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