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:55:17 UTC

cvs commit: jakarta-tomcat-jasper/jasper34/liaison/org/apache/jasper34/liaison ServletContainerLiaison.java

costin      01/06/17 12:55:17

  Added:       jasper34/liaison/org/apache/jasper34/liaison
                        ServletContainerLiaison.java
  Log:
  Added the old JspEngineContext.
  
  This is a ContainerLiaison implementation using only servlet API and few
  context attributes, for maximum portability ( but minimal integration )
  
  Revision  Changes    Path
  1.1                  jakarta-tomcat-jasper/jasper34/liaison/org/apache/jasper34/liaison/ServletContainerLiaison.java
  
  Index: ServletContainerLiaison.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.ServletContext;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import java.io.*;
  import java.net.*;
  
  import org.apache.jasper34.generator.*;
  import org.apache.jasper34.core.Compiler;
  import org.apache.jasper34.core.*;
  import org.apache.jasper34.runtime.*;
  import org.apache.jasper34.jsptree.*;
  import org.apache.jasper34.liaison.*;
  import org.apache.jasper34.parser.*;
  import org.apache.jasper34.javacompiler.*;
  
  import org.apache.tomcat.util.log.*;
  
  /**
   *  Container liaison using minimal servlet container services. Most
   *  functionality is implemented using the standard javax.servlet API,
   *  plus few special context attributes.
   *
   *  XXX provide workarounds for the special attributes ! 
   *
   * @author Anil K. Vijendran
   * @author Harish Prabandham
   * @author Costin Manolache
   */
  public class ServletContainerLiaison extends ContainerLiaison
  {
      JspReader reader;
      ServletWriter writer;
      ServletContext context;
      ClassLoader 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 ServletContainerLiaison(String classpath, 
  				   ServletContext context, String jspFile, 
  				   boolean isErrPage, Options options, 
  			   HttpServletRequest req, HttpServletResponse res) 
      {
          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() {
  	// XXX Use common code, toolkit
          return  options.getClassPath();
      }
      
      /**
       * 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() {
  	if( loader==null ) {
  	    
  	    try {
  		ClassLoader parentClassLoader=getParentLoader( context );
  		File sDir=options.getScratchDir();
  
  		// PD will be set in the policy
  		// XXX get loader
  		URL urls[]=new URL[1];
  		urls[0]=new URL( "file", null,
  			 sDir.getAbsolutePath().replace('\\','/') + "/");
  
  		// XXX JDK1.1, compat 
  		loader=new URLClassLoader( urls, parentClassLoader);
  	    } catch( Exception ex ) {
  		ex.printStackTrace();
  	    }
  
  	}
          return loader;
      }
  
      /** Extract parent class loader from ServletContext
       */
      private ClassLoader getParentLoader(ServletContext ctx) {
  	ClassLoader 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) {
              ContainerLiaison.message("jsp.message.parent_class_loader_is", 
  				     new Object[] {
  		parentClassLoader.toString()
  		    }, Log.DEBUG);
  	}
  	else {
              ContainerLiaison.message("jsp.message.parent_class_loader_is", 
  				     new Object[] {
  		"<none>"
  		    }, Log.DEBUG);
  	}
  	return parentClassLoader;
      }
  
  
      
      /**
       * 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 JavaCompiler getJavaCompiler() throws JasperException {
  	String compilerPath = options.getJspCompilerPath();
  	String jspCompilerPlugin = options.getJspCompilerPlugin();
  
  	JavaCompiler javac=JavaCompiler.createJavaCompiler( this,
  							    jspCompilerPlugin);
          if (compilerPath != null)
              javac.setCompilerPath(compilerPath);
  
  	return javac;
      }
  
      /** 
       * Get the full value of a URI relative to this compilations context
       */
      public String resolveRelativeUri(String uri, String baseUri)
      {
          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;
          }
      }
  
      public void readWebXml( TagLibraries tli )
  	throws IOException, JasperException
      {
  	TagLibReader reader=new TagLibReader( this, tli );
  	reader.readWebXml( tli );
      }
  
      /** Read a tag lib descriptor ( tld ). You can use the default
  	implementation ( TagLibReader ).
      */
      public void readTLD( TagLibraries libs,
  			 TagLibraryInfoImpl tl, String prefix, String uri,
  			 String uriBase )
      	throws IOException, JasperException
      {
  	TagLibReader reader=new TagLibReader( this, libs );
  	reader.readTLD( tl, prefix, uri, uriBase );
      }
      
     
  }