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/06/17 21:56:23 UTC
cvs commit: jakarta-tomcat-jasper/jasper34/liaison/org/apache/jasper34/liaison JspServletLiaisonImpl.java
costin 01/06/17 12:56:23
Added: jasper34/liaison/org/apache/jasper34/liaison
JspServletLiaisonImpl.java
Log:
Added the JspServletLiaison implementation ( the code is the old JspServlet
code - still need cleanup )
Revision Changes Path
1.1 jakarta-tomcat-jasper/jasper34/liaison/org/apache/jasper34/liaison/JspServletLiaisonImpl.java
Index: JspServletLiaisonImpl.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.liaison;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
import java.io.*;
import org.apache.jasper34.runtime.*;
import org.apache.jasper34.core.*;
import org.apache.jasper34.generator.*;
import org.apache.jasper34.jsptree.*;
import org.apache.jasper34.javacompiler.*;
import org.apache.jasper34.liaison.*;
import org.apache.jasper34.core.Compiler;
import org.apache.jasper34.servlet.*;
import org.apache.tomcat.util.log.Log;
/**
* This is used by JspServlet to construct a link to jasper at runtime,
* in a separated class loader.
*
* @author Costin Manolache
*/
public class JspServletLiaisonImpl extends JspServletLiaison {
static final String INC_SERVLET_PATH =
"javax.servlet.include.servlet_path";
static final String PRECOMPILE = "jsp_precompile";
protected ServletContext context = null;
// config of jsp servlet
protected ServletConfig config;
protected Options options;
Hashtable jsps=new Hashtable();
public JspServletLiaisonImpl() {
}
/** Set to true to provide Too Much Information on errors */
private final boolean insecure_TMI = false;
public void init(ServletConfig config, ServletContext context )
throws ServletException
{
this.config = config;
this.context = config.getServletContext();
options = new OptionsServletConfig(config, context);
// XXX each generate servlet will check that - so it works with JSPC
// and without JspServlet
if( JspFactory.getDefaultFactory() ==null )
JspFactory.setDefaultFactory(new JspFactoryImpl());
}
public void service (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
try {
String includeUri
= (String) request.getAttribute(INC_SERVLET_PATH);
String jspUri;
if (includeUri == null)
jspUri = request.getServletPath();
else
jspUri = includeUri;
boolean precompile = isPreCompile(request);
// XXX This seemed to be true all the time.
// When do we have exception ??
boolean isErrorPage = false; //exception != null;
JspServletWrapper wrapper = (JspServletWrapper) jsps.get(jspUri);
if( debug>0 )
log("Service " + jspUri + " " + wrapper );
if (wrapper == null) {
wrapper = new JspServletWrapper(jspUri, isErrorPage);
jsps.put(jspUri, wrapper);
}
wrapper.initWrapper( context, options, request, response);
if( wrapper.isOutDated() ) {
compileJsp(wrapper, wrapper.jspUri, wrapper.isErrorPage,
request, response);
}
// If a page is to only to be precompiled return.
if (precompile)
return;
wrapper.service(request, response);
} catch (FileNotFoundException ex) {
handleFileNotFoundException( ex, response );
} catch (RuntimeException e) {
throw e;
} catch (ServletException e) {
throw e;
} catch (IOException e) {
throw e;
} catch (Throwable e) {
throw new ServletException(e);
}
}
void compileJsp(JspServletWrapper jsw,String jspUri, boolean isErrorPage,
HttpServletRequest req, HttpServletResponse res)
throws JasperException, FileNotFoundException
{
synchronized ( this ) {
try {
// second check - maybe it was compiled while we
// waited for the sync
if ( ! jsw.isOutDated() )
return;
Compiler compiler = new Compiler(jsw.containerL);
compiler.jsp2java( jsw.pageInfo );
String javaFile=
jsw.pageInfo.getMangler().getJavaFileName();
JavaCompiler javaC=
compiler.createJavaCompiler( jsw.pageInfo );
compiler.prepareCompiler( javaC, jsw.pageInfo );
boolean status = javaC.compile( javaFile );
if (status == false) {
String msg = javaC.getCompilerMessage();
throw new JasperException("Unable to compile " + msg);
// XXX remember this - until the file is changed !!
}
// remove java file if !keepgenerated, etc
compiler.postCompile(jsw.pageInfo);
if( jsw.theServlet == null) {
// A (re)load happened - need to init the servlet
jsw.load( this.config );
}
} catch (ClassNotFoundException cex) {
throw new JasperException(
ContainerLiaison.getString("jsp.error.unable.load"),cex);
} catch (FileNotFoundException ex) {
throw ex;
} catch (JasperException ex) {
throw ex;
} catch (Exception ex) {
throw new JasperException(
ContainerLiaison.getString("jsp.error.unable.compile"), ex);
}
}
}
// XXX Do we need all this ???
private void handleFileNotFoundException( IOException ex,
HttpServletResponse response)
throws IOException, IllegalStateException
{
try {
if (insecure_TMI) {
response.sendError(HttpServletResponse.SC_NOT_FOUND,
ContainerLiaison.getString
("jsp.error.file.not.found.TMI",
new Object[] { ex.getMessage() }));
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND,
ContainerLiaison.getString
("jsp.error.file.not.found",
new Object[] {}));
}
} catch (IllegalStateException ise) {
// logs are presumed to be secure,
// thus the TMI info can be logged
ContainerLiaison.message(ContainerLiaison.getString
("jsp.error.file.not.found.TMI",
new Object[] { ex.getMessage()}),
Log.ERROR);
// rethrow FileNotFoundException so someone higher
// up can handle
if (insecure_TMI)
throw ex;
else
throw new FileNotFoundException(ContainerLiaison.getString
("jsp.error.file.not.found",
new Object[] {}));
}
}
/** Destroy all generated Jsp Servlets
*/
public void destroy() {
ContainerLiaison.message("JspServlet.destroy()", Log.INFORMATION);
Enumeration servlets = jsps.elements();
while (servlets.hasMoreElements())
((JspServletWrapper) servlets.nextElement()).destroy();
}
// -------------------- Utils --------------------
/** Detect if we're in a precompile request
*/
private boolean isPreCompile(HttpServletRequest request)
throws ServletException
{
boolean precompile = false;
String precom = request.getParameter(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 " +
PRECOMPILE +
" set to " + precom);
}
} else if (qString != null &&
(qString.startsWith(PRECOMPILE) ||
qString.indexOf("&" + PRECOMPILE) != -1))
precompile = true;
return precompile;
}
private int debug=10;
public void log( String s ) {
System.out.println("JspServlet: " + s );
}
}