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/04/14 04:12:14 UTC

svn commit: r394001 - in /incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context: event/SessionStart.java scope/RequestScopeContext.java scope/SessionScopeContext.java

Author: jmarino
Date: Thu Apr 13 19:12:12 2006
New Revision: 394001

URL: http://svn.apache.org/viewcvs?rev=394001&view=rev
Log:
add support for true eager init of session scoped impls

Added:
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionStart.java
Modified:
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/RequestScopeContext.java
    incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/SessionScopeContext.java

Added: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionStart.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionStart.java?rev=394001&view=auto
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionStart.java (added)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionStart.java Thu Apr 13 19:12:12 2006
@@ -0,0 +1,10 @@
+package org.apache.tuscany.core.context.event;
+
+/**
+ * Propagated when a session starts
+ *
+ * @version $$Rev$$ $$Date$$
+ */
+public interface SessionStart extends SessionEvent{
+
+}

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/RequestScopeContext.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/RequestScopeContext.java?rev=394001&r1=394000&r2=394001&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/RequestScopeContext.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/RequestScopeContext.java Thu Apr 13 19:12:12 2006
@@ -34,7 +34,10 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * An implementation of a request-scoped component container.
+ * An implementation of a request-scoped component container.  This scope contexts eagerly starts contexts when
+ * a {@link org.apache.tuscany.core.context.event.RequestStart} event is received. If a contained context has an implementation marked to eagerly initialized,
+ * the an instance will be created at that time as well. Contained contexts are shutdown when a {@link org.apache.tuscany.core.context.event.RequestEnd}
+ * event is received in reverse order to which their implementation instances were created.
  * 
  * @version $Rev$ $Date$
  */

Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/SessionScopeContext.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/SessionScopeContext.java?rev=394001&r1=394000&r2=394001&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/SessionScopeContext.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/SessionScopeContext.java Thu Apr 13 19:12:12 2006
@@ -23,22 +23,27 @@
 import org.apache.tuscany.core.context.EventContext;
 import org.apache.tuscany.core.context.ScopeRuntimeException;
 import org.apache.tuscany.core.context.TargetException;
-import org.apache.tuscany.core.context.event.InstanceCreated;
 import org.apache.tuscany.core.context.event.Event;
 import org.apache.tuscany.core.context.event.HttpSessionEvent;
+import org.apache.tuscany.core.context.event.InstanceCreated;
 import org.apache.tuscany.core.context.event.SessionEnd;
+import org.apache.tuscany.core.context.event.SessionStart;
 
-import java.util.Map;
-import java.util.List;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.ListIterator;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * An implementation of an session-scoped component container
+ * An implementation of an session-scoped component container.  This scope contexts eagerly starts contexts when a
+ * {@link org.apache.tuscany.core.context.event.SessionStart} event is received. If a contained context has an implementation
+ * marked to eagerly initialized, the an instance will be created at that time as well. Contained contexts are shutdown when a
+ * {@link org.apache.tuscany.core.context.event.SessionEnd} event is received in reverse order to which their implementation
+ * instances were created.
  * TODO this implementation needs to be made generic so that it supports a range of session types, i.e. not tied to HTTP
