[Patch] Allow shielded class loading for a single block
-------------------------------------------------------
Key: COCOON-1955
URL: http://issues.apache.org/jira/browse/COCOON-1955
Project: Cocoon
Issue Type: New Feature
Components: * Cocoon Core, - Blocks Framework
Affects Versions: 2.2-dev (Current SVN)
Reporter: Alexander Klimetschek
== Problem ==
When trying to integrate Apache Solr in our Cocoon webapplication, we got a
problem with conflicting versions of jars. Our jackrabbit block needs an old
lucene, whereas Solr wants a fresh new lucene nightly build.
== Solution ==
Since we integrate the SolrServlet (and the other servlets from solar) inside a
BlockServlet to have them all inside our cocoon webapp with consistent URLs, we
considered adding a ShieldingServlet. Thus the BlockServlet wraps the
ShieldingServlet which in turn wraps the SolrServlet. The configuration for the
BlockServlet bean looks like this:
<bean id="com.mindquarry.search.solr.solr-select-block"
class="org.apache.cocoon.blocks.BlockServlet">
<property name="mountPath" value="/solr-select" />
<property name="servletClass"
value="org.apache.cocoon.bootstrap.servlet.ShieldingServlet" />
<property name="blockContextURL"
value="blockcontext:/mindquarry-solr-block/" />
<property name="properties">
<map>
<entry key="servlet-class"
value="org.apache.solr.servlet.SolrServlet" />
<entry key="bootstrap-classpath-file"
value="/paranoid-classpath.txt" />
<entry key="bootstrap-classloader-debug"
value="true" />
<entry key="bootstrap-classloader-factory"
value="org.apache.cocoon.classloader.DefaultClassLoaderFactory" />
</map>
</property>
</bean>
The directory structure of the solr-block:
src/main/resources/
COB-INF/
paranoid-classpath.txt
paranoid-lib/
<shielded-jars>.jar
(including the jar which contains the
solr servlet)
META-INF/
cocoon/
spring/
solr-blockservlet.xml
The paranoid-classpath.txt contains the following single line:
lib-dir: context:paranoid-lib
== The Patch ==
To get the ShieldingServlet work with the blocks-fw and the basic shielding
that is done in the Cocoon webapp anyway (via a ShieldingListener in the
web.xml), two things must be done:
a) The BootstrapClassLoaderManager in cocoon-bootstrap must not store the
classloader it creates in a static variable so that in each call of
getClassLoader() a new ClassLoader is created. That method is exactly called 2
times in our situation: first by the cocoon webapp shielding listener and then
by the ShieldingServlet in our block.
b) The method BlockContext.getResourcePaths() must be implemented to list the
resources in that block context (stuff under COB-INF of that block).
Lots of the work was done by my colleague Alexander Saar.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira