cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java
markt 2005/03/02 12:56:03 Modified:jasper2/src/share/org/apache/jasper/compiler Tag: tomcat_4_branch Generator.java JspUtil.java Log: Port fix for 22867 tag handlers can't be inner/nested classes from TC5 - TC4 port provided by Steven Parkes in bug 24586 Revision ChangesPath No revision No revision 1.35.2.28 +14 -10 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.35.2.27 retrieving revision 1.35.2.28 diff -u -r1.35.2.27 -r1.35.2.28 --- Generator.java22 Feb 2005 22:00:54 - 1.35.2.27 +++ Generator.java2 Mar 2005 20:56:02 - 1.35.2.28 @@ -648,7 +648,7 @@ if (beanInfo.checkVariable(name)) { // Bean is defined using useBean, introspect at compile time Class bean = beanInfo.getBeanType(name); -String beanName = bean.getName(); +String beanName = JspUtil.getCanonicalName(bean); java.lang.reflect.Method meth = JspRuntimeLibrary.getReadMethod(bean, property); String methodName = meth.getName(); @@ -1293,21 +1293,23 @@ declareScriptingVars(n, VariableInfo.AT_BEGIN); saveScriptingVars(n, VariableInfo.AT_BEGIN); -out.printin(tagHandlerClass.getName()); +String tagHandlerClassName = +JspUtil.getCanonicalName(tagHandlerClass); +out.printin(tagHandlerClassName); out.print(" "); out.print(tagHandlerVar); out.print(" = "); if (ctxt.getOptions().isPoolingEnabled()) { out.print("("); -out.print(tagHandlerClass.getName()); +out.print(tagHandlerClassName); out.print(") "); out.print(n.getTagHandlerPoolName()); out.print(".get("); -out.print(tagHandlerClass.getName()); +out.print(tagHandlerClassName); out.println(".class);"); } else { out.print("new "); -out.print(tagHandlerClass.getName()); +out.print(tagHandlerClassName); out.println("();"); } @@ -1750,11 +1752,12 @@ throws JasperException { if (propEditorClass != null) { -return "(" + c.getName() +String className = JspUtil.getCanonicalName(c); +return "(" + className + ")JspRuntimeLibrary.getValueFromBeanInfoPropertyEditor(" -+ c.getName() + ".class, \"" + attrName + "\", " ++ className + ".class, \"" + attrName + "\", " + quote(s) + ", " -+ propEditorClass.getName() + ".class)"; ++ JspUtil.getCanonicalName(propEditorClass) + ".class)"; } else if (c == String.class) { return quote(s); } else if (c == boolean.class) { @@ -1808,9 +1811,10 @@ } else if (c == Object.class) { return "new String(" + quote(s) + ")"; } else { -return "(" + c.getName() +String className = JspUtil.getCanonicalName(c); +return "(" + className + ")JspRuntimeLibrary.getValueFromPropertyEditorManager(" -+ c.getName() + ".class, \"" + attrName + "\", " ++ className + ".class, \"" + attrName + "\", " + quote(s) + ")"; } } 1.4.2.4 +29 -0 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.4.2.3 retrieving revision 1.4.2.4 diff -u -r1.4.2.3 -r1.4.2.4 --- JspUtil.java 25 Aug 2004 20:53:31 - 1.4.2.3 +++ JspUtil.java 2 Mar 2005 20:56:03 - 1.4.2.4 @@ -423,6 +423,35 @@ } return b; } + +// javac -classpath ~mint/tomcat/common/lib/ant.jar:~mint/tomcat/common/endorsed/xml-apis.jar:~mint/tomcat/common/lib/servlet.jar `find . -name \*.java ` + + +/** + * Compute the canonical name from a Class instance. Note that a + * simple replacment of '$' with '.' of a binary name would not work,
cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java
kinman 2004/06/10 17:29:57 Modified:jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java Log: - If the value of the "type" attribute of the attribute directive is an array, allow it to be specified as "[L;" Revision ChangesPath 1.234 +3 -3 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.233 retrieving revision 1.234 diff -u -r1.233 -r1.234 --- Generator.java10 Jun 2004 21:17:28 - 1.233 +++ Generator.java11 Jun 2004 00:29:56 - 1.234 @@ -3444,7 +3444,7 @@ if (attrInfos[i].isFragment()) { out.print("javax.servlet.jsp.tagext.JspFragment "); } else { -out.print(attrInfos[i].getTypeName()); +out.print(JspUtil.toJavaSourceType(attrInfos[i].getTypeName())); out.print(" "); } out.print(attrInfos[i].getName()); @@ -3460,7 +3460,7 @@ if (attrInfos[i].isFragment()) { out.print("javax.servlet.jsp.tagext.JspFragment "); } else { -out.print(attrInfos[i].getTypeName()); +out.print(JspUtil.toJavaSourceType(attrInfos[i].getTypeName())); out.print(" "); } out.print(toGetterMethod(attrInfos[i].getName())); @@ -3480,7 +3480,7 @@ out.print("(javax.servlet.jsp.tagext.JspFragment "); } else { out.print("("); -out.print(attrInfos[i].getTypeName()); +out.print(JspUtil.toJavaSourceType(attrInfos[i].getTypeName())); out.print(" "); } out.print(attrInfos[i].getName()); 1.49 +1 -1 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.48 retrieving revision 1.49 diff -u -r1.48 -r1.49 --- JspUtil.java 19 Apr 2004 21:10:19 - 1.48 +++ JspUtil.java 11 Jun 2004 00:29:56 - 1.49 @@ -1047,7 +1047,7 @@ * the element type can be one of ZBCDFIJS or L; * It is converted into forms that can be understood by javac. */ -private static String toJavaSourceType(String type) { +public static String toJavaSourceType(String type) { if (type.charAt(0) != '[') { return type; - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java
kinman 2004/04/19 14:10:19 Modified:jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java Log: - Fix 28380: Javac error with ':' and '.' in attribute names. Revision ChangesPath 1.232 +7 -29 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.231 retrieving revision 1.232 diff -u -r1.231 -r1.232 --- Generator.java5 Apr 2004 16:07:41 - 1.231 +++ Generator.java19 Apr 2004 21:10:19 - 1.232 @@ -254,18 +254,6 @@ boolean hasEmptyBody) { String poolName = null; -if (prefix.indexOf('-') >= 0) -prefix = JspUtil.replace(prefix, '-', "$1"); -if (prefix.indexOf('.') >= 0) -prefix = JspUtil.replace(prefix, '.', "$2"); - -if (shortName.indexOf('-') >= 0) -shortName = JspUtil.replace(shortName, '-', "$1"); -if (shortName.indexOf('.') >= 0) -shortName = JspUtil.replace(shortName, '.', "$2"); -if (shortName.indexOf(':') >= 0) -shortName = JspUtil.replace(shortName, ':', "$3"); - poolName = "_jspx_tagPool_" + prefix + "_" + shortName; if (attrs != null) { String[] attrNames = new String[attrs.getLength()]; @@ -280,7 +268,7 @@ if (hasEmptyBody) { poolName = poolName + "_nobody"; } -return poolName; +return JspUtil.makeXmlJavaIdentifier(poolName); } } @@ -2617,37 +2605,27 @@ /* * Creates a tag variable name by concatenating the given prefix and - * shortName and replacing '-' with "$1", '.' with "$2", and ':' with - * "$3". + * shortName and endcoded to make the resultant string a valid Java + * Identifier. */ private String createTagVarName( String fullName, String prefix, String shortName) { -if (prefix.indexOf('-') >= 0) -prefix = JspUtil.replace(prefix, '-', "$1"); -if (prefix.indexOf('.') >= 0) -prefix = JspUtil.replace(prefix, '.', "$2"); - -if (shortName.indexOf('-') >= 0) -shortName = JspUtil.replace(shortName, '-', "$1"); -if (shortName.indexOf('.') >= 0) -shortName = JspUtil.replace(shortName, '.', "$2"); -if (shortName.indexOf(':') >= 0) -shortName = JspUtil.replace(shortName, ':', "$3"); +String varName; synchronized (tagVarNumbers) { -String varName = prefix + "_" + shortName + "_"; +varName = prefix + "_" + shortName + "_"; if (tagVarNumbers.get(fullName) != null) { Integer i = (Integer)tagVarNumbers.get(fullName); varName = varName + i.intValue(); tagVarNumbers.put(fullName, new Integer(i.intValue() + 1)); -return varName; } else { tagVarNumbers.put(fullName, new Integer(1)); -return varName + "0"; +varName = varName + "0"; } } +return JspUtil.makeXmlJavaIdentifier(varName); } private String evaluateAttribute( 1.48 +21 -0 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.47 retrieving revision 1.48 diff -u -r1.47 -r1.48 --- JspUtil.java 17 Mar 2004 19:23:03 - 1.47 +++ JspUtil.java 19 Apr 2004 21:10:19 - 1.48 @@ -1003,6 +1003,27 @@ return false; } +/** + * Converts the given Xml name to a legal Java identifier. This is + * slightly more efficient than makeJavaIdentifier in that we only need + * to worry about '.', '-', and ':' in the string. We also assume that + * the resultant string is further concatenated with some prefix string + * so that we don't have to worry about it being a Java key word. + * + * @param name Identifier to convert + * + * @return Legal Java identifier corresponding to the give
cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java
kinman 2003/09/19 11:30:10 Modified:jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java Log: - When a tag handler class is an inner class, it is specified in the TLD in binary form (Outer$Inner). It needs to be converted to canonical form (Outer.Inner) when generating Java files. Revision ChangesPath 1.210 +21 -15 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.209 retrieving revision 1.210 diff -u -r1.209 -r1.210 --- Generator.java18 Sep 2003 23:12:39 - 1.209 +++ Generator.java19 Sep 2003 18:30:09 - 1.210 @@ -1048,7 +1048,7 @@ if (beanInfo.checkVariable(name)) { // Bean is defined using useBean, introspect at compile time Class bean = beanInfo.getBeanType(name); -String beanName = bean.getName(); +String beanName = JspUtil.getCanonicalName(bean); java.lang.reflect.Method meth = JspRuntimeLibrary.getReadMethod(bean, property); String methodName = meth.getName(); @@ -2121,21 +2121,23 @@ declareScriptingVars(n, VariableInfo.AT_BEGIN); saveScriptingVars(n, VariableInfo.AT_BEGIN); -out.printin(tagHandlerClass.getName()); +String tagHandlerClassName = +JspUtil.getCanonicalName(tagHandlerClass); +out.printin(tagHandlerClassName); out.print(" "); out.print(tagHandlerVar); out.print(" = "); if (isPoolingEnabled) { out.print("("); -out.print(tagHandlerClass.getName()); +out.print(tagHandlerClassName); out.print(") "); out.print(n.getTagHandlerPoolName()); out.print(".get("); -out.print(tagHandlerClass.getName()); +out.print(tagHandlerClassName); out.println(".class);"); } else { out.print("new "); -out.print(tagHandlerClass.getName()); +out.print(tagHandlerClassName); out.println("();"); } @@ -2333,12 +2335,14 @@ declareScriptingVars(n, VariableInfo.AT_BEGIN); saveScriptingVars(n, VariableInfo.AT_BEGIN); -out.printin(tagHandlerClass.getName()); +String tagHandlerClassName = +JspUtil.getCanonicalName(tagHandlerClass); +out.printin(tagHandlerClassName); out.print(" "); out.print(tagHandlerVar); out.print(" = "); out.print("new "); -out.print(tagHandlerClass.getName()); +out.print(tagHandlerClassName); out.println("();"); generateSetters(n, tagHandlerVar, handlerInfo, true); @@ -2853,16 +2857,17 @@ } if (propEditorClass != null) { +String className = JspUtil.getCanonicalName(c); return "(" -+ c.getName() ++ className + ")org.apache.jasper.runtime.JspRuntimeLibrary.getValueFromBeanInfoPropertyEditor(" -+ c.getName() ++ className + ".class, \"" + attrName + "\", " + quoted + ", " -+ propEditorClass.getName() ++ JspUtil.getCanonicalName(propEditorClass) + ".class)"; } else if (c == String.class) { return quoted; @@ -2901,10 +2906,11 @@ } else if (c == Object.class) { return "new String(" + quoted + ")"; } else { +String className = JspUtil.getCanonicalName(c); return "(" -+ c.getName() ++ className + ")org.apache.jasper.runtime.JspRuntimeLibrary.getValueFromPropertyEditorManager(" -+ c.getName() ++ className + ".class, \"" + attrName + "\", " 1.45 +28 -3 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspUtil.java Index: JspUtil.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/s
cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java SmapStratum.java SmapUtil.java
remm2003/08/09 12:19:37 Modified:jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java SmapStratum.java SmapUtil.java Log: - Bug 2006: Invalid SMAP line entries when running with mappedfile=true. - Submitted by Eric Carmichael (like the previous patch). Revision ChangesPath 1.194 +5 -7 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.193 retrieving revision 1.194 diff -u -r1.193 -r1.194 --- Generator.java3 Aug 2003 09:07:47 - 1.193 +++ Generator.java9 Aug 2003 19:19:37 - 1.194 @@ -1700,8 +1700,6 @@ } } - private static final int CHUNKSIZE = 1024; - public void visit(Node.TemplateText n) throws JasperException { String text = n.getText(); @@ -1711,7 +1709,7 @@ out.printin(); StringBuffer sb = new StringBuffer("out.write(\""); int initLength = sb.length(); - int count = CHUNKSIZE; + int count = JspUtil.CHUNKSIZE; for (int i = 0 ; i < text.length() ; i++) { char ch = text.charAt(i); --count; @@ -1736,7 +1734,7 @@ out.printin(); } sb.setLength(initLength); - count = CHUNKSIZE; + count = JspUtil.CHUNKSIZE; } break; case '\t': // Not sure we need this 1.42 +5 -3 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.41 retrieving revision 1.42 diff -u -r1.41 -r1.42 --- JspUtil.java 8 Aug 2003 10:22:23 - 1.41 +++ JspUtil.java 9 Aug 2003 19:19:37 - 1.42 @@ -117,6 +117,8 @@ "this", "throws", "transient", "try", "void", "volatile", "while" }; +public static final int CHUNKSIZE = 1024; + public static char[] removeQuotes(char []chars) { CharArrayWriter caw = new CharArrayWriter(); for (int i = 0; i < chars.length; i++) { 1.6 +38 -0 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/SmapStratum.java Index: SmapStratum.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/SmapStratum.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- SmapStratum.java 31 Jul 2003 16:56:20 - 1.5 +++ SmapStratum.java 9 Aug 2003 19:19:37 - 1.6 @@ -205,6 +205,44 @@ } /** + * Combines consecutive LineInfos wherever possible + */ +public void optimizeLineSection() { + +//Incorporate each LineInfo into the previous LineInfo's +//outputLineIncrement, if possible +int i=0; +while (i < lineData.size()-1) { +LineInfo li = (LineInfo)lineData.get(i); +LineInfo liNext = (LineInfo)lineData.get(i+1); +if (liNext.inputStartLine == li.inputStartLine + && liNext.inputLineCount==1 + && li.inputLineCount==1) { +li.setOutputLineIncrement(liNext.outputStartLine - li.outputStartLine + liNext.outputLineIncrement); +lineData.remove(i+1); +} else { +i++; +} +} + +//Incorporate each LineInfo into the previous LineInfo's +//inputLineCount, if possible +i=0; +while (i < lineData.size()-1) { +LineInfo li = (LineInfo)lineData.get(i); +LineInfo liNext = (LineInfo)lineData.get(i+1); +if (liNext.inputStartLine == li.inputStartLine + li.inputLineCount + && liNext.outputLineIncrement == li.outputLineIncrement + && liNext.outputStartLine == li.outputStartLine + li.inputLineCount*li.outputLineIncrement) { + li.setInputLineCount(li.inputLineCount + liNext.inputLineCount); + lineData.remove(i+1); + } else { + i++; + } +} +} + +/** * Adds complete information about a simple line mapping. Specify * all the fields in this method; the back-end machinery takes care * of printi
cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java Validator.java
luehe 2002/09/19 16:21:40 Modified:jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java Validator.java Log: Fixed 12718: A variable scoped within a fragment in a tag file is always expsed as a string Revision ChangesPath 1.102 +67 -10 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.101 retrieving revision 1.102 diff -u -r1.101 -r1.102 --- Generator.java13 Sep 2002 00:29:48 - 1.101 +++ Generator.java19 Sep 2002 23:21:39 - 1.102 @@ -587,7 +587,7 @@ JspUtil.FunctionSignature functionSignature = new JspUtil.FunctionSignature( fnSignature, -tli.getShortName(), err ); +tli.getShortName(), err, ctxt.getClassLoader() ); out.print( quote( functionSignature.getMethodName() ) ); out.print(", "); Class[] args = functionSignature.getParameterTypes(); @@ -701,6 +701,7 @@ private FragmentHelperClass fragmentHelperClass; private int methodNesting; private TagInfo tagInfo; + private ClassLoader loader; /** * Constructor. @@ -709,11 +710,13 @@ ServletWriter out, MethodsBuffer methodsBuffer, FragmentHelperClass fragmentHelperClass, +ClassLoader loader, TagInfo tagInfo) { this.isTagFile = isTagFile; this.out = out; this.methodsBuffer = methodsBuffer; this.fragmentHelperClass = fragmentHelperClass; + this.loader = loader; this.tagInfo = tagInfo; methodNesting = 0; handlerInfos = new Hashtable(); @@ -1831,21 +1834,66 @@ */ class ParamVisitor extends Node.Visitor { + // The name of the fragment to which the applies + private String fragName; + + public ParamVisitor(String fragName) { + this.fragName = fragName; + } + public void visit(Node.ParamAction n) throws JasperException { out.printin("_jspx_params.put("); out.print(quote(n.getTextAttribute("name"))); out.print(", "); out.print(attributeValue(n.getValue(), false, - String.class, "null")); + getParamClass(n), "null")); out.println(");"); } + + /* + * Checks to see if the given matches a tag file + * variable scoped to the same fragment as the enclosing + * . If a match is found, the class specified in + * the variable directive's 'variable-class' attribute (if + * present) is loaded and returned. + */ + private Class getParamClass(Node.ParamAction n) + throws JasperException { + + Class clazz = String.class; + + TagVariableInfo[] tagVars = tagInfo.getTagVariableInfos(); + if (tagVars != null) { + String paramName = n.getTextAttribute("name"); + for (int i=0; iClass object by appending ".class" to it (e.g., "int.class"). */ -public static Class toClass(String type) throws ClassNotFoundException { +public static Class toClass(String type, ClassLoader loader) + throws ClassNotFoundException { if ("boolean".equals(type)) return boolean.class; else if ("char".equals(type)) @@ -556,7 +557,7 @@ else if ("double".equals(type)) return double.class; else - return Class.forName(type); + return loader.loadClass(type); } /** @@ -715,7 +716,7 @@ * signature. */ public FunctionSignature( String signature, String tagName, -ErrorDispatcher err ) +ErrorDispatcher err, ClassLoader loader ) throws JasperException { try { @@ -763,7 +764,7 @@ tagName, this.methodName ) ); } -parameterTypes.add(toClass(argType)); +parameterTypes.add(toClass(argType, loader)); String c
cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java
luehe 2002/08/01 11:47:28 Modified:jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java Log: more compilation error fixes for generated tag handler file Revision ChangesPath 1.55 +33 -27 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.54 retrieving revision 1.55 diff -u -r1.54 -r1.55 --- Generator.java1 Aug 2002 02:12:05 - 1.54 +++ Generator.java1 Aug 2002 18:47:28 - 1.55 @@ -407,10 +407,8 @@ out.println(); } -// Static data for EL function maps: +// Static data for EL function and prefix maps: generateELFunctionMap(); - -// Static data for EL function maps: generatePrefixMap(); // Class variable declarations @@ -736,6 +734,7 @@ private String parent; private String simpleTagHandlerVar; private boolean isSimpleTagHandler; + private boolean isTagFile; private ServletWriter out; private MethodsBuffer methodsBuffer; private FragmentHelperClass fragmentHelperClass; @@ -745,10 +744,12 @@ /** * Constructor. */ - public GenerateVisitor(ServletWriter out, + public GenerateVisitor(boolean isTagFile, +ServletWriter out, MethodsBuffer methodsBuffer, FragmentHelperClass fragmentHelperClass, TagInfo tagInfo) { + this.isTagFile = isTagFile; this.out = out; this.methodsBuffer = methodsBuffer; this.fragmentHelperClass = fragmentHelperClass; @@ -783,9 +784,9 @@ if (attr.isExpression() || attr.isELInterpreterInput()) { if (attr.isELInterpreterInput()) { - v = JspUtil.interpreterCall( attr.getValue(), -expectedType, "_jspx_prefix_map", "_jspx_fnmap", - defaultPrefix ); + v = JspUtil.interpreterCall(this.isTagFile, + attr.getValue(), expectedType, "_jspx_prefix_map", + "_jspx_fnmap", defaultPrefix ); } if (encode) { return "java.net.URLEncoder.encode(" + v + ")"; @@ -861,9 +862,9 @@ if ( true /*isELEnabled*/ ) { out.printil( "out.write(" - + JspUtil.interpreterCall( - "${" + new String(n.getText()) + "}", String.class, - "_jspx_prefix_map", "_jspx_fnmap", "null" ) + + JspUtil.interpreterCall(this.isTagFile, +"${" + new String(n.getText()) + "}", String.class, + "_jspx_prefix_map", "_jspx_fnmap", "null" ) + ");"); } else { out.printil("out.write(" + @@ -2392,8 +2393,8 @@ // Do nothing } else if (attrs[i].isELInterpreterInput()) { // run attrValue through the expression interpreter -attrValue = JspUtil.interpreterCall( attrValue, -c[0], "_jspx_prefix_map", "_jspx_fnmap", +attrValue = JspUtil.interpreterCall(this.isTagFile, +attrValue, c[0], "_jspx_prefix_map", "_jspx_fnmap", n.getPrefix() ); } else { attrValue = convertString( @@ -2729,20 +2730,21 @@ if (gen.ctxt.isTagFile()) { TagInfo tagInfo = gen.ctxt.getTagInfo(); gen.generateTagHandlerPreamble(tagInfo); - page.visit(gen.new GenerateVisitor(out, gen.methodsBuffer, null, -tagInfo)); + page.visit(gen.new GenerateVisitor(gen.ctxt.isTagFile(), out, +gen.methodsBuffer, null, +tagInfo)); gen.generateTagHandlerPostamble(); - return; - } - - if (gen.ctxt.getOptions().isPoolingEnabled()) { - gen.compileTagHandlerPoolList(page); + } else { + if (gen.ctxt.getOptions().isPoolingEnabled()) { + gen.compileTagHandlerPoolList(page); + } + gen.generatePreamble(page); + gen.fragmentHelperClass.generatePreamble(); + page.visit(gen.new GenerateVisitor(gen.ctxt.isTagFile(), out, +gen.methodsBuffer, +
cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java Node.java
kinman 2002/06/07 17:14:35 Modified:jasper2/src/share/org/apache/jasper/compiler Generator.java JspUtil.java Node.java Log: Applied the patch supplied by Jan Luehe, to implement tag pooling/reuse based on a scheme Jan and I discussed. Jan's note: Tag pooling/reuse is implemented as follows: - Every custom tag is assigned a tag handler pool, based on its full tag name and attribute set. - Tag handler pools are declared as servlet instance variables, so that they can be shared across page invocations. - Tag handler pools are instantiated with a yet-to-be-made-configurable capacity at servlet construction time (current default capacity is 5). - When a tag handler is required, it is retrieved from the appropriate tag handler pool. If the pool is empty, a new tag handler is instantiated and returned. - When a tag handler is no longer needed, it is returned to the appropriate pool. It is added to the pool, unless the pool has already reached its capacity, in which case the tag handler's release() method is called. - The servlet's destroy() method enumerates the servlet's tag handler pools and calls the release() method of every available tag handler. Outstanding issues: - Make tag handler pool capacity configurable. - Optimize tag reuse in the body of iteration tags. Revision ChangesPath 1.18 +154 -44 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- Generator.java5 Jun 2002 22:01:33 - 1.17 +++ Generator.java8 Jun 2002 00:14:35 - 1.18 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v 1.17 2002/06/05 22:01:33 kinman Exp $ - * $Revision: 1.17 $ - * $Date: 2002/06/05 22:01:33 $ + * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v 1.18 2002/06/08 00:14:35 kinman Exp $ + * $Revision: 1.18 $ + * $Date: 2002/06/08 00:14:35 $ * * * @@ -96,6 +96,7 @@ private boolean breakAtLF; private PageInfo pageInfo; private int maxTagNesting; +private Vector tagHandlerPoolNames; /** * @param s the input string @@ -158,6 +159,99 @@ } /** + * Compiles list of tag handler pool names. + */ +private void compileTagHandlerPoolList(Node.Nodes page) + throws JasperException { + + class TagHandlerPoolVisitor extends Node.Visitor { + + private Vector names; + + /* + * Constructor + * + * @param v Vector of tag handler pool names to populate + */ + TagHandlerPoolVisitor(Vector v) { + names = v; + } + + /* + * Gets the name of the tag handler pool for the given custom tag + * and adds it to the list of tag handler pool names unless it is + * already contained in it. + */ + public void visit(Node.CustomTag n) throws JasperException { + + String name = createTagHandlerPoolName(n.getPrefix(), + n.getShortName(), + n.getAttributes()); + n.setTagHandlerPoolName(name); + if (!names.contains(name)) { + names.add(name); + } + visitBody(n); + } + + /* + * Creates the name of the tag handler pool whose tag handlers may + * be (re)used to service this action. + * + * @return The name of the tag handler pool + */ + private String createTagHandlerPoolName(String prefix, + String shortName, + Attributes attrs) { + String poolName = null; + + if (prefix.indexOf('-') >= 0) + prefix = JspUtil.replace(prefix, '-', "$1"); + if (prefix.indexOf('.') >= 0) + prefix = JspUtil.replace(prefix, '.', "$2"); + + if (shortName.indexOf('-') >= 0) + shortName = JspUtil.replace(shortName, '-', "$1"); + if (shortName.indexOf('.') >= 0) + shortName = JspUtil.replace(shortName, '.', "$2"); + if (shortName.indexOf(':') >= 0) + shortName = JspUtil.replace