You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ki...@apache.org on 2003/07/30 01:22:23 UTC

cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler JspUtil.java

kinman      2003/07/29 16:22:23

  Modified:    jasper2/src/share/org/apache/jasper
                        JspCompilationContext.java
               jasper2/src/share/org/apache/jasper/compiler JspUtil.java
  Log:
  - Fix bug 21978: Certain tag file pathnames lead to compile errors
  
    Patch submitted by armich@alumni.rice.edu (Eric Carmichael), with my
    added check for Java keywords in package names.
  
  Revision  Changes    Path
  1.41      +20 -78    jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspCompilationContext.java
  
  Index: JspCompilationContext.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspCompilationContext.java,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- JspCompilationContext.java	21 May 2003 18:09:33 -0000	1.40
  +++ JspCompilationContext.java	29 Jul 2003 23:22:23 -0000	1.41
  @@ -61,19 +61,24 @@
   
   package org.apache.jasper;
   
  -import java.io.*;
  -import java.net.*;
  -import java.util.*;
  -import java.util.jar.JarFile;
  +import java.io.File;
  +import java.io.FileNotFoundException;
  +import java.net.MalformedURLException;
  +import java.net.URL;
  +import java.net.URLClassLoader;
  +import java.util.Hashtable;
  +import java.util.Set;
  +
   import javax.servlet.ServletContext;
   import javax.servlet.jsp.tagext.TagInfo;
  -import javax.servlet.jsp.tagext.TagData;
  -import org.apache.jasper.compiler.JspRuntimeContext;
  -import org.apache.jasper.compiler.ServletWriter;
  +
   import org.apache.jasper.compiler.Compiler;
  +import org.apache.jasper.compiler.JspRuntimeContext;
  +import org.apache.jasper.compiler.JspUtil;
   import org.apache.jasper.compiler.Localizer;
  -import org.apache.jasper.servlet.JspServletWrapper;
  +import org.apache.jasper.compiler.ServletWriter;
   import org.apache.jasper.servlet.JasperLoader;
  +import org.apache.jasper.servlet.JspServletWrapper;
   
   /**
    * A place holder for various things that are used through out the JSP
  @@ -128,19 +133,6 @@
       private TagInfo tagInfo;
       private URL tagFileJarUrl;
   
  -    private static final String javaKeywords[] = {
  -        "abstract", "boolean", "break", "byte", "case",
  -        "catch", "char", "class", "const", "continue",
  -        "default", "do", "double", "else", "extends",
  -        "final", "finally", "float", "for", "goto",
  -        "if", "implements", "import", "instanceof", "int",
  -        "interface", "long", "native", "new", "package",
  -        "private", "protected", "public", "return", "short",
  -        "static", "strictfp", "super", "switch", "synchronized",
  -        "this", "throws", "transient", "try", "void",
  -        "volatile", "while" };
  -
  -
       // jspURI _must_ be relative to the context
       public JspCompilationContext(String jspUri,
                                    boolean isErrPage,
  @@ -343,25 +335,8 @@
               }
           } else {
               int iSep = jspUri.lastIndexOf('/') + 1;
  -            int iEnd = jspUri.length();
  -            StringBuffer modifiedClassName = 
  -                new StringBuffer(jspUri.length() - iSep);
  -            if (!Character.isJavaIdentifierStart(jspUri.charAt(iSep))) {
  -                modifiedClassName.append('_');
  -            }
  -            for (int i = iSep; i < iEnd; i++) {
  -                char ch = jspUri.charAt(i);
  -                if (Character.isJavaIdentifierPart(ch) && ch != '_') {
  -                    modifiedClassName.append(ch);
  -                } else if (ch == '.') {
  -                    modifiedClassName.append('_');
  -                } else {
  -                    modifiedClassName.append(mangleChar(ch));
  -                }
  -            }
  -            className = modifiedClassName.toString();
  +            className = JspUtil.makeJavaIdentifier(jspUri.substring(iSep));
           }
  -
           return className;
       }
   
  @@ -436,17 +411,17 @@
                   if (Character.isJavaIdentifierPart(ch) && ch != '_') {
                       modifiedPackageName.append(ch);
                   } else if (ch == '/') {
  -                    if (isJavaKeyword(jspUri.substring(nameStart, i))) {
  +                    if (JspUtil.isJavaKeyword(jspUri.substring(nameStart, i))) {
                           modifiedPackageName.append('_');
                       }
                       nameStart = i+1;
                       modifiedPackageName.append('.');
                   } else {
  -                    modifiedPackageName.append(mangleChar(ch));
  +                    modifiedPackageName.append(JspUtil.mangleChar(ch));
                   }
               }
               if (nameStart < iSep
  -                    && isJavaKeyword(jspUri.substring(nameStart, iSep))) {
  +                    && JspUtil.isJavaKeyword(jspUri.substring(nameStart, iSep))) {
                   modifiedPackageName.append('_');
               }
               derivedPackageName = modifiedPackageName.toString();
  @@ -670,20 +645,6 @@
       }
       
       // ==================== Private methods ==================== 
  -    // Mangling, etc.
  -    
  -    /**
  -     * Mangle the specified character to create a legal Java class name.
  -     */
  -    private static final String mangleChar(char ch) {
  -        char[] result = new char[5];
  -        result[0] = '_';
  -        result[1] = Character.forDigit((ch >> 12) & 0xf, 16);
  -        result[2] = Character.forDigit((ch >> 8) & 0xf, 16);
  -        result[3] = Character.forDigit((ch >> 4) & 0xf, 16);
  -        result[4] = Character.forDigit(ch & 0xf, 16);
  -        return new String(result);
  -    }
   
       private static final boolean isPathSeparator(char c) {
          return (c == '/' || c == '\\');
  @@ -747,24 +708,5 @@
          }
          return result.toString();
       }
  -
  -    private static boolean isJavaKeyword(String key) {
  -        int i = 0;
  -        int j = javaKeywords.length;
  -        while (i < j) {
  -            int k = (i+j)/2;
  -            int result = javaKeywords[k].compareTo(key);
  -            if (result == 0) {
  -                return true;
  -            }
  -            if (result < 0) {
  -                i = k+1;
  -            } else {
  -                j = k;
  -            }
  -        }
  -        return false;
  -    }
  -
   }
   
  
  
  
  1.39      +124 -33   jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspUtil.java
  
  Index: JspUtil.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspUtil.java,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- JspUtil.java	25 Jun 2003 01:01:55 -0000	1.38
  +++ JspUtil.java	29 Jul 2003 23:22:23 -0000	1.39
  @@ -60,24 +60,24 @@
    */ 
   package org.apache.jasper.compiler;
   
  -import java.io.*;
  -import java.util.Enumeration;
  -import java.util.Hashtable;
  +import java.io.CharArrayWriter;
  +import java.io.IOException;
  +import java.io.InputStream;
  +import java.io.InputStreamReader;
  +import java.io.UnsupportedEncodingException;
   import java.util.Vector;
   import java.util.jar.JarFile;
   import java.util.zip.ZipEntry;
   
  -import org.apache.jasper.Constants;
  -import org.apache.jasper.JspCompilationContext;
  -import org.apache.jasper.JasperException;
  -
  -import org.xml.sax.Attributes;
  -
  -// EL interpreter (subject to change)
  -import javax.servlet.jsp.el.FunctionMapper;
   import javax.servlet.jsp.el.ELException;
   import javax.servlet.jsp.el.ELParseException;
  +import javax.servlet.jsp.el.FunctionMapper;
  +
   import org.apache.commons.el.ExpressionEvaluatorImpl;
  +import org.apache.jasper.Constants;
  +import org.apache.jasper.JasperException;
  +import org.apache.jasper.JspCompilationContext;
  +import org.xml.sax.Attributes;
   
   /** 
    * This class has all the utility method(s).
  @@ -105,6 +105,18 @@
       private static ExpressionEvaluatorImpl expressionEvaluator
   	= new ExpressionEvaluatorImpl();
   
  +    private static final String javaKeywords[] = {
  +        "abstract", "boolean", "break", "byte", "case",
  +        "catch", "char", "class", "const", "continue",
  +        "default", "do", "double", "else", "extends",
  +        "final", "finally", "float", "for", "goto",
  +        "if", "implements", "import", "instanceof", "int",
  +        "interface", "long", "native", "new", "package",
  +        "private", "protected", "public", "return", "short",
  +        "static", "strictfp", "super", "switch", "synchronized",
  +        "this", "throws", "transient", "try", "void",
  +        "volatile", "while" };
  +
       public static char[] removeQuotes(char []chars) {
           CharArrayWriter caw = new CharArrayWriter();
           for (int i = 0; i < chars.length; i++) {
  @@ -885,23 +897,30 @@
   						ErrorDispatcher err)
                   throws JasperException {
   
  -	String className = null;
  -	int begin = 0;
  -	int index;
  -	
  -	// Remove ".tag" suffix
  -	index = path.lastIndexOf(".tag");
  -	if (index != -1) {
  -	    path = path.substring(0, index);
  -	} else {
  -	    err.jspError("jsp.error.tagfile.badSuffix", path);
  -	}
  -
  -	index = path.indexOf(WEB_INF_TAGS);
  -	if (index != -1) {
  -	    className = "org.apache.jsp.tag.web.";
  -	    begin = index + WEB_INF_TAGS.length();
  -	} else {
  +        String className = null;
  +        int begin = 0;
  +        int index;
  +        
  +        index = path.lastIndexOf(".tag");
  +        if (index == -1) {
  +            err.jspError("jsp.error.tagfile.badSuffix", path);
  +        }
  +
  +        //It's tempting to remove the ".tag" suffix here, but we can't.
  +        //If we remove it, the fully-qualified class name of this tag
  +        //could conflict with the package name of other tags.
  +        //For instance, the tag file
  +        //    /WEB-INF/tags/foo.tag
  +        //would have fully-qualified class name
  +        //    org.apache.jsp.tag.web.foo
  +        //which would conflict with the package name of the tag file
  +        //    /WEB-INF/tags/foo/bar.tag
  +
  +        index = path.indexOf(WEB_INF_TAGS);
  +        if (index != -1) {
  +            className = "org.apache.jsp.tag.web.";
  +            begin = index + WEB_INF_TAGS.length();
  +        } else {
   	    index = path.indexOf(META_INF_TAGS);
   	    if (index != -1) {
   		className = "org.apache.jsp.tag.meta.";
  @@ -911,9 +930,81 @@
   	    }
   	}
   
  -	className += path.substring(begin).replace('/', '.');
  -
  +        //Make sure the class name consists of legal Java identifiers
  +        String classNameComponents[] = path.substring(begin).split("/");
  +        StringBuffer legalClassNames = new StringBuffer();
  +        for (int i = 0; i < classNameComponents.length; i++) {
  +            legalClassNames.append(makeJavaIdentifier(classNameComponents[i]));
  +            if (isJavaKeyword(classNameComponents[i])) {
  +                legalClassNames.append('_');
  +            }
  +            if (i < classNameComponents.length - 1) {
  +                legalClassNames.append('.');
  +            }
  +        }
  +        className += legalClassNames.toString();
  +  
   	return className;
  +    }
  +
  +    /**
  +     * Converts the given identifier to a legal Java identifier
  +     *
  +     * @param identifier Identifier to convert
  +     *
  +     * @return Legal Java identifier corresponding to the given identifier
  +     */
  +    public static final String makeJavaIdentifier(String identifier) {
  +        StringBuffer modifiedIdentifier = 
  +            new StringBuffer(identifier.length());
  +        if (!Character.isJavaIdentifierStart(identifier.charAt(0))) {
  +            modifiedIdentifier.append('_');
  +        }
  +        for (int i = 0; i < identifier.length(); i++) {
  +            char ch = identifier.charAt(i);
  +            if (Character.isJavaIdentifierPart(ch) && ch != '_') {
  +                modifiedIdentifier.append(ch);
  +            } else if (ch == '.') {
  +                modifiedIdentifier.append('_');
  +            } else {
  +                modifiedIdentifier.append(mangleChar(ch));
  +            }
  +        }
  +        return modifiedIdentifier.toString();
  +    }
  +    
  +    /**
  +     * Mangle the specified character to create a legal Java class name.
  +     */
  +    public static final String mangleChar(char ch) {
  +        char[] result = new char[5];
  +        result[0] = '_';
  +        result[1] = Character.forDigit((ch >> 12) & 0xf, 16);
  +        result[2] = Character.forDigit((ch >> 8) & 0xf, 16);
  +        result[3] = Character.forDigit((ch >> 4) & 0xf, 16);
  +        result[4] = Character.forDigit(ch & 0xf, 16);
  +        return new String(result);
  +    }
  +
  +    /**
  +     * Test whether the argument is a Java keyword
  +     */
  +    public static boolean isJavaKeyword(String key) {
  +        int i = 0;
  +        int j = javaKeywords.length;
  +        while (i < j) {
  +            int k = (i+j)/2;
  +            int result = javaKeywords[k].compareTo(key);
  +            if (result == 0) {
  +                return true;
  +            }
  +            if (result < 0) {
  +                i = k+1;
  +            } else {
  +                j = k;
  +            }
  +        }
  +        return false;
       }
   
       static InputStreamReader getReader(String fname, String encoding,
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org