cziegeler 2002/11/15 07:12:35 Modified: src/java/org/apache/cocoon/components CocoonComponentManager.java Log: New Object to support RequestLifecycleComponents Revision Changes Path 1.31 +136 -13 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.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- CocoonComponentManager.java 15 Nov 2002 13:31:36 -0000 1.30 +++ CocoonComponentManager.java 15 Nov 2002 15:12:35 -0000 1.31 @@ -75,9 +75,9 @@ /** * Cocoon Component Manager. - * This manager extends the <code>ExcaliburComponentManager</code> - * by a special lifecycle handling for a RequestLifecycleComponent - * and by handling the lookup of the <code>SourceResolver</code> (in development) + * This manager extends the {@link ExcaliburComponentManager} + * by a special lifecycle handling for a {@link RequestLifecycleComponent} + * and by handling the lookup of the <code>SourceResolver</code> * * @author <a href="mailto:cziegeler@;apache.org">Carsten Ziegeler</a> * @version CVS $Id$ @@ -86,6 +86,10 @@ extends ExcaliburComponentManager implements SourceResolver { + /** The key used to store the current process environment */ + private static final String PROCESS_KEY = + "org.apache.cocoon.components.CocoonComponentManager"; + /** The environment information */ private static InheritableThreadLocal environmentStack = new InheritableThreadLocal(); @@ -158,7 +162,7 @@ while (iter.hasNext()) { final Object[] o = (Object[])iter.next(); final Component component = (Component)o[0]; - ((CocoonComponentManager)o[1]).releaseRLComponent( component ); + ((ComponentManager)o[1]).release( component ); } if (objects.length > 6) { final List automaticReleasedComponents = (List)objects[6]; @@ -195,7 +199,7 @@ Map values = new HashMap(5); Long key = new Long(System.currentTimeMillis()); processes.put(key, values); - env.getObjectModel().put("org.apache.cocoon.components.CocoonComponentManager", key); + env.getObjectModel().put(PROCESS_KEY, key); return key; } @@ -261,6 +265,22 @@ final Stack stack = (Stack)environmentStack.get(); if ( null != stack && !stack.empty()) { final Object[] objects = (Object[])stack.peek(); + /* new version that will fix the RequestLifecycleComponent bug + Map objectModel = (Map)objects[1]; + Object processKey = objectModel.get(PROCESS_KEY); + if ( null != processKey) { + Map processes = (Map)processList.get(); + if ( null != processes) { + EnvironmentDescription envDesc = (EnvironmentDescription)processes.get(processKey); + if (envDesc != null) { + final Component component = envDesc.getRequestLifecycleComponent(role); + if (null != component) { + return component; + } + } + } + } + */ final Map components = (Map)objects[2]; final Object[] o = (Object[])components.get(role); if ( null != o ) { @@ -419,13 +439,6 @@ } /** - * Release a RequestLifecycleComponent - */ - protected void releaseRLComponent( final Component component ) { - super.release( component ); - } - - /** * Get a <code>Source</code> object. */ public Source resolveURI(final String location) @@ -456,4 +469,114 @@ public void release( final Source source ) { this.sourceResolver.release( source ); } +} + +final class EnvironmentDescription { + + Environment environment; + Map objectModel; + Map requestLifecycleComponents = new HashMap(5); + List autoreleaseComponents = new ArrayList(2); + + /** + * Constructor + */ + EnvironmentDescription(Environment env, Map objectModel) { + this.environment = env; + this.objectModel = objectModel; + } + + /** + * Release all components of this environment + * All RequestLifecycleComponents and autoreleaseComponents are + * released. + */ + void release() { + final Iterator iter = this.requestLifecycleComponents.values().iterator(); + while (iter.hasNext()) { + final Object[] o = (Object[])iter.next(); + final Component component = (Component)o[0]; + ((ComponentManager)o[1]).release( component ); + } + + for(int i = 0; i < autoreleaseComponents.size(); i++) { + final Object[] o = (Object[])autoreleaseComponents.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] ); + } + } + } + } + + /** + * Add a RequestLifecycleComponent to the environment + */ + void addRequestLifecycleComponent(final String role, + final Component co, + final ComponentManager manager) { + this.requestLifecycleComponents.put(role, new Object[] {co, manager}); + } + + /** + * Search a RequestLifecycleComponent + */ + Component getRequestLifecycleComponent(final String role) { + final Object[] o = (Object[])this.requestLifecycleComponents.get(role); + if ( null != o ) { + return (Component)o[0]; + } + return null; + } + + /** + * Add an automatically released component + */ + public void addToAutoRelease(final ComponentSelector selector, + final Component component, + final ComponentManager manager) { + this.autoreleaseComponents.add(new Object[] {component, selector, manager}); + } + + /** + * Add an automatically released component + */ + public void addToAutoRelease(final ComponentManager manager, + final Component component) { + this.autoreleaseComponents.add(new Object[] {component, manager}); + } + + /** + * Remove from automatically released components + */ + public void removeFromAutoRelease(final Component component) + throws ProcessingException { + int i = 0; + boolean found = false; + while (i < this.autoreleaseComponents.size() && !found) { + final Object[] o = (Object[])this.autoreleaseComponents.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] ); + } + } + this.autoreleaseComponents.remove(i); + } else { + i++; + } + } + if (!found) { + throw new ProcessingException("Unable to remove component from automatic release: component not found."); + } + } + }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]