vgritsenko 02/02/12 08:18:45
Modified: . build.xml
src/java/org/apache/cocoon/servlet CocoonServlet.java
Added: tools/src ManifestToolTask.java
Log:
Make Cocoon work out of unpacked WAR. Ugly, but works.
Revision Changes Path
1.167 +7 -1 xml-cocoon2/build.xml
Index: build.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/build.xml,v
retrieving revision 1.166
retrieving revision 1.167
diff -u -r1.166 -r1.167
--- build.xml 11 Feb 2002 16:39:26 -0000 1.166
+++ build.xml 12 Feb 2002 16:18:45 -0000 1.167
@@ -1035,6 +1035,9 @@
<taskdef name="xconf-tool" classname="XConfToolTask"
classpath="${tools.dir}/anttasks"/>
+ <taskdef name="manifest-tool" classname="ManifestToolTask"
+ classpath="${tools.dir}/anttasks"/>
+
<!-- Invoke the SitemapToolTask to add optional entries -->
<sitemap-tool directory="${build.src}"
extension="sitemap"
@@ -1044,6 +1047,7 @@
<xconf-tool directory="${build.src}"
extension="xconf"
configuration="${build.war}/cocoon.xconf"/>
+
</target>
<!-- =================================================================== -->
@@ -1092,6 +1096,8 @@
</move>
<copy file="${build.dir}/${name}.jar"
tofile="${build.war}/WEB-INF/lib/${name}-${version}.jar"/>
+
+ <manifest-tool directory="${build.war}/WEB-INF/lib"
manifest="${build.war}/WEB-INF/Manifest.mf"/>
</target>
<!-- =================================================================== -->
@@ -1120,7 +1126,7 @@
<!-- Creates the war file -->
<!-- =================================================================== -->
<target name="webapp" depends="prepare-webapp, prepare-webapp-libs,
prepare-scratchpad-libs, prepare-xsp" description="* Generates the war package">
- <jar jarfile="${build.dir}/${name}.war" basedir="${build.war}" includes="**"/>
+ <jar jarfile="${build.dir}/${name}.war" basedir="${build.war}" includes="**"
manifest="${build.war}/WEB-INF/Manifest.mf"/>
</target>
<!-- =================================================================== -->
1.1 xml-cocoon2/tools/src/ManifestToolTask.java
Index: ManifestToolTask.java
===================================================================
/*****************************************************************************
* Copyright (C) The Apache Software Foundation. All rights reserved. *
* ------------------------------------------------------------------------- *
* This software is published under the terms of the Apache Software License *
* version 1.1, a copy of which has been included with this distribution in *
* the LICENSE file. *
*****************************************************************************/
import java.io.*;
import java.util.*;
import org.apache.tools.ant.*;
import org.apache.tools.ant.taskdefs.*;
import org.apache.tools.ant.types.*;
/**
* Creates Manifest file with the all the JARs and modification dates
* in the specified directory.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Vadim Gritsenko</a>
* @version CVS $Revision: 1.1 $ $Date: 2002/02/12 16:18:45 $
*/
public final class ManifestToolTask extends Task {
private String directory;
private String manifest;
public void setDirectory(String directory) {
this.directory = directory;
}
public void setManifest(String manifest) {
this.manifest = manifest;
}
public void execute() throws BuildException {
if (this.manifest == null) {
throw new BuildException("manifest attribute is required", location);
}
if (this.directory == null) {
throw new BuildException("directory attribute is required", location);
}
try {
// process recursive
this.process(new File(this.directory), this.manifest);
} catch (IOException ioe) {
throw new BuildException("IOException: " + ioe);
}
}
/**
* Scan recursive
*/
private void process(final File directoryFile,
final String manifest)
throws IOException, BuildException {
System.out.println("Writing: " + manifest);
FileWriter w = new FileWriter(manifest);
w.write("Manifest-Version: 1.0\n");
w.write("Cocoon-Libs: ");
final File[] files = directoryFile.listFiles();
for(int i = 0; i < files.length; i++) {
if (files[i].getName().endsWith(".jar")) {
w.write(files[i].getName());
w.write(" ");
}
}
w.write("\n");
for(int i = 0; i < files.length; i++) {
if (files[i].getName().endsWith(".jar")) {
w.write("Cocoon-Lib-");
String s = files[i].getName().replace('.', '_');
w.write(s);
w.write(": ");
w.write(String.valueOf(files[i].lastModified()));
w.write("\n");
}
}
w.close();
}
}
1.8 +97 -5
xml-cocoon2/src/java/org/apache/cocoon/servlet/CocoonServlet.java
Index: CocoonServlet.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/servlet/CocoonServlet.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- CocoonServlet.java 4 Feb 2002 13:51:27 -0000 1.7
+++ CocoonServlet.java 12 Feb 2002 16:18:45 -0000 1.8
@@ -97,11 +97,17 @@
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
+import java.io.FileOutputStream;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.StringTokenizer;
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.jar.Manifest;
+import java.util.jar.Attributes;
/**
* This is the entry point for Cocoon execution as an HTTP Servlet.
@@ -113,7 +119,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Berin Loritsch</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Leo Sutic</a>
- * @version CVS $Id: CocoonServlet.java,v 1.7 2002/02/04 13:51:27 cziegeler Exp $
+ * @version CVS $Id: CocoonServlet.java,v 1.8 2002/02/12 16:18:45 vgritsenko Exp $
*/
public class CocoonServlet extends HttpServlet {
@@ -149,6 +155,7 @@
private static final boolean SAVE_UPLOADED_FILES_TO_DISK = true;
private static final int MAX_UPLOAD_SIZE = 10000000; // 10Mb
private int maxUploadSize = MAX_UPLOAD_SIZE; // 10Mb
+
private File uploadDir;
private File workDir;
private File cacheDir;
@@ -196,6 +203,7 @@
this.appContext.put(Constants.CONTEXT_ENVIRONMENT_CONTEXT, new
HttpContext(this.servletContext));
this.servletContextPath = this.servletContext.getRealPath("/");
+
// first init the work-directory for the logger.
// this is required if we are running inside a war file!
final String workDirParam = conf.getInitParameter("work-directory");
@@ -399,12 +407,10 @@
*
* @throws ServletException
*/
- protected String getClassPath()
- throws ServletException {
+ protected String getClassPath() throws ServletException {
StringBuffer buildClassPath = new StringBuffer();
File root = null;
-
if (servletContextPath != null) {
// Old method. There *MUST* be a better method than this...
@@ -450,7 +456,7 @@
}
if (libDirURL != null &&
libDirURL.toExternalForm().startsWith("file:")) {
- root = new File(libDirURL.toExternalForm().substring(5));
+ root = new
File(libDirURL.toExternalForm().substring("file:".length()));
}
if (classDirURL != null) {
@@ -468,6 +474,11 @@
}
}
+ // Unable to find lib directory. Going the hard way.
+ if (root == null) {
+ root = extractLibraries();
+ }
+
if (root != null && root.isDirectory()) {
File[] libraries = root.listFiles();
Arrays.sort(libraries);
@@ -494,6 +505,87 @@
.append(getExtraClassPath());
return buildClassPath.toString();
}
+
+ private File extractLibraries() {
+ try {
+ URL manifestURL =
this.servletContext.getResource("/META-INF/MANIFEST.MF");
+ if (manifestURL == null) {
+ this.log.fatalError("Unable to get Manifest");
+ return null;
+ }
+
+ Manifest mf = new Manifest(manifestURL.openStream());
+ Attributes attr = mf.getMainAttributes();
+ String libValue = (String)attr.getValue("Cocoon-Libs");
+ if (libValue == null) {
+ this.log.fatalError("Unable to get 'Cocoon-Libs' attribute from the
Manifest");
+ return null;
+ }
+
+ List libList = new ArrayList();
+ for(StringTokenizer st = new StringTokenizer(libValue, " ");
st.hasMoreTokens();) {
+ libList.add(st.nextToken());
+ }
+
+ File root = new File(this.workDir, "lib");
+ root.mkdirs();
+
+ File[] oldLibs = root.listFiles();
+ for (int i=0; i<oldLibs.length; i++) {
+ String oldLib = oldLibs[i].getName();
+ if (!libList.contains(oldLib)) {
+ this.log.debug("Removing old library " + oldLibs[i]);
+ oldLibs[i].delete();
+ }
+ }
+
+ this.log.warn("Extracting libraries into " + root);
+ byte[] buffer = new byte[65536];
+ for (Iterator i = libList.iterator(); i.hasNext();) {
+ String libName = (String)i.next();
+
+ long lastModified = -1;
+ try {
+ lastModified = Long.parseLong(attr.getValue("Cocoon-Lib-" +
libName.replace('.', '_')));
+ } catch (Exception e) {
+ this.log.debug("Failed to parse lastModified: " +
attr.getValue("Cocoon-Lib-" + libName.replace('.', '_')));
+ }
+
+ File lib = new File(root, libName);
+ if (lib.exists() && lib.lastModified() != lastModified) {
+ this.log.debug("Removing modified library " + lib);
+ lib.delete();
+ }
+
+ InputStream is =
this.servletContext.getResourceAsStream("/WEB-INF/lib/" + libName);
+ if (is == null) {
+ this.log.warn("Skipping " + libName);
+ } else {
+ this.log.debug("Extracting " + libName);
+ OutputStream os = null;
+ try {
+ os = new FileOutputStream(lib);
+ int count;
+ while((count = is.read(buffer)) > 0) {
+ os.write(buffer, 0, count);
+ }
+ } finally {
+ if (is != null) is.close();
+ if (os != null) os.close();
+ }
+ }
+
+ if (lastModified != -1) {
+ lib.setLastModified(lastModified);
+ }
+ }
+
+ return root;
+ } catch (IOException e) {
+ this.log.fatalError("Exception while processing Manifest file", e);
+ return null;
+ }
+ }
/**
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]