Hello everyone. I had to modify a little the wljspc task (under org\apache\tools\ant\taskdefs\optional\jsp). I added three optional parameters: docroot, compiler and compilerclass, and I tested succesfully with wl 5.1 I attach the class code to this msg. I'd like to know other members' opinion about the code I modified... maybe my code will be appreciated.. :-D so much to be included in future Ant releases. Thanks' a lot Valerio Gentile
/* * The Apache Software License, Version 1.1 * * Copyright (c) 2000,2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Ant", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.taskdefs.optional.jsp;
//apache/ant imports import org.apache.tools.ant.taskdefs.MatchingTask; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.taskdefs.Java; import org.apache.tools.ant.types.Path; import org.apache.tools.ant.Project; //java imports import java.io.File; import java.util.Vector; import java.util.Date; import java.util.StringTokenizer; /** * VaG - 09/10/2002 * * @author <a href="mailto:[EMAIL PROTECTED]">Valerio Gentile</a> http://www.tidysoft.com * * Added parameters: * docroot : weblogic document root * compiler: java compiler executable (it must be in the path) * compilerclass: java compiler class (it must be in the classpath) * * Tested on Weblogic 5.1 - Win2K * * * <pre> * example * <target name="jspcompile" depends="compile"> * <wljspc src="c:\\weblogic\\myserver\\public_html" * dest="c:\\weblogic\\myserver\\serverclasses" * compiler="javac" * docRoot="c:\\weblogic\\myserver\\public_html" * package="myapp.jsp"> * <classpath> * <pathelement location="${weblogic.classpath}" /> * <pathelement path="${compile.dest}" /> * </classpath> * * </wljspc> * </target> * </pre> * * * Precompiles JSP's using WebLogic's JSP compiler (weblogic.jspc). * * @author <a href="mailto:[EMAIL PROTECTED]">Avik Sengupta</a> http://www.webteksoftware.com * * Tested only on Weblogic 4.5.1 - NT4.0 and Solaris 5.7 * * required attributes * src : root of source tree for JSP * (it can be the document root for your weblogic server, * if it's not explicitly set) * dest : root of destination directory, what you have set as WorkingDir in the weblogic properties * package : start package name under which your JSP's would be compiled * * other attributes * classpath * * A classpath should be set which contains the weblogic classes as well as all application classes * referenced by the JSP. The system classpath is also appended when the jspc is called, so you may * choose to put everything in the classpath while calling Ant. However, since presumably the JSP's will reference * classes being build by Ant, it would be better to explicitly add the classpath in the task * * The task checks timestamps on the JSP's and the generated classes, and compiles * only those files that have changed. * * It follows the weblogic naming convention of putting classes in * <b> _dirName/_fileName.class for dirname/fileName.jsp </b> * * Limitation: It compiles the files thru the Classic compiler only. * Limitation: Since it is my experience that weblogic jspc throws out of memory error on being given too * many files at one go, it is called multiple times with one jsp file each. * * <pre> * example * <target name="jspcompile" depends="compile"> * <wljspc src="c:\\weblogic\\myserver\\public_html" dest="c:\\weblogic\\myserver\\serverclasses" package="myapp.jsp"> * <classpath> * <pathelement location="${weblogic.classpath}" /> * <pathelement path="${compile.dest}" /> * </classpath> * * </wljspc> * </target> * </pre> * */ public class WLJspc extends MatchingTask { // TODO Test on more versions of weblogic // TODO add more attributes to the task, to take care of all jspc options // TODO Test on Unix /** * VaG - 09/10/2002 * Document-root. */ private File m_docRoot; /** * VaG - 09/10/2002 * Java compiler class. */ private String m_javaCompilerClass; /** * VaG - 09/10/2002 * Java compiler. */ private String m_javaCompiler; private File destinationDirectory; //root of compiled files tree private File sourceDirectory; // root of source files tree private String destinationPackage; //package under which resultant classes will reside private Path compileClasspath; //classpath used to compile the jsp files. //private String compilerPath; //fully qualified name for the compiler executable private String pathToPackage = ""; private Vector filesToDo = new Vector(); public void execute() throws BuildException { if (!destinationDirectory.isDirectory()) { throw new BuildException("destination directory " + destinationDirectory.getPath() + " is not valid"); } if (!sourceDirectory.isDirectory()) { throw new BuildException("src directory " + sourceDirectory.getPath() + " is not valid"); } if (destinationPackage == null) { throw new BuildException("package attribute must be present.", location); } // VaG - 09/10/2002 // Added document root control. // if (m_docRoot != null && !m_docRoot.isDirectory()) { throw new BuildException("document root directory " + m_docRoot.getPath() + " is not valid"); } String systemClassPath = System.getProperty("java.class.path"); pathToPackage = this.destinationPackage.replace('.', File.separatorChar); // get all the files in the sourceDirectory DirectoryScanner ds = super.getDirectoryScanner(sourceDirectory); //use the systemclasspath as well, to include the ant jar if (compileClasspath == null) { compileClasspath = new Path(project); } compileClasspath.append(Path.systemClasspath); String[] files = ds.getIncludedFiles(); //Weblogic.jspc calls System.exit() ... have to fork // Therefore, takes loads of time // Can pass directories at a time (*.jsp) but easily runs out of memory on hefty dirs // (even on a Sun) Java helperTask = (Java) project.createTask("java"); helperTask.setFork(true); helperTask.setClassname("weblogic.jspc"); helperTask.setTaskName(getTaskName()); String[] args = new String[12]; File jspFile = null; String parents = ""; String arg = ""; int j = 0; //XXX this array stuff is a remnant of prev trials.. gotta remove. args[j++] = "-d"; args[j++] = destinationDirectory.getAbsolutePath().trim(); args[j++] = "-docroot"; // VaG - 09/10/2002 // Replaced by parameter, if set ;-) // if (m_docRoot == null) args[j++] = sourceDirectory.getAbsolutePath().trim(); else args[j++] = m_docRoot.getAbsolutePath().trim(); args[j++] = "-keepgenerated"; //TODO: Parameterise ?? //Call compiler as class... dont want to fork again //Use classic compiler -- can be parameterised? // VaG - 09/10/2002 // Added '-compiler' parameter. // if (m_javaCompiler != null) { args[j++] = "-compiler"; args[j++] = m_javaCompiler; } else { args[j++] = "-compilerclass"; // VaG - 09/10/2002 // Replaced by parameter, if set ;-) // if (m_javaCompilerClass == null) args[j++] = "sun.tools.javac.Main"; else args[j++] = m_javaCompilerClass; } //Weblogic jspc does not seem to work unless u explicitly set this... // Does not take the classpath from the env.... // Am i missing something about the Java task?? args[j++] = "-classpath"; args[j++] = compileClasspath.toString(); this.scanDir(files); log("Compiling " + filesToDo.size() + " JSP files"); for (int i = 0; i < filesToDo.size(); i++) { //XXX // All this to get package according to weblogic standards // Can be written better... this is too hacky! // Careful.. similar code in scanDir , but slightly different!! jspFile = new File((String) filesToDo.elementAt(i)); args[j] = "-package"; parents = jspFile.getParent(); if ((parents != null) && (!("").equals(parents))) { parents = this.replaceString(parents, File.separator, "_."); args[j + 1] = destinationPackage + "." + "_" + parents; } else { args[j + 1] = destinationPackage; } args[j + 2] = sourceDirectory + File.separator + (String) filesToDo.elementAt(i); arg = ""; for (int x = 0; x < 12; x++) { arg += " " + args[x]; } System.out.println("arg = " + arg); helperTask.clearArgs(); helperTask.setArgs(arg); helperTask.setClasspath(compileClasspath); if (helperTask.executeJava() != 0) { log(files[i] + " failed to compile", Project.MSG_WARN); } } } /** * Set the classpath to be used for this compilation. * */ public void setClasspath(Path classpath) { if (compileClasspath == null) { compileClasspath = classpath; } else { compileClasspath.append(classpath); } } /** * Maybe creates a nested classpath element. */ public Path createClasspath() { if (compileClasspath == null) { compileClasspath = new Path(project); } return compileClasspath; } /** * Set the directory containing the source jsp's * * * @param dirName the directory containg the source jsp's */ public void setSrc(File dirName) { sourceDirectory = dirName; } /** * VaG - 09/10/2002 * Set weblogic document-root * * * @param docRoot weblogic document-root */ public void setDocroot(File docRoot) { m_docRoot = docRoot; } /** * VaG - 09/10/2002 * Set java compiler to use * * * @param javaCompiler the compiler to use */ public void setCompiler(String javaCompiler) { m_javaCompiler = javaCompiler; } /** * VaG - 09/10/2002 * Set java compiler class to use * * * @param javaCompilerClass the compiler class to use */ public void setCompilerclass(String javaCompilerClass) { m_javaCompilerClass = javaCompilerClass; } /** * Set the directory containing the source jsp's * * * @param dirName the directory containg the source jsp's */ public void setDest(File dirName) { destinationDirectory = dirName; } /** * Set the package under which the compiled classes go * * @param packageName the package name for the clases */ public void setPackage(String packageName) { destinationPackage = packageName; } protected void scanDir(String files[]) { long now = (new Date()).getTime(); File jspFile = null; String parents = null; String pack = ""; for (int i = 0; i < files.length; i++) { File srcFile = new File(this.sourceDirectory, files[i]); //XXX // All this to convert source to destination directory according to weblogic standards // Can be written better... this is too hacky! jspFile = new File(files[i]); parents = jspFile.getParent(); int loc = 0; if ((parents != null) && (!("").equals(parents))) { parents = this.replaceString(parents, File.separator, "_/"); pack = pathToPackage + File.separator + "_" + parents; } else { pack = pathToPackage; } String filePath = pack + File.separator + "_"; int startingIndex = files[i].lastIndexOf(File.separator) != -1 ? files[i].lastIndexOf(File.separator) + 1 : 0; int endingIndex = files[i].indexOf(".jsp"); if (endingIndex == -1) { break; } filePath += files[i].substring(startingIndex, endingIndex); filePath += ".class"; File classFile = new File(this.destinationDirectory, filePath); if (srcFile.lastModified() > now) { log("Warning: file modified in the future: " + files[i], Project.MSG_WARN); } if (srcFile.lastModified() > classFile.lastModified()) { //log("Files are" + srcFile.getAbsolutePath()+" " +classFile.getAbsolutePath()); filesToDo.addElement(files[i]); log("Recompiling File " + files[i], Project.MSG_VERBOSE); } } } protected String replaceString(String inpString, String escapeChars, String replaceChars) { String localString = ""; int numTokens = 0; StringTokenizer st = new StringTokenizer(inpString, escapeChars, true); numTokens = st.countTokens(); for (int i = 0; i < numTokens; i++) { String test = st.nextToken(); test = (test.equals(escapeChars) ? replaceChars : test); localString += test; } return localString; } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
