Hi Detelin,

Thanks very much for the information.
Would it possible to enter a bug report for this? That way your history and input is properly captured and the Gemini Web maintainers can track it.

https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Gemini.Web

Thanks,
-Mike

On 03/04/2014 9:21 AM, [email protected] wrote:
Seems it is not as trivial as I initially thought. After doing the proposed changes, the simple-war is redeployed successfully. I then went ahead and tested this on a more complex WAB but got an exception during servlet initialization which indicated that the "osgi-bundlecontext" servlet context attribute is not available.

Researching this further, I found out that Tomcat would re-create the ServletContext instance when reloading a web application. Gemini Web however is not coded to expect that ServletContext will change. In fact, it assumes that the web application lifecycle is bound entirely to the corresponding bundle's lifecycle, so it does not assume that the web application might be controlled from Tomcat at all.

This seems like a general design issue of Gemini Web and solving it might require changing the its architecture. I would be interested to know if this issue has already been discussed and whether you think it makes sense to improve Gemini Web to handle this use case.

Regards,
    Detelin




On Wed, Apr 2, 2014 at 3:57 PM, <[email protected] <mailto:[email protected]>> wrote:

    Hello Gemini Web devs,
      We are using Gemini Web with Equinox and we had to update our
    test setup recently to reload a web application, while Tomcat is
    running. We ended up using Tomcat JMX for that, but it turned out
    a NPE is thrown when the web application is re-started. The issue
    is reproducible with any web application bundle. To reproduce it
    with latest Gemini Web 2.2.2 and the "simple-war.war" web
    application, follow these steps:

    1. Install the war in Equinox:

    osgi> install file:simple-war.war

    2. Run jconsole JDK tool and connect to the Equinox process

    3. Open the "//localhost/simple-war" node under
    "Catalina/WebModule", navigate to the operations and execute "reload"

    4. Observe the following exception appears in Equinox console:

    org.apache.catalina.core.StandardContext reload
    SEVERE: Exception starting Context with name [/simple-war]
    org.apache.catalina.LifecycleException: Failed to start component
    
[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/simple-war]]
            at
    org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
            at
    org.apache.catalina.core.StandardContext.reload(StandardContext.java:3926)
    ...
    Caused by: org.apache.catalina.LifecycleException: Failed to start
    component
    [org.eclipse.gemini.web.tomcat.internal.loading.BundleWebappLoader@6638e53]
    ...
    Caused by: java.lang.NullPointerException
            at
    
org.eclipse.gemini.web.tomcat.internal.loading.BundleClassPathURLExtractor.extractBundleClassPathURLs(BundleClassPathURLExtractor.java:37)
            at
    
org.eclipse.gemini.web.tomcat.internal.loading.BundleWebappClassLoader.addBundleClassPathURLs(BundleWebappClassLoader.java:101)
            at
    
org.eclipse.gemini.web.tomcat.internal.loading.BundleWebappClassLoader.<init>(BundleWebappClassLoader.java:77)
            at
    
org.eclipse.gemini.web.tomcat.internal.loading.BundleWebappLoader.createClassLoader(BundleWebappLoader.java:88)
            at
    
org.eclipse.gemini.web.tomcat.internal.loading.BundleWebappLoader.startInternal(BundleWebappLoader.java:169)

    I checked the sources and it seems that the
    BundleWebappClassLoader nulls out the "bundle" and
    "classLoaderCustomizer" fields upon stop:

    
http://git.eclipse.org/c/gemini.web/org.eclipse.gemini.web.gemini-web-container.git/tree/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/loading/BundleWebappLoader.java#n212

    These are initialized in the constructor and since a new
    BundleWebappClassLoader instance is not created when starting the
    context after a stop, these remain null and ultimately cause the
    exception.

    It seems like the fix would be easy - removing the respective null
    assigments so that  the "bundle" and "classLoaderCustomizer"
    instances are preserved. If there are no side effects and there is
    no specific reason for this piece of code, I would open a defect
    and attach a patch, but first I wanted to get your opinion on
    this. Does this sound reasonable?

    Thanks,
       Detelin







_______________________________________________
gemini-dev mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/gemini-dev

_______________________________________________
gemini-dev mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/gemini-dev

Reply via email to