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);