cziegeler 2002/12/02 00:39:17
Modified: src/java/org/apache/cocoon/environment/wrapper
EnvironmentWrapper.java
src/java/org/apache/cocoon/environment
ObjectModelHelper.java
src/java/org/apache/cocoon/components/source/impl
SitemapSource.java
src/java/org/apache/cocoon/components EnvironmentStack.java
CocoonComponentManager.java
Log:
Finally fixing environment stack handling for multi-threading
Fixing recycling of sources
Fixing minor bug in EnvironmentWrapper constructor
Adding possibility to pass objects from the outer pipeline to an internal one
Revision Changes Path
1.22 +12 -8
xml-cocoon2/src/java/org/apache/cocoon/environment/wrapper/EnvironmentWrapper.java
Index: EnvironmentWrapper.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/environment/wrapper/EnvironmentWrapper.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- EnvironmentWrapper.java 24 Sep 2002 08:46:35 -0000 1.21
+++ EnvironmentWrapper.java 2 Dec 2002 08:39:17 -0000 1.22
@@ -131,7 +131,7 @@
Logger logger,
boolean rawMode)
throws MalformedURLException {
- this(env, requestURI, queryString, logger, null, false);
+ this(env, requestURI, queryString, logger, null, rawMode);
}
/**
@@ -155,13 +155,17 @@
this.prefix = new StringBuffer(env.getURIPrefix());
// create new object model and replace the request object
- this.objectModel = new HashMap(4);
Map oldObjectModel = env.getObjectModel();
- Iterator keys = oldObjectModel.keySet().iterator();
- String key;
- while (keys.hasNext()) {
- key = (String)keys.next();
- this.objectModel.put(key, oldObjectModel.get(key));
+ if (oldObjectModel instanceof HashMap) {
+ this.objectModel = (Map)((HashMap)oldObjectModel).clone();
+ } else {
+ this.objectModel = new HashMap(oldObjectModel.size()*2);
+ Iterator entries = oldObjectModel.entrySet().iterator();
+ Map.Entry entry;
+ while (entries.hasNext()) {
+ entry = (Map.Entry)entries.next();
+ this.objectModel.put(entry.getKey(), entry.getValue());
+ }
}
this.request = new
RequestWrapper(ObjectModelHelper.getRequest(oldObjectModel),
requestURI,
1.7 +5 -1
xml-cocoon2/src/java/org/apache/cocoon/environment/ObjectModelHelper.java
Index: ObjectModelHelper.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/environment/ObjectModelHelper.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ObjectModelHelper.java 19 Aug 2002 11:14:05 -0000 1.6
+++ ObjectModelHelper.java 2 Dec 2002 08:39:17 -0000 1.7
@@ -86,6 +86,10 @@
/** Key for the environment {@link Context} in the object model. */
public final static String EXPIRES_OBJECT = "expires";
+ /** Key for a {@link Map} containing information from
+ * a parent request provided to a sub-request (internal processing) */
+ public final static String PARENT_CONTEXT = "parent-context";
+
private ObjectModelHelper() {
// Forbid instantiation
}
1.25 +9 -2
xml-cocoon2/src/java/org/apache/cocoon/components/source/impl/SitemapSource.java
Index: SitemapSource.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/source/impl/SitemapSource.java,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- SitemapSource.java 20 Nov 2002 14:23:33 -0000 1.24
+++ SitemapSource.java 2 Dec 2002 08:39:17 -0000 1.25
@@ -50,13 +50,13 @@
*/
package org.apache.cocoon.components.source.impl;
+import org.apache.excalibur.source.Recyclable;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceException;
import org.apache.excalibur.source.SourceNotFoundException;
import org.apache.excalibur.source.SourceValidity;
import org.apache.excalibur.source.impl.validity.AggregatedValidity;
-import org.apache.avalon.excalibur.pool.Recyclable;
import org.apache.avalon.excalibur.xml.XMLizable;
import org.apache.avalon.framework.component.ComponentException;
@@ -68,6 +68,8 @@
import org.apache.cocoon.components.EnvironmentStack;
import org.apache.cocoon.components.pipeline.ProcessingPipeline;
import org.apache.cocoon.environment.Environment;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
import org.apache.cocoon.environment.wrapper.EnvironmentWrapper;
import org.apache.cocoon.xml.AbstractXMLConsumer;
import org.apache.cocoon.xml.ContentHandlerWrapper;
@@ -203,6 +205,11 @@
"cocoon://" + requestURI + "?" + queryString;
this.environment = new EnvironmentWrapper(env, requestURI, queryString,
logger, manager, rawMode);
+ if ( null != parameters ) {
+ this.environment.getObjectModel().put(ObjectModelHelper.PARENT_CONTEXT,
parameters);
+ } else {
+
this.environment.getObjectModel().remove(ObjectModelHelper.PARENT_CONTEXT);
+ }
this.uri = uri;
this.discardValidity();
}
1.3 +9 -1
xml-cocoon2/src/java/org/apache/cocoon/components/EnvironmentStack.java
Index: EnvironmentStack.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/EnvironmentStack.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- EnvironmentStack.java 21 Nov 2002 08:42:19 -0000 1.2
+++ EnvironmentStack.java 2 Dec 2002 08:39:17 -0000 1.3
@@ -60,7 +60,9 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
* @version CVS $Id$
*/
-public final class EnvironmentStack extends ArrayStack {
+public final class EnvironmentStack
+ extends ArrayStack
+ implements Cloneable {
int offset;
@@ -82,6 +84,12 @@
public int getOffset() {
return this.offset;
+ }
+
+ public Object clone() {
+ EnvironmentStack old = (EnvironmentStack) super.clone();
+ old.offset = offset;
+ return old;
}
}
1.42 +33 -4
xml-cocoon2/src/java/org/apache/cocoon/components/CocoonComponentManager.java
Index: CocoonComponentManager.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/CocoonComponentManager.java,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- CocoonComponentManager.java 22 Nov 2002 06:37:46 -0000 1.41
+++ CocoonComponentManager.java 2 Dec 2002 08:39:17 -0000 1.42
@@ -94,7 +94,7 @@
/** The environment information */
- private static InheritableThreadLocal environmentStack = new
InheritableThreadLocal();
+ private static InheritableThreadLocal environmentStack = new
CloningInheritableThreadLocal();
/** The configured <code>SourceResolver</code> */
private SourceResolver sourceResolver;
@@ -226,6 +226,12 @@
*/
public Component lookup( final String role )
throws ComponentException {
+ if( null == role ) {
+ final String message =
+ "ComponentLocator Attempted to retrieve component with null role.";
+
+ throw new ComponentException( role, message );
+ }
if ( role.equals(SourceResolver.ROLE) ) {
if ( null == this.sourceResolver ) {
this.sourceResolver = (SourceResolver) super.lookup( role );
@@ -249,7 +255,7 @@
final Component component = super.lookup( role );
if (null != component && component instanceof RequestLifecycleComponent) {
if (stack == null || stack.empty()) {
- throw new ComponentException("ComponentManager has no Environment
Stack.");
+ throw new ComponentException(role, "ComponentManager has no
Environment Stack.");
}
final Object[] objects = (Object[]) stack.getCurrent();
final Map objectModel = ((Environment)objects[0]).getObjectModel();
@@ -288,7 +294,7 @@
}
}
} catch (Exception local) {
- throw new ComponentException("Exception during setup of
RequestLifecycleComponent with role '"+role+"'", local);
+ throw new ComponentException(role, "Exception during setup
of RequestLifecycleComponent.", local);
}
desc.addRequestLifecycleComponent(role, component, this);
}
@@ -551,4 +557,27 @@
}
}
+final class CloningInheritableThreadLocal
+ extends InheritableThreadLocal {
+
+ /**
+ * Computes the child's initial value for this InheritableThreadLocal
+ * as a function of the parent's value at the time the child Thread is
+ * created. This method is called from within the parent thread before
+ * the child is started.
+ * <p>
+ * This method merely returns its input argument, and should be overridden
+ * if a different behavior is desired.
+ *
+ * @param parentValue the parent thread's value
+ * @return the child thread's initial value
+ */
+ protected Object childValue(Object parentValue) {
+ if ( null != parentValue) {
+ return ((EnvironmentStack)parentValue).clone();
+ } else {
+ return null;
+ }
+ }
+}
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]