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