[jira] Commented: (NANO-39) groovy scripted nanocontainer fails in servlet context

jira-yCVjj/[email protected] Sat, 14 Feb 2004 18:26:27 -0500 (EST)
Newsgroups gmane.comp.java.nanocontainer.devel
Message-ID <[email protected]>
The following comment has been added to this issue:

     Author: Jacob Kjome
    Created: Sat, 14 Feb 2004 6:25 PM
       Body:
Ok, I think I've figured it out.  The problem happens because the GroovyClassLoader is newly created each time and, somehow, the second time loading, there exists a reference in the GroovyClassLoader cache, a field named "nanocontainer.groovy" which has a "main" and "run" methods.  Not sure which class that is.  Well, that last part is speculation, but what fixes the issue is this...

Modfy the constructor from this....

public GroovyContainerBuilder(Reader script, ClassLoader classLoader) {
    super(script, classLoader);
}

To this....

public GroovyContainerBuilder(Reader script, ClassLoader classLoader) {
    super(script, new GroovyClassLoader(classLoader));
}

And then when we reference the classloader to use Groovy-specific mehods, we cast it to a GroovyClassLoader like this...

GroovyClassLoader loader = (GroovyClassLoader)classLoader;

This way, the GroovyClassLoader's "cache" field will continue to contain a reference to the pre-built script.  I no longer get a "nanocontainer" class coming back after the first time the GroovyContainerBuilder.createContainer() is called.  I get the DemoBuilder class defined in my script.  Great!....of course now I've run into another issue.  I get the following stack trace...

org.picocontainer.defaults.UnsatisfiableDependenciesException: java.lang.Class doesn't have any satisfiable constructors. Unsatisfiable dependencies: []
	at org.picocontainer.defaults.ConstructorComponentAdapter.getAllSatisfiableConstructors(ConstructorComponentAdapter.java:117)
	at org.picocontainer.defaults.ConstructorComponentAdapter.getGreediestSatisifableConstructor(ConstructorComponentAdapter.java:63)
	at org.picocontainer.defaults.ConstructorComponentAdapter.getMostSatisfiableDependencyTypes(ConstructorComponentAdapter.java:57)
	at org.picocontainer.defaults.InstantiatingComponentAdapter.getMostSatisifableDependencyAdapters(InstantiatingComponentAdapter.java:76)
	at org.picocontainer.defaults.InstantiatingComponentAdapter.getComponentInstance(InstantiatingComponentAdapter.java:44)
	at org.picocontainer.defaults.DecoratingComponentAdapter.getComponentInstance(DecoratingComponentAdapter.java:41)
	at org.picocontainer.defaults.CachingComponentAdapter.getComponentInstance(CachingComponentAdapter.java:37)
	at org.picocontainer.defaults.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:248)
	at org.apache.jsp.index_jsp._jspService(index_jsp.java:58)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:284)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:204)
	at org.nanocontainer.servlet.ServletRequestContainerFilter.doFilter(ServletRequestContainerFilter.java:37)


Here's my groovy script.  Anyone see a problem with it????


import org.picoextras.servlet.sample.SomeRequestUtil
import org.picoextras.servlet.sample.SomeCounter

class DemoBuilder {
    buildContainer(parent, compositionScope) {
        pico = new org.picocontainer.defaults.DefaultPicoContainer(parent)
        if (compositionScope instanceof javax.servlet.ServletRequest) {
            pico.registerComponentImplementation("util", SomeRequestUtil.class)
        }
        else if (compositionScope instanceof javax.servlet.http.HttpSession) {
            pico.registerComponentImplementation("counter", SomeCounter.class)
        }
        else if (compositionScope instanceof javax.servlet.ServletContext) {
        }
        else {
        }
        return pico
    }
}
---------------------------------------------------------------------
View this comment:
  http://jira.codehaus.org/secure/ViewIssue.jspa?key=NANO-39&page=comments#action_16751

---------------------------------------------------------------------
View the issue:
  http://jira.codehaus.org/secure/ViewIssue.jspa?key=NANO-39

