[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

        

Reply via email to