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 );
      }
  
  
  }