Hi Thorsten, I believe having encountered this problem once. However, it is not systematic.
Jos On Mon, Sep 17, 2012 at 12:06 AM, Thorsten Scherler (JIRA) <j...@apache.org>wrote: > > [ > https://issues.apache.org/jira/browse/COCOON3-105?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13456689#comment-13456689] > > Thorsten Scherler commented on COCOON3-105: > ------------------------------------------- > > The problem lies in in > org.apache.cocoon.blockdeployment.BlockContextURLStreamHandlerFactory.createURLStreamHandler > here we create a BlockContextURLStreamHandler extends URLStreamHandler > > Regarding URLStreamHandler > /** > * The abstract class <code>URLStreamHandler</code> is the common > * superclass for all stream protocol handlers. A stream protocol > * handler knows how to make a connection for a particular protocol > * type, such as <code>http</code>, <code>ftp</code>, or > * <code>gopher</code>. > * <p> > * In most cases, an instance of a <code>URLStreamHandler</code> > * subclass is not created directly by an application. Rather, the > * first time a protocol name is encountered when constructing a > * <code>URL</code>, the appropriate stream protocol handler is > * automatically loaded.*/ > > Which is exactly the problem in our case. Once the URLStreamHandler is > setup for the first blockcontext as protocol the second servlet will > directly use the java.net.URLStreamHandler and use that protocol. > > Meaning if you start tomcat with both apps deployed the first request of > the first app decides which blockcontext will be associate with the block > context protocol > > That happens in BlockContextURLStreamHandlerFactory where > createURLStreamHandler is only called once with the first request the > second then uses the old block context. > > > > webapp fails if on the same servlet container is a c2.2.1 or other c3 > webapp running > > > ------------------------------------------------------------------------------------- > > > > Key: COCOON3-105 > > URL: https://issues.apache.org/jira/browse/COCOON3-105 > > Project: Cocoon 3 > > Issue Type: Bug > > Components: cocoon-webapp > > Affects Versions: 3.0.0-beta-1 > > Reporter: Thorsten Scherler > > Priority: Blocker > > > > I noticed that you cannot run 2 c3 based war in a tomcat. > > To reproduce: > > - seed parent via archetype > > - seed block in parent via archetype > > - seed block2 in parent via archetype > > - seed webapp in parent via archetype > > - seed webapp2 in parent via archetype > > where webapp depends on block one and webapp2 depends on block2. > > My sample was: > > [INFO] Reactor Summary: > > [INFO] > > [INFO] myparent .......................................... SUCCESS > [1.163s] > > [INFO] myblock ........................................... SUCCESS > [3.611s] > > [INFO] mywebapp .......................................... SUCCESS > [1.924s] > > [INFO] myblock2 .......................................... SUCCESS > [1.498s] > > [INFO] mywebapp2 ......................................... SUCCESS > [1.230s] > > [INFO] > ------------------------------------------------------------------------ > > Now take a tomcat (I used 6) and first deploy the mywebapp. You can copy > it before you start to webapp or if you have it enable deploy it on a > running instance. You should see the welcome page under something like > http://localhost:8080/mywebapp-1.0-SNAPSHOT/ > > side note: http://localhost:8080/mywebapp-1.0-SNAPSHOT will throw a > StringIndexOutOfBoundsException but that is another ticket I guess. > > Now if you deploy the second webapp on a running instance it will deploy > without problem but requesting > > http://localhost:8080/mywebapp2-1.0-SNAPSHOT/ > > will return a blank page and in > > /.../tomcat/work/Catalina/localhost/mywebapp-1.0-SNAPSHOT/cocoon.log > > you find: > > 2012-09-13 22:12:46,056 ERROR http-8080-1 > org.apache.cocoon.servlet.XMLSitemapServlet - Can't initialize the > RequestProcessor correctly. > > org.apache.cocoon.sitemap.SitemapBuilder$SitemapBuilderException: Can't > build sitemap from blockcontext:/myblock2/sitemap.xmap > > at > org.apache.cocoon.sitemap.SitemapBuilder.build(SitemapBuilder.java:70) > ~[cocoon-sitemap-3.0.0-beta-1-SNAPSHOT.jar:3.0.0-beta-1-SNAPSHOT] > > at > org.apache.cocoon.servlet.RequestProcessor.initializeSitemap(RequestProcessor.java:203) > ~[cocoon-servlet-3.0.0-beta-1-SNAPSHOT.jar:3.0.0-beta-1-SNAPSHOT] > > ... > > Caused by: java.lang.RuntimeException: There is no block 'myblock2' > deployed. The available blocks are > {myblock=file:/home/thorsten/src/apache/apache-tomcat-6.0.20/work/Catalina/localhost/mywebapp-1.0-SNAPSHOT/blocks/myblock/}. > > at > org.apache.cocoon.blockdeployment.BlockContextURLConnection.getConnection(BlockContextURLConnection.java:76) > ~[cocoon-block-deployment-1.2.1.jar:1.2.1] > > at > org.apache.cocoon.blockdeployment.BlockContextURLConnection.getInputStream(BlockContextURLConnection.java:56) > ~[cocoon-block-deployment-1.2.1.jar:1.2.1] > > at java.net.URL.openStream(URL.java:1010) ~[na:1.6.0_30] > > at > org.apache.cocoon.sitemap.SitemapBuilder.build(SitemapBuilder.java:65) > ~[cocoon-sitemap-3.0.0-beta-1-SNAPSHOT.jar:3.0.0-beta-1-SNAPSHOT] > > ... 46 common frames omitted > > As you see the blockcontext from the 2nd app is the one from the first > EVEN if they are deployed as 2 different webapps! > > Now stop the tomcat and start again. > > Depending which app you request on a fresh stared tomcat that one will > work the other will present a blank page and the log will say something > like: > > Caused by: java.lang.RuntimeException: There is no block 'myblock' > deployed. The available blocks are > {myblock2=file:/home/thorsten/src/apache/apache-tomcat-6.0.20/work/Catalina/localhost/mywebapp2-1.0-SNAPSHOT/blocks/myblock2/}. > > In this case I requested the 2nd first. > > Originally I found out because we have a client that has some c3 and a > c2.2.1 app (not) running aside. So in case you create a 2.2.1 webapp from > the archetype as described http://cocoon.apache.org/2.2/1159_1_1.htmland use > it instead of the c3 2nd webapp you will get similar results. > > If you start first with the 1st c3 and then deploy the c2.2 on the run > then you can actually see both working ONLY if you first request the c3 and > then deploy and then see the c2. In case you do not request the c3 prior it > will not work once you requested the c2 (which maybe present interesting > for the cause of the problem). > > Now shutdown and start with both deployed the c2.2 always works and the > c3 not. > > I see the problem for our client coming when we introduced > > > <listener-class>org.apache.cocoon.blockdeployment.BlockDeploymentServletContextListener</listener-class> > > The main observation is that the c2 one seems to much more presistence > but that can come the way of invocation (on-demand vs. startup). Anyway the > blockcontext should never be shared between two different servlets. > > -- > This message is automatically generated by JIRA. > If you think it was sent incorrectly, please contact your JIRA > administrators > For more information on JIRA, see: http://www.atlassian.com/software/jira > -- The doctrine of human equality reposes on this: that there is no man really clever who has not found that he is stupid. -- Gilbert K. Chesterson