You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by jb...@apache.org on 2007/03/11 17:07:15 UTC

svn commit: r516941 - in /incubator/tuscany/java/sca/kernel: core/src/main/java/org/apache/tuscany/core/component/scope/ core/src/main/java/org/apache/tuscany/core/implementation/ core/src/main/java/org/apache/tuscany/core/implementation/system/compone...

Author: jboynes
Date: Sun Mar 11 09:07:14 2007
New Revision: 516941

URL: http://svn.apache.org/viewvc?view=rev&rev=516941
Log:
add method to ScopeContainer so that components can unregister
add test cases for PojoComponent

Added:
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoComponentTestCase.java   (with props)
Modified:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/AbstractScopeContainer.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/CompositeScopeContainer.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainer.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/HttpSessionScopeContainer.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/RequestScopeContainer.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/StatelessScopeContainer.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoComponent.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemComponent.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/ScopeContainer.java

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/AbstractScopeContainer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/AbstractScopeContainer.java?view=diff&rev=516941&r1=516940&r2=516941
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/AbstractScopeContainer.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/AbstractScopeContainer.java Sun Mar 11 09:07:14 2007
@@ -56,6 +56,13 @@
         this.monitor = monitor;
     }
 
+    public void register(AtomicComponent component) {
+        checkInit();
+    }
+
+    public void unregister(AtomicComponent component) {
+    }
+
     public void addListener(RuntimeEventListener listener) {
         addListener(TRUE_FILTER, listener);
     }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/CompositeScopeContainer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/CompositeScopeContainer.java?view=diff&rev=516941&r1=516940&r2=516941
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/CompositeScopeContainer.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/CompositeScopeContainer.java Sun Mar 11 09:07:14 2007
@@ -116,8 +116,15 @@
     }
 
     public void register(AtomicComponent component) {
-        checkInit();
+        super.register(component);
         instanceWrappers.put(component, EMPTY);
+    }
+
+
+    public void unregister(AtomicComponent component) {
+        // FIXME should this component be destroyed already?
+        instanceWrappers.remove(component);
+        super.unregister(component);
     }
 
     protected InstanceWrapper getInstanceWrapper(AtomicComponent component, boolean create)

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainer.java?view=diff&rev=516941&r1=516940&r2=516941
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainer.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainer.java Sun Mar 11 09:07:14 2007
@@ -18,9 +18,6 @@
  */
 package org.apache.tuscany.core.component.scope;
 
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
 import org.apache.tuscany.spi.component.AtomicComponent;
 import org.apache.tuscany.spi.component.InstanceWrapper;
 import org.apache.tuscany.spi.component.PersistenceException;
@@ -44,7 +41,6 @@
  */
 public class ConversationalScopeContainer extends AbstractScopeContainer implements ScopeContainer {
     private Store nonDurableStore;
-    private Map<AtomicComponent, AtomicComponent> components;
 
     public ConversationalScopeContainer(Store store, WorkContext workContext, final ScopeContainerMonitor monitor) {
         super(workContext, monitor);
@@ -52,7 +48,6 @@
         if (store != null) {
             store.addListener(new ExpirationListener(monitor));
         }
-        components = new ConcurrentHashMap<AtomicComponent, AtomicComponent>();
     }
 
     public Scope getScope() {
@@ -75,10 +70,16 @@
     }
 
     public void register(AtomicComponent component) {
-        components.put(component, component);
+        super.register(component);
         component.addListener(this);
     }
 
+    public void unregister(AtomicComponent component) {
+        // FIXME should all the instances associated with this component be remove already
+        component.removeListener(this);
+        super.unregister(component);
+    }
+
     public void persistNew(AtomicComponent component, String id, Object instance, long expiration)
         throws PersistenceException {
         try {
@@ -143,6 +144,7 @@
 
     /**
      * Returns the conversation id associated with the current invocation context
+     * @return the conversation id
      */
     private String getConversationId() {
         String conversationId = (String) workContext.getIdentifier(Scope.CONVERSATION);

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/HttpSessionScopeContainer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/HttpSessionScopeContainer.java?view=diff&rev=516941&r1=516940&r2=516941
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/HttpSessionScopeContainer.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/HttpSessionScopeContainer.java Sun Mar 11 09:07:14 2007
@@ -83,6 +83,13 @@
         component.addListener(this);
     }
 
+    public void unregister(AtomicComponent component) {
+        // FIXME should all the instances associated with this component be destroyed already
+        contexts.remove(component);
+        component.removeListener(this);
+        super.unregister(component);
+    }
+
     protected InstanceWrapper getInstanceWrapper(AtomicComponent component, boolean create)
         throws TargetResolutionException {
         Object key = workContext.getIdentifier(Scope.SESSION);

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/RequestScopeContainer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/RequestScopeContainer.java?view=diff&rev=516941&r1=516940&r2=516941
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/RequestScopeContainer.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/RequestScopeContainer.java Sun Mar 11 09:07:14 2007
@@ -77,7 +77,14 @@
     }
 
     public void register(AtomicComponent component) {
+        super.register(component);
         contexts.put(component, new ConcurrentHashMap<Thread, InstanceWrapper>());
+    }
+
+    public void unregister(AtomicComponent component) {
+        // FIXME should all the instances associated with this component be destroyed already
+        contexts.remove(component);
+        super.unregister(component);
     }
 
     protected InstanceWrapper getInstanceWrapper(AtomicComponent component, boolean create)

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/StatelessScopeContainer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/StatelessScopeContainer.java?view=diff&rev=516941&r1=516940&r2=516941
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/StatelessScopeContainer.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/StatelessScopeContainer.java Sun Mar 11 09:07:14 2007
@@ -59,10 +59,6 @@
     public void onEvent(Event event) {
     }
 
-    public void register(AtomicComponent component) {
-        checkInit();
-    }
-
     protected InstanceWrapper getInstanceWrapper(AtomicComponent component, boolean create)
         throws TargetResolutionException {
         // there never is a previously associated instance, return null

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoComponent.java?view=diff&rev=516941&r1=516940&r2=516941
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoComponent.java Sun Mar 11 09:07:14 2007
@@ -20,13 +20,29 @@
 
 import java.net.URI;
 import java.util.List;
+import java.util.Map;
+
+import org.osoa.sca.ComponentContext;
 
 import org.apache.tuscany.core.component.InstanceFactory;
 import org.apache.tuscany.core.component.InstanceFactoryProvider;
 import org.apache.tuscany.spi.component.AbstractSCAObject;
 import org.apache.tuscany.spi.component.AtomicComponent;
 import org.apache.tuscany.spi.component.InstanceWrapper;
+import org.apache.tuscany.spi.component.TargetInvokerCreationException;
+import org.apache.tuscany.spi.component.ComponentException;
+import org.apache.tuscany.spi.component.TargetResolutionException;
+import org.apache.tuscany.spi.component.ScopeContainer;
+import org.apache.tuscany.spi.component.Service;
+import org.apache.tuscany.spi.component.RegistrationException;
+import org.apache.tuscany.spi.component.Reference;
+import org.apache.tuscany.spi.model.PropertyValue;
+import org.apache.tuscany.spi.model.Scope;
+import org.apache.tuscany.spi.model.Operation;
+import org.apache.tuscany.spi.model.physical.PhysicalOperationDefinition;
+import org.apache.tuscany.spi.wire.TargetInvoker;
 import org.apache.tuscany.spi.wire.Wire;
+import org.apache.tuscany.spi.ObjectCreationException;
 
 /**
  * Base class for Component implementations based on Java objects.
@@ -36,6 +52,7 @@
  */
 public abstract class PojoComponent<T> extends AbstractSCAObject implements AtomicComponent {
     private final InstanceFactoryProvider<T> provider;
+    private final ScopeContainer scopeContainer;
     private final int initLevel;
     private final long maxIdleTime;
     private final long maxAge;
@@ -45,14 +62,32 @@
                          InstanceFactoryProvider<T> provider,
                          int initLevel,
                          long maxIdleTime,
-                         long maxAge) {
+                         long maxAge,
+                         ScopeContainer scopeContainer) {
         super(componentId);
         this.provider = provider;
+        this.scopeContainer = scopeContainer;
         this.initLevel = initLevel;
         this.maxIdleTime = maxIdleTime;
         this.maxAge = maxAge;
     }
 
+    public boolean isEagerInit() {
+        return initLevel > 0;
+    }
+
+    public int getInitLevel() {
+        return initLevel;
+    }
+
+    public long getMaxIdleTime() {
+        return maxIdleTime;
+    }
+
+    public long getMaxAge() {
+        return maxAge;
+    }
+
     public void attachWire(Wire wire) {
         provider.attachWire(wire);
     }
@@ -61,13 +96,18 @@
         provider.attachWires(wires);
     }
 
+    public void attachCallbackWire(Wire wire) {
+    }
+
     public void start() {
         super.start();
+        scopeContainer.register(this);
         instanceFactory = provider.createFactory();
     }
 
     public void stop() {
         instanceFactory = null;
+        scopeContainer.unregister(this);
         super.stop();
     }
 
@@ -75,20 +115,84 @@
         return instanceFactory.newInstance();
     }
 
+    public TargetInvoker createTargetInvoker(String targetName, PhysicalOperationDefinition operation)
+        throws TargetInvokerCreationException {
+        return null;
+    }
 
-    public boolean isEagerInit() {
-        return initLevel > 0;
+    public ComponentContext getComponentContext() {
+        return null;
     }
 
-    public int getInitLevel() {
-        return initLevel;
+    public List<Wire> getWires(String name) {
+        return null;
     }
 
-    public long getMaxIdleTime() {
-        return maxIdleTime;
+    public Map<String, PropertyValue<?>> getDefaultPropertyValues() {
+        return null;
     }
 
-    public long getMaxAge() {
-        return maxAge;
+    public void setDefaultPropertyValues(Map<String, PropertyValue<?>> defaultPropertyValues) {
+    }
+
+    @Deprecated
+    public Object createInstance() throws ObjectCreationException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Deprecated
+    public void removeInstance() throws ComponentException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Deprecated
+    public Object getTargetInstance() throws TargetResolutionException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Deprecated
+    public Object getAssociatedTargetInstance() throws TargetResolutionException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Deprecated
+    public Scope getScope() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Deprecated
+    public void setScopeContainer(ScopeContainer scopeContainer) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Deprecated
+    public boolean isOptimizable() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Deprecated
+    public void register(Service service) throws RegistrationException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Deprecated
+    public void register(Reference reference) throws RegistrationException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Deprecated
+    public Service getService(String name) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Deprecated
+    public Reference getReference(String name) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Deprecated
+    public TargetInvoker createTargetInvoker(String targetName, Operation operation) 
+        throws TargetInvokerCreationException {
+        throw new UnsupportedOperationException();
     }
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemComponent.java?view=diff&rev=516941&r1=516940&r2=516941
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemComponent.java Sun Mar 11 09:07:14 2007
@@ -22,18 +22,20 @@
 
 import org.apache.tuscany.core.component.InstanceFactoryProvider;
 import org.apache.tuscany.core.implementation.PojoComponent;
+import org.apache.tuscany.spi.component.ScopeContainer;
 
 /**
  * @version $Rev$ $Date$
  * @param <T> the implementation class for the defined component
  */
-public abstract class SystemComponent<T> extends PojoComponent<T> {
+public class SystemComponent<T> extends PojoComponent<T> {
     public SystemComponent(URI componentId,
                            InstanceFactoryProvider<T> provider,
+                           ScopeContainer scopeContainer,
                            int initLevel,
                            int maxIdleTime,
                            int maxAge) {
-        super(componentId, provider, initLevel, maxIdleTime, maxAge);
+        super(componentId, provider, initLevel, maxIdleTime, maxAge, scopeContainer);
     }
 
 }

Added: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoComponentTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoComponentTestCase.java?view=auto&rev=516941
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoComponentTestCase.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoComponentTestCase.java Sun Mar 11 09:07:14 2007
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.core.implementation;
+
+import java.net.URI;
+
+import junit.framework.TestCase;
+import org.easymock.EasyMock;
+
+import org.apache.tuscany.core.component.InstanceFactory;
+import org.apache.tuscany.core.component.InstanceFactoryProvider;
+import org.apache.tuscany.spi.component.InstanceWrapper;
+import org.apache.tuscany.spi.component.ScopeContainer;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class PojoComponentTestCase<T> extends TestCase {
+    private URI componentId;
+    private PojoComponent component;
+    private InstanceFactoryProvider<T> provider;
+    private InstanceFactory<T> instanceFactory;
+    private InstanceWrapper<T> wrapper;
+    private ScopeContainer scopeContainer;
+
+    public void testConversationAttributes() {
+        TestComponent<T> component = new TestComponent<T>(componentId, null, null, 0, 12, 34);
+        assertEquals(0, component.getInitLevel());
+        assertEquals(false, component.isEagerInit());
+        assertEquals(12, component.getMaxIdleTime());
+        assertEquals(34, component.getMaxAge());
+    }
+
+    public void testEagerInit() {
+        TestComponent<T> component = new TestComponent<T>(componentId, null, null, 50, 12, 34);
+        assertEquals(50, component.getInitLevel());
+        assertEquals(true, component.isEagerInit());
+        assertEquals(12, component.getMaxIdleTime());
+        assertEquals(34, component.getMaxAge());
+    }
+
+    public void testLifecycleAndWrapperCreation() {
+        // test start method creates the factory
+        EasyMock.expect(provider.createFactory()).andReturn(instanceFactory);
+        scopeContainer.register(component);
+        EasyMock.replay(provider, instanceFactory, wrapper, scopeContainer);
+        component.start();
+        EasyMock.verify(provider, instanceFactory, wrapper, scopeContainer);
+
+        // test creating an wrapper calls the factory
+        // we piggyback this here has the component needs to be started for the factory to be active
+        EasyMock.reset(provider, instanceFactory, wrapper, scopeContainer);
+        EasyMock.expect(instanceFactory.newInstance()).andReturn(wrapper);
+        EasyMock.replay(provider, instanceFactory, wrapper, scopeContainer);
+        component.createInstanceWrapper();
+        EasyMock.verify(provider, instanceFactory, wrapper, scopeContainer);
+
+        // test stop method
+        EasyMock.reset(provider, instanceFactory, wrapper, scopeContainer);
+        scopeContainer.unregister(component);
+        EasyMock.replay(provider, instanceFactory, wrapper, scopeContainer);
+        component.stop();
+        EasyMock.verify(provider, instanceFactory, wrapper, scopeContainer);
+    }
+
+    @SuppressWarnings("unchecked")
+    protected void setUp() throws Exception {
+        super.setUp();
+        componentId = URI.create("sca://./component");
+        provider = EasyMock.createNiceMock(InstanceFactoryProvider.class);
+        instanceFactory = EasyMock.createNiceMock(InstanceFactory.class);
+        wrapper = EasyMock.createNiceMock(InstanceWrapper.class);
+        scopeContainer = EasyMock.createNiceMock(ScopeContainer.class);
+        component = new TestComponent<T>(componentId, provider, scopeContainer, 0, -1, -1);
+    }
+
+    public static class TestComponent<T> extends PojoComponent<T> {
+
+        public TestComponent(URI componentId,
+                             InstanceFactoryProvider<T> instanceFactoryProvider,
+                             ScopeContainer scopeContainer,
+                             int initLevel,
+                             long maxIdleTime,
+                             long maxAge) {
+            super(componentId, instanceFactoryProvider, initLevel, maxIdleTime, maxAge, scopeContainer);
+        }
+    }
+}

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoComponentTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoComponentTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/ScopeContainer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/ScopeContainer.java?view=diff&rev=516941&r1=516940&r2=516941
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/ScopeContainer.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/ScopeContainer.java Sun Mar 11 09:07:14 2007
@@ -36,9 +36,16 @@
     Scope getScope();
 
     /**
-     * Registers a component with the scope component
+     * Registers a component with the scope.
+     * @param component the component to register
      */
     void register(AtomicComponent component);
+
+    /**
+     * Unregisters a component with the scope.
+     * @param component the component to unregister
+     */
+    void unregister(AtomicComponent component);
 
     /**
      * Returns an instance wrapper associated with the current scope context, creating one if necessary



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org