kinman      2002/08/19 20:54:54

  Added:       jasper2/src/share/org/apache/jasper/compiler JspConfig.java
  Log:
  - Added for JSP configuration support
  
  Revision  Changes    Path
  1.1                  
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspConfig.java
  
  Index: JspConfig.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspConfig.java,v
 1.1 2002/08/20 03:54:54 kinman Exp $
   * $Revision: 1.1 $
   * $Date: 2002/08/20 03:54:54 $
   *
   * ====================================================================
   *
   * 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 [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package org.apache.jasper.compiler;
  
  import java.util.Vector;
  import java.io.InputStream;
  import java.util.Iterator;
  
  import javax.servlet.ServletContext;
  
  import org.apache.jasper.Constants;
  import org.apache.jasper.logging.Logger;
  import org.apache.jasper.JasperException;
  import org.apache.jasper.xmlparser.ParserUtils;
  import org.apache.jasper.xmlparser.TreeNode;
  
  
  /**
   * Handles the jsp-config element in WEB_INF/web.xml.  This is used
   * for specifying the JSP configuration informantion on a JSP page
   *
   * @authro Kin-man Chung
   */
  
  public class JspConfig {
  
      static private final String WEB_XML = "/WEB-INF/web.xml";
  
      private Vector jspProperties = null;
      private ServletContext ctxt;
      private boolean initialized = false;
  
      private String defaultIsXml = "false";
      private String defaultIsELEnabled = "true";
      private String defaultIsScriptingEnabled = "true";
  
      public JspConfig(ServletContext ctxt) {
        this.ctxt = ctxt;
      }
  
      private void processWebDotXml(ServletContext ctxt) throws JasperException {
  
        InputStream is = ctxt.getResourceAsStream(WEB_XML);
        if (is == null) {
            // no web.xml
            return;
        }
  
        ClassLoader cl = this.getClass().getClassLoader();
        ParserUtils pu = ParserUtils.createParserUtils(cl);
        TreeNode webApp = pu.parseXMLDocument(WEB_XML, is);
        if (webApp == null || !"2.4".equals(webApp.findAttribute("version"))) {
            System.out.println("Servlet 2.3");
            defaultIsELEnabled = "false";
            return;
        }
        TreeNode jspConfig = webApp.findChild("jsp-config");
        if (jspConfig == null) {
            return;
        }
  
        jspProperties = new Vector();
        Iterator jspPropertyList = jspConfig.findChildren("jsp-property-group");
        while (jspPropertyList.hasNext()) {
  
            TreeNode element = (TreeNode) jspPropertyList.next();
            Iterator list = element.findChildren();
  
            String urlPattern = null;
            String pageEncoding = null;
            String scriptingEnabled = null;
            String elEnabled = null;
            String isXml = null;
            Vector includePrelude = new Vector();
            Vector includeCoda = new Vector();
  
            while (list.hasNext()) {
  
                element = (TreeNode) list.next();
                String tname = element.getName();
  
                if ("url-pattern".equals(tname))
                    urlPattern = element.getBody();
                else if ("page-encoding".equals(tname))
                    pageEncoding = element.getBody();
                else if ("is-xml".equals(tname))
                    isXml = element.getBody();
                else if ("el-enabled".equals(tname))
                    elEnabled = element.getBody();
                else if ("scripting-enabled".equals(tname))
                    scriptingEnabled = element.getBody();
                else if ("include-prelude".equals(tname))
                    includePrelude.addElement(element.getBody());
                else if ("include-coda".equals(tname))
                    includeCoda.addElement(element.getBody());
            }
            
            String path = null;
            String extension = null;
  
            if (urlPattern == null) {
                continue;
            }
  
            if (urlPattern.indexOf('*') < 0) {
                // Exact match
                path = urlPattern;
            } else {
                int i = urlPattern.lastIndexOf('/');
                String file;
                if (i >= 0) {
                    path = urlPattern.substring(0,i+1);
                    file = urlPattern.substring(i+1);
                } else {
                    file = urlPattern;
                }
  
                // pattern must be "*", or of the form "*.jsp"
                if (file.equals("*")) {
                    extension = "*";
                } else if (file.startsWith("*.")) {
                    extension = file.substring(file.indexOf('.')+1);
                } else {
                    Constants.message(
                        "jsp.warning.bad.urlpattern.propertygroup",
                        new Object[] {urlPattern},
                        Logger.WARNING);
                    continue;
                }
            }
  
            JspProperty property = new JspProperty(isXml,
                                                   elEnabled,
                                                   scriptingEnabled,
                                                   pageEncoding,
                                                   includePrelude,
                                                   includeCoda);
            JspPropertyGroup propertyGroup =
                new JspPropertyGroup(path, extension, property);
  
            jspProperties.addElement(propertyGroup);
        }
      }
  
      /**
       * Find a property that best match the supplied resource.
       * @param uri the resource supplied.
       * @return a JspProperty if a match is found, null otherwise
       */
      public JspProperty findJspProperty(String uri) throws JasperException {
  
        if (!initialized) {
            processWebDotXml(ctxt);
            initialized = true;
        }
            
        if (jspProperties == null) {
            return new JspProperty(defaultIsXml, defaultIsELEnabled,
                                   defaultIsScriptingEnabled,
                                   null, null, null);
        }
  
        String uriPath = null;
        int index = uri.lastIndexOf('/');
        if (index >=0 ) {
            uriPath = uri.substring(0, index+1);
        }
        String uriExtension = null;
        index = uri.lastIndexOf('.');
        if (index >=0) {
            uriExtension = uri.substring(index+1);
        }
  
        Vector includePreludes = new Vector();
        Vector includeCodas = new Vector();
  
        JspPropertyGroup isXmlMatch = null;
        JspPropertyGroup elEnabledMatch = null;
        JspPropertyGroup scriptingEnabledMatch = null;
        JspPropertyGroup pageEncodingMatch = null;
  
        Iterator iter = jspProperties.iterator();
        while (iter.hasNext()) {
  
            JspPropertyGroup jpg = (JspPropertyGroup) iter.next();
            JspProperty jp = jpg.getJspProperty();
  
            if (jpg.getExtension() == null) {
  
                // exact match pattern: /a/foo.jsp
                if (!uri.equals(jpg.getPath())) {
                    // not matched;
                    continue;
                }
  
                // Add include-preludes and include-codas
                if (jp.getIncludePrelude() != null) {
                    includePreludes.addAll(jp.getIncludePrelude());
                }
                if (jp.getIncludeCoda() != null) {
                    includeCodas.addAll(jp.getIncludeCoda());
                }
  
                // For other attributes, keep the best match.
                if (jp.isXml() != null) {
                    isXmlMatch = jpg;
                }
                if (jp.isELEnabled() != null) {
                    elEnabledMatch = jpg;
                }
                if (jp.isScriptingEnabled() != null) {
                    scriptingEnabledMatch = jpg;
                }
                if (jp.getPageEncoding() != null) {
                    pageEncodingMatch = jpg;
                }
            } else {
  
                // Possible patterns are *, *.ext, /p/*, and /p/*.ext
  
                if (jpg.getPath() != null && !jpg.getPath().equals(uriPath)) {
                    // not matched
                    continue;
                }
                if (!jpg.getExtension().equals("*") &&
                                !jpg.getExtension().equals(uriExtension)) {
                    // not matched
                    continue;
                }
  
                // We have a match
                // Add include-preludes and include-codas
                if (jp.getIncludePrelude() != null) {
                    includePreludes.addAll(jp.getIncludePrelude());
                }
                if (jp.getIncludeCoda() != null) {
                    includeCodas.addAll(jp.getIncludeCoda());
                }
  
                // If there is a previous match, and the current match is
                // more restrictive, use the current match.
                if (jp.isXml() != null &&
                        (isXmlMatch == null ||
                                (isXmlMatch.getExtension() != null &&
                                 isXmlMatch.getExtension().equals("*")))) {
                        isXmlMatch = jpg;
                }
                if (jp.isELEnabled() != null &&
                        (elEnabledMatch == null ||
                            (elEnabledMatch.getExtension() != null &&
                             elEnabledMatch.getExtension().equals("*")))) {
                    elEnabledMatch = jpg;
                }
                if (jp.isScriptingEnabled() != null &&
                        (scriptingEnabledMatch == null ||
                            (scriptingEnabledMatch.getExtension() != null &&
                             scriptingEnabledMatch.getExtension().equals("*")))) {
                    scriptingEnabledMatch = jpg;
                }
                if (jp.getPageEncoding() != null &&
                        (pageEncodingMatch == null ||
                            (pageEncodingMatch.getExtension() != null &&
                             pageEncodingMatch.getExtension().equals("*")))) {
                    pageEncodingMatch = jpg;
                }
            }
        }
  
  
        String isXml = defaultIsXml;
        String isELEnabled = defaultIsELEnabled;
        String isScriptingEnabled = defaultIsScriptingEnabled;
        String pageEncoding = null;
  
        if (isXmlMatch != null) {
            isXml = isXmlMatch.getJspProperty().isXml();
        }
        if (elEnabledMatch != null) {
            isELEnabled = elEnabledMatch.getJspProperty().isELEnabled();
        }
        if (scriptingEnabledMatch != null) {
            isScriptingEnabled =
                scriptingEnabledMatch.getJspProperty().isScriptingEnabled();
        }
        if (pageEncodingMatch != null) {
            pageEncoding = pageEncodingMatch.getJspProperty().getPageEncoding();
        }
  
        return new JspProperty(isXml, isELEnabled, isScriptingEnabled,
                               pageEncoding, includePreludes, includeCodas);
      }
  
      static class JspPropertyGroup {
        private String path;
        private String extension;
        private JspProperty jspProperty;
  
        JspPropertyGroup(String path, String extension,
                         JspProperty jspProperty) {
            this.path = path;
            this.extension = extension;
            this.jspProperty = jspProperty;
        }
  
        public String getPath() {
            return path;
        }
  
        public String getExtension() {
            return extension;
        }
  
        public JspProperty getJspProperty() {
            return jspProperty;
        }
      }
  
      static public class JspProperty {
  
        private String isXml;
        private String elEnabled;
        private String scriptingEnabled;
        private String pageEncoding;
        private Vector includePrelude;
        private Vector includeCoda;
  
        JspProperty(String isXml, String elEnabled,
                    String scriptingEnabled, String pageEncoding,
                    Vector includePrelude, Vector includeCoda) {
  
            this.isXml = isXml;
            this.elEnabled = elEnabled;
            this.scriptingEnabled = scriptingEnabled;
            this.pageEncoding = pageEncoding;
            this.includePrelude = includePrelude;
            this.includeCoda = includeCoda;
        }
  
        public String isXml() {
            return isXml;
        }
  
        public String isELEnabled() {
            return elEnabled;
        }
  
        public String isScriptingEnabled() {
            return scriptingEnabled;
        }
  
        public String getPageEncoding() {
            return pageEncoding;
        }
  
        public Vector getIncludePrelude() {
            return includePrelude;
        }
  
        public Vector getIncludeCoda() {
            return includeCoda;
        }
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to