Hi Geoff,

I think the reason is, that the PartSourceFactory isn't ThreadSafe. So
every time you access a PartSourceFactory a new Component is created and
the contextualize Method is called.
Calling "this.objectModel = ContextHelper.getObjectModel(context)" inside
the "contextualize"-Method can't work, because contextualize is called only
once. You need to call "ContextHelper.getObjectModel(context)" inside the
actual Thead, instead you don't get the right objectModel.

My proposal is change getSource to:

public Source getSource(String uri, Map parameters) throws IOException,
MalformedURLException
{
    return new PartSource(uri, ContextHelper.getObjectModel(this.context));
}

Volker




Oh, by the way - when I was testing this I traced things through a few
times with the debugger and found that contextualize() is being called
twice for each request.  Is that expected?  Is there any conceivable
mis-coding or mis-configuration of the component that could cause this?

Geoff

[EMAIL PROTECTED] wrote:

>ghoward     2003/10/25 15:31:39
>
>  Modified:    src/java/org/apache/cocoon/components/source/impl
>                        PartSource.java PartSourceFactory.java
>  Log:
>  use contextualize instead of static
>
>  CocoonComponentManager.getCurrentEnvironment()
>
>
>
>
>  Revision  Changes    Path
>  1.2       +2 -7
cocoon-2.1/src/java/org/apache/cocoon/components/source/impl/PartSource.java

>
>  Index: PartSource.java
>  ===================================================================
>  RCS file:
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/source/impl/PartSource.java,v

>  retrieving revision 1.1
>  retrieving revision 1.2
>  diff -u -r1.1 -r1.2
>  --- PartSource.java         23 Oct 2003 01:45:34 -0000          1.1
>  +++ PartSource.java         25 Oct 2003 22:31:39 -0000          1.2
>  @@ -58,8 +58,6 @@
>   import org.apache.cocoon.servlet.multipart.Part;
>   import org.apache.cocoon.environment.ObjectModelHelper;
>   import org.apache.cocoon.environment.Request;
>  -import org.apache.cocoon.components.CocoonComponentManager;
>  -
>   import java.net.MalformedURLException;
>   import java.util.Map;
>   import java.io.IOException;
>  @@ -91,7 +89,7 @@
>        * @throws SourceException
>        * @throws MalformedURLException
>        */
>  -         public PartSource(String uri) throws MalformedURLException,
SourceException
>  +         public PartSource(String uri, Map objectModel) throws
MalformedURLException, SourceException
>            {
>                        // set the uri for use in getURI()
>                this.uri = uri;
>  @@ -110,9 +108,6 @@
>
>                        // get the request parameter name: the bit after
://
>                        String location = uri.substring(position + 2);
>  -
>  -                     // get the object model from the component
managers curr env.
>  -                     Map objectModel =
CocoonComponentManager.getCurrentEnvironment().getObjectModel();
>
>                        // get the cocoon request from the object model.
>                        Request request =
ObjectModelHelper.getRequest(objectModel);
>
>
>
>  1.2       +16 -3
cocoon-2.1/src/java/org/apache/cocoon/components/source/impl/PartSourceFactory.java

>
>  Index: PartSourceFactory.java
>  ===================================================================
>  RCS file:
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/source/impl/PartSourceFactory.java,v

>  retrieving revision 1.1
>  retrieving revision 1.2
>  diff -u -r1.1 -r1.2
>  --- PartSourceFactory.java        23 Oct 2003 01:45:34 -0000
1.1
>  +++ PartSourceFactory.java        25 Oct 2003 22:31:39 -0000
1.2
>  @@ -50,6 +50,9 @@
>   */
>   package org.apache.cocoon.components.source.impl;
>
>  +import org.apache.avalon.framework.context.ContextException;
>  +import org.apache.avalon.framework.context.Contextualizable;
>  +import org.apache.cocoon.components.ContextHelper;
>   import org.apache.excalibur.source.Source;
>   import org.apache.excalibur.source.SourceFactory;
>
>  @@ -62,16 +65,18 @@
>    *
>    * @author <a href="mailto:[EMAIL PROTECTED]">Paul Crabtree</a>
>    */
>  -public class PartSourceFactory implements SourceFactory
>  +public class PartSourceFactory implements SourceFactory,
Contextualizable
>   {
>  -         /*
>  +         Map objectModel;
>  +
>  +    /*
>             * Returns a new [EMAIL PROTECTED] PartSource} based on the uri.
>             *
>             * @see
org.apache.excalibur.source.SourceFactory#getSource(java.lang.String,
java.util.Map)
>             */
>       public Source getSource(String uri, Map parameters) throws
IOException, MalformedURLException
>       {
>  -        return new PartSource(uri);
>  +        return new PartSource(uri, this.objectModel);
>       }
>
>            /**
>  @@ -82,5 +87,13 @@
>       public void release(Source source)
>       {
>           // Nothing to do here
>  +    }
>  +
>  +         /**
>  +     * Get the objectModel from the Context
>  +     */
>  +    public void
contextualize(org.apache.avalon.framework.context.Context context)
>  +    throws ContextException {
>  +         this.objectModel = ContextHelper.getObjectModel(context);
>       }
>   }
>
>
>
>
>
>
>
>







Reply via email to