You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by lg...@apache.org on 2004/11/21 14:26:03 UTC

svn commit: r106089 - /cocoon/branches/BRANCH_2_1_X/src/blocks/apples/java/org/apache/cocoon/components/flow/apples/ApplesProcessor.java /cocoon/branches/BRANCH_2_1_X/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/JavaInterpreter.java /cocoon/branches/BRANCH_2_1_X/src/blocks/scratchpad/java/org/apache/cocoon/components/flow/javascript/fom/AO_FOM_Cocoon.java /cocoon/branches/BRANCH_2_1_X/src/blocks/scratchpad/java/org/apache/cocoon/components/flow/javascript/fom/AO_FOM_JavaScriptInterpreter.java /cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/AbstractInterpreter.java /cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/ContinuationsManager.java /cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java /cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/Interpreter.java /cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/WebContinuation.java /cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_Cocoon.java /cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_JavaScriptInterpreter.java /cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_WebContinuation.java /cocoon/branches/BRANCH_2_1_X/status.xml

Author: lgawron
Date: Sun Nov 21 05:26:02 2004
New Revision: 106089

Modified:
   cocoon/branches/BRANCH_2_1_X/src/blocks/apples/java/org/apache/cocoon/components/flow/apples/ApplesProcessor.java
   cocoon/branches/BRANCH_2_1_X/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/JavaInterpreter.java
   cocoon/branches/BRANCH_2_1_X/src/blocks/scratchpad/java/org/apache/cocoon/components/flow/javascript/fom/AO_FOM_Cocoon.java
   cocoon/branches/BRANCH_2_1_X/src/blocks/scratchpad/java/org/apache/cocoon/components/flow/javascript/fom/AO_FOM_JavaScriptInterpreter.java
   cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/AbstractInterpreter.java
   cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/ContinuationsManager.java
   cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java
   cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/Interpreter.java
   cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/WebContinuation.java
   cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_Cocoon.java
   cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_JavaScriptInterpreter.java
   cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_WebContinuation.java
   cocoon/branches/BRANCH_2_1_X/status.xml
Log:
Fix: Continuation can only be invoked for the interpreter it was originally created for
- o.a.c.components.flow.ContinuationsManager interface change. Interpreter id has to be passed
  to create a continuation and lookup one. 
- o.a.c.components.flow.ContinuationManagerImpl returns null if interpreter does not match during lookup.
- o.a.c.components.flow.Interpreter interface extended with setInterpreterID method. 
- all current interpreters updated to match new contracts

Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/apples/java/org/apache/cocoon/components/flow/apples/ApplesProcessor.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/apples/java/org/apache/cocoon/components/flow/apples/ApplesProcessor.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/apples/java/org/apache/cocoon/components/flow/apples/ApplesProcessor.java	Sun Nov 21 05:26:02 2004
@@ -53,7 +53,8 @@
 
         WebContinuation wk = null;
         if (!(app instanceof StatelessAppleController)) {
-            wk = this.continuationsMgr.createWebContinuation(app, null, 0, this);
+            wk = this.continuationsMgr.createWebContinuation(app, null, 0,
+                    getInterpreterID(), this);
             if (getLogger().isDebugEnabled())
                 getLogger().debug("Instantiated a stateful apple, continuationid = " + wk.getId());
         }
