You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cocoon.apache.org by bu...@apache.org on 2003/04/24 20:28:24 UTC

DO NOT REPLY [Bug 19282] New: - CocoonComponentManager must be loaded in own classloader

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=19282>.
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=19282

CocoonComponentManager must be loaded in own classloader

           Summary: CocoonComponentManager must be loaded in own classloader
           Product: Cocoon 2
           Version: Current CVS 2.1
          Platform: Other
        OS/Version: Other
            Status: NEW
          Severity: Critical
          Priority: Other
         Component: core
        AssignedTo: cocoon-dev@xml.apache.org
        ReportedBy: leo.sutic@inspireinfrastructure.com


The CocoonComponentManager uses static variables for component management.

This completely obliterates the ability to have several cocoon instances 
per classloader.

As I understand it, the CocoonComponentManager is a Singleton with respect to 
the Cocoon instance, right?

This means that the static variables could in theory be localized to that 
instance, if it weren't for the need to access them via static accessors.

This one is no problem, as it is thread local, and, as I understand it, empty 
at the start of a request and empty at the end of one.

    /** The environment information */
    private static InheritableThreadLocal environmentStack = new 
CloningInheritableThreadLocal();

So that variable should be just fine and we're not going to have any 
classloader issues here.

This one I don't get:

    private static Map sitemapConfigurationHolders = new HashMap(15);

Can these be made thread-local, or per-instance?

            holder = (SitemapConfigurationHolder)sitemapConfigurationHolders.get
( role );
            if ( null == holder ) {
                // create new holder
                holder = new DefaultSitemapConfigurationHolder( role );
                sitemapConfigurationHolders.put( role, holder );
            }

This one, however, is poison:

    private static ComponentManager rootManager;

Can it be made instance-specific? It is only used as a default in:

    public ComponentManager getSitemapComponentManager()

and that method is only referenced from AbstractEnvironment in the
starting() method. Ironically, the Environment passes through the 
CocoonComponentManager itself, so it is a no-brainer to pass the manager in 
right then and there.

However, the SourceUtil and JSCocoon classes also reference this method.

The question is then: Is JSCocoon's invocations done before or after the

Environment is set up? In that case, the getSitemapComponentManager can return 
null if no environment is set up:

    public ComponentManager getSitemapComponentManager() {
        final EnvironmentStack stack = (EnvironmentStack)environmentStack.get();
        
        if ( null != stack && !stack.empty()) {
            Object[] o = (Object[])stack.peek();
            return (ComponentManager)o[2];
        }
        
        // if we don't have an environment yet, just return null
        return null; // WAS: rootManager;
    }

Since, if I understand this correctly, the only time you'd fall through was 
when called from the AbstractEnvironment.starting() method, which was unneeded.

The attached patch removes this problem. However, the cost is that the 
getSitemapComponentManager method will return null when there is no sitemap. 
This, however, seems to be in line with the contract.