- * session scope 
- * 
+ * session scope
+ *
  * @version $Rev$ $Date$
  */
 public class SessionScopeContext extends AbstractScopeContext {
@@ -74,16 +79,20 @@
     }
 
     public void onEvent(Event event) {
-        if (event instanceof SessionEnd){
+        if (event instanceof SessionStart) {
+            checkInit();
+            Object key = ((SessionEnd) event).getId();
+            getSessionContexts(key);
+       }else if (event instanceof SessionEnd) {
             checkInit();
-            Object key = ((SessionEnd)event).getId();
+            Object key = ((SessionEnd) event).getId();
             shutdownContexts(key);
             destroyComponentContext(key);
-        }else if(event instanceof InstanceCreated){
+        } else if (event instanceof InstanceCreated) {
             checkInit();
             Object sessionKey = getEventContext().getIdentifier(HttpSessionEvent.HTTP_IDENTIFIER);
             List<Context> shutdownQueue = destroyQueues.get(sessionKey);
-            Context context = (Context)event.getSource();
+            Context context = (Context) event.getSource();
             assert(shutdownQueue != null): "Shutdown queue not found for key";
             shutdownQueue.add(context);
         }
@@ -108,13 +117,13 @@
             if (configuration != null) {
                 context = configuration.createContext();
                 context.start();
-                if (context instanceof AtomicContext){
-                    ((AtomicContext)context).init();
+                if (context instanceof AtomicContext) {
+                    ((AtomicContext) context).init();
                 }
 
                 ctxs.put(context.getName(), context);
                 List<Context> shutdownQueue = destroyQueues.get(getEventContext().getIdentifier(HttpSessionEvent.HTTP_IDENTIFIER));
-                synchronized(shutdownQueue){
+                synchronized (shutdownQueue) {
                     shutdownQueue.add(context);
                 }
                 context.addListener(this);
@@ -151,7 +160,7 @@
         components.remove(ctxName);
         Map<String, Context> definitions = contexts.get(key);
         Context ctx = definitions.get(ctxName);
-        if (ctx != null){
+        if (ctx != null) {
             destroyQueues.get(key).remove(ctx);
         }
         definitions.remove(ctxName);
@@ -161,7 +170,14 @@
      * Returns and, if necessary, creates a context for the current sesion
      */
     private Map<String, Context> getSessionContexts() throws CoreRuntimeException {
-        Object key = getEventContext().getIdentifier(HttpSessionEvent.HTTP_IDENTIFIER);
+       Object key = getEventContext().getIdentifier(HttpSessionEvent.HTTP_IDENTIFIER);
+        return getSessionContexts(key);
+    }
+
+    /**
+     * Returns and, if necessary, creates a context for the given session key
+     */
+    private Map<String, Context> getSessionContexts(Object key) throws CoreRuntimeException {
         if (key == null) {
             throw new ScopeRuntimeException("Session key not set in request context");
         }
@@ -186,7 +202,7 @@
                 AtomicContext atomic = (AtomicContext) context;
                 if (atomic.isEagerInit()) {
                     atomic.init();  // Notify the instance
-                    synchronized(shutdownQueue){
+                    synchronized (shutdownQueue) {
                         shutdownQueue.add(context);
                     }
                 }
@@ -208,17 +224,17 @@
     private synchronized void shutdownContexts(Object key) {
         List<Context> destroyQueue = destroyQueues.remove(key);
         if (destroyQueue == null || destroyQueue.size() == 0) {
-             return;
+            return;
         }
         // shutdown destroyable instances in reverse instantiation order
         ListIterator<Context> iter = destroyQueue.listIterator(destroyQueue.size());
-        synchronized(destroyQueue){
-            while(iter.hasPrevious()){
+        synchronized (destroyQueue) {
+            while (iter.hasPrevious()) {
                 Context context = iter.previous();
                 if (context.getLifecycleState() == RUNNING) {
                     try {
-                        if (context instanceof AtomicContext){
-                            ((AtomicContext)context).destroy();
+                        if (context instanceof AtomicContext) {
+                            ((AtomicContext) context).destroy();
                         }
                     } catch (TargetException e) {
                         // TODO send a monitoring event
@@ -227,11 +243,11 @@
             }
         }
         // shutdown contexts
-        Map<String,Context> currentContexts = contexts.remove(Thread.currentThread());
-        if (currentContexts == null){
+        Map<String, Context> currentContexts = contexts.remove(Thread.currentThread());
+        if (currentContexts == null) {
             return;
         }
-        for (Context context: currentContexts.values()){
+        for (Context context : currentContexts.values()) {
             if (context.getLifecycleState() == RUNNING) {
                 context.stop();
             }