jefft 2003/06/21 07:08:07
Modified: src/java/org/apache/cocoon/components CocoonComponentManager.java Log: Fix bug 20987 We shouldn't call the lookup() method in addComponent(), because we're not initialize()'ed yet. Instead, defer the lookup() calls to the initialize() method. Revision Changes Path 1.13 +26 -4 cocoon-2.1/src/java/org/apache/cocoon/components/CocoonComponentManager.java Index: CocoonComponentManager.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/CocoonComponentManager.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- CocoonComponentManager.java 18 Jun 2003 11:06:31 -0000 1.12 +++ CocoonComponentManager.java 21 Jun 2003 14:08:07 -0000 1.13 @@ -112,6 +112,10 @@ /** The parent component manager for implementing parent aware components */ private ComponentManager parentManager; + /** Temporary list of parent-aware components. Will be null for most of + * our lifecycle. */ + private ArrayList parentAwareComponents = new ArrayList(); + /** Create the ComponentManager */ public CocoonComponentManager() { super( null, Thread.currentThread().getContextClassLoader() ); @@ -463,13 +467,32 @@ this.sourceResolver.release( source ); } + /* (non-Javadoc) * @see org.apache.avalon.excalibur.component.ExcaliburComponentManager#addComponent(java.lang.String, java.lang.Class, org.apache.avalon.framework.configuration.Configuration) */ public void addComponent(String role, Class clazz, Configuration conf) - throws ComponentException { + throws ComponentException { super.addComponent(role, clazz, conf); + // Note that at this point, we're not initialized and cannot do + // lookups, so defer parental introductions to initialize(). if ( ParentAware.class.isAssignableFrom( clazz ) ) { + parentAwareComponents.add(role); + } + } + + public void initialize() + throws Exception + { + super.initialize(); + if (parentAwareComponents == null) { + throw new ComponentException("CocoonComponentManager already initialized"); + } + // Set parents for parentAware components + Iterator iter = parentAwareComponents.iterator(); + while (iter.hasNext()) { + String role = (String)iter.next(); + getLogger().debug(".. "+role); if ( parentManager != null && parentManager.hasComponent( role ) ) { // lookup new component Component component = null; @@ -481,11 +504,10 @@ } finally { this.release( component ); } - } } + parentAwareComponents = null; // null to save memory, and catch logic bugs. } - } final class EnvironmentDescription {