You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by jm...@apache.org on 2006/05/04 10:52:05 UTC
svn commit: r399621 - in /incubator/tuscany/sandbox/jboynes/sca:
core/src/main/java/org/apache/tuscany/core/context/event/
core/src/main/java/org/apache/tuscany/core/context/scope/
core/src/main/java/org/apache/tuscany/core/system/context/ core2/src/ma...
Author: jmarino
Date: Thu May 4 01:52:01 2006
New Revision: 399621
URL: http://svn.apache.org/viewcvs?rev=399621&view=rev
Log:
more scope refactoring
Added:
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/AbstractRequestEvent.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEnd.java
- copied, changed from r399567, incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEnd.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEvent.java
- copied, changed from r399567, incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEvent.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestEnd.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestEvent.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestStart.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/HttpSessionScopeContext.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/RequestScopeContext.java
Removed:
incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEnd.java
incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEvent.java
incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/context/scope/AbstractScopeContext.java
incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemAtomicContext.java
Modified:
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/PojoAtomicContext.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/PojoInstanceContext.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/AbstractScopeContext.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/ModuleScopeContext.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/StatelessScopeContext.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/system/context/SystemAtomicContext.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/test/java/org/apache/tuscany/core/mock/context/scope/MockScopeContext.java
incubator/tuscany/sandbox/jboynes/sca/core2/src/test/java/org/apache/tuscany/core/system/context/SystemAtomicContextTestCase.java
Modified: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/PojoAtomicContext.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/PojoAtomicContext.java?rev=399621&r1=399620&r2=399621&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/PojoAtomicContext.java (original)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/PojoAtomicContext.java Thu May 4 01:52:01 2006
@@ -15,32 +15,37 @@
*/
public abstract class PojoAtomicContext extends AbstractContext implements AtomicContext {
- private ScopeContext<AtomicContext> scopeContext;
+ protected ScopeContext<AtomicContext> scopeContext;
+ protected boolean eagerInit;
+ protected EventInvoker<Object> initInvoker;
+ protected EventInvoker<Object> destroyInvoker;
+ protected ObjectFactory<?> objectFactory;
- private boolean eagerInit;
-
- private EventInvoker<Object> initInvoker;
-
- private EventInvoker<Object> destroyInvoker;
-
-
- private ObjectFactory<?> objectFactory;
-
- public PojoAtomicContext(String name, ScopeContext<AtomicContext> scopeContext, ObjectFactory<?> objectFactory, boolean eagerInit, EventInvoker<Object> initInvoker,
+ public PojoAtomicContext(String name, ObjectFactory<?> objectFactory, boolean eagerInit, EventInvoker<Object> initInvoker,
EventInvoker<Object> destroyInvoker) {
super(name);
- assert (scopeContext != null) : "Scope context was null";
assert (objectFactory != null) : "Object factory was null";
if (eagerInit && initInvoker == null) {
throw new AssertionError("No intialization method found for eager init implementation");
}
- this.scopeContext = scopeContext;
this.objectFactory = objectFactory;
this.eagerInit = eagerInit;
this.initInvoker = initInvoker;
this.destroyInvoker = destroyInvoker;
}
+ public Scope getScope() {
+ if (scopeContext == null) {
+ return null;
+ }
+ return scopeContext.getScope();
+ }
+
+ public void setScopeContext(ScopeContext<AtomicContext> scopeContext) {
+ this.scopeContext = scopeContext;
+ scopeContext.register(this);
+ }
+
public boolean isEagerInit() {
return eagerInit;
}
@@ -65,16 +70,12 @@
return scopeContext.getInstance(this);
}
- public Scope getScope() {
- return scopeContext.getScope();
- }
-
public void addProperty(String propertyName, Object value) {
}
public InstanceContext createInstance() throws ObjectCreationException {
- InstanceContext ctx = new PojoInstanceContext(objectFactory.getInstance());
+ InstanceContext ctx = new PojoInstanceContext(this, objectFactory.getInstance());
ctx.start();
publish(new InstanceCreated(this, ctx));
return ctx;
Modified: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/PojoInstanceContext.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/PojoInstanceContext.java?rev=399621&r1=399620&r2=399621&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/PojoInstanceContext.java (original)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/PojoInstanceContext.java Thu May 4 01:52:01 2006
@@ -13,8 +13,10 @@
*/
package org.apache.tuscany.core.context;
-import org.apache.tuscany.spi.context.InstanceContext;
import org.apache.tuscany.core.AbstractLifecycle;
+import org.apache.tuscany.spi.CoreRuntimeException;
+import org.apache.tuscany.spi.context.AtomicContext;
+import org.apache.tuscany.spi.context.InstanceContext;
/**
* @version $$Rev$$ $$Date$$
@@ -22,12 +24,39 @@
public class PojoInstanceContext extends AbstractLifecycle implements InstanceContext {
private Object instance;
+ private AtomicContext context;
- public PojoInstanceContext(Object instance){
+ public PojoInstanceContext(AtomicContext context, Object instance) {
+ assert(context != null);
+ assert(instance != null);
+ this.context = context;
this.instance = instance;
}
public Object getInstance() {
+ checkInit();
return instance;
}
+
+ public void start() throws CoreRuntimeException {
+ try {
+ context.init(instance);
+ lifecycleState = RUNNING;
+ } catch (RuntimeException e) {
+ lifecycleState = ERROR;
+ throw e;
+ }
+ }
+
+ public void stop() throws CoreRuntimeException {
+ checkInit();
+ context.destroy(instance);
+ }
+
+ protected void checkInit() {
+ if (getLifecycleState() != RUNNING) {
+ throw new IllegalStateException("Scope not running [" + getLifecycleState() + "]");
+ }
+ }
+
}
Added: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/AbstractRequestEvent.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/AbstractRequestEvent.java?rev=399621&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/AbstractRequestEvent.java (added)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/AbstractRequestEvent.java Thu May 4 01:52:01 2006
@@ -0,0 +1,40 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.context.event;
+
+/**
+ * Base implementation of a request event
+ *
+ * @version $$Rev$$ $$Date$$
+ */
+public abstract class AbstractRequestEvent extends AbstractEvent implements RequestEvent {
+
+ private Object id;
+
+ /**
+ * Creates a new event
+ * @param source the source of the event
+ * @param id the id of the request associated with the event
+ */
+ public AbstractRequestEvent(Object source, Object id) {
+ super(source);
+ assert (id !=null): "Request id was null";
+ this.id = id;
+ }
+
+ public Object getId(){
+ return id;
+ }
+
+}
Copied: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEnd.java (from r399567, incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEnd.java)
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEnd.java?p2=incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEnd.java&p1=incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEnd.java&r1=399567&r2=399621&rev=399621&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEnd.java (original)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEnd.java Thu May 4 01:52:01 2006
@@ -18,7 +18,7 @@
*
* @version $$Rev$$ $$Date$$
*/
-public class HttpSessionEnd extends HttpSessionEvent implements SessionEnd {
+public class HttpSessionEnd extends HttpSessionEvent{
/**
* Creates a new event
Copied: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEvent.java (from r399567, incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEvent.java)
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEvent.java?p2=incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEvent.java&p1=incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEvent.java&r1=399567&r2=399621&rev=399621&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEvent.java (original)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEvent.java Thu May 4 01:52:01 2006
@@ -18,21 +18,17 @@
*
* @version $$Rev$$ $$Date$$
*/
-public abstract class HttpSessionEvent implements SessionEvent {
-
- // FIXME this needs to be made private and not directly referenced in the runtime
- public static final Object HTTP_IDENTIFIER = new Object();
+public abstract class HttpSessionEvent extends AbstractEvent {
private Object id;
- protected transient Object source;
public HttpSessionEvent(Object source, Object id) {
- assert (source !=null): "Source id was null";
+ super(source);
assert (id !=null): "Session id was null";
- this.source = source;
this.id = id;
}
+
public Object getSource() {
return source;
}
@@ -41,7 +37,4 @@
return id;
}
- public Object getSessionTypeIdentifier(){
- return HTTP_IDENTIFIER;
- }
}
Added: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestEnd.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestEnd.java?rev=399621&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestEnd.java (added)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestEnd.java Thu May 4 01:52:01 2006
@@ -0,0 +1,33 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.context.event;
+
+/**
+ * Propagated when a request completes or is ended
+ *
+ * @version $$Rev$$ $$Date$$
+ */
+public class RequestEnd extends AbstractRequestEvent{
+
+ /**
+ * Creates a new event
+ * @param source the source of the event
+ * @param id the id of the completed/ended request
+ */
+ public RequestEnd(Object source, Object id) {
+ super(source,id);
+ }
+
+
+}
Added: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestEvent.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestEvent.java?rev=399621&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestEvent.java (added)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestEvent.java Thu May 4 01:52:01 2006
@@ -0,0 +1,27 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.context.event;
+
+/**
+ * Implemented by runtime events associated request
+ * @version $$Rev$$ $$Date$$
+ */
+public interface RequestEvent {
+
+ /**
+ * Returns the id of the request the event is associated with
+ */
+ public Object getId();
+
+}
Added: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestStart.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestStart.java?rev=399621&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestStart.java (added)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/event/RequestStart.java Thu May 4 01:52:01 2006
@@ -0,0 +1,32 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.context.event;
+
+/**
+ * Propagated when a request is started in the runtime
+ *
+ * @version $$Rev$$ $$Date$$
+ */
+public class RequestStart extends AbstractRequestEvent {
+
+ /**
+ * Creates a new event
+ * @param source the source of the event
+ * @param id the id of the request being started
+ */
+ public RequestStart(Object source, Object id) {
+ super(source,id);
+ }
+
+}
Modified: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/AbstractScopeContext.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/AbstractScopeContext.java?rev=399621&r1=399620&r2=399621&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/AbstractScopeContext.java (original)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/AbstractScopeContext.java Thu May 4 01:52:01 2006
@@ -3,17 +3,19 @@
import java.util.List;
import java.util.Map;
-import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.tuscany.core.AbstractLifecycle;
import org.apache.tuscany.core.context.event.filter.TrueFilter;
import org.apache.tuscany.spi.context.Context;
-import org.apache.tuscany.spi.context.WorkContext;
+import org.apache.tuscany.spi.context.InstanceContext;
import org.apache.tuscany.spi.context.ScopeContext;
-import org.apache.tuscany.spi.event.RuntimeEventListener;
-import org.apache.tuscany.spi.event.EventFilter;
+import org.apache.tuscany.spi.context.TargetException;
+import org.apache.tuscany.spi.context.WorkContext;
import org.apache.tuscany.spi.event.Event;
+import org.apache.tuscany.spi.event.EventFilter;
+import org.apache.tuscany.spi.event.RuntimeEventListener;
/**
* Implements functionality common to scope contexts.
@@ -32,16 +34,6 @@
this.workContext = workContext;
}
- protected void checkInit() {
- if (getLifecycleState() != RUNNING) {
- throw new IllegalStateException("Scope not running [" + getLifecycleState() + "]");
- }
- }
-
- protected WorkContext getEventContext() {
- return workContext;
- }
-
public void addListener(RuntimeEventListener listener) {
addListener(TRUE_FILTER, listener);
}
@@ -83,11 +75,33 @@
}
}
+ public Object getInstance(T context) throws TargetException {
+ InstanceContext ctx = getInstanceContext(context);
+ if (ctx != null) {
+ if (ctx.getLifecycleState() == UNINITIALIZED) {
+ ctx.start();
+ }
+ return ctx.getInstance();
+ }
+ return null;
+ }
+
protected Map<EventFilter, List<RuntimeEventListener>> getListeners() {
if (listeners == null) {
listeners = new ConcurrentHashMap<EventFilter, List<RuntimeEventListener>>();
}
return listeners;
}
+
+ protected void checkInit() {
+ if (getLifecycleState() != RUNNING) {
+ throw new IllegalStateException("Scope not running [" + getLifecycleState() + "]");
+ }
+ }
+
+ protected WorkContext getEventContext() {
+ return workContext;
+ }
+
}
Added: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/HttpSessionScopeContext.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/HttpSessionScopeContext.java?rev=399621&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/HttpSessionScopeContext.java (added)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/HttpSessionScopeContext.java Thu May 4 01:52:01 2006
@@ -0,0 +1,95 @@
+package org.apache.tuscany.core.context.scope;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.tuscany.core.context.event.HttpSessionEnd;
+import org.apache.tuscany.core.context.event.InstanceCreated;
+import org.apache.tuscany.model.Scope;
+import org.apache.tuscany.spi.context.AtomicContext;
+import org.apache.tuscany.spi.context.InstanceContext;
+import org.apache.tuscany.spi.context.TargetException;
+import org.apache.tuscany.spi.context.WorkContext;
+import org.apache.tuscany.spi.event.Event;
+
+/**
+ * An implementation of a request-scoped component container.
+ *
+ * @version $Rev: 399161 $ $Date: 2006-05-02 23:09:37 -0700 (Tue, 02 May 2006) $
+ */
+public class HttpSessionScopeContext extends AbstractScopeContext<AtomicContext> {
+
+ public static final Object HTTP_IDENTIFIER = new Object();
+
+ private Map<AtomicContext, Map<Object, InstanceContext>> contexts;
+ private Map<Object, List<InstanceContext>> destroyQueues;
+
+ public HttpSessionScopeContext(WorkContext workContext) {
+ super("Session Scope", workContext);
+ contexts = new ConcurrentHashMap<AtomicContext, Map<Object, InstanceContext>>();
+ destroyQueues = new ConcurrentHashMap<Object, List<InstanceContext>>();
+ }
+
+ public Scope getScope() {
+ return Scope.REQUEST;
+ }
+
+ public void onEvent(Event event) {
+ checkInit();
+ if (event instanceof HttpSessionEnd) {
+ checkInit();
+ shutdownInstances();
+ } else if (event instanceof InstanceCreated) {
+ checkInit();
+ InstanceContext context = ((InstanceCreated) event).getContext();
+ List<InstanceContext> destroyQueue = destroyQueues.get(workContext.getIdentifier(HTTP_IDENTIFIER));
+ destroyQueue.add(context);
+ }
+ }
+
+ public synchronized void start() {
+ if (lifecycleState != UNINITIALIZED) {
+ throw new IllegalStateException("Scope must be in UNINITIALIZED state [" + lifecycleState + "]");
+ }
+ }
+
+ public synchronized void stop() {
+ //TODO stop semantics
+ lifecycleState = STOPPED;
+ }
+
+ public void register(AtomicContext context) {
+ contexts.put(context, new ConcurrentHashMap<Object, InstanceContext>());
+ Object key = workContext.getIdentifier(HTTP_IDENTIFIER);
+ List<InstanceContext> destroyQueue = destroyQueues.get(key);
+
+ if (destroyQueue == null) {
+ destroyQueues.put(key, new ArrayList<InstanceContext>());
+ }
+ context.addListener(this);
+
+ }
+
+ public InstanceContext getInstanceContext(AtomicContext context) throws TargetException {
+ Map<Object,InstanceContext> contextMap = contexts.get(context);
+ InstanceContext ctx = contextMap.get(workContext.getIdentifier(HTTP_IDENTIFIER));
+ if(ctx == null){
+ ctx = context.createInstance();
+ contextMap.put(context,ctx);
+ }
+ return ctx;
+ }
+
+ private void shutdownInstances() {
+ Object key = workContext.getIdentifier(HTTP_IDENTIFIER);
+ List<InstanceContext> destroyQueue = destroyQueues.get(key);
+ if (destroyQueue != null) {
+ for (InstanceContext ctx : destroyQueue) {
+ ctx.stop();
+ }
+ }
+ }
+
+}
Modified: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/ModuleScopeContext.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/ModuleScopeContext.java?rev=399621&r1=399620&r2=399621&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/ModuleScopeContext.java (original)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/ModuleScopeContext.java Thu May 4 01:52:01 2006
@@ -11,7 +11,6 @@
import org.apache.tuscany.core.context.event.ModuleStop;
import org.apache.tuscany.model.Scope;
import org.apache.tuscany.spi.CoreRuntimeException;
-import org.apache.tuscany.spi.Lifecycle;
import org.apache.tuscany.spi.context.AtomicContext;
import org.apache.tuscany.spi.context.CompositeContext;
import org.apache.tuscany.spi.context.Context;
@@ -41,7 +40,7 @@
private Map<CompositeContext, List<InstanceContext>> destroyQueues;
public ModuleScopeContext(WorkContext workContext) {
- super("Module Scope",workContext);
+ super("Module Scope", workContext);
instanceContexts = new ConcurrentHashMap<Context, InstanceContext>();
registeredContexts = new ConcurrentHashMap<CompositeContext, List<AtomicContext>>();
destroyQueues = new ConcurrentHashMap<CompositeContext, List<InstanceContext>>();
@@ -56,9 +55,9 @@
checkInit();
if (event instanceof ModuleStart) {
lifecycleState = RUNNING;
- initComponentContexts(((ModuleStart)event).getContext());
+ eagerInitContexts(((ModuleStart) event).getContext());
} else if (event instanceof ModuleStop) {
- shutdownContexts(((ModuleStop)event).getContext());
+ shutdownContexts(((ModuleStop) event).getContext());
} else if (event instanceof InstanceCreated) {
checkInit();
// Queue the context to have its implementation instance released if destroyable
@@ -74,9 +73,7 @@
}
public synchronized void stop() {
- if (lifecycleState != RUNNING) {
- throw new IllegalStateException("Scope in wrong state [" + lifecycleState + "]");
- }
+ checkInit();
lifecycleState = STOPPED;
//TODO implement stop semantics
}
@@ -95,7 +92,7 @@
// shutdown destroyable instances in reverse instantiation order
ListIterator<InstanceContext> iter = destroyQueue.listIterator(destroyQueue.size());
while (iter.hasPrevious()) {
- Lifecycle context = iter.previous();
+ InstanceContext context = iter.previous();
if (context.getLifecycleState() == RUNNING) {
context.stop();
}
@@ -103,7 +100,7 @@
}
}
- private void initComponentContexts(CompositeContext module) throws CoreRuntimeException {
+ private void eagerInitContexts(CompositeContext module) throws CoreRuntimeException {
checkInit();
assert(module != null): "Current module not set in work context";
List<AtomicContext> contexts = registeredContexts.get(module);
@@ -112,33 +109,10 @@
if (context.isEagerInit()) {
InstanceContext instanceCtx = context.createInstance();
instanceContexts.put(context, instanceCtx);
- context.init(instanceCtx.getInstance());
+ instanceCtx.start();
}
}
}
-
-// if (instanceContexts == null) {
-// instanceContexts = new ConcurrentHashMap<String, Context>();
-// destroyQueue = new ArrayList<Context>();
-// for (ContextFactory<Context> config : contextFactories.values()) {
-// Context context = config.createContext();
-// context.start();
-// instanceContexts.put(context.getName(), context);
-// }
-// // Initialize eager instanceContexts. Note this cannot be done when we initially create each context since a component may
-// // contain a forward reference to a component which has not been instantiated
-// for (Context context : instanceContexts.values()) {
-// if (context instanceof AtomicContext) {
-// AtomicContext atomic = (AtomicContext) context;
-// if (atomic.isEagerInit()) {
-// // perform silent creation and manual shutdown registration
-// atomic.init();
-// destroyQueue.add(context);
-// }
-// }
-// context.addListener(this);
-// }
-// }
}
public void register(AtomicContext context) {
@@ -156,29 +130,17 @@
atomicContexts.add(context);
}
context.addListener(this);
-
}
- public Object getInstance(AtomicContext context) throws TargetException {
+ public InstanceContext getInstanceContext(AtomicContext context) throws TargetException {
checkInit();
InstanceContext ctx = instanceContexts.get(context);
- if (ctx != null) {
- if (ctx.getLifecycleState() != RUNNING) {
- TargetException e = new TargetException("Instance in invalid state");
- e.setIdentifier(String.valueOf(ctx.getLifecycleState()));
- throw e;
- }
- Object instance = ctx.getInstance();
- context.init(instance);
- return instance;
+ if (ctx == null) {
+ ctx = context.createInstance();
+ instanceContexts.put(context, ctx);
}
- return null;
- }
-
- public InstanceContext getInstanceContext(AtomicContext context) throws TargetException {
- checkInit();
- return instanceContexts.get(context);
+ return ctx;
}
Added: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/RequestScopeContext.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/RequestScopeContext.java?rev=399621&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/RequestScopeContext.java (added)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/RequestScopeContext.java Thu May 4 01:52:01 2006
@@ -0,0 +1,91 @@
+package org.apache.tuscany.core.context.scope;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.tuscany.core.context.event.InstanceCreated;
+import org.apache.tuscany.core.context.event.RequestEnd;
+import org.apache.tuscany.model.Scope;
+import org.apache.tuscany.spi.context.AtomicContext;
+import org.apache.tuscany.spi.context.InstanceContext;
+import org.apache.tuscany.spi.context.TargetException;
+import org.apache.tuscany.spi.context.WorkContext;
+import org.apache.tuscany.spi.event.Event;
+
+/**
+ * An implementation of a request-scoped component container.
+ *
+ * @version $Rev: 399161 $ $Date: 2006-05-02 23:09:37 -0700 (Tue, 02 May 2006) $
+ */
+public class RequestScopeContext extends AbstractScopeContext<AtomicContext> {
+
+ private Map<AtomicContext, Map<Thread, InstanceContext>> contexts;
+ private Map<Thread, List<InstanceContext>> destroyQueues;
+
+ public RequestScopeContext(WorkContext workContext) {
+ super("Request Scope", workContext);
+ contexts = new ConcurrentHashMap<AtomicContext, Map<Thread, InstanceContext>>();
+ destroyQueues = new ConcurrentHashMap<Thread, List<InstanceContext>>();
+ }
+
+ public Scope getScope() {
+ return Scope.REQUEST;
+ }
+
+ public void onEvent(Event event) {
+ checkInit();
+ if (event instanceof RequestEnd) {
+ checkInit();
+ shutdownInstances();
+ } else if (event instanceof InstanceCreated) {
+ checkInit();
+ InstanceContext context = ((InstanceCreated) event).getContext();
+ List<InstanceContext> destroyQueue = destroyQueues.get(Thread.currentThread());
+ destroyQueue.add(context);
+ }
+ }
+
+ public synchronized void start() {
+ if (lifecycleState != UNINITIALIZED) {
+ throw new IllegalStateException("Scope must be in UNINITIALIZED state [" + lifecycleState + "]");
+ }
+ }
+
+ public synchronized void stop() {
+ //TODO stop semantics
+ lifecycleState = STOPPED;
+ }
+
+ public void register(AtomicContext context) {
+ contexts.put(context, new ConcurrentHashMap<Thread, InstanceContext>());
+ List<InstanceContext> destroyQueue = destroyQueues.get(Thread.currentThread());
+
+ if (destroyQueue == null) {
+ destroyQueues.put(Thread.currentThread(), new ArrayList<InstanceContext>());
+ }
+ context.addListener(this);
+
+ }
+
+ public InstanceContext getInstanceContext(AtomicContext context) throws TargetException {
+ Map<Thread,InstanceContext> instanceContextMap = contexts.get(context);
+ InstanceContext ctx = instanceContextMap.get(Thread.currentThread());
+ if(ctx == null){
+ ctx = context.createInstance();
+ instanceContextMap.put(Thread.currentThread(),ctx);
+ }
+ return ctx;
+ }
+
+ private void shutdownInstances() {
+ List<InstanceContext> destroyQueue = destroyQueues.get(Thread.currentThread());
+ if (destroyQueue != null) {
+ for (InstanceContext ctx : destroyQueue) {
+ ctx.stop();
+ }
+ }
+ }
+
+}
Modified: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/StatelessScopeContext.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/StatelessScopeContext.java?rev=399621&r1=399620&r2=399621&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/StatelessScopeContext.java (original)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/context/scope/StatelessScopeContext.java Thu May 4 01:52:01 2006
@@ -83,12 +83,8 @@
contexts.put(module, ctxs);
}
- public Object getInstance(AtomicContext context) throws TargetException {
- return context.createInstance();
- }
-
public InstanceContext getInstanceContext(AtomicContext context) throws TargetException {
- throw new UnsupportedOperationException();
+ return context.createInstance();
}
}
Modified: incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/system/context/SystemAtomicContext.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/system/context/SystemAtomicContext.java?rev=399621&r1=399620&r2=399621&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/system/context/SystemAtomicContext.java (original)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/main/java/org/apache/tuscany/core/system/context/SystemAtomicContext.java Thu May 4 01:52:01 2006
@@ -9,11 +9,8 @@
import org.apache.tuscany.core.context.PojoInstanceContext;
import org.apache.tuscany.core.context.event.InstanceCreated;
import org.apache.tuscany.core.injection.EventInvoker;
-import org.apache.tuscany.model.Scope;
import org.apache.tuscany.spi.QualifiedName;
-import org.apache.tuscany.spi.context.AtomicContext;
import org.apache.tuscany.spi.context.InstanceContext;
-import org.apache.tuscany.spi.context.ScopeContext;
import org.apache.tuscany.spi.context.TargetException;
import org.apache.tuscany.spi.wire.SourceWireFactory;
import org.apache.tuscany.spi.wire.TargetWireFactory;
@@ -23,50 +20,12 @@
*/
public class SystemAtomicContext extends PojoAtomicContext {
- private ScopeContext<AtomicContext> scopeContext;
-
private ObjectFactory<?> objectFactory;
- private boolean eagerInit;
- private EventInvoker<Object> initInvoker;
- private EventInvoker<Object> destroyInvoker;
- public SystemAtomicContext(String name, ScopeContext<AtomicContext> scopeContext, ObjectFactory<?> objectFactory, boolean eagerInit, EventInvoker<Object> initInvoker,
+ public SystemAtomicContext(String name, ObjectFactory<?> objectFactory, boolean eagerInit, EventInvoker<Object> initInvoker,
EventInvoker<Object> destroyInvoker) {
- super(name, scopeContext, objectFactory, eagerInit, initInvoker, destroyInvoker);
- assert (scopeContext != null) : "Scope context was null";
- assert (objectFactory != null) : "Object factory was null";
- if (eagerInit && initInvoker == null) {
- throw new AssertionError("No intialization method found for eager init implementation");
- }
- this.scopeContext = scopeContext;
+ super(name, objectFactory, eagerInit, initInvoker, destroyInvoker);
this.objectFactory = objectFactory;
- this.eagerInit = eagerInit;
- this.initInvoker = initInvoker;
- this.destroyInvoker = destroyInvoker;
- }
-
- public Scope getScope() {
- return scopeContext.getScope();
- }
-
- public boolean isEagerInit() {
- return eagerInit;
- }
-
- public void init(Object instance) throws TargetException {
- if (initInvoker != null) {
- initInvoker.invokeEvent(instance);
- }
- }
-
- public void destroy(Object instance) throws TargetException {
- if (destroyInvoker != null) {
- destroyInvoker.invokeEvent(instance);
- }
- }
-
- public boolean isDestroyable() {
- return (destroyInvoker != null);
}
public Object getTargetInstance() throws TargetException {
@@ -74,7 +33,7 @@
}
public InstanceContext createInstance() throws ObjectCreationException {
- InstanceContext ctx = new PojoInstanceContext(objectFactory.getInstance());
+ InstanceContext ctx = new PojoInstanceContext(this, objectFactory.getInstance());
ctx.start();
publish(new InstanceCreated(this, ctx));
return ctx;
Modified: incubator/tuscany/sandbox/jboynes/sca/core2/src/test/java/org/apache/tuscany/core/mock/context/scope/MockScopeContext.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/test/java/org/apache/tuscany/core/mock/context/scope/MockScopeContext.java?rev=399621&r1=399620&r2=399621&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/test/java/org/apache/tuscany/core/mock/context/scope/MockScopeContext.java (original)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/test/java/org/apache/tuscany/core/mock/context/scope/MockScopeContext.java Thu May 4 01:52:01 2006
@@ -3,6 +3,7 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import org.apache.tuscany.core.AbstractLifecycle;
import org.apache.tuscany.core.context.scope.AbstractScopeContext;
import org.apache.tuscany.model.Scope;
import org.apache.tuscany.spi.context.AtomicContext;
@@ -18,6 +19,7 @@
private Map<Context, InstanceContext> instanceContexts;
private Scope scope;
+ private static final InstanceContext EMPTY = new EmptyContext();
public MockScopeContext() {
this(null);
@@ -33,18 +35,13 @@
return scope;
}
- public Object getInstance(AtomicContext context) throws TargetException {
+ public InstanceContext getInstanceContext(AtomicContext context) throws TargetException {
InstanceContext ctx = instanceContexts.get(context);
- if (ctx == null) {
+ if(ctx == EMPTY){
ctx = context.createInstance();
- context.init(ctx.getInstance());
- instanceContexts.put(context, ctx);
+ instanceContexts.put(context,ctx);
}
- return ctx.getInstance();
- }
-
- public InstanceContext getInstanceContext(AtomicContext context) throws TargetException {
- return instanceContexts.get(context);
+ return ctx;
}
public void onEvent(Event event) {
@@ -52,8 +49,13 @@
}
public void register(AtomicContext context) {
-
+ instanceContexts.put(context, EMPTY);
}
+ private static class EmptyContext extends AbstractLifecycle implements InstanceContext {
+ public Object getInstance() {
+ return null;
+ }
+ }
}
Modified: incubator/tuscany/sandbox/jboynes/sca/core2/src/test/java/org/apache/tuscany/core/system/context/SystemAtomicContextTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/core2/src/test/java/org/apache/tuscany/core/system/context/SystemAtomicContextTestCase.java?rev=399621&r1=399620&r2=399621&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/core2/src/test/java/org/apache/tuscany/core/system/context/SystemAtomicContextTestCase.java (original)
+++ incubator/tuscany/sandbox/jboynes/sca/core2/src/test/java/org/apache/tuscany/core/system/context/SystemAtomicContextTestCase.java Thu May 4 01:52:01 2006
@@ -6,6 +6,8 @@
import org.apache.tuscany.core.injection.MethodEventInvoker;
import org.apache.tuscany.core.injection.PojoObjectFactory;
import org.apache.tuscany.core.mock.context.scope.MockScopeContext;
+import org.apache.tuscany.spi.context.ScopeContext;
+import org.apache.tuscany.spi.context.AtomicContext;
/**
* @version $$Rev$$ $$Date$$
@@ -16,7 +18,9 @@
public void testContextCreationAndInit() throws Exception {
ObjectFactory<Foo> factory = new PojoObjectFactory<Foo>(Foo.class.getConstructor((Class[]) null), null, null);
- SystemAtomicContext context = new SystemAtomicContext("foo", new MockScopeContext(), factory, false, initInvoker, null);
+ ScopeContext<AtomicContext> scopeContext = new MockScopeContext();
+ SystemAtomicContext context = new SystemAtomicContext("foo",factory, false, initInvoker, null);
+ context.setScopeContext(scopeContext);
Foo instance = (Foo) context.getInstance(null);
assertNotNull(instance);
assertTrue(instance.initialized);