You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by Kin-Man Chung <Ki...@Eng.Sun.COM> on 2001/09/08 00:18:54 UTC

[PATCH] JSP generated file names are too long

This patches fixes Bug 2917.  The name of the .java files generated by Jasper
includes the path name, which can be a problem in Windows if the path name
is long.  Since the files are placed under the directories indicated by the
path name, there is really no reason to include the pathname with the file
name.

This fix is based on a submitter's (aklimuk@iba.by) suggestion.

runsocks cvs diff -u JspCompiler.java
Index: JspCompiler.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/J
spCompiler.java,v
retrieving revision 1.6
diff -u -r1.6 JspCompiler.java
--- JspCompiler.java    2001/05/16 06:02:48     1.6
+++ JspCompiler.java    2001/09/07 21:24:48
@@ -123,40 +123,14 @@
     }
 
     private final String getBaseClassName() {
-       String className;
-        
+       // Only keep the file name, not the path.
+       int iSep = jsp.lastIndexOf(File.separatorChar) + 1;
+               // By luck, also works when '/' is absent
+       int iEnd = jsp.length();
         if (jsp.endsWith(".jsp"))
-            className = jsp.substring(0, jsp.length() - 4);
-        else
-            className = jsp;
+           iEnd = iEnd - 4;
             
-
-       // Fix for invalid characters. If you think of more add to the list.
-       StringBuffer modifiedClassName = new StringBuffer();
-       for (int i = 0; i < className.length(); i++) {
-           if (Character.isLetterOrDigit(className.charAt(i)) == true)
-               modifiedClassName.append(className.substring(i,i+1));
-           else
-               modifiedClassName.append(mangleChar(className.charAt(i)));
-       }
-       modifiedClassName.append("_jsp");
-       return modifiedClassName.toString();
-    }
-
-    private static final String mangleChar(char ch) {
-
-        if(ch == File.separatorChar) {
-           ch = '/';
-       }
-       String s = Integer.toHexString(ch);
-       int nzeros = 5 - s.length();
-       char[] result = new char[6];
-       result[0] = '_';
-       for (int i = 1; i <= nzeros; i++)
-           result[i] = '0';
-       for (int i = nzeros+1, j = 0; i < 6; i++, j++)
-           result[i] = s.charAt(j);
-       return new String(result);
+       return (jsp.substring(iSep, iEnd) + "_jsp");
     }
 
     /**


Re: [PATCH] JSP generated file names are too long

Posted by "Craig R. McClanahan" <cr...@apache.org>.
I modified this patch a little before applying it:

* The "jsp" variable will have a context relative path that is already
  normalized to forward slashes, so looking for File.separator would
  fail on Windows.

* The generated filename will be the same length as the last component
  of the path, no matter what extension is used.  Previous code only
  supported changing ".jsp" to "_jsp".

* Character mangling is still necessary to create legal Java class names.

Craig


On Fri, 7 Sep 2001, Kin-Man Chung wrote:

> Date: Fri, 07 Sep 2001 15:18:54 -0700 (PDT)
> From: Kin-Man Chung <Ki...@Eng.Sun.COM>
> Reply-To: tomcat-dev@jakarta.apache.org,
>      Kin-Man Chung <Ki...@Eng.Sun.COM>
> To: tomcat-dev@jakarta.apache.org
> Subject: [PATCH] JSP generated file names are too long
>
> This patches fixes Bug 2917.  The name of the .java files generated by Jasper
> includes the path name, which can be a problem in Windows if the path name
> is long.  Since the files are placed under the directories indicated by the
> path name, there is really no reason to include the pathname with the file
> name.
>
> This fix is based on a submitter's (aklimuk@iba.by) suggestion.
>
> runsocks cvs diff -u JspCompiler.java
> Index: JspCompiler.java
> ===================================================================
> RCS file:
> /home/cvspublic/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/J
> spCompiler.java,v
> retrieving revision 1.6
> diff -u -r1.6 JspCompiler.java
> --- JspCompiler.java    2001/05/16 06:02:48     1.6
> +++ JspCompiler.java    2001/09/07 21:24:48
> @@ -123,40 +123,14 @@
>      }
>
>      private final String getBaseClassName() {
> -       String className;
> -
> +       // Only keep the file name, not the path.
> +       int iSep = jsp.lastIndexOf(File.separatorChar) + 1;
> +               // By luck, also works when '/' is absent
> +       int iEnd = jsp.length();
>          if (jsp.endsWith(".jsp"))
> -            className = jsp.substring(0, jsp.length() - 4);
> -        else
> -            className = jsp;
> +           iEnd = iEnd - 4;
>
> -
> -       // Fix for invalid characters. If you think of more add to the list.
> -       StringBuffer modifiedClassName = new StringBuffer();
> -       for (int i = 0; i < className.length(); i++) {
> -           if (Character.isLetterOrDigit(className.charAt(i)) == true)
> -               modifiedClassName.append(className.substring(i,i+1));
> -           else
> -               modifiedClassName.append(mangleChar(className.charAt(i)));
> -       }
> -       modifiedClassName.append("_jsp");
> -       return modifiedClassName.toString();
> -    }
> -
> -    private static final String mangleChar(char ch) {
> -
> -        if(ch == File.separatorChar) {
> -           ch = '/';
> -       }
> -       String s = Integer.toHexString(ch);
> -       int nzeros = 5 - s.length();
> -       char[] result = new char[6];
> -       result[0] = '_';
> -       for (int i = 1; i <= nzeros; i++)
> -           result[i] = '0';
> -       for (int i = nzeros+1, j = 0; i < 6; i++, j++)
> -           result[i] = s.charAt(j);
> -       return new String(result);
> +       return (jsp.substring(iSep, iEnd) + "_jsp");
>      }
>
>      /**
>
>