You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2006/06/27 12:35:57 UTC
svn commit: r417407 - in /cocoon/trunk: ./
core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/
core/cocoon-bootstrap/src/main/java/org/apache/cocoon/classloader/
tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/...
Author: cziegeler
Date: Tue Jun 27 03:35:56 2006
New Revision: 417407
URL: http://svn.apache.org/viewvc?rev=417407&view=rev
Log:
Add web.xml rewriter to deploy tool which will add the paranoid classloader
Fix include bug in paranoid class loader
Added:
cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/ParanoidListener.java (with props)
cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/WebApplicationRewriter.java (with props)
cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/XMLUtils.java (with props)
Removed:
cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/ParanoidHttpSessionListener.java
cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/ParanoidServletContextListener.java
Modified:
cocoon/trunk/README.txt
cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/AbstractParanoidListener.java
cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/classloader/DefaultClassLoader.java
cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/AbstractDeployMojo.java
Modified: cocoon/trunk/README.txt
URL: http://svn.apache.org/viewvc/cocoon/trunk/README.txt?rev=417407&r1=417406&r2=417407&view=diff
==============================================================================
--- cocoon/trunk/README.txt (original)
+++ cocoon/trunk/README.txt Tue Jun 27 03:35:56 2006
@@ -74,9 +74,13 @@
Go to core/cocoon-webapp:
$ mvn cocoon:deploy
- $ mvn jetty6:run-exploded
+ $ mvn jetty6:run
Point your browser to http://localhost:8888/
+
+(Don't use jetty6:run-exploded as in this case the jetty6 plugin will
+ alter the webapp build by the Cocoon deployer again!)
+
HOW TO START THE COCOON WEBAPP (OSGI MODE)
Modified: cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/AbstractParanoidListener.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/AbstractParanoidListener.java?rev=417407&r1=417406&r2=417407&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/AbstractParanoidListener.java (original)
+++ cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/AbstractParanoidListener.java Tue Jun 27 03:35:56 2006
@@ -75,6 +75,7 @@
while ( i.hasNext() ) {
final Object listener = i.next();
try {
+ this.invokeListener(identifier, listener, event);
} catch (Exception e) {
throw new RuntimeException("Cannot invoke listener " + listener, e);
}
Added: cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/ParanoidListener.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/ParanoidListener.java?rev=417407&view=auto
==============================================================================
--- cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/ParanoidListener.java (added)
+++ cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/ParanoidListener.java Tue Jun 27 03:35:56 2006
@@ -0,0 +1,288 @@
+/*
+ * Copyright 1999-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cocoon.bootstrap.servlet;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextAttributeEvent;
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpSessionActivationListener;
+import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionBindingEvent;
+import javax.servlet.http.HttpSessionBindingListener;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
+
+/**
+ * This listener can be used as a wrapper around "real" listeners to
+ * support the paranoid class loader.
+ *
+ * @version $Id$
+ */
+public class ParanoidListener
+ implements HttpSessionListener,
+ ServletContextListener,
+ HttpSessionActivationListener,
+ HttpSessionAttributeListener,
+ HttpSessionBindingListener,
+ ServletContextAttributeListener {
+
+ private static final String SERVLET_CONTEXT_CREATED = "CLC";
+
+ private static final String SERVLET_CONTEXT_DESTROYED = "CLD";
+
+ private static final String SESSION_CREATED = "SEC";
+
+ private static final String SESSION_DESTROYED = "SED";
+
+ private static final String SESSION_ACTIVATED = "SEAC";
+
+ private static final String SESSION_PASSIVATE = "SEDE";
+
+ private static final String VALUE_BOUND = "VB";
+
+ private static final String VALUE_UNBOUND = "VUB";
+
+ private static final String ATTR_REPLACED = "ARE";
+
+ private static final String ATTR_REMOVED = "ADE";
+
+ private static final String ATTR_ADDED = "AAD";
+
+ private static final String CONTEXT_ATTR_REPLACED = "CARE";
+
+ private static final String CONTEXT_ATTR_REMOVED = "CADE";
+
+ private static final String CONTEXT_ATTR_ADDED = "CAAD";
+
+ protected ClassLoader classloader;
+
+ protected List httpSessionListeners = new ArrayList();
+
+ protected List servletContextListeners = new ArrayList();
+
+ protected List httpSessionActivationListeners = new ArrayList();
+
+ protected List httpSessionBindingListeners = new ArrayList();
+
+ protected List servletContextAttributeListeners = new ArrayList();
+
+ protected List httpSessionAttributeListeners = new ArrayList();
+
+ protected void init(ServletContext context) {
+ // Get the classloader
+ try {
+ this.classloader = BootstrapClassLoaderManager.getClassLoader(context);
+ } catch (ServletException se) {
+ throw new RuntimeException("Unable to create bootstrap classloader.", se);
+ }
+
+ // Create the listeners
+ final ClassLoader old = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(this.classloader);
+ final String listenersConfig = context.getInitParameter(ParanoidListener.class.getName());
+ if ( listenersConfig != null ) {
+ final StringTokenizer st = new StringTokenizer(listenersConfig, " \t\r\n\f;,", false);
+ while ( st.hasMoreTokens() ) {
+ final String className = st.nextToken();
+ try {
+ Class listenerClass = this.classloader.loadClass(className);
+ final Object listener = listenerClass.newInstance();
+ if ( listener instanceof HttpSessionListener ) {
+ this.httpSessionListeners.add(listener);
+ }
+ if ( listener instanceof ServletContextListener ) {
+ this.servletContextListeners.add(listener);
+ }
+ if ( listener instanceof HttpSessionActivationListener ) {
+ this.httpSessionActivationListeners.add(listener);
+ }
+ if ( listener instanceof HttpSessionAttributeListener ) {
+ this.httpSessionAttributeListeners.add(listener);
+ }
+ if ( listener instanceof HttpSessionBindingListener ) {
+ this.httpSessionBindingListeners.add(listener);
+ }
+ if ( listener instanceof ServletContextAttributeListener ) {
+ this.servletContextAttributeListeners.add(listener);
+ }
+ } catch (Exception e) {
+ throw new RuntimeException("Cannot load listener " + className, e);
+ }
+ }
+ }
+ } finally {
+ Thread.currentThread().setContextClassLoader(old);
+ }
+ }
+
+ protected void invoke(List listeners, String identifier, Object event) {
+ if ( this.classloader != null ) {
+ final ClassLoader old = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(this.classloader);
+ final Iterator i = listeners.iterator();
+ while ( i.hasNext() ) {
+ final Object listener = i.next();
+ try {
+ if ( ParanoidListener.SERVLET_CONTEXT_CREATED.equals(identifier) ) {
+ ((ServletContextListener)listener).contextInitialized((ServletContextEvent)event);
+ } else if ( ParanoidListener.SERVLET_CONTEXT_DESTROYED.equals(identifier) ) {
+ ((ServletContextListener)listener).contextDestroyed((ServletContextEvent)event);
+ } else if ( ParanoidListener.SESSION_CREATED.equals(identifier) ) {
+ ((HttpSessionListener)listener).sessionCreated((HttpSessionEvent)event);
+ } else if ( ParanoidListener.SESSION_DESTROYED.equals(identifier) ) {
+ ((HttpSessionListener)listener).sessionDestroyed((HttpSessionEvent)event);
+ } else if ( ParanoidListener.VALUE_BOUND.equals(identifier) ) {
+ ((HttpSessionBindingListener)listener).valueBound((HttpSessionBindingEvent)event);
+ } else if ( ParanoidListener.VALUE_UNBOUND.equals(identifier) ) {
+ ((HttpSessionBindingListener)listener).valueUnbound((HttpSessionBindingEvent)event);
+ } else if ( ParanoidListener.ATTR_ADDED.equals(identifier) ) {
+ ((HttpSessionAttributeListener)listener).attributeAdded((HttpSessionBindingEvent)event);
+ } else if ( ParanoidListener.ATTR_REMOVED.equals(identifier) ) {
+ ((HttpSessionAttributeListener)listener).attributeRemoved((HttpSessionBindingEvent)event);
+ } else if ( ParanoidListener.ATTR_REPLACED.equals(identifier) ) {
+ ((HttpSessionAttributeListener)listener).attributeReplaced((HttpSessionBindingEvent)event);
+ } else if ( ParanoidListener.CONTEXT_ATTR_ADDED.equals(identifier) ) {
+ ((ServletContextAttributeListener)listener).attributeAdded((ServletContextAttributeEvent)event);
+ } else if ( ParanoidListener.CONTEXT_ATTR_REMOVED.equals(identifier) ) {
+ ((ServletContextAttributeListener)listener).attributeRemoved((ServletContextAttributeEvent)event);
+ } else if ( ParanoidListener.CONTEXT_ATTR_REPLACED.equals(identifier) ) {
+ ((ServletContextAttributeListener)listener).attributeReplaced((ServletContextAttributeEvent)event);
+ } else if ( ParanoidListener.SESSION_ACTIVATED.equals(identifier) ) {
+ ((HttpSessionActivationListener)listener).sessionDidActivate((HttpSessionEvent)event);
+ } else if ( ParanoidListener.SESSION_PASSIVATE.equals(identifier) ) {
+ ((HttpSessionActivationListener)listener).sessionWillPassivate((HttpSessionEvent)event);
+ }
+ } catch (Exception e) {
+ throw new RuntimeException("Cannot invoke listener " + listener, e);
+ }
+ }
+ } finally {
+ Thread.currentThread().setContextClassLoader(old);
+ }
+ }
+ }
+
+ /**
+ * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
+ */
+ public void contextDestroyed(ServletContextEvent contextEvent) {
+ this.invoke(this.servletContextListeners, ParanoidListener.SERVLET_CONTEXT_DESTROYED, contextEvent);
+ }
+
+ /**
+ * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
+ */
+ public void contextInitialized(ServletContextEvent contextEvent) {
+ final ServletContext context = contextEvent.getServletContext();
+ this.init(context);
+
+ this.invoke(this.servletContextListeners, ParanoidListener.SERVLET_CONTEXT_CREATED, contextEvent);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)
+ */
+ public void sessionCreated(HttpSessionEvent event) {
+ this.invoke(this.httpSessionListeners, ParanoidListener.SESSION_CREATED, event);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
+ */
+ public void sessionDestroyed(HttpSessionEvent event) {
+ this.invoke(this.httpSessionListeners, ParanoidListener.SESSION_DESTROYED, event);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)
+ */
+ public void valueBound(HttpSessionBindingEvent event) {
+ this.invoke(this.httpSessionBindingListeners, ParanoidListener.VALUE_BOUND, event);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
+ */
+ public void valueUnbound(HttpSessionBindingEvent event) {
+ this.invoke(this.httpSessionBindingListeners, ParanoidListener.VALUE_UNBOUND, event);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpSessionAttributeListener#attributeAdded(javax.servlet.http.HttpSessionBindingEvent)
+ */
+ public void attributeAdded(HttpSessionBindingEvent event) {
+ this.invoke(this.httpSessionAttributeListeners, ParanoidListener.ATTR_ADDED, event);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpSessionAttributeListener#attributeRemoved(javax.servlet.http.HttpSessionBindingEvent)
+ */
+ public void attributeRemoved(HttpSessionBindingEvent event) {
+ this.invoke(this.httpSessionAttributeListeners, ParanoidListener.ATTR_REMOVED, event);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpSessionAttributeListener#attributeReplaced(javax.servlet.http.HttpSessionBindingEvent)
+ */
+ public void attributeReplaced(HttpSessionBindingEvent event) {
+ this.invoke(this.httpSessionAttributeListeners, ParanoidListener.ATTR_REPLACED, event);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpSessionActivationListener#sessionDidActivate(javax.servlet.http.HttpSessionEvent)
+ */
+ public void sessionDidActivate(HttpSessionEvent event) {
+ this.invoke(this.httpSessionActivationListeners, ParanoidListener.SESSION_ACTIVATED, event);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpSessionActivationListener#sessionWillPassivate(javax.servlet.http.HttpSessionEvent)
+ */
+ public void sessionWillPassivate(HttpSessionEvent event) {
+ this.invoke(this.httpSessionActivationListeners, ParanoidListener.SESSION_PASSIVATE, event);
+ }
+
+ /**
+ * @see javax.servlet.ServletContextAttributeListener#attributeAdded(javax.servlet.ServletContextAttributeEvent)
+ */
+ public void attributeAdded(ServletContextAttributeEvent event) {
+ this.invoke(this.servletContextAttributeListeners, ParanoidListener.CONTEXT_ATTR_ADDED, event);
+ }
+
+ /**
+ * @see javax.servlet.ServletContextAttributeListener#attributeRemoved(javax.servlet.ServletContextAttributeEvent)
+ */
+ public void attributeRemoved(ServletContextAttributeEvent event) {
+ this.invoke(this.servletContextAttributeListeners, ParanoidListener.CONTEXT_ATTR_REMOVED, event);
+ }
+
+ /**
+ * @see javax.servlet.ServletContextAttributeListener#attributeReplaced(javax.servlet.ServletContextAttributeEvent)
+ */
+ public void attributeReplaced(ServletContextAttributeEvent event) {
+ this.invoke(this.servletContextAttributeListeners, ParanoidListener.CONTEXT_ATTR_REPLACED, event);
+ }
+}
\ No newline at end of file
Propchange: cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/ParanoidListener.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/bootstrap/servlet/ParanoidListener.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/classloader/DefaultClassLoader.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/classloader/DefaultClassLoader.java?rev=417407&r1=417406&r2=417407&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/classloader/DefaultClassLoader.java (original)
+++ cocoon/trunk/core/cocoon-bootstrap/src/main/java/org/apache/cocoon/classloader/DefaultClassLoader.java Tue Jun 27 03:35:56 2006
@@ -63,7 +63,7 @@
boolean tryHere;
// If no explicit includes, try here
- if (this.includes == null) {
+ if (this.includes == null || this.includes.size() == 0) {
tryHere = true;
} else {
// See if it matches include patterns
@@ -77,7 +77,7 @@
}
// Go through the exclusion list
- if (tryHere && excludes != null) {
+ if (tryHere && this.excludes != null && this.excludes.size() > 0) {
for (int i = 0; i < this.excludes.size(); i++) {
if (WildcardMatcherHelper.match((String)excludes.get(i), name) != null) {
tryHere = false;
Modified: cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/AbstractDeployMojo.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/AbstractDeployMojo.java?rev=417407&r1=417406&r2=417407&view=diff
==============================================================================
--- cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/AbstractDeployMojo.java (original)
+++ cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/AbstractDeployMojo.java Tue Jun 27 03:35:56 2006
@@ -16,7 +16,9 @@
package org.apache.cocoon.maven.deployer;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
@@ -26,6 +28,8 @@
import org.apache.cocoon.maven.deployer.monolithic.DevelopmentBlock;
import org.apache.cocoon.maven.deployer.monolithic.DevelopmentProperty;
import org.apache.cocoon.maven.deployer.monolithic.MonolithicCocoonDeployer;
+import org.apache.cocoon.maven.deployer.utils.WebApplicationRewriter;
+import org.apache.cocoon.maven.deployer.utils.XMLUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.repository.ArtifactRepository;
@@ -34,14 +38,15 @@
import org.apache.maven.plugin.war.AbstractWarMojo;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.artifact.MavenMetadataSource;
+import org.w3c.dom.Document;
/**
* Create a Cocoon web application based on a block deployment descriptor.
*
* @version $Id$
*/
-abstract class AbstractDeployMojo extends AbstractWarMojo
-{
+abstract class AbstractDeployMojo extends AbstractWarMojo {
+
/**
* Artifact factory, needed to download source jars for inclusion in classpath.
*
@@ -137,7 +142,14 @@
*/
private String webXml;
- /**
+ /**
+ * Use paranoid classloading
+ *
+ * @parameter expression="${maven.war.paranoidclassloader}"
+ */
+ private boolean useParanoidClassloader = true;
+
+ /**
* Deploy a monolithic Cocoon web application. This means it doesn't use
* the features that the blocks-fw offers.
*/
@@ -159,7 +171,23 @@
}
// take care of paranoid classloading
- // TBD
+ if ( this.useParanoidClassloader ) {
+ String webXmlLocation = this.getWebXml();
+ if ( webXmlLocation == null ) {
+ webXmlLocation = getWarSourceDirectory().getAbsolutePath() + File.separatorChar + "WEB-INF" + File.separatorChar + "web.xml";
+ }
+ this.getLog().info("Adding paranoid classloader configuration.");
+ this.getLog().info("Reading web.xml: " + webXmlLocation);
+ try {
+ final Document webAppDoc = XMLUtils.parseXml(new FileInputStream(new File(webXmlLocation)));
+ WebApplicationRewriter.rewrite(webAppDoc);
+ final String dest = webappDirectory_.getAbsolutePath() + File.separatorChar + "WEB-INF" + File.separatorChar + "web.xml";
+ this.getLog().info("Writing web.xml: " + dest);
+ XMLUtils.write(webAppDoc, new FileOutputStream(dest));
+ } catch (Exception e) {
+ throw new MojoExecutionException("Unable to read web.xml from " + webXmlLocation, e);
+ }
+ }
}
/**
Added: cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/WebApplicationRewriter.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/WebApplicationRewriter.java?rev=417407&view=auto
==============================================================================
--- cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/WebApplicationRewriter.java (added)
+++ cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/WebApplicationRewriter.java Tue Jun 27 03:35:56 2006
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cocoon.maven.deployer.utils;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @version $Id$
+ */
+public class WebApplicationRewriter {
+
+ public static final String SERVLET_CLASS = "org.apache.cocoon.bootstrap.servlet.ParanoidServlet";
+
+ public static final String LISTENER_CLASS = "org.apache.cocoon.bootstrap.servlet.ParanoidListener";
+
+ public static boolean rewrite(Document webAppDoc) {
+ boolean rewritten = false;
+ final Element rootElement = webAppDoc.getDocumentElement();
+ // first rewrite servlets
+ final List servlets = XMLUtils.getChildNodes(rootElement, "servlet");
+ Iterator i = servlets.iterator();
+ while ( i.hasNext() ) {
+ final Element servletElement = (Element)i.next();
+ final Element servletClassElement = XMLUtils.getChildNode(servletElement, "servlet-class");
+ if ( servletClassElement != null ) {
+ final String className = XMLUtils.getValue(servletClassElement);
+ XMLUtils.setValue(servletClassElement, SERVLET_CLASS);
+ // create init-param with real servlet class
+ final Element initParamElem = webAppDoc.createElementNS(null, "init-param");
+ final Element initParamNameElem = webAppDoc.createElementNS(null, "param-name");
+ final Element initParamValueElem = webAppDoc.createElementNS(null, "param-value");
+ initParamElem.appendChild(initParamNameElem);
+ initParamElem.appendChild(initParamValueElem);
+ XMLUtils.setValue(initParamNameElem, "servlet-class");
+ XMLUtils.setValue(initParamValueElem, className);
+ servletElement.appendChild(initParamElem);
+ rewritten = true;
+ }
+ }
+ // now rewrite listeners
+ final List listeners = XMLUtils.getChildNodes(rootElement, "listener");
+ i = listeners.iterator();
+ boolean hasListener = false;
+ final StringBuffer rewrittenListeners = new StringBuffer();
+ while ( i.hasNext() ) {
+ final Element listenerElement = (Element)i.next();
+ final Element listenerClassElement = XMLUtils.getChildNode(listenerElement, "listener-class");
+ if ( listenerClassElement != null ) {
+ final String className = XMLUtils.getValue(listenerClassElement);
+ if ( rewrittenListeners.length() > 0 ) {
+ rewrittenListeners.append(',');
+ }
+ rewrittenListeners.append(className);
+ if ( hasListener ) {
+ rootElement.removeChild(listenerElement);
+ } else {
+ XMLUtils.setValue(listenerClassElement, LISTENER_CLASS);
+ hasListener = true;
+ }
+ rewritten = true;
+ }
+ }
+ // remove old parameter
+ i = XMLUtils.getChildNodes(rootElement, "context-param").iterator();
+ while ( i.hasNext() ) {
+ final Element child = (Element)i.next();
+ if ( LISTENER_CLASS.equals(XMLUtils.getValue(XMLUtils.getChildNode(child, "param-name")))) {
+ rootElement.removeChild(child);
+ }
+ }
+ if ( hasListener ) {
+ addContextParameter(rootElement, LISTENER_CLASS, rewrittenListeners.toString());
+ }
+ // TBD: filters
+ return rewritten;
+ }
+
+ protected static void addContextParameter(Element root, String name, String value) {
+ // search the element where we have to put the new context parameter before!
+ // we know that either filters or listeners exist
+ Element searchElement = XMLUtils.getChildNode(root, "context-param");
+ if ( searchElement == null ) {
+ searchElement = XMLUtils.getChildNode(root, "filter");
+ if ( searchElement == null ) {
+ searchElement = XMLUtils.getChildNode(root, "filter-mapping");
+ if ( searchElement == null ) {
+ searchElement = XMLUtils.getChildNode(root, "listener");
+ }
+ }
+ }
+ final Element contextParamElement = root.getOwnerDocument().createElementNS(null, "context-param");
+ final Element contextParamNameElement = root.getOwnerDocument().createElementNS(null, "param-name");
+ final Element contextParamValueElement = root.getOwnerDocument().createElementNS(null, "param-value");
+ contextParamElement.appendChild(contextParamNameElement);
+ contextParamElement.appendChild(contextParamValueElement);
+ XMLUtils.setValue(contextParamNameElement, name);
+ XMLUtils.setValue(contextParamValueElement, value);
+ root.insertBefore(contextParamElement, searchElement);
+ }
+}
\ No newline at end of file
Propchange: cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/WebApplicationRewriter.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/WebApplicationRewriter.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/XMLUtils.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/XMLUtils.java?rev=417407&view=auto
==============================================================================
--- cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/XMLUtils.java (added)
+++ cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/XMLUtils.java Tue Jun 27 03:35:56 2006
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cocoon.maven.deployer.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * @version $Id$
+ */
+public class XMLUtils {
+
+ public static Document parseXml(InputStream source) throws IOException, SAXException {
+ try {
+ DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
+ documentFactory.setNamespaceAware(true);
+ documentFactory.setValidating(false);
+ DocumentBuilder docBuilder = documentFactory.newDocumentBuilder();
+ // Parse using the local dtds instead of remote dtds. This
+ // allows to deploy the application offline
+ /*
+ docBuilder.setEntityResolver(new EntityResolver() {
+ public InputSource resolveEntity(String publicId, String systemId) throws SAXException,
+ java.io.IOException {
+ if (systemId.equals("http://java.sun.com/dtd/web-app_2_3.dtd")) {
+ return new InputSource(getClass().getResourceAsStream("web-app_2_3.dtd"));
+ }
+ return null;
+ }
+ });
+ */
+ return docBuilder.parse(source);
+ } catch (ParserConfigurationException pce) {
+ throw new IOException("Creating document failed:" + pce.getMessage());
+ }
+ }
+
+ public static void write(Document node, OutputStream out)
+ throws Exception {
+ final Properties format = new Properties();
+ format.put(OutputKeys.METHOD, "xml");
+ format.put(OutputKeys.OMIT_XML_DECLARATION, "no");
+ format.put(OutputKeys.INDENT, "yes");
+
+ Transformer transformer;
+ transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.setOutputProperties(format);
+ transformer.transform(new DOMSource(node), new StreamResult(out));
+ }
+
+ public static List getChildNodes(Element parent, String nodeName) {
+ final List nodes = new ArrayList();
+ if ( parent != null && nodeName != null ) {
+ final NodeList children = parent.getChildNodes();
+ if ( children != null ) {
+ for(int i=0; i<children.getLength(); i++) {
+ if ( nodeName.equals(children.item(i).getLocalName()) ) {
+ nodes.add(children.item(i));
+ }
+ }
+ }
+ }
+ return nodes;
+ }
+
+ public static Element getChildNode(Element parent, String nodeName) {
+ final List children = getChildNodes(parent, nodeName);
+ if ( children.size() > 0 ) {
+ return (Element)children.get(0);
+ }
+
+ return null;
+ }
+
+ public static String getValue(Element node) {
+ if (node != null) {
+ if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
+ return node.getNodeValue();
+ } else {
+ node.normalize();
+ NodeList childs = node.getChildNodes();
+ int i = 0;
+ int length = childs.getLength();
+ while (i < length) {
+ if (childs.item(i).getNodeType() == Node.TEXT_NODE) {
+ return childs.item(i).getNodeValue().trim();
+ } else {
+ i++;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public static void setValue(Element node, String value) {
+ if ( node != null ) {
+ // remove all children
+ while ( node.hasChildNodes() ) {
+ node.removeChild(node.getFirstChild());
+ }
+ node.appendChild(node.getOwnerDocument().createTextNode(value));
+ }
+ }
+}
\ No newline at end of file
Propchange: cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/XMLUtils.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cocoon/trunk/tools/cocoon-block-deployer/cocoon-deployer-plugin/src/main/java/org/apache/cocoon/maven/deployer/utils/XMLUtils.java
------------------------------------------------------------------------------
svn:keywords = Id