Here is an overview of the issue:
---------------------------------------------------------------------
        Key: NANO-39
    Summary: groovy scripted nanocontainer fails in servlet context
       Type: Bug

     Status: Unassigned
   Priority: Major

 Original Estimate: Unknown
 Time Spent: Unknown
  Remaining: Unknown

    Project: NanoContainer
 Components: 
             Core
   Versions:
             1.0-beta-1

   Assignee: 
   Reporter: Jacob Kjome

    Created: Fri, 13 Feb 2004 1:51 AM
    Updated: Sat, 14 Feb 2004 6:25 PM
Environment: servlet container, scripting of nanocontainer done with Groovy

Description:
When setting up the nanocontainer servlet in web.xml using the context-param "nanocontainer.groovy", it only seems to work for the first container that is configured, or, the first compositionScope.  If any other scope is provided such as a ServletRequest or HttpSession, it fails with the following message...

"Caused by: groovy.lang.MissingMethodException: No such method: buildContainer for class: nanocontainer with arguments: [org.picocontainer.defaults.DefaultPicoContainer-Le89R2mpRr8@public.gmane.org, org.apache.coyote.tomcat5.CoyoteRequestFacade@952905]"

I know it is working the for the first container (in the ServletContext compositionScope) because I print out the compositionScope as soon as the "buildContainer" method is entered and it says...

"compositionScope is: org.apache.catalina.core.ApplicationContextFacade-m6hyCi5e6VU@public.gmane.org"

Here is the script...

class DemoBuilder {
    buildContainer(parent, compositionScope) {
        System.out.println("compositionScope is: " + compositionScope);
        pico = new org.picocontainer.defaults.DefaultPicoContainer(parent)
        if (compositionScope instanceof javax.servlet.ServletRequest) {
            System.out.println("I got here to register a component in the servlet request scope!!!!")
            pico.registerComponentImplementation("util", SomeRequestUtil.class)
        }
        else if (compositionScope instanceof javax.servlet.http.HttpSession) {
            System.out.println("I got here to register a component in the servlet session scope!!!!")
            pico.registerComponentImplementation("counter", SomeCounter.class)
        }
        else if (compositionScope instanceof javax.servlet.ServletContext) {
            //nothing to do for now
        }
        else {
            //nothing to do for now
        }
        return pico
    }
}


Here's the full stack trace....


org.nanocontainer.integrationkit.PicoCompositionException
	at org.nanocontainer.script.groovy.GroovyContainerBuilder.createContainer(GroovyContainerBuilder.java:57)
	at org.nanocontainer.integrationkit.LifecycleContainerBuilder.buildContainer(LifecycleContainerBuilder.java:25)
	at org.nanocontainer.servlet.ServletRequestContainerLauncher.startContainer(ServletRequestContainerLauncher.java:48)
	at org.nanocontainer.servlet.ServletRequestContainerFilter.doFilter(ServletRequestContainerFilter.java:36)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:233)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:204)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:257)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:564)
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:245)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:199)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:564)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:195)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:164)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:149)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:564)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:156)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:564)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972)
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:700)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:584)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
	at java.lang.Thread.run(Thread.java:534)
Caused by: groovy.lang.MissingMethodException: No such method: buildContainer for class: nanocontainer with arguments: [org.picocontainer.defaults.DefaultPicoContainer-Le89R2mpRr8@public.gmane.org, org.apache.coyote.tomcat5.CoyoteRequestFacade@952905]
	at groovy.lang.MetaClass.invokeStaticMethod(MetaClass.java:291)
	at groovy.lang.MetaClass.invokeMethod(MetaClass.java:247)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:324)
	at groovy.lang.MetaClass.doMethodInvoke(MetaClass.java:765)
	at groovy.lang.MetaClass.invokeMethod(MetaClass.java:214)
	at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:130)
	at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:98)
	at nanocontainer.invokeMethod(nanocontainer.groovy)
	at org.nanocontainer.script.groovy.GroovyContainerBuilder.createContainer(GroovyContainerBuilder.java:55)
	... 27 more


Jake


---------------------------------------------------------------------
JIRA INFORMATION:
This message is automatically generated by JIRA.

If you think it was sent incorrectly contact one of the administrators:
   http://jira.codehaus.org/secure/Administrators.jspa

If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira