cziegeler 02/01/07 04:34:13 Modified: src/java/org/apache/cocoon Cocoon.java src/java/org/apache/cocoon/sitemap AbstractSitemap.java Handler.java src/scratchpad/src/org/apache/cocoon/components CocoonComponentManager.java RequestLifecycleComponent.java Added: src/java/org/apache/cocoon/components CocoonComponentManager.java RequestLifecycleComponent.java Log: Finished RequestLifecycleComponent handling Revision Changes Path 1.2 +2 -2 xml-cocoon2/src/java/org/apache/cocoon/Cocoon.java Index: Cocoon.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/Cocoon.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- Cocoon.java 3 Jan 2002 12:31:06 -0000 1.1 +++ Cocoon.java 7 Jan 2002 12:34:12 -0000 1.2 @@ -55,8 +55,8 @@ package org.apache.cocoon; -import org.apache.avalon.excalibur.component.DefaultRoleManager; import org.apache.avalon.excalibur.component.ExcaliburComponentManager; +import org.apache.avalon.excalibur.component.DefaultRoleManager; import org.apache.avalon.excalibur.logger.LogKitManageable; import org.apache.avalon.excalibur.logger.LogKitManager; import org.apache.avalon.framework.activity.Disposable; @@ -104,7 +104,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Pierpaolo Fumagalli</a> (Apache Software Foundation, Exoffice Technologies) * @author <a href="mailto:[EMAIL PROTECTED]">Stefano Mazzocchi</a> * @author <a href="mailto:[EMAIL PROTECTED]">Leo Sutic</a> - * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:06 $ + * @version CVS $Revision: 1.2 $ $Date: 2002/01/07 12:34:12 $ */ public class Cocoon extends AbstractLoggable 1.1 xml-cocoon2/src/java/org/apache/cocoon/components/CocoonComponentManager.java Index: CocoonComponentManager.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. */ package org.apache.cocoon.components; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Stack; import org.apache.avalon.excalibur.component.ExcaliburComponentManager; import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.environment.Source; import org.apache.cocoon.environment.SourceResolver; import org.xml.sax.SAXException; /** * Cocoon Component Manager. * This manager extends the <code>ExcaliburComponentManager</code> * by a special lifecycle handling for a RequestLifecycleComponent. * * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> * @version CVS $Revision: 1.1 $ $Date: 2002/01/07 12:34:12 $ */ public final class CocoonComponentManager extends ExcaliburComponentManager { /** The environment information */ private static InheritableThreadLocal environmentStack = new InheritableThreadLocal(); /** Create the ComponentManager */ public CocoonComponentManager() { super( null, Thread.currentThread().getContextClassLoader() ); } /** Create the ComponentManager with a Classloader */ public CocoonComponentManager( final ClassLoader loader ) { super( null, loader ); } /** Create the ComponentManager with a Classloader and parent ComponentManager */ public CocoonComponentManager( final ComponentManager manager, final ClassLoader loader ) { super(manager, loader); } /** Create the ComponentManager with a parent ComponentManager */ public CocoonComponentManager(final ComponentManager manager) { super(manager); } /** * This hook must be called by the sitemap each time a sitemap is entered */ public static void enterEnvironment(SourceResolver resolver, Map objectModel) { if (environmentStack.get() == null) { environmentStack.set(new Stack()); } final Stack stack = (Stack)environmentStack.get(); stack.push(new Object[] {resolver, objectModel, new HashMap(5)}); } /** * This hook must be called by the sitemap each time a sitemap is left */ public static void leaveEnvironment() { final Stack stack = (Stack)environmentStack.get(); if ( null != stack && !stack.empty()) { final Object[] objects = (Object[])stack.pop(); final Map components = (Map)objects[2]; final Iterator iter = components.values().iterator(); while (iter.hasNext() == true) { final Object[] o = (Object[])iter.next(); final Component component = (Component)o[0]; ((ComponentManager)o[1]).release( component ); } } } /** * Return an instance of a component based on a Role. The Role is usually the Interface's * Fully Qualified Name(FQN)--unless there are multiple Components for the same Role. In that * case, the Role's FQN is appended with "Selector", and we return a ComponentSelector. */ public Component lookup( final String role ) throws ComponentException { final Stack stack = (Stack)environmentStack.get(); if ( null != stack && !stack.empty()) { final Object[] objects = (Object[])stack.peek(); final Map components = (Map)objects[2]; final Object[] o = (Object[])components.get(role); if ( null != o ) { final Component component = (Component) o[0]; if ( null != component ) { return component; } } } 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."); } final Object[] objects = (Object[]) stack.peek(); final Map components = (Map)objects[2]; try { ((RequestLifecycleComponent) component).setup( (SourceResolver)objects[0], (Map)objects[1]); } catch (Exception local) { throw new ComponentException("Exception during setup of RequestLifecycleComponent with role '"+role+"'", local); } components.put( role, new Object[] {component, this}); } return component; } /** * Release a Component. This implementation makes sure it has a handle on the propper * ComponentHandler, and let's the ComponentHandler take care of the actual work. */ public void release( final Component component ) { if( null == component ) { return; } if ( component instanceof RequestLifecycleComponent) { return; } super.release( component); } } 1.1 xml-cocoon2/src/java/org/apache/cocoon/components/RequestLifecycleComponent.java Index: RequestLifecycleComponent.java =================================================================== /***************************************************************************** * Copyright (C) The Apache Software Foundation. All rights reserved. * * ------------------------------------------------------------------------- * * This software is published under the terms of the Apache Software License * * version 1.1, a copy of which has been included with this distribution in * * the LICENSE file. * *****************************************************************************/ package org.apache.cocoon.components; import org.apache.avalon.framework.component.Component; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.environment.SourceResolver; import org.xml.sax.SAXException; import java.io.IOException; import java.util.Map; /** * Objects implementing this marker interface have a lifecycle of one * request. This means if one request is looking up several times * an object implementing this interface, it's always the same object. * In addition, the first time this object is looked up during a request, * the setup() method is called * * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> * @version CVS $Revision: 1.1 $ $Date: 2002/01/07 12:34:12 $ */ public interface RequestLifecycleComponent extends Component { /** * Set the <code>SourceResolver</code>, objectModel <code>Map</code>, * used to process the request. */ void setup(SourceResolver resolver, Map objectModel) throws ProcessingException, SAXException, IOException; } 1.2 +9 -9 xml-cocoon2/src/java/org/apache/cocoon/sitemap/AbstractSitemap.java Index: AbstractSitemap.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/sitemap/AbstractSitemap.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- AbstractSitemap.java 3 Jan 2002 12:31:20 -0000 1.1 +++ AbstractSitemap.java 7 Jan 2002 12:34:13 -0000 1.2 @@ -8,7 +8,6 @@ package org.apache.cocoon.sitemap; -import org.apache.avalon.excalibur.component.ExcaliburComponentManager; import org.apache.avalon.excalibur.component.RoleManager; import org.apache.avalon.excalibur.logger.LogKitManager; import org.apache.avalon.framework.activity.Disposable; @@ -22,6 +21,7 @@ import org.apache.avalon.framework.thread.ThreadSafe; import org.apache.cocoon.Constants; import org.apache.cocoon.acting.Action; +import org.apache.cocoon.components.CocoonComponentManager; import org.apache.cocoon.components.classloader.RepositoryClassLoader; import org.apache.cocoon.components.pipeline.EventPipeline; import org.apache.cocoon.components.pipeline.StreamPipeline; @@ -48,7 +48,7 @@ * Base class for generated <code>Sitemap</code> classes * * @author <a href="mailto:[EMAIL PROTECTED]">Giacomo Pati</a> - * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:20 $ + * @version CVS $Revision: 1.2 $ $Date: 2002/01/07 12:34:13 $ */ public abstract class AbstractSitemap extends AbstractLoggable implements Sitemap, Disposable, ThreadSafe { private Context context; @@ -58,7 +58,7 @@ private static Configuration defaultConfig; /** The component manager instance */ - protected ExcaliburComponentManager manager; + protected CocoonComponentManager manager; /** The sitemap manager instance */ protected Manager sitemapManager; @@ -96,7 +96,7 @@ * <code>Composable</code>. */ public void compose(ComponentManager manager) throws ComponentException { - this.manager = new ExcaliburComponentManager(manager); + this.manager = new CocoonComponentManager(manager); this.manager.setLogger(getLogger()); this.manager.contextualize(this.context); this.manager.setRoleManager(AbstractSitemap.roleManager); @@ -323,7 +323,7 @@ } } - /** + /** * Dumps all sitemap parameters to log */ protected void dumpParameters(List list) { @@ -414,16 +414,16 @@ manager.release((Component)this.selectors); } } - + /** Reset the response if possible. This allows error handlers to have a higher chance to produce clean output if the pipeline that raised the error has already output some data. - + @param objectModel the object model @return true if the response was successfully reset */ - + protected boolean tryResetResponse(Map objectModel) { try { @@ -440,7 +440,7 @@ // Log the error, but don't transmit it getLogger().warn("Problem resetting response", e); } - + getLogger().debug("Response wasn't reset"); return false; } 1.2 +8 -3 xml-cocoon2/src/java/org/apache/cocoon/sitemap/Handler.java Index: Handler.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/sitemap/Handler.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- Handler.java 3 Jan 2002 12:31:20 -0000 1.1 +++ Handler.java 7 Jan 2002 12:34:13 -0000 1.2 @@ -19,6 +19,7 @@ import org.apache.avalon.framework.logger.AbstractLoggable; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.Processor; +import org.apache.cocoon.components.CocoonComponentManager; import org.apache.cocoon.components.language.generator.CompiledComponent; import org.apache.cocoon.components.language.generator.ProgramGenerator; import org.apache.cocoon.components.pipeline.EventPipeline; @@ -41,7 +42,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> * @author <a href="mailto:[EMAIL PROTECTED]">Giacomo Pati</a> * @author <a href="mailto:[EMAIL PROTECTED]">Stefano Mazzocchi</a> - * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:20 $ + * @version CVS $Revision: 1.2 $ $Date: 2002/01/07 12:34:13 $ */ public class Handler extends AbstractLoggable implements Runnable, Contextualizable, Composable, Processor, Disposable, SourceResolver { @@ -74,7 +75,7 @@ // FIXME : ugly hack to pass delay information from the main sitemap configuration // (the way to pass it cleanly from SitemapManager isn't obvious). private static long sitemapCheckDelay = 10000L; // default is 10 secs. - + static void setSitemapCheckDelay(long delay) { sitemapCheckDelay = delay; } @@ -83,7 +84,7 @@ this.check_reload = check_reload; this.sourceFileName = sourceFileName; } - + /** * Contextualizable */ @@ -166,10 +167,12 @@ public boolean process(Environment environment) throws Exception { checkSanity(); SourceHandler oldSourceHandler = environment.getSourceHandler(); + CocoonComponentManager.enterEnvironment(environment, environment.getObjectModel()); try { environment.setSourceHandler(this.sourceHandler); return sitemap.process(environment); } finally { + CocoonComponentManager.leaveEnvironment(); environment.setSourceHandler(oldSourceHandler); } } @@ -178,10 +181,12 @@ EventPipeline eventPipeline) throws Exception { checkSanity(); SourceHandler oldSourceHandler = environment.getSourceHandler(); + CocoonComponentManager.enterEnvironment(environment, environment.getObjectModel()); try { environment.setSourceHandler(this.sourceHandler); return sitemap.process(environment, pipeline, eventPipeline); } finally { + CocoonComponentManager.leaveEnvironment(); environment.setSourceHandler(oldSourceHandler); } } 1.2 +73 -38 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/CocoonComponentManager.java Index: CocoonComponentManager.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/CocoonComponentManager.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- CocoonComponentManager.java 3 Jan 2002 12:31:36 -0000 1.1 +++ CocoonComponentManager.java 7 Jan 2002 12:34:13 -0000 1.2 @@ -7,115 +7,150 @@ */ package org.apache.cocoon.components; +import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Stack; +import org.apache.avalon.excalibur.component.ExcaliburComponentManager; import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; -import org.apache.avalon.excalibur.component.ExcaliburComponentManager; +import org.apache.cocoon.ProcessingException; +import org.apache.cocoon.environment.Source; import org.apache.cocoon.environment.SourceResolver; +import org.xml.sax.SAXException; + /** * Cocoon Component Manager. * This manager extends the <code>ExcaliburComponentManager</code> - * by a special lifecycle handling for RequestLifecycleComponent. + * by a special lifecycle handling for a RequestLifecycleComponent. * * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> - * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:36 $ + * @version CVS $Revision: 1.2 $ $Date: 2002/01/07 12:34:13 $ */ public final class CocoonComponentManager extends ExcaliburComponentManager +implements SourceResolver { - /** The environment information */ - private InheritableThreadLocal environmentStack = new InheritableThreadLocal(); + private static InheritableThreadLocal environmentStack = new InheritableThreadLocal(); + + /** The parent manager */ + private ComponentManager parentManager; /** Create the ComponentManager */ public CocoonComponentManager() { - super(); + super( null, Thread.currentThread().getContextClassLoader() ); } /** Create the ComponentManager with a Classloader */ public CocoonComponentManager( final ClassLoader loader ) { - super(loader); + super( null, loader ); } /** Create the ComponentManager with a Classloader and parent ComponentManager */ public CocoonComponentManager( final ComponentManager manager, final ClassLoader loader ) { - super(manager, loader); + super(manager instanceof CocoonComponentManager ? ((CocoonComponentManager)manager).getParentManager() : manager, loader); + this.parentManager = manager instanceof CocoonComponentManager ? ((CocoonComponentManager)manager).getParentManager() : manager; } /** Create the ComponentManager with a parent ComponentManager */ public CocoonComponentManager(final ComponentManager manager) { - super(manager); + super(manager instanceof CocoonComponentManager ? ((CocoonComponentManager)manager).getParentManager() : manager); + this.parentManager = manager instanceof CocoonComponentManager ? ((CocoonComponentManager)manager).getParentManager() : manager; } - public void enterEnvironment(SourceResolver resolver, Map objectModel) { - System.out.println("Entering environment"); - if (this.environmentStack.get() == null) { - this.environmentStack.set(new Stack()); + /** + * This hook must be called by the sitemap each time a sitemap is entered + */ + public static void enterEnvironment(SourceResolver resolver, Map objectModel) { + System.out.println("Entering environment"+ " - " + Thread.currentThread().getName()); + if (environmentStack.get() == null) { + environmentStack.set(new Stack()); } - final Stack stack = (Stack)this.environmentStack.get(); + final Stack stack = (Stack)environmentStack.get(); stack.push(new Object[] {resolver, objectModel, new HashMap(5)}); } - public void leaveEnvironment() { - System.out.println("Leaving environment"); - final Stack stack = (Stack)this.environmentStack.get(); - if (stack != null) { + /** + * This hook must be called by the sitemap each time a sitemap is left + */ + public static void leaveEnvironment() { + System.out.println("Leaving environment"+ " - " + Thread.currentThread().getName()); + final Stack stack = (Stack)environmentStack.get(); + if ( null != stack && !stack.empty()) { final Object[] objects = (Object[])stack.pop(); final Map components = (Map)objects[2]; final Iterator iter = components.values().iterator(); while (iter.hasNext() == true) { - final Component component = (Component)iter.next(); + final Object[] o = (Object[])iter.next(); + final Component component = (Component)o[0]; System.out.println("RELEASING COMPONENT: " + component); - super.release( component ); + ((ComponentManager)o[1]).release( component ); } + } else { + System.out.println("*** UNBALANCED LEAVE ENVIRONMENT ***"); } } /** + * Resolve the source. + * @param systemID This is either a system identifier + * (<code>java.net.URL</code> or a local file. + */ + public Source resolve(String systemID) + throws ProcessingException, SAXException, IOException { + System.out.println("Resolving source:" + systemID); + return null; + } + + + ComponentManager getParentManager() { + System.out.println("Getting parent!"); + return this.parentManager; + } + + /** * Return an instance of a component based on a Role. The Role is usually the Interface's * Fully Qualified Name(FQN)--unless there are multiple Components for the same Role. In that * case, the Role's FQN is appended with "Selector", and we return a ComponentSelector. */ public Component lookup( final String role ) throws ComponentException { - final Stack stack = (Stack)this.environmentStack.get(); - if ( stack != null ) { - final Object[] objects = (Object[])stack.pop(); + System.out.println("Looking up: " + role + " - " + Thread.currentThread().getName()); + final Stack stack = (Stack)environmentStack.get(); + if ( null != stack && !stack.empty()) { + final Object[] objects = (Object[])stack.peek(); final Map components = (Map)objects[2]; - if ( components != null ) { - final Component component = (Component) components.get(role); - if ( component != null) { - System.out.println("Looked up RequestLifecycleComponent again: " + role); - return component; - } + final Object[] o = (Object[])components.get(role); + final Component component = (Component) o[0]; + if ( component != null) { + System.out.println("Looked up RequestLifecycleComponent again: " + role); + return component; } } final Component component = super.lookup( role ); - if ( component != null && component instanceof RequestLifecycleComponent) { - if ( stack == null) { - throw new ComponentException("ComponentManager has no Environment Stack"); + if ( null != component && component instanceof RequestLifecycleComponent) { + if ( stack == null || stack.empty() ) { + System.out.println("No env"); + return component; + //throw new ComponentException("ComponentManager has no Environment Stack"); } - final Object[] objects = (Object[]) stack.pop(); + final Object[] objects = (Object[]) stack.peek(); final Map components = (Map)objects[2]; - if ( components == null ) { - throw new ComponentException("ComponentManager has no Environment Stack"); - } - components.put( role, component); try { - ((RequestLifecycleComponent) component).setup((SourceResolver)objects[0], (Map)objects[1]); + ((RequestLifecycleComponent) component).setup(this); } catch (Exception local) { throw new ComponentException("Exception during setup of RequestLifecycleComponent with role '"+role+"'", local); } + components.put( role, new Object[] {component, this}); System.out.println("New RequestModelComponent :" + component); } return component; 1.2 +2 -2 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/RequestLifecycleComponent.java Index: RequestLifecycleComponent.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/RequestLifecycleComponent.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- RequestLifecycleComponent.java 3 Jan 2002 12:31:36 -0000 1.1 +++ RequestLifecycleComponent.java 7 Jan 2002 12:34:13 -0000 1.2 @@ -24,7 +24,7 @@ * the setup() method is called * * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> - * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:36 $ + * @version CVS $Revision: 1.2 $ $Date: 2002/01/07 12:34:13 $ */ public interface RequestLifecycleComponent extends Component { @@ -32,6 +32,6 @@ * Set the <code>SourceResolver</code>, objectModel <code>Map</code>, * used to process the request. */ - void setup(SourceResolver resolver, Map objectModel) + void setup(SourceResolver resolver) throws ProcessingException, SAXException, IOException; }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]