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/07 00:54:16 UTC

[PATCH] Jasper generates bad custom tag variable names

This patch fixes Bug 3019.

If a tag name includes a '-', the generated var name is not a legal Java
identifier name, causing javac compilation errors.  The bug is fixed by
substituting '-' with "$1".  Similarily, '.' is replaced by "$2",
and ':' by "$3".

runsocks cvs diff -u TagGeneratorBase.java
Index: TagGeneratorBase.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/T
agGeneratorBase.java,v
retrieving revision 1.2
diff -u -r1.2 TagGeneratorBase.java
--- TagGeneratorBase.java       2000/11/01 20:25:08     1.2
+++ TagGeneratorBase.java       2001/09/06 22:32:12
@@ -119,7 +119,42 @@
        return (TagVariableData) tagHandlerStack.peek();
     }
 
+    private String substitute(String name, char from, String to) {
+       StringBuffer s = new StringBuffer();
+       int begin = 0;
+       int last = name.length();
+       int end;
+       while (true) {
+           end = name.indexOf(from, begin);
+           if (end == -1)
+               end = last;
+           s.append(name.substring(begin, end));
+           if (end == last)
+               break;
+           s.append(to);
+           begin = end + 1;
+       }
+       return s.toString();
+    }
+           
+    /**
+     * Return a tag variable name from the given prefix and shortTagName.
+     * Not all NMTOKEN's are legal Java identifiers, since they may contain
+     * '-', '.', or ':'.  We use the following mapping: substitute "-" with
+     * "$1", "." with "$2", and ":" with "$3".
+     */
     protected String getTagVarName(String prefix, String shortTagName) {
+
+       if (shortTagName.indexOf('-') != -1) {
+           shortTagName = substitute(shortTagName, '-', "$1");
+       }
+       if (shortTagName.indexOf('.') != -1) {
+           shortTagName = substitute(shortTagName, '.', "$2");
+       }
+       if (shortTagName.indexOf(':') != -1) {
+           shortTagName = substitute(shortTagName, ':', "$3");
+       }
+
        // Fix: Can probably remove the synchronization now when no vars or 
method is static
        synchronized (tagVarNumbers) {
            String tag = prefix+":"+shortTagName;