cziegeler 02/05/29 02:12:04 Modified: . todo.xml src/java/org/apache/cocoon/components CocoonComponentManager.java src/java/org/apache/cocoon/components/pipeline AbstractProcessingPipeline.java src/java/org/apache/cocoon/components/treeprocessor InvokeContext.java Log: Fixed documentation generation Fixed out of memory error Corrected release of ProcessingPipeline Revision Changes Path 1.35 +1 -7 xml-cocoon2/todo.xml Index: todo.xml =================================================================== RCS file: /home/cvs/xml-cocoon2/todo.xml,v retrieving revision 1.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- todo.xml 29 May 2002 08:20:25 -0000 1.34 +++ todo.xml 29 May 2002 09:12:04 -0000 1.35 @@ -3,7 +3,7 @@ <!DOCTYPE todo PUBLIC "-//APACHE//DTD Todo V1.0//EN" "src/documentation/xdocs/dtd/todo-v10.dtd"> <!-- - $Id: todo.xml,v 1.34 2002/05/29 08:20:25 cziegeler Exp $ + $Id: todo.xml,v 1.35 2002/05/29 09:12:04 cziegeler Exp $ --> @@ -34,12 +34,6 @@ a correct implementation of the toString() method of the used keys. A correct version should rely on hashCode() and equals(). (This is actually an Avalon action as the code is in Excalibur) - </action> - - <action context="code" assigned-to="open"> - Correct the release of internal ProcessingPipelines. If an - error/exception occurs, the ProcessingPipeline might not be - released correctly. </action> <action context="code" assigned-to="open"> 1.19 +89 -2 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.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- CocoonComponentManager.java 26 Apr 2002 08:41:52 -0000 1.18 +++ CocoonComponentManager.java 29 May 2002 09:12:04 -0000 1.19 @@ -51,14 +51,17 @@ package org.apache.cocoon.components; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; 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.framework.component.ComponentSelector; import org.apache.avalon.framework.component.Recomposable; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.environment.Environment; @@ -76,7 +79,7 @@ * and by handling the lookup of the <code>SourceResolver</code> (in development) * * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> - * @version CVS $Id: CocoonComponentManager.java,v 1.18 2002/04/26 08:41:52 cziegeler Exp $ + * @version CVS $Id: CocoonComponentManager.java,v 1.19 2002/05/29 09:12:04 cziegeler Exp $ */ public final class CocoonComponentManager extends ExcaliburComponentManager @@ -132,7 +135,7 @@ return; } } - stack.push(new Object[] {env, objectModel, new HashMap(5), ONE, processor}); + stack.push(new Object[] {env, objectModel, new HashMap(5), ONE, processor, new ArrayList(2)}); } /** @@ -150,6 +153,21 @@ final Component component = (Component)o[0]; ((CocoonComponentManager)o[1]).releaseRLComponent( component ); } + if (objects.length > 5) { + final List automaticReleasedComponents = (List)objects[5]; + for(int i = 0; i < automaticReleasedComponents.size(); i++) { + final Object[] o = (Object[])automaticReleasedComponents.get(i); + final Component component = (Component)o[0]; + if (o[1] instanceof ComponentManager) { + ((ComponentManager)o[1]).release( component ); + } else { + ((ComponentSelector)o[1]).release( component ); + if (o[2] != null) { + ((ComponentManager)o[2]).release( (Component)o[1] ); + } + } + } + } } } } @@ -232,6 +250,75 @@ return; } super.release( component); + } + + /** + * Add an automatically released component + */ + public static void addComponentForAutomaticRelease(final ComponentSelector selector, + final Component component, + final ComponentManager manager) + throws ProcessingException { + final Stack stack = (Stack)environmentStack.get(); + if ( null != stack && !stack.empty()) { + final Object[] objects = (Object[])stack.firstElement(); + final List automaticReleasedComponents = (List)objects[5]; + automaticReleasedComponents.add(new Object[] {component, selector, manager}); + } else { + throw new ProcessingException("Unable to add component for automatic release: no environment available."); + } + } + + /** + * Add an automatically released component + */ + public static void addComponentForAutomaticRelease(final ComponentManager manager, + final Component component) + throws ProcessingException { + final Stack stack = (Stack)environmentStack.get(); + if ( null != stack && !stack.empty()) { + final Object[] objects = (Object[])stack.firstElement(); + final List automaticReleasedComponents = (List)objects[5]; + automaticReleasedComponents.add(new Object[] {component, manager}); + } else { + throw new ProcessingException("Unable to add component for automatic release: no environment available."); + } + } + + /** + * Remove from automatically released components + */ + public static void removeFromAutomaticRelease(final Component component) + throws ProcessingException { + final Stack stack = (Stack)environmentStack.get(); + if ( null != stack && !stack.empty()) { + final Object[] objects = (Object[])stack.firstElement(); + final List automaticReleasedComponents = (List)objects[5]; + int i = 0; + boolean found = false; + while (i < automaticReleasedComponents.size() && !found) { + final Object[] o = (Object[])automaticReleasedComponents.get(i); + if (o[0] == component) { + found = true; + if (o[1] instanceof ComponentManager) { + ((ComponentManager)o[1]).release( component ); + } else { + ((ComponentSelector)o[1]).release( component ); + if (o[2] != null) { + ((ComponentManager)o[2]).release( (Component)o[1] ); + } + } + automaticReleasedComponents.remove(i); + } else { + i++; + } + } + if (!found) { + throw new ProcessingException("Unable to remove component from automatic release: component not found."); + } + } else { + throw new ProcessingException("Unable to remove component from automatic release: no environment available."); + } } /** 1.15 +8 -2 xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java Index: AbstractProcessingPipeline.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- AbstractProcessingPipeline.java 29 May 2002 08:20:26 -0000 1.14 +++ AbstractProcessingPipeline.java 29 May 2002 09:12:04 -0000 1.15 @@ -61,6 +61,7 @@ import org.apache.avalon.framework.parameters.Parameterizable; import org.apache.cocoon.ConnectionResetException; import org.apache.cocoon.ProcessingException; +import org.apache.cocoon.components.CocoonComponentManager; import org.apache.cocoon.components.pipeline.OutputComponentSelector; import org.apache.cocoon.components.saxconnector.SAXConnector; import org.apache.cocoon.environment.Environment; @@ -84,7 +85,7 @@ * * @since @next-version@ * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> - * @version CVS $Id: AbstractProcessingPipeline.java,v 1.14 2002/05/29 08:20:26 cziegeler Exp $ + * @version CVS $Id: AbstractProcessingPipeline.java,v 1.15 2002/05/29 09:12:04 cziegeler Exp $ */ public abstract class AbstractProcessingPipeline extends AbstractLogEnabled @@ -196,7 +197,12 @@ * this method and NOT by using a component manager! */ public void release() { - this.manager.release( this ); + try { + CocoonComponentManager.removeFromAutomaticRelease( this ); + } catch (ProcessingException pe) { + // ignore this + this.getLogger().error("Unabled to release processing component.", pe); + } } /** 1.10 +7 -2 xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/InvokeContext.java Index: InvokeContext.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/InvokeContext.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- InvokeContext.java 27 May 2002 14:31:27 -0000 1.9 +++ InvokeContext.java 29 May 2002 09:12:04 -0000 1.10 @@ -57,7 +57,7 @@ import org.apache.avalon.framework.component.ComponentSelector; import org.apache.avalon.framework.thread.ThreadSafe; import org.apache.avalon.framework.logger.Loggable; - +import org.apache.cocoon.components.CocoonComponentManager; import org.apache.cocoon.components.pipeline.ProcessingPipeline; import org.apache.cocoon.environment.Environment; import org.apache.log.Logger; @@ -76,7 +76,7 @@ * * @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a> * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> - * @version CVS $Id: InvokeContext.java,v 1.9 2002/05/27 14:31:27 cziegeler Exp $ + * @version CVS $Id: InvokeContext.java,v 1.10 2002/05/29 09:12:04 cziegeler Exp $ */ public class InvokeContext implements Recomposable, Disposable, Loggable { @@ -172,6 +172,11 @@ MapStackResolver.buildParameters(this.processingPipelineParameters, this.getMapStack()) ); + if (this.isInternalRequest) { + CocoonComponentManager.addComponentForAutomaticRelease(this.pipelineSelector, + this.processingPipeline, + this.pipelinesManager); + } } return this.processingPipeline; }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]