kinman 2003/03/24 17:49:29 Modified: jasper2/src/share/org/apache/jasper/compiler ELFunctionMapper.java ELNode.java Validator.java Log: - Reuse a previous function mapper if it contains all the functions in the current expression. Revision Changes Path 1.4 +37 -1 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ELFunctionMapper.java Index: ELFunctionMapper.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ELFunctionMapper.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- ELFunctionMapper.java 25 Mar 2003 00:07:10 -0000 1.3 +++ ELFunctionMapper.java 25 Mar 2003 01:49:29 -0000 1.4 @@ -96,6 +96,12 @@ class ELFunctionVisitor extends Node.Visitor { + /** + * Use a global name map to facilitate reuse of function maps. + * The key used is prefix:function:uri. + */ + private HashMap gMap = new HashMap(); + public void visit(Node.ParamAction n) throws JasperException { doMap(n.getValue()); } @@ -174,8 +180,15 @@ return; } + // Reuse a previous map if possible + String decName = matchMap(functions); + if (decName != null) { + el.setMapName(decName); + return; + } + // Generate declaration for the map statically - String decName = getMapName(); + decName = getMapName(); ss.append("static private org.apache.jasper.runtime.ProtectedFunctionMapper " + decName + ";\n"); ds.append(" " + decName + " = org.apache.jasper.runtime.ProtectedFunctionMapper.getInstance();\n"); @@ -195,8 +208,31 @@ ds.append(params[k] + ".class"); } ds.append("});\n"); + // Put the current name in the global function map + gMap.put(f.getPrefix() + ':' + f.getName() + ':' + f.getUri(), + decName); } el.setMapName(decName); + } + + private String matchMap(ArrayList functions) { + + String mapName = null; + for (int i = 0; i < functions.size(); i++) { + ELNode.Function f = (ELNode.Function)functions.get(i); + String temName = (String) gMap.get(f.getPrefix() + ':' + + f.getName() + ':' + f.getUri()); + if (temName != null) { + if (mapName == null) { + mapName = temName; + } + else if (! temName.equals(mapName)) { + // If not all in the previous match, then no match. + return null; + } + } + } + return mapName; } private String getMapName() { 1.3 +9 -0 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ELNode.java Index: ELNode.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ELNode.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ELNode.java 25 Mar 2003 00:07:10 -0000 1.2 +++ ELNode.java 25 Mar 2003 01:49:29 -0000 1.3 @@ -145,6 +145,7 @@ private String prefix; private String name; + private String uri; private FunctionInfo functionInfo; private String methodName; private String[] parameters; @@ -164,6 +165,14 @@ public String getName() { return name; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public String getUri() { + return uri; } public void setFunctionInfo(FunctionInfo f) { 1.98 +4 -3 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Validator.java Index: Validator.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Validator.java,v retrieving revision 1.97 retrieving revision 1.98 diff -u -r1.97 -r1.98 --- Validator.java 25 Mar 2003 00:57:46 -0000 1.97 +++ Validator.java 25 Mar 2003 01:49:29 -0000 1.98 @@ -1248,6 +1248,7 @@ err.jspError(n, "jsp.error.noFunction", function); } // Skip TLD function uniqueness check. Done by Schema ? + func.setUri(uri); func.setFunctionInfo(funcInfo); processSignature(func); }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]