DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20987>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20987

uninitialized ComponentLocator warnings on startup

           Summary: uninitialized ComponentLocator warnings on startup
           Product: Cocoon 2
           Version: Current CVS 2.1
          Platform: Other
        OS/Version: Other
            Status: NEW
          Severity: Normal
          Priority: Other
         Component: core
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]


Hi,

With CVS Cocoon, I've been getting warnings like this in my error log:

WARN    (2003-06-21) 19:45.39:446   [sitemap] (/fs/skin/page.css)
HttpProcessor[8787][4]/ExcaliburComponentManager: Looking up component on an
uninitialized ComponentLocator [org.apache.cocoon.generation.GeneratorSelector]
WARN    (2003-06-21) 19:45.39:450   [sitemap] (/fs/skin/page.css)
HttpProcessor[8787][4]/ExcaliburComponentManager: Looking up component on an
uninitialized ComponentLocator
[org.apache.cocoon.serialization.SerializerSelector]
WARN    (2003-06-21) 19:45.39:483   [sitemap] (/fs/skin/page.css)
HttpProcessor[8787][4]/ExcaliburComponentManager: Looking up component on an
uninitialized ComponentLocator
[org.apache.cocoon.transformation.TransformerSelector]

The same problem can be seen in Cocoon's logs, if the log level is taken
from from ERROR to WARN.

I eventually obtained the following stack trace snippet, illustrating
what's happening:

java.lang.RuntimeException: Looking up component on an uninitialized
ComponentLocator [org.apache.cocoon.generation.GeneratorSelector]
    at
org.apache.avalon.excalibur.component.ExcaliburComponentManager.lookup(ExcaliburComponentManager.java:194)
    at
org.apache.cocoon.components.CocoonComponentManager.lookup(CocoonComponentManager.java:294)
    at
org.apache.cocoon.components.CocoonComponentManager.addComponent(CocoonComponentManager.java:477)
    at
org.apache.avalon.excalibur.component.ExcaliburComponentManager.configure(ExcaliburComponentManager.java:477)
    at
org.apache.cocoon.components.LifecycleHelper.setupComponent(LifecycleHelper.java:262)
    at
org.apache.cocoon.components.LifecycleHelper.setupComponent(LifecycleHelper.java:188)
    at
org.apache.cocoon.components.treeprocessor.sitemap.SitemapLanguage.createComponentManager(SitemapLanguage.java:104)
    ...

Here, LifecycleHelper is busy setting up a CocoonComponentManager object.  It 
calls ECM.configure(...), which delegates to addComponent() to add each
component in the Configuration.  CocoonComponentManager overrides 
addComponent() in order to tell ParentAware components about their parent:
    public void addComponent(String role, Class clazz, Configuration conf)
    throws ComponentException {
        super.addComponent(role, clazz, conf);
        if ( ParentAware.class.isAssignableFrom( clazz ) ) {
            if ( parentManager != null && parentManager.hasComponent( role ) ) {
                // lookup new component
                Component component = null;
                try {
                    component = this.lookup( role );
                    ((ParentAware)component).setParentLocator( new
ComponentLocatorImpl(this.parentManager, role ));
                } catch (ComponentException ignore) {
                    // we don't set the parent then
                } finally {
                    this.release( component );
                }

            }
        }
    }

The problem with this is that we're technically still inside the
configure() method, and can't do a this.lookup() call, because we're not
yet initialized (configure() is called before initialize(); see [1]).

The fix is to just record each ParentAware component we encounter, and
tell it about its parent in an overridden initialize() method.


--Jeff

[1] http://avalon.apache.org/framework/reference-the-lifecycle.html

Reply via email to