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]

Reply via email to