cziegeler 2002/11/15 09:07:56 Modified: src/java/org/apache/cocoon/components CocoonComponentManager.java Log: Hopefully fixing bug 12293 Revision Changes Path 1.32 +84 -112 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.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- CocoonComponentManager.java 15 Nov 2002 15:12:35 -0000 1.31 +++ CocoonComponentManager.java 15 Nov 2002 17:07:56 -0000 1.32 @@ -72,6 +72,7 @@ import org.apache.excalibur.source.Source; import org.apache.excalibur.source.SourceException; import org.apache.excalibur.source.SourceResolver; +import sun.tools.tree.ThisExpression; /** * Cocoon Component Manager. @@ -126,27 +127,22 @@ super(manager); } - private static final Integer ONE = new Integer(1); - private static final Integer TWO = new Integer(2); - /** * This hook must be called by the sitemap each time a sitemap is entered */ public static void enterEnvironment(Environment env, - Map objectModel, - Processor processor) { + Map objectModel, + Processor processor) { if (environmentStack.get() == null) { environmentStack.set(new Stack()); } final Stack stack = (Stack)environmentStack.get(); - if (!stack.empty()) { - final Object[] objects = (Object[])stack.peek(); - if ( objects[1] == objectModel ) { - stack.push(new Object[] {env, objectModel, objects[2], TWO, processor, processor.getComponentConfigurations()}); - return; - } + stack.push(new Object[] {env, processor}); + + EnvironmentDescription desc = getDescription(objectModel); + if ( null != desc ) { + desc.addSitemapConfiguration(processor.getComponentConfigurations()); } - stack.push(new Object[] {env, objectModel, new HashMap(5), ONE, processor, processor.getComponentConfigurations(), new ArrayList(2)}); } /** @@ -156,30 +152,6 @@ final Stack stack = (Stack)environmentStack.get(); if (null != stack && !stack.empty()) { final Object[] objects = (Object[])stack.pop(); - if (objects[3] == ONE) { - final Map components = (Map)objects[2]; - final Iterator iter = components.values().iterator(); - while (iter.hasNext()) { - final Object[] o = (Object[])iter.next(); - final Component component = (Component)o[0]; - ((ComponentManager)o[1]).release( component ); - } - if (objects.length > 6) { - final List automaticReleasedComponents = (List)objects[6]; - 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] ); - } - } - } - } - } } } @@ -196,9 +168,9 @@ processes = new HashMap(4); processList.set(processes); } - Map values = new HashMap(5); + EnvironmentDescription desc = new EnvironmentDescription(env); Long key = new Long(System.currentTimeMillis()); - processes.put(key, values); + processes.put(key, desc); env.getObjectModel().put(PROCESS_KEY, key); return key; } @@ -213,7 +185,6 @@ public static void endProcessing(Object key) { Map processes = (Map)processList.get(); if ( null != processes ) { - processes.remove(key); } } @@ -235,7 +206,7 @@ public static Processor getCurrentProcessor() { final Stack stack = (Stack)environmentStack.get(); if (null != stack && !stack.empty()) { - return (Processor) ((Object[])stack.peek())[4]; + return (Processor) ((Object[])stack.peek())[1]; } return null; } @@ -265,26 +236,10 @@ 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 ) { - final Component component = (Component) o[0]; + final Map objectModel = ((Environment)objects[0]).getObjectModel(); + EnvironmentDescription desc = getDescription(objectModel); + if ( null != desc ) { + final Component component = desc.getRequestLifecycleComponent(role); if (null != component) { return component; } @@ -297,20 +252,22 @@ throw new ComponentException("ComponentManager has no Environment Stack."); } final Object[] objects = (Object[]) stack.peek(); - final Map components = (Map)objects[2]; - // first test if the parent CM has already initialized this component - if (components.containsKey( role ) == false) { - try { - if (component instanceof Recomposable) { - ((Recomposable) component).recompose(this); - } - ((RequestLifecycleComponent) component).setup((org.apache.cocoon.environment.SourceResolver)objects[0], - (Map)objects[1]); - if (component instanceof SitemapConfigurable) { - for(int i=0; i < stack.size(); i++) { - Object[] o = (Object[])stack.get(i); - Configuration parent = (Configuration)o[5]; - if ( null != parent ) { + final Map objectModel = ((Environment)objects[0]).getObjectModel(); + EnvironmentDescription desc = getDescription(objectModel); + if ( null != desc ) { + + // first test if the parent CM has already initialized this component + if ( !desc.containsRequestLifecycleComponent( role ) ) { + try { + if (component instanceof Recomposable) { + ((Recomposable) component).recompose(this); + } + ((RequestLifecycleComponent) component).setup((org.apache.cocoon.environment.SourceResolver)objects[0], + (Map)objects[1]); + if (component instanceof SitemapConfigurable) { + List configs = desc.getSitemapConfigurations(); + for(int i=0; i < configs.size(); i++) { + Configuration parent = (Configuration)configs.get(i); Configuration cc = parent.getChild( role, false ); if ( null != cc ) { ((SitemapConfigurable) component).setSitemapConfiguration(cc); @@ -330,11 +287,11 @@ } } } + } catch (Exception local) { + throw new ComponentException("Exception during setup of RequestLifecycleComponent with role '"+role+"'", local); } - } catch (Exception local) { - throw new ComponentException("Exception during setup of RequestLifecycleComponent with role '"+role+"'", local); + desc.addRequestLifecycleComponent(role, component, this); } - components.put(role, new Object[] {component, this}); } } return component; @@ -368,8 +325,11 @@ final Stack stack = (Stack)environmentStack.get(); if ( null != stack && !stack.empty()) { final Object[] objects = (Object[])stack.firstElement(); - final List automaticReleasedComponents = (List)objects[6]; - automaticReleasedComponents.add(new Object[] {component, selector, manager}); + final Map objectModel = ((Environment)objects[0]).getObjectModel(); + EnvironmentDescription desc = getDescription(objectModel); + if ( null != desc ) { + desc.addToAutoRelease(selector, component, manager); + } } else { throw new ProcessingException("Unable to add component for automatic release: no environment available."); } @@ -384,8 +344,11 @@ final Stack stack = (Stack)environmentStack.get(); if ( null != stack && !stack.empty()) { final Object[] objects = (Object[])stack.firstElement(); - final List automaticReleasedComponents = (List)objects[6]; - automaticReleasedComponents.add(new Object[] {component, manager}); + final Map objectModel = ((Environment)objects[0]).getObjectModel(); + EnvironmentDescription desc = getDescription(objectModel); + if ( null != desc ) { + desc.addToAutoRelease(manager, component); + } } else { throw new ProcessingException("Unable to add component for automatic release: no environment available."); } @@ -399,28 +362,10 @@ final Stack stack = (Stack)environmentStack.get(); if ( null != stack && !stack.empty()) { final Object[] objects = (Object[])stack.firstElement(); - final List automaticReleasedComponents = (List)objects[6]; - 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."); + final Map objectModel = ((Environment)objects[0]).getObjectModel(); + EnvironmentDescription desc = getDescription(objectModel); + if ( null != desc ) { + desc.removeFromAutoRelease(component); } } else { throw new ProcessingException("Unable to remove component from automatic release: no environment available."); @@ -469,6 +414,18 @@ public void release( final Source source ) { this.sourceResolver.release( source ); } + + private static EnvironmentDescription getDescription(Map objectModel) { + Object processKey = objectModel.get(PROCESS_KEY); + if ( null != processKey) { + Map processes = (Map)CocoonComponentManager.processList.get(); + if ( null != processes) { + return (EnvironmentDescription)processes.get(processKey); + } + } + return null; + } + } final class EnvironmentDescription { @@ -477,13 +434,14 @@ Map objectModel; Map requestLifecycleComponents = new HashMap(5); List autoreleaseComponents = new ArrayList(2); + List sitemapConfigurations = new ArrayList(4); /** * Constructor */ - EnvironmentDescription(Environment env, Map objectModel) { + EnvironmentDescription(Environment env) { this.environment = env; - this.objectModel = objectModel; + this.objectModel = env.getObjectModel(); } /** @@ -522,6 +480,10 @@ this.requestLifecycleComponents.put(role, new Object[] {co, manager}); } + boolean containsRequestLifecycleComponent(final String role) { + return this.requestLifecycleComponents.containsKey( role ); + } + /** * Search a RequestLifecycleComponent */ @@ -536,24 +498,24 @@ /** * Add an automatically released component */ - public void addToAutoRelease(final ComponentSelector selector, - final Component component, - final ComponentManager manager) { + 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) { + 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) + void removeFromAutoRelease(final Component component) throws ProcessingException { int i = 0; boolean found = false; @@ -579,4 +541,14 @@ } } + void addSitemapConfiguration(Configuration conf) { + if (conf != null) { + this.sitemapConfigurations.add(conf); + } + } + + List getSitemapConfigurations() { + return this.sitemapConfigurations; + } + }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]