You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@apache.org on 2001/05/28 04:17:58 UTC
cvs commit: jakarta-tomcat-jasper/jasper34/liaison/org/apache/jasper34/servlet EmbededServletOptions.java JasperLoader.java JasperLoader12.java JspEngineContext.java JspLoader.java JspServlet.java ServletEngine.java TomcatServletEngine.java
costin 01/05/27 19:17:58
Added: jasper34/liaison/org/apache/jasper34/servlet
EmbededServletOptions.java JasperLoader.java
JasperLoader12.java JspEngineContext.java
JspLoader.java JspServlet.java ServletEngine.java
TomcatServletEngine.java
Log:
Added the (old) servlet interface.
Revision Changes Path
1.1 jakarta-tomcat-jasper/jasper34/liaison/org/apache/jasper34/servlet/EmbededServletOptions.java
Index: EmbededServletOptions.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 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", "Tomcat", 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 apache@apache.org.
*
* 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.jasper34.servlet;
import java.io.File;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import org.apache.jasper34.core.*;
import org.apache.tomcat.util.log.*;
/**
* A class to hold all init parameters specific to the JSP engine.
*
* @author Anil K. Vijendran
* @author Hans Bergsten
*/
public final class EmbededServletOptions implements Options {
/**
* Do you want to keep the generated Java files around?
*/
public boolean keepGenerated = true;
/**
* Do you want support for "large" files? What this essentially
* means is that we generated code so that the HTML data in a JSP
* file is stored separately as opposed to those constant string
* data being used literally in the generated servlet.
*/
public boolean largeFile = false;
/**
* Do you want support for "mapped" files? This will generate
* servlet that has a print statement per line of the JSP file.
* This seems like a really nice feature to have for debugging.
*/
public boolean mappedFile = false;
/**
* Do you want stack traces and such displayed in the client's
* browser? If this is false, such messages go to the standard
* error or a log file if the standard error is redirected.
*/
public boolean sendErrorToClient = false;
/**
* Do we want to include debugging information in the class file?
*/
public boolean classDebugInfo = false;
/**
* I want to see my generated servlets. Which directory are they
* in?
*/
public File scratchDir;
/**
* When used with a Securitymanager, what ProtectionDomain to use.
*/
private Object protectionDomain;
/**
* Need to have this as is for versions 4 and 5 of IE. Can be set from
* the initParams so if it changes in the future all that is needed is
* to have a jsp initParam of type ieClassId="<value>"
*/
public String ieClassId = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93";
/**
* What classpath should I use while compiling generated servlets?
*/
public String classpath = null;
/**
* Plugin class to use to compile JSP pages.
*/
public Class jspCompilerPlugin = null;
/**
* Path of the compiler to use for compiling JSP pages.
*/
public String jspCompilerPath = null;
/**
* Java platform encoding to generate the JSP
* page servlet.
*/
private String javaEncoding;
/**
* Are we keeping generated code around?
*/
public boolean getKeepGenerated() {
return keepGenerated;
}
/**
* Are we supporting large files?
*/
public boolean getLargeFile() {
return largeFile;
}
/**
* Are we supporting HTML mapped servlets?
*/
public boolean getMappedFile() {
return mappedFile;
}
/**
* Should errors be sent to client or thrown into stderr?
*/
public boolean getSendErrorToClient() {
return sendErrorToClient;
}
/**
* Should class files be compiled with debug information?
*/
public boolean getClassDebugInfo() {
return classDebugInfo;
}
/**
* Class ID for use in the plugin tag when the browser is IE.
*/
public String getIeClassId() {
return ieClassId;
}
/**
* What is my scratch dir?
*/
public File getScratchDir() {
return scratchDir;
}
/**
* ProtectionDomain for this JSP Context when using a SecurityManager
*/
public final Object getProtectionDomain() {
return protectionDomain;
}
/**
* What classpath should I use while compiling the servlets
* generated from JSP files?
*/
public String getClassPath() {
return classpath;
}
/**
* What compiler plugin should I use to compile the servlets
* generated from JSP files?
*/
public Class getJspCompilerPlugin() {
return jspCompilerPlugin;
}
/**
* Path of the compiler to use for compiling JSP pages.
*/
public String getJspCompilerPath() {
return jspCompilerPath;
}
public String getJavaEncoding() {
return javaEncoding;
}
/**
* Create an EmbededServletOptions object using data available from
* ServletConfig and ServletContext.
*/
public EmbededServletOptions(ServletConfig config, ServletContext context) {
String keepgen = config.getInitParameter("keepgenerated");
if (keepgen != null) {
if (keepgen.equalsIgnoreCase("true"))
this.keepGenerated = true;
else if (keepgen.equalsIgnoreCase("false"))
this.keepGenerated = false;
else Constants.message ("jsp.warning.keepgen", Log.WARNING);
}
String largeFile = config.getInitParameter("largefile");
if (largeFile != null) {
if (largeFile.equalsIgnoreCase("true"))
this.largeFile = true;
else if (largeFile.equalsIgnoreCase("false"))
this.largeFile = false;
else Constants.message ("jsp.warning.largeFile", Log.WARNING);
}
String mapFile = config.getInitParameter("mappedfile");
if (mapFile != null) {
if (mapFile.equalsIgnoreCase("true"))
this.mappedFile = true;
else if (mapFile.equalsIgnoreCase("false"))
this.mappedFile = false;
else Constants.message ("jsp.warning.mappedFile", Log.WARNING);
}
String senderr = config.getInitParameter("sendErrToClient");
if (senderr != null) {
if (senderr.equalsIgnoreCase("true"))
this.sendErrorToClient = true;
else if (senderr.equalsIgnoreCase("false"))
this.sendErrorToClient = false;
else Constants.message ("jsp.warning.sendErrToClient", Log.WARNING);
}
String debugInfo = config.getInitParameter("classdebuginfo");
if (debugInfo != null) {
if (debugInfo.equalsIgnoreCase("true"))
this.classDebugInfo = true;
else if (debugInfo.equalsIgnoreCase("false"))
this.classDebugInfo = false;
else Constants.message ("jsp.warning.classDebugInfo", Log.WARNING);
}
String ieClassId = config.getInitParameter("ieClassId");
if (ieClassId != null)
this.ieClassId = ieClassId;
String classpath = config.getInitParameter("classpath");
if (classpath != null)
this.classpath = classpath;
String dir = config.getInitParameter("scratchdir");
if (dir != null)
scratchDir = new File(dir);
else {
// First we try the Servlet 2.2 javax.servlet.context.tempdir property
scratchDir = (File) context.getAttribute(Constants.TMP_DIR);
if (scratchDir == null) {
// Not running in a Servlet 2.2 container.
// Try to get the JDK 1.2 java.io.tmpdir property
dir = System.getProperty("java.io.tmpdir");
if (dir != null)
scratchDir = new File(dir);
}
}
// Get the ProtectionDomain for this Context in case
// we are using a SecurityManager
protectionDomain = context.getAttribute(Constants.ATTRIB_JSP_ProtectionDomain);
if (this.scratchDir == null) {
Constants.message("jsp.error.no.scratch.dir", Log.FATAL);
return;
}
if (!(scratchDir.exists() && scratchDir.canRead() &&
scratchDir.canWrite() && scratchDir.isDirectory()))
Constants.message("jsp.error.bad.scratch.dir",
new Object[] {
scratchDir.getAbsolutePath()
}, Log.FATAL);
String jspCompilerPath = config.getInitParameter("jspCompilerPath");
if (jspCompilerPath != null) {
if (new File(jspCompilerPath).exists()) {
this.jspCompilerPath = jspCompilerPath;
} else {
Constants.message("jsp.warning.compiler.path.notfound",
new Object[] { jspCompilerPath },
Log.FATAL);
}
}
String jspCompilerPlugin = config.getInitParameter("jspCompilerPlugin");
if (jspCompilerPlugin != null) {
try {
this.jspCompilerPlugin = Class.forName(jspCompilerPlugin);
} catch (ClassNotFoundException cnfe) {
Constants.message("jsp.warning.compiler.class.notfound",
new Object[] { jspCompilerPlugin },
Log.FATAL);
}
}
this.javaEncoding = config.getInitParameter("javaEncoding");
}
}
1.1 jakarta-tomcat-jasper/jasper34/liaison/org/apache/jasper34/servlet/JasperLoader.java
Index: JasperLoader.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 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", "Tomcat", 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 apache@apache.org.
*
* 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.jasper34.servlet;
import java.io.FileInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Vector;
import java.util.zip.ZipFile;
import java.util.zip.ZipEntry;
import java.net.URL;
import java.security.*;
import org.apache.jasper34.core.*;
import org.apache.jasper34.runtime.*;
import org.apache.jasper34.generator.*;
import org.apache.tomcat.util.log.*;
import javax.servlet.http.*;
/**
* This is a class loader that loads JSP files as though they were
* Java classes. It calls the compiler to compile the JSP file into a
* servlet and then loads the generated class.
*
* This code is quite fragile and needs careful
* treatment/handling/revisiting. I know this doesn't work very well
* right now for:
*
* (a) inner classes
* (b) does not work at all for tag handlers that have inner
* classes; but that is likely to change with the new JSP PR2
* spec.
*
* @author Anil K. Vijendran
* @author Harish Prabandham
*/
public class JasperLoader extends JspLoader {
// ClassLoader parent;
// Options options;
Object pd;
/*
* This should be factoried out
*/
public JasperLoader() {
super();
}
// public void setParentClassLoader( ClassLoader cl)
// {
// this.parent = cl;
// }
// public void setOptions( Options options) {
// this.options = options;
// }
public void setProtectionDomain( Object pd ) {
this.pd=pd;
}
protected synchronized Class loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
if( debug>0) log("load " + name );
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
if(debug>0) log("load from parent " + name );
c = parent.loadClass(name);
}
else {
if(debug>0) log("load from system " + name );
c = findSystemClass(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then call findClass in order
// to find the class.
try {
if(debug>0) log("local jsp loading " + name );
c = findClass(name);
} catch (ClassNotFoundException ex) {
throw ex;
}
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
public InputStream getResourceAsStream(String name) {
if( debug>0) log("getResourcesAsStream()" + name );
URL url = getResource(name);
try {
return url != null ? url.openStream() : null;
} catch (IOException e) {
return null;
}
}
public URL getResource(String name) {
if( debug>0) log( "getResource() " + name );
if( parent != null )
return parent.getResource(name);
return super.getResource(name);
}
private static final int debug=0;
private void log( String s ) {
System.out.println("JspLoader: " + s );
}
protected Class findClass(String className) throws ClassNotFoundException {
try {
int beg = className.lastIndexOf(".") == -1 ? 0 :
className.lastIndexOf(".")+1;
int end = className.lastIndexOf("_jsp_");
if (end <= 0) {
// this is a class that the JSP file depends on
// (example: class in a tag library)
byte[] classBytes = loadClassDataFromJar(className);
if (classBytes == null)
throw new ClassNotFoundException(className);
return defClass(className, classBytes);
} else {
String fileName = null;
String outputDir = options.getScratchDir().toString();
if (className.indexOf('$', end) != -1) {
// this means we're loading an inner class
fileName = outputDir + File.separatorChar +
className.replace('.', File.separatorChar) + ".class";
} else {
fileName = className.substring(beg, end) + ".class";
fileName = outputDir + File.separatorChar + fileName;
}
byte [] classBytes = null;
/**
* When using a SecurityManager and a JSP page itself triggers
* another JSP due to an errorPage or from a jsp:include,
* the loadClass must be performed with the Permissions of
* this class using doPriviledged because the parent JSP
* may not have sufficient Permissions.
*/
classBytes = loadClassDataFromFile(fileName);
if( classBytes == null ) {
throw new ClassNotFoundException(Constants.getString(
"jsp.error.unable.loadclass",
new Object[] {className}));
}
return defClass(className, classBytes);
}
} catch (Exception ex) {
throw new ClassNotFoundException(Constants.getString(
"jsp.error.unable.loadclass",
new Object[] {className}));
}
}
/**
* Just a short hand for defineClass now... I suspect we might need to
* make this public at some point of time.
*/
protected Class defClass(String className, byte[] classData) {
return defineClass(className, classData, 0, classData.length);
}
/**
* Load JSP class data from file, method may be called from
* within a doPriviledged if a SecurityManager is installed.
*/
protected byte[] loadClassDataFromFile(String fileName) {
return doLoadClassDataFromFile( fileName );
}
/**
* Load JSP class data from file, method may be called from
* within a doPriviledged if a SecurityManager is installed.
*/
protected byte[] doLoadClassDataFromFile(String fileName) {
byte[] classBytes = null;
try {
FileInputStream fin = new FileInputStream(fileName);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buf[] = new byte[1024];
for(int i = 0; (i = fin.read(buf)) != -1; )
baos.write(buf, 0, i);
fin.close();
baos.close();
classBytes = baos.toByteArray();
} catch(Exception ex) {
return null;
}
return classBytes;
}
// private Vector jars = new Vector();
private byte[] loadClassDataFromJar(String className) {
String entryName = className.replace('.','/')+".class";
InputStream classStream = null;
//System.out.println("Loading " + className);
for(int i = 0; i < jars.size(); i++) {
File thisFile = new File((String) jars.elementAt(i));
try {
//System.out.println(" - trying " + thisFile.getAbsolutePath());
// check if it exists...
if (!thisFile.exists()) {
continue;
};
if (thisFile.isFile()) {
ZipFile zip = new ZipFile(thisFile);
ZipEntry entry = zip.getEntry(entryName);
if (entry != null) {
classStream = zip.getInputStream(entry);
byte[] classData = getClassData(classStream);
zip.close();
return classData;
} else {
zip.close();
}
} else { // its a directory...
File classFile =
new File(thisFile,
entryName.replace('/', File.separatorChar));
if (classFile.exists()) {
classStream = new FileInputStream(classFile);
byte[] classData = getClassData(classStream);
classStream.close();
return classData;
}
}
} catch (IOException ioe) {
return null;
}
}
return null;
}
private byte[] getClassData(InputStream istream) throws IOException {
byte[] buf = new byte[1024];
ByteArrayOutputStream bout = new ByteArrayOutputStream();
int num = 0;
while((num = istream.read(buf)) != -1) {
bout.write(buf, 0, num);
}
return bout.toByteArray();
}
public String toString() {
Object obj = (options==null)?null: options.getScratchDir();
String s = (obj==null)?"null":obj.toString();
return "JspLoader@"+hashCode()+"( " + s + " ) / " + parent;
}
boolean loadJSP(JspServlet jspS, String name, String classpath,
boolean isErrorPage, HttpServletRequest req,
HttpServletResponse res)
throws JasperException, FileNotFoundException
{
return jspS.doLoadJSP( name, classpath, isErrorPage, req, res );
}
}
1.1 jakarta-tomcat-jasper/jasper34/liaison/org/apache/jasper34/servlet/JasperLoader12.java
Index: JasperLoader12.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 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", "Tomcat", 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 apache@apache.org.
*
* 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.jasper34.servlet;
import java.io.FileInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Vector;
import java.util.zip.ZipFile;
import java.util.zip.ZipEntry;
import java.net.URL;
import java.security.*;
import org.apache.jasper34.core.*;
import org.apache.jasper34.runtime.*;
import org.apache.jasper34.generator.*;
import org.apache.tomcat.util.log.*;
import javax.servlet.http.*;
/**
* 1.2 version of the JspLoader
*
* @author Anil K. Vijendran
* @author Harish Prabandham
* @author Costin Manolache
*/
public class JasperLoader12 extends JasperLoader {
JasperLoader12()
{
super();
}
/**
*/
protected Class defClass(String className, byte[] classData) {
// If a SecurityManager is being used, set the ProtectionDomain
// for this clas when it is defined.
// System.out.println("JspLoader12: " + className + " " +
// ((ProtectionDomain)pd).getCodeSource() );
if( pd != null ) {
return defineClass(className, classData, 0,
classData.length,
(ProtectionDomain)pd);
}
return defineClass(className, classData, 0, classData.length);
}
protected byte[] loadClassDataFromFile( String fileName ) {
/**
* When using a SecurityManager and a JSP page itself triggers
* another JSP due to an errorPage or from a jsp:include,
* the loadClass must be performed with the Permissions of
* this class using doPriviledged because the parent JSP
* may not have sufficient Permissions.
*/
if( System.getSecurityManager() != null ) {
class doInit implements PrivilegedAction {
private String fileName;
public doInit(String file) {
fileName = file;
}
public Object run() {
return doLoadClassDataFromFile(fileName);
}
}
doInit di = new doInit(fileName);
return (byte [])AccessController.doPrivileged(di);
} else {
return doLoadClassDataFromFile( fileName );
}
}
// Hack - we want to keep JDK1.2 dependencies in fewer places,
// and same for doPriviledged.
boolean loadJSP(JspServlet jspS, String name, String classpath,
boolean isErrorPage, HttpServletRequest req,
HttpServletResponse res)
throws JasperException, FileNotFoundException
{
if( System.getSecurityManager() == null ) {
return jspS.doLoadJSP( name, classpath, isErrorPage, req, res );
}
final JspServlet jspServlet=jspS;
final String nameF=name;
final String classpathF=classpath;
final boolean isErrorPageF=isErrorPage;
final HttpServletRequest reqF=req;
final HttpServletResponse resF=res;
try {
Boolean b = (Boolean)AccessController.doPrivileged(new
PrivilegedExceptionAction() {
public Object run() throws Exception
{
return new Boolean(jspServlet.doLoadJSP( nameF,
classpathF,
isErrorPageF,
reqF, resF ));
}
});
return b.booleanValue();
} catch( Exception ex ) {
if( ex instanceof PrivilegedActionException )
ex=((PrivilegedActionException)ex).getException();
if( ex instanceof JasperException )
throw (JasperException)ex;
if( ex instanceof FileNotFoundException )
throw (FileNotFoundException) ex;
throw new JasperException( ex );
}
}
}
1.1 jakarta-tomcat-jasper/jasper34/liaison/org/apache/jasper34/servlet/JspEngineContext.java
Index: JspEngineContext.java
===================================================================
/*
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 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", "Tomcat", 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 apache@apache.org.
*
* 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.jasper34.servlet;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.apache.jasper34.generator.*;
import org.apache.jasper34.generator.Compiler;
import org.apache.jasper34.core.*;
import org.apache.jasper34.runtime.*;
import org.apache.tomcat.util.log.*;
/**
* A place holder for various things that are used through out the JSP
* engine. This is a per-request/per-context data structure. Some of
* the instance variables are set at different points.
*
* JspLoader creates this object and passes this off to the "compiler"
* subsystem, which then initializes the rest of the variables.
*
* @author Anil K. Vijendran
* @author Harish Prabandham
*/
public class JspEngineContext implements JspCompilationContext {
JspReader reader;
ServletWriter writer;
ServletContext context;
JasperLoader loader;
String classpath; // for compiling JSPs.
boolean isErrPage;
String jspFile;
String servletClassName;
String servletPackageName;
String servletJavaFileName;
String contentType;
Options options;
HttpServletRequest req;
HttpServletResponse res;
public JspEngineContext(JasperLoader loader, String classpath,
ServletContext context, String jspFile,
boolean isErrPage, Options options,
HttpServletRequest req, HttpServletResponse res)
{
this.loader = loader;
this.classpath = classpath;
this.context = context;
this.jspFile = jspFile;
this.isErrPage = isErrPage;
this.options = options;
this.req = req;
this.res = res;
}
/**
* Get the http request we are servicing now...
*/
public HttpServletRequest getRequest() {
return req;
}
/**
* Get the http response we are using now...
*/
public HttpServletResponse getResponse() {
return res;
}
/**
* The classpath that is passed off to the Java compiler.
*/
public String getClassPath() {
return loader.getClassPath() + classpath;
}
/**
* Get the input reader for the JSP text.
*/
public JspReader getReader() {
return reader;
}
/**
* Where is the servlet being generated?
*/
public ServletWriter getWriter() {
return writer;
}
/**
* Get the ServletContext for the JSP we're processing now.
*/
public ServletContext getServletContext() {
return context;
}
/**
* What class loader to use for loading classes while compiling
* this JSP? I don't think this is used right now -- akv.
*/
public ClassLoader getClassLoader() {
return loader;
}
public void addJar( String jar ) throws IOException {
loader.addJar( jar );
}
/**
* Are we processing something that has been declared as an
* errorpage?
*/
public boolean isErrorPage() {
return isErrPage;
}
/**
* What is the scratch directory we are generating code into?
* FIXME: In some places this is called scratchDir and in some
* other places it is called outputDir.
*/
public String getOutputDir() {
return options.getScratchDir().toString();
}
/**
* Path of the JSP URI. Note that this is not a file name. This is
* the context rooted URI of the JSP file.
*/
public String getJspFile() {
return jspFile;
}
/**
* Just the class name (does not include package name) of the
* generated class.
*/
public String getServletClassName() {
return servletClassName;
}
/**
* The package name into which the servlet class is generated.
*/
public String getServletPackageName() {
return servletPackageName;
}
/**
* Utility method to get the full class name from the package and
* class name.
*/
public final String getFullClassName() {
if (servletPackageName == null)
return servletClassName;
return servletPackageName + "." + servletClassName;
}
/**
* Full path name of the Java file into which the servlet is being
* generated.
*/
public String getServletJavaFileName() {
return servletJavaFileName;
}
/**
* Are we keeping generated code around?
*/
public boolean keepGenerated() {
return options.getKeepGenerated();
}
/**
* What's the content type of this JSP? Content type includes
* content type and encoding.
*/
public String getContentType() {
return contentType;
}
/**
* Get hold of the Options object for this context.
*/
public Options getOptions() {
return options;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public void setReader(JspReader reader) {
this.reader = reader;
}
public void setWriter(ServletWriter writer) {
this.writer = writer;
}
public void setServletClassName(String servletClassName) {
this.servletClassName = servletClassName;
}
public void setServletPackageName(String servletPackageName) {
this.servletPackageName = servletPackageName;
}
public void setServletJavaFileName(String servletJavaFileName) {
this.servletJavaFileName = servletJavaFileName;
}
public void setErrorPage(boolean isErrPage) {
this.isErrPage = isErrPage;
}
/**
* Create a "Compiler" object based on some init param data. If
* jspCompilerPlugin is not specified or is not available, the
* SunJavaCompiler is used.
*/
public Compiler createCompiler() throws JasperException {
String compilerPath = options.getJspCompilerPath();
Class jspCompilerPlugin = options.getJspCompilerPlugin();
JavaCompiler javac;
if (jspCompilerPlugin != null) {
try {
javac = (JavaCompiler) jspCompilerPlugin.newInstance();
} catch (Exception ex) {
Constants.message("jsp.warning.compiler.class.cantcreate",
new Object[] { jspCompilerPlugin, ex },
Log.FATAL);
javac = new SunJavaCompiler();
}
} else {
javac = new SunJavaCompiler();
}
if (compilerPath != null)
javac.setCompilerPath(compilerPath);
Compiler jspCompiler = new JspCompiler(this);
jspCompiler.setJavaCompiler(javac);
return jspCompiler;
}
/**
* Get the full value of a URI relative to this compilations context
*/
public String resolveRelativeUri(String uri)
{
if (uri.charAt(0) == '/')
{
return uri;
}
else
{
String actURI = req.getServletPath();
String baseURI = actURI.substring(0, actURI.lastIndexOf('/'));
return baseURI + '/' + uri;
}
}
/**
* Gets a resource as a stream, relative to the meanings of this
* context's implementation.
*@returns a null if the resource cannot be found or represented
* as an InputStream.
*/
public java.io.InputStream getResourceAsStream(String res)
{
return context.getResourceAsStream(res);
}
/**
* Gets the actual path of a URI relative to the context of
* the compilation.
*/
public String getRealPath(String path)
{
if (context != null)
{
return context.getRealPath(path);
}
else
{
return path;
}
}
}
1.1 jakarta-tomcat-jasper/jasper34/liaison/org/apache/jasper34/servlet/JspLoader.java
Index: JspLoader.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 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", "Tomcat", 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 apache@apache.org.
*
* 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.jasper34.servlet;
import java.io.FileInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Vector;
import java.util.zip.ZipFile;
import java.util.zip.ZipEntry;
import java.net.URL;
import java.security.*;
import org.apache.jasper34.core.*;
import org.apache.jasper34.runtime.*;
import org.apache.tomcat.util.log.*;
import javax.servlet.http.*;
/**
* Jsp compiler and runtime depends on special features from the
* ClassLoader.
*
* It has to allow run-time addition of class paths and provide
* access to the class path.
*
* The loader is also responsible for detecting changes and reloading.
*
* @author Anil K. Vijendran
* @author Harish Prabandham
* @author Costin Manolache
*/
public abstract class JspLoader extends ClassLoader {
protected ClassLoader parent;
protected Options options;
// Object pd;
/*
* This should be factoried out
*/
protected JspLoader() {
super();
}
public void setParentClassLoader( ClassLoader cl)
{
this.parent = cl;
}
// The only thing we use is getScratchDir !
public void setOptions( Options options) {
this.options = options;
}
protected Vector jars = new Vector();
public void addJar(String jarFileName) throws IOException {
if (!jars.contains(jarFileName)) {
Constants.message("jsp.message.adding_jar",
new Object[] { jarFileName },
Log.INFORMATION);
jars.addElement(jarFileName);
}
}
public String getClassPath() {
StringBuffer cpath = new StringBuffer();
String sep = System.getProperty("path.separator");
for(int i = 0; i < jars.size(); i++) {
cpath.append((String)jars.elementAt(i)+sep);
}
return cpath.toString();
}
}
1.1 jakarta-tomcat-jasper/jasper34/liaison/org/apache/jasper34/servlet/JspServlet.java
Index: JspServlet.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 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", "Tomcat", 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 apache@apache.org.
*
* 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.jasper34.servlet;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.SingleThreadModel;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.HttpJspPage;
import javax.servlet.jsp.JspFactory;
import java.util.Hashtable;
import java.util.Enumeration;
import java.io.File;
import java.io.PrintWriter;
import java.io.IOException;
import java.io.FileNotFoundException;
import org.apache.jasper34.runtime.*;
import org.apache.jasper34.core.*;
import org.apache.jasper34.generator.*;
import org.apache.jasper34.generator.Compiler;
import org.apache.tomcat.util.log.Log;
/**
* The JSP engine (a.k.a Jasper)!
*
* @author Anil K. Vijendran
* @author Harish Prabandham
*/
public class JspServlet extends HttpServlet {
Log loghelper = Log.getLog("JASPER_LOG", "JspServlet");
class JspServletWrapper {
Servlet theServlet;
String jspUri;
boolean isErrorPage;
// ServletWrapper will set this
Class servletClass;
JspServletWrapper(String jspUri, boolean isErrorPage) {
this.jspUri = jspUri;
this.isErrorPage = isErrorPage;
this.theServlet = null;
}
private void load() throws JasperException, ServletException {
try {
// Class servletClass = (Class) loadedJSPs.get(jspUri);
// This is to maintain the original protocol.
destroy();
theServlet = (Servlet) servletClass.newInstance();
} catch (Exception ex) {
throw new JasperException(ex);
}
theServlet.init(JspServlet.this.config);
if (theServlet instanceof HttpJspBase) {
HttpJspBase h = (HttpJspBase) theServlet;
h.setClassLoader(JspServlet.this.parentClassLoader);
}
}
private void loadIfNecessary(HttpServletRequest req, HttpServletResponse res)
throws JasperException, ServletException, FileNotFoundException
{
// First try context attribute; if that fails then use the
// classpath init parameter.
// Should I try to concatenate them if both are non-null?
String cp = (String) context.getAttribute(Constants.SERVLET_CLASSPATH);
String accordingto;
if (cp == null || cp.equals("")) {
accordingto = "according to the init parameter";
cp = options.getClassPath();
} else
accordingto = "according to the Servlet Engine";
Constants.message("jsp.message.cp_is",
new Object[] {
accordingto,
cp == null ? "" : cp
},
Log.INFORMATION);
if (loadJSP(jspUri, cp, isErrorPage, req, res)
|| theServlet == null) {
load();
}
}
public void service(HttpServletRequest request,
HttpServletResponse response,
boolean precompile)
throws ServletException, IOException, FileNotFoundException
{
try {
loadIfNecessary(request, response);
// If a page is to only to be precompiled return.
if (precompile)
return;
if (theServlet instanceof SingleThreadModel) {
// sync on the wrapper so that the freshness
// of the page is determined right before servicing
synchronized (this) {
theServlet.service(request, response);
}
} else {
theServlet.service(request, response);
}
} catch (FileNotFoundException ex) {
try {
if (insecure_TMI) {
response.sendError(HttpServletResponse.SC_NOT_FOUND,
Constants.getString
("jsp.error.file.not.found.TMI",
new Object[] {
ex.getMessage()
}));
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND,
Constants.getString
("jsp.error.file.not.found",
new Object[] {
// Too Much Information -- ex.getMessage()
}));
}
} catch (IllegalStateException ise) {
// logs are presumed to be secure, thus the TMI info can be logged
Constants.jasperLog.log(Constants.getString
("jsp.error.file.not.found.TMI",
new Object[] {
ex.getMessage()
}), ex,
Log.ERROR);
// rethrow FileNotFoundException so someone higher up can handle
if (insecure_TMI)
throw ex;
else
throw new FileNotFoundException(Constants.getString
("jsp.error.file.not.found",
new Object[] {
// Too Much Information -- ex.getMessage()
}));
}
return;
}
}
public void destroy() {
if (theServlet != null)
theServlet.destroy();
}
}
protected ServletContext context = null;
protected Hashtable jsps = new Hashtable();
// protected Hashtable loadedJSPs = new Hashtable();
protected ServletConfig config;
protected JasperLoader loader;
protected Options options;
protected ClassLoader parentClassLoader;
protected ServletEngine engine;
protected String serverInfo;
/** Set to true to provide Too Much Information on errors */
private final boolean insecure_TMI = false;
static boolean firstTime = true;
static boolean jdk12=false;
static {
try {
Class.forName( "java.security.PrivilegedAction" );
jdk12=true;
} catch(Throwable ex ) {
}
}
public void init(ServletConfig config)
throws ServletException
{
super.init(config);
this.config = config;
this.context = config.getServletContext();
this.serverInfo = context.getServerInfo();
options = new EmbededServletOptions(config, context);
parentClassLoader = (ClassLoader) context.getAttribute(Constants.SERVLET_CLASS_LOADER);
if (parentClassLoader == null)
parentClassLoader = this.getClass().getClassLoader();
// getClass().getClassLoader() returns null in JDK 1.1.6/1.1.8
if (parentClassLoader != null) {
Constants.message("jsp.message.parent_class_loader_is",
new Object[] {
parentClassLoader.toString()
}, Log.DEBUG);
}
else {
Constants.message("jsp.message.parent_class_loader_is",
new Object[] {
"<none>"
}, Log.DEBUG);
}
// System.out.println("JspServlet: init " + config.getServletName() );
if( loader==null ) {
if( jdk12 ) {
try {
Class ld=Class.forName("org.apache.jasper.servlet.JasperLoader12");
loader=(JasperLoader)ld.newInstance();
} catch(Throwable t ) {
loghelper.log("Loading org.apache.jasper.servlet.JasperLoader12", t);
}
}
if( loader==null )
loader = new JasperLoader();
loader.setParentClassLoader(parentClassLoader);
loader.setOptions(options);
Object pd=context.getAttribute("org.apache.tomcat.protection_domain");
loader.setProtectionDomain( pd );
}
if (firstTime) {
firstTime = false;
Constants.message("jsp.message.scratch.dir.is",
new Object[] {
options.getScratchDir().toString()
}, Log.INFORMATION );
Constants.message("jsp.message.dont.modify.servlets", Log.INFORMATION);
JspFactory.setDefaultFactory(new JspFactoryImpl());
}
}
private void serviceJspFile(HttpServletRequest request,
HttpServletResponse response, String jspUri,
Throwable exception, boolean precompile)
throws ServletException, IOException
{
boolean isErrorPage = exception != null;
JspServletWrapper wrapper = (JspServletWrapper) jsps.get(jspUri);
if (wrapper == null) {
wrapper = new JspServletWrapper(jspUri, isErrorPage);
jsps.put(jspUri, wrapper);
}
wrapper.service(request, response, precompile);
}
boolean preCompile(HttpServletRequest request)
throws ServletException
{
boolean precompile = false;
String precom = request.getParameter(Constants.PRECOMPILE);
String qString = request.getQueryString();
if (precom != null) {
if (precom.equals("true"))
precompile = true;
else if (precom.equals("false"))
precompile = false;
else {
// This is illegal.
throw new ServletException("Can't have request parameter " +
Constants.PRECOMPILE + " set to " + precom);
}
}
else if (qString != null && (qString.startsWith(Constants.PRECOMPILE) ||
qString.indexOf("&" + Constants.PRECOMPILE)
!= -1))
precompile = true;
return precompile;
}
public void service (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
try {
String includeUri
= (String) request.getAttribute(Constants.INC_SERVLET_PATH);
String jspUri;
if (includeUri == null)
jspUri = request.getServletPath();
else
jspUri = includeUri;
// System.out.println("JspServletWrapper: " + includeUri + " " +
// jspUri +
// (String) request.getAttribute(
// Constants.INC_REQUEST_URI));
boolean precompile = preCompile(request);
Log jasperLog = Constants.jasperLog;
if (jasperLog != null &&
jasperLog.getLevel() >= Log.INFORMATION)
{
jasperLog.log("JspEngine --> "+jspUri);
jasperLog.log("\t ServletPath: "+request.getServletPath());
jasperLog.log("\t PathInfo: "+request.getPathInfo());
jasperLog.log("\t RealPath: "
+getServletConfig().getServletContext().getRealPath(jspUri));
jasperLog.log("\t RequestURI: "+request.getRequestURI());
jasperLog.log("\t QueryString: "+request.getQueryString());
jasperLog.log("\t Request Params: ");
Enumeration e = request.getParameterNames();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
jasperLog.log("\t\t "+name+" = "+request.getParameter(name));
}
}
serviceJspFile(request, response, jspUri, null, precompile);
} catch (RuntimeException e) {
throw e;
} catch (ServletException e) {
throw e;
} catch (IOException e) {
throw e;
} catch (Throwable e) {
throw new ServletException(e);
}
// It's better to throw the exception - we don't
// know if we can deal with sendError ( buffer may be
// commited )
// catch (Throwable t) {
// unknownException(response, t);
// }
}
public void destroy() {
if (Constants.jasperLog != null)
Constants.jasperLog.log("JspServlet.destroy()", Log.INFORMATION);
Enumeration servlets = jsps.elements();
while (servlets.hasMoreElements())
((JspServletWrapper) servlets.nextElement()).destroy();
}
/* Check if we need to reload a JSP page.
*
* Side-effect: re-compile the JSP page.
*
* @param classpath explicitly set the JSP compilation path.
* @return true if JSP files is newer
*/
boolean loadJSP(String jspUri, String classpath,
boolean isErrorPage, HttpServletRequest req, HttpServletResponse res)
throws JasperException, FileNotFoundException
{
// Loader knows how to set the right priviledges, and call
// doLoadeJsp
return loader.loadJSP( this,jspUri, classpath, isErrorPage, req, res );
}
/* Check if we need to reload a JSP page.
*
* Side-effect: re-compile the JSP page.
*
* @param classpath explicitly set the JSP compilation path.
* @return true if JSP files is newer
*/
protected boolean doLoadJSP(String jspUri, String classpath,
boolean isErrorPage, HttpServletRequest req, HttpServletResponse res)
throws JasperException, FileNotFoundException
{
JspServletWrapper jsw=(JspServletWrapper) jsps.get(jspUri);
if( jsw==null ) {
throw new JasperException("Can't happen - JspServletWrapper=null");
}
// Class jspClass = (Class) loadedJSPs.get(jspUri);
boolean firstTime = jsw.servletClass == null;
JspCompilationContext ctxt = new JspEngineContext(loader, classpath,
context, jspUri,
isErrorPage, options,
req, res);
boolean outDated = false;
Compiler compiler = ctxt.createCompiler();
try {
outDated = compiler.isOutDated();
if ( (jsw.servletClass == null) || outDated ) {
synchronized ( this ) {
if ((jsw.servletClass == null) ||
(compiler.isOutDated() )) {
outDated = compiler.compile();
}
}
}
} catch (FileNotFoundException ex) {
compiler.removeGeneratedFiles();
throw ex;
} catch (JasperException ex) {
throw ex;
} catch (Exception ex) {
throw new JasperException(Constants.getString("jsp.error.unable.compile"),
ex);
}
// Reload only if it's outdated
if((jsw.servletClass == null) || outDated) {
try {
if( null ==ctxt.getServletClassName() ) {
compiler.computeServletClassName();
}
jsw.servletClass = loader.loadClass(ctxt.getFullClassName());
//loadClass(ctxt.getFullClassName(), true);
} catch (ClassNotFoundException cex) {
throw new JasperException(Constants.getString("jsp.error.unable.load"),
cex);
}
// loadedJSPs.put(jspUri, jspClass);
}
return outDated;
}
/**
* Determines whether the current JSP class is older than the JSP file
* from whence it came
*/
public boolean isOutDated(File jsp, JspCompilationContext ctxt,
Mangler mangler ) {
File jspReal = null;
boolean outDated;
jspReal = new File(ctxt.getRealPath(jsp.getPath()));
File classFile = new File(mangler.getClassFileName());
if (classFile.exists()) {
outDated = classFile.lastModified() < jspReal.lastModified();
} else {
outDated = true;
}
return outDated;
}
}
1.1 jakarta-tomcat-jasper/jasper34/liaison/org/apache/jasper34/servlet/ServletEngine.java
Index: ServletEngine.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 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", "Tomcat", 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 apache@apache.org.
*
* 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.jasper34.servlet;
import java.io.File;
import javax.servlet.ServletContext;
/**
* Simple class to factor out servlet runner dependencies from the JSP
* engine. There's a few motivations here:
*
* (a) ability for the JSP engine to be able to run on multiple
* servlet engines - 2.1 and 2.2
* (b) ability for the JSP engine to take advantage of specific
* servlet engines; this is crucial from a J2EE point of
* view.
*
* @author Anil K. Vijendran
* @author Harish Prabandham
*/
public class ServletEngine {
static ServletEngine tomcat;
static ServletEngine deflt;
/**
* Get a specific ServletEngine instance for the particular servlet runner
* we are running on.
*/
static ServletEngine getServletEngine(String serverInfo) {
if (serverInfo.startsWith("Tomcat Web Server")) {
if (tomcat == null) {
try {
tomcat = (ServletEngine)
Class.forName("org.apache.jasper.runtime.TomcatServletEngine").newInstance();
} catch (Exception ex) {
return null;
}
}
return tomcat;
} else {
if (deflt == null)
deflt = new ServletEngine();
return deflt;
}
}
/**
* Get the class loader for this ServletContext object.
*/
public ClassLoader getClassLoader(ServletContext ctx) {
return null;
}
}
1.1 jakarta-tomcat-jasper/jasper34/liaison/org/apache/jasper34/servlet/TomcatServletEngine.java
Index: TomcatServletEngine.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 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", "Tomcat", 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 apache@apache.org.
*
* 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.jasper34.servlet;
import java.io.File;
import javax.servlet.ServletContext;
/**
* Implementation of Servlet Engine that is used when the JSP engine
* is running with Tomcat.
*
* @author Anil K. Vijendran
*/
public class TomcatServletEngine extends ServletEngine {
public ClassLoader getClassLoader(ServletContext ctx) {
return null;// XXX (ClassLoader)((ServletContextFacade) ctx).getRealContext().getLoader();
}
}