Hi,

I have been trying around with Karaf 4.4.0 with the pax-web-tomcat webcontainer 
in the last days. First of all I want to state that Grzegorz did a fantastic 
job with the Pax-Web refactoring!

Nevertheless, I encountered a few issues with tomcat context.xml handling.

First of all prior versions of pax-web-tomcat were able to load a default 
context.xml from the same directory as the tomcat-server.xml. I am not sure how 
to proceed with this.
The BundleWebApplication class in the pax-web-extender-war bundle contains the 
following comment:
                                // additionally:
                                //  - Tomcat handles context.xml files set by 
org.apache.catalina.core.StandardContext.setDefaultContextXml()
However, as far as I understand, the defaultContextXml in StandardContext is 
not used in the embedded Tomcat. The only uses I could find was in the 
org.apache.catalina.startup.ContextConfig.contextConfig() method which does not 
seem to get called by the embedded tomcat startup. This method is normally 
called with a ContextConfig.lifecycleEvent(Lifecycle.AFTER_INIT_EVENT), but it 
seems that this ContextConfig lifecycle is not called. I am not sure what is 
the way to go here, either to try to include this ContextConfig lifecycle, try 
to exeute the contextConfig method with the digester we get in the 
TomcatFactory.createContextDigester() method, or try to funnel this default 
context.xml somehow into the serverSpecificDescriptors and parse it in the 
tomcat specific OsgiContextConfiguration class. What do you think?

The code does support context.xml files in WARs. The context.xml files are 
found within a war by the BundleWebApplication class and forwarded as 
serverSpecificDescriptors to the web container implementation. These 
descriptors are applied in class 
org.ops4j.pax.web.service.tomcat.internal.OsgiContextConfiguration. However, 
the war extender will find context files both in /META-INF/context.xml and 
/WEB-INF/classes/META-INF/context.xml (actually it will find any invocation of 
/META-INF/context.xml in the bundle’s classpath), whereas the 
OsgiContextConfiguration class explicitly limits this to 
path.equals("/META-INF/context.xml") which will include the first but exclude 
the second location. I am not sure if this is correct (but it seems a bit odd 
to me). This results in the logs below:

2022 05 23 
14:37:26#+00#DEBUG#org.ops4j.pax.web.extender.war.internal.model.BundleWebApplication##anonymous#wab-extender-1-thread-3####na#na#na#na#Found
 Tomcat-specific descriptor: 
bundle://2157ae21-cf1a-4966-8b3e-c768aaacf073_230.0:0/META-INF/context.xml|
2022 05 23 
14:37:26#+00#DEBUG#org.ops4j.pax.web.extender.war.internal.model.BundleWebApplication##anonymous#wab-extender-1-thread-3####na#na#na#na#Found
 Tomcat-specific descriptor: 
bundle://2157ae21-cf1a-4966-8b3e-c768aaacf073_230.0:0/WEB-INF/classes/META-INF/context.xml|

2022 05 23 
14:37:26#+00#INFO#org.ops4j.pax.web.service.tomcat.internal.OsgiContextConfiguration##anonymous#paxweb-config-3-thread-1
 (deploy /auth)####na#na#na#na#Processing context specific 
bundle://2157ae21-cf1a-4966-8b3e-c768aaacf073_230.0:0/META-INF/context.xml for 
/auth|

Is that behavior correct? It might probably be a good idea to relax the filter 
in OsgiContextConfiguration a bit.

I am willing to contribute to this, but I would prefer to discuss the correct 
way to go first.

Best regards
Stephan

Reply via email to