@@ -79,7 +80,7 @@
         throws Exception {
 
         WebContinuation wk =
-            this.continuationsMgr.lookupWebContinuation(continuationId);
+            this.continuationsMgr.lookupWebContinuation(continuationId, getInterpreterID());
         if (wk == null) {
             // Throw an InvalidContinuationException to be handled inside the
             // <map:handle-errors> sitemap element.

Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/JavaInterpreter.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/JavaInterpreter.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/JavaInterpreter.java	Sun Nov 21 05:26:02 2004
@@ -144,14 +144,15 @@
         context.setRedirector(redirector);
         Parameters parameters = new Parameters();
         for(Iterator i=params.iterator(); i.hasNext();) {
-        	Argument argument = (Argument)i.next();
-        	parameters.setParameter(argument.name, argument.value);
+            Argument argument = (Argument)i.next();
+            parameters.setParameter(argument.name, argument.value);
         }
         context.setParameters(parameters);
 
         Continuation continuation = new Continuation(context);
 
-        WebContinuation wk = continuationsMgr.createWebContinuation(continuation, null, timeToLive, null);
+        WebContinuation wk = continuationsMgr.createWebContinuation(
+                continuation, null, timeToLive, getInterpreterID(), null);
         FlowHelper.setWebContinuation(ContextHelper.getObjectModel(this.avalonContext), wk);
 
         continuation.registerThread();
@@ -195,7 +196,7 @@
         if (!initialized)
             initialize();
 
-        WebContinuation parentwk = continuationsMgr.lookupWebContinuation(id);
+        WebContinuation parentwk = continuationsMgr.lookupWebContinuation(id, getInterpreterID());
 
         if (parentwk == null) {
             /*
@@ -216,8 +217,8 @@
         context.setRedirector(redirector);
         Parameters parameters = new Parameters();
         for(Iterator i=params.iterator(); i.hasNext();) {
-        	Argument argument = (Argument)i.next();
-        	parameters.setParameter(argument.name, argument.value);
+            Argument argument = (Argument)i.next();
+            parameters.setParameter(argument.name, argument.value);
         }
         context.setParameters(parameters);
 
@@ -230,8 +231,8 @@
         Continuable flow = (Continuable) context.getObject();
         Method method = context.getMethod();
 
-        WebContinuation wk =
-                continuationsMgr.createWebContinuation(continuation, parentwk, timeToLive, null);
+        WebContinuation wk = continuationsMgr.createWebContinuation(
+                continuation, parentwk, timeToLive, getInterpreterID(), null);
         FlowHelper.setWebContinuation(ContextHelper.getObjectModel(this.avalonContext), wk);
 
         continuation.registerThread();

Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/scratchpad/java/org/apache/cocoon/components/flow/javascript/fom/AO_FOM_Cocoon.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/scratchpad/java/org/apache/cocoon/components/flow/javascript/fom/AO_FOM_Cocoon.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/scratchpad/java/org/apache/cocoon/components/flow/javascript/fom/AO_FOM_Cocoon.java	Sun Nov 21 05:26:02 2004
@@ -124,6 +124,7 @@
                 contMgr.createWebContinuation(continuation,
                                               lastContinuation,
                                               0,
+                                              interpreter.getInterpreterID(),
                                               null);
         }
         
@@ -248,7 +249,7 @@
         public FOM_Request(Object request) {
             this.request = (Request)unwrap(request);
         }
-		
+        
         public String getClassName() {
             return "FOM_Request";
         }
@@ -675,7 +676,7 @@
         
         /* TODO: Vote on the inclusion of this method
         public String jsFunction_getRealPath(String path) {
-        	return context.getRealPath(path);
+            return context.getRealPath(path);
         }
         */
     }
@@ -926,6 +927,7 @@
         wk = contMgr.createWebContinuation(unwrap(k),
                                            (parent == null ? null : parent.getWebContinuation()),
                                            timeToLive,
+                                           interpreter.getInterpreterID(),
                                            null);
         FOM_WebContinuation result = new FOM_WebContinuation(wk);
         result.setParentScope(getParentScope());

Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/scratchpad/java/org/apache/cocoon/components/flow/javascript/fom/AO_FOM_JavaScriptInterpreter.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/scratchpad/java/org/apache/cocoon/components/flow/javascript/fom/AO_FOM_JavaScriptInterpreter.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/scratchpad/java/org/apache/cocoon/components/flow/javascript/fom/AO_FOM_JavaScriptInterpreter.java	Sun Nov 21 05:26:02 2004
@@ -652,7 +652,7 @@
                                    Redirector redirector)
         throws Exception
     {
-        WebContinuation wk = continuationsMgr.lookupWebContinuation(id);
+        WebContinuation wk = continuationsMgr.lookupWebContinuation(id, getInterpreterID());
 
         if (wk == null) {
 

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/AbstractInterpreter.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/AbstractInterpreter.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/AbstractInterpreter.java	Sun Nov 21 05:26:02 2004
@@ -103,7 +103,7 @@
      *
      * @return a unique ID for this interpreter
      */
-    protected String getInterpreterID() {
+    public String getInterpreterID() {
         return this.instanceID;
     }
 

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/ContinuationsManager.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/ContinuationsManager.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/ContinuationsManager.java	Sun Nov 21 05:26:02 2004
@@ -31,7 +31,7 @@
  * @author <a href="mailto:ovidiu@cup.hp.com">Ovidiu Predescu</a>
  * @since March 19, 2002
  * @see WebContinuation
- * @version CVS $Id: ContinuationsManager.java,v 1.6 2004/03/05 13:02:46 bdelacretaz Exp $
+ * @version CVS $Id$
  */
 public interface ContinuationsManager {
     public final String ROLE = ContinuationsManager.class.getName();
@@ -47,6 +47,7 @@
      * @param timeToLive an <code>int</code> value indicating how long
      * in seconds this continuation will live in the server if not
      * accessed
+     * @param interpreterId id of interpreter invoking continuation creation
      * @param disposer a <code>ContinuationsDisposer</code> instance to called when 
      * the continuation gets cleaned up.
      * @return a <code>WebContinuation</code> value
@@ -55,6 +56,7 @@
     public WebContinuation createWebContinuation(Object kont,
                                                  WebContinuation parentKont,
                                                  int timeToLive,
+                                                 String interpreterId,
                                                  ContinuationsDisposer disposer);
 
     /**
@@ -71,12 +73,16 @@
     /**
      * Given a <code>WebContinuation</code> id, retrieve the associated
      * <code>WebContinuation</code> object.
-     *
      * @param id a <code>String</code> value
-     * @return a <code>WebContinuation</code> object, or null if no such
-     * <code>WebContinuation</code> could be found.
+     * @param interpreterId Id of an interpreter that queries for 
+     * the continuation
+     *
+     * @return a <code>WebContinuation</code> object, null if no such
+     * <code>WebContinuation</code> could be found. Also null if 
+     * <code>WebContinuation</code> was found but interpreter id does 
+     * not match the one that the continuation was initialy created for.
      */
-    public WebContinuation lookupWebContinuation(String id);
+    public WebContinuation lookupWebContinuation(String id, String interpreterId);
 
     /**
      * Prints debug information about all web continuations into the log file.

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/ContinuationsManagerImpl.java	Sun Nov 21 05:26:02 2004
@@ -168,10 +168,11 @@
     public WebContinuation createWebContinuation(Object kont,
                                                  WebContinuation parent,
                                                  int timeToLive,
+                                                 String interpreterId, 
                                                  ContinuationsDisposer disposer) {
         int ttl = (timeToLive == 0 ? defaultTimeToLive : timeToLive);
 
-        WebContinuation wk = generateContinuation(kont, parent, ttl, disposer);
+        WebContinuation wk = generateContinuation(kont, parent, ttl, interpreterId, disposer);
         wk.enableLogging(getLogger());
 
         if (parent == null) {
@@ -198,10 +199,11 @@
         return wk;
     }
 
-    public WebContinuation lookupWebContinuation(String id) {
+    public WebContinuation lookupWebContinuation(String id, String interpreterId) {
         // REVISIT: Is the following check needed to avoid threading issues:
         // return wk only if !(wk.hasExpired) ?
-        return (WebContinuation) idToWebCont.get(id);
+        WebContinuation kont = (WebContinuation) idToWebCont.get(id);
+        return (kont.interpreterMatches(interpreterId)) ? kont : null;
     }
 
     /**
@@ -215,6 +217,7 @@
      * @param kont an <code>Object</code> value representing continuation
      * @param parent value representing parent <code>WebContinuation</code>
      * @param ttl <code>WebContinuation</code> time to live
+     * @param interpreterId id of interpreter invoking continuation creation
      * @param disposer <code>ContinuationsDisposer</code> instance to use for
      * cleanup of the continuation.
      * @return the generated <code>WebContinuation</code> with unique identifier
@@ -222,7 +225,8 @@
     private WebContinuation generateContinuation(Object kont,
                                                  WebContinuation parent,
                                                  int ttl,
-                                                 ContinuationsDisposer disposer) {
+                                                 String interpreterId,
+                                                 ContinuationsDisposer disposer ) {
 
         char[] result = new char[bytes.length * 2];
         WebContinuation wk = null;
@@ -239,7 +243,7 @@
             final String id = new String(result);
             synchronized (idToWebCont) {
                 if (!idToWebCont.containsKey(id)) {
-                    wk = new WebContinuation(id, kont, parent, ttl, disposer);
+                    wk = new WebContinuation(id, kont, parent, ttl, interpreterId, disposer);
                     idToWebCont.put(id, wk);
                     continuationsCount.setValue(idToWebCont.size());
                     break;

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/Interpreter.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/Interpreter.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/Interpreter.java	Sun Nov 21 05:26:02 2004
@@ -93,7 +93,12 @@
 
     public static final String ROLE = Interpreter.class.getName();
 
-    /**
+	/**
+	 * @return the unique ID for this interpreter.
+	 */
+	String getInterpreterID();
+	
+	/**
      * Set the unique ID for this interpreter.
      */
     void setInterpreterID(String interpreterID);

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/WebContinuation.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/WebContinuation.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/WebContinuation.java	Sun Nov 21 05:26:02 2004
@@ -19,6 +19,7 @@
 import java.util.List;
 
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.commons.lang.StringUtils;
 
 /**
  * Representation of continuations in a Web environment.
@@ -34,7 +35,7 @@
  *
  * @author <a href="mailto:ovidiu@cup.hp.com">Ovidiu Predescu</a>
  * @since March 19, 2002
- * @version CVS $Id: WebContinuation.java,v 1.9 2004/05/17 18:50:53 vgritsenko Exp $
+ * @version CVS $Id$
  */
 public class WebContinuation extends AbstractLogEnabled
                              implements Comparable {
@@ -67,6 +68,11 @@
      * The continuation id used to represent this instance in Web pages.
      */
     protected String id;
+    
+    /**
+     * Interpreter id that this continuation is bound to
+     */
+    protected String interpreterId;
 
     /**
      * A user definable object. This is present for convenience, to
@@ -113,12 +119,14 @@
                     Object continuation,
                     WebContinuation parentContinuation,
                     int timeToLive,
+                    String interpreterId,
                     ContinuationsDisposer disposer) {
         this.id = id;
         this.continuation = continuation;
         this.parentContinuation = parentContinuation;
         this.updateLastAccessTime();
         this.timeToLive = timeToLive;
+        this.interpreterId = interpreterId;
         this.disposer = disposer;
 
         if (parentContinuation != null) {
@@ -363,5 +371,9 @@
      */
     public boolean disposed() {
         return this.continuation == null;
+    }
+    
+    public boolean interpreterMatches( String interpreterId ) {
+        return StringUtils.equals( this.interpreterId, interpreterId );
     }
 }

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_Cocoon.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_Cocoon.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_Cocoon.java	Sun Nov 21 05:26:02 2004
@@ -1237,7 +1237,7 @@
 
         /* TODO: Vote on the inclusion of this method
         public String jsFunction_getRealPath(String path) {
-        	return context.getRealPath(path);
+            return context.getRealPath(path);
         }
         */
 
@@ -1470,6 +1470,14 @@
     }
 
     /**
+     * Required by FOM_WebContinuation. This way we do not make whole Interpreter public
+     * @return interpreter Id associated with this FOM.
+     */
+    public String getInterpreterId() {
+        return getInterpreter().getInterpreterID();
+    }
+    
+    /**
      * Call the Cocoon Sitemap to process a page
      * @param uri Uri to match
      * @param bean Input to page
@@ -1572,6 +1580,7 @@
         wk = contMgr.createWebContinuation(unwrap(k),
                                            (parent == null ? null : parent.getWebContinuation()),
                                            timeToLive,
+                                           getInterpreter().getInterpreterID(),
                                            null);
         FOM_WebContinuation result = new FOM_WebContinuation(wk);
         result.setParentScope(getParentScope());

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_JavaScriptInterpreter.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_JavaScriptInterpreter.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_JavaScriptInterpreter.java	Sun Nov 21 05:26:02 2004
@@ -758,7 +758,7 @@
     public void handleContinuation(String id, List params,
                                    Redirector redirector) throws Exception
     {
-        WebContinuation wk = continuationsMgr.lookupWebContinuation(id);
+        WebContinuation wk = continuationsMgr.lookupWebContinuation(id, getInterpreterID());
 
         if (wk == null) {
             /*

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_WebContinuation.java
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_WebContinuation.java	(original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_WebContinuation.java	Sun Nov 21 05:26:02 2004
@@ -90,6 +90,7 @@
         wk = contMgr.createWebContinuation(c,
                                            (parent == null ? null : parent.getWebContinuation()),
                                            timeToLive,
+                                           cocoon.getInterpreterId(), 
                                            null);
         result = new FOM_WebContinuation(wk);
         result.setParentScope(getTopLevelScope(scope));

Modified: cocoon/branches/BRANCH_2_1_X/status.xml
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/status.xml	(original)
+++ cocoon/branches/BRANCH_2_1_X/status.xml	Sun Nov 21 05:26:02 2004
@@ -78,6 +78,7 @@
   <person name="Gerhard Froehlich" email="froehlich@apache.org" id="GF"/>
   <person name="Pierpaolo Fumagalli" email="pier@apache.org" id="PF"/>
   <person name="Antonio Gallardo" email="antonio@apache.org" id="AG"/>
+  <person name="Leszek Gawron" email="lgawron@apache.org" id="LG"/>
   <person name="Ralph Goers" email="rgoers@apache.org" id="RG"/>
   <person name="Vadim Gritsenko" email="vgritsenko@apache.org" id="VG"/>
   <person name="Christian Haul" email="haul@apache.org" id="CH"/>
@@ -203,6 +204,9 @@
  <release version="@version@" date="@date@">
   <action dev="NN" type="add">
     Dummy
+  </action>
+  <action dev="LG" type="fix">
+    Fix: Continuation can only be invoked for the interpreter it was originally created for.
   </action>
  </release>
  <release version="2.1.6" date="November 19 2004">