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/04/04 00:22:12 UTC
cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/runtime ProtectedFunctionMapper.java
kinman 2003/04/03 14:22:12
Modified: jasper2/src/share/org/apache/jasper/compiler
ELFunctionMapper.java
jasper2/src/share/org/apache/jasper/runtime
ProtectedFunctionMapper.java
Log:
- Optimization: If the function mapper has only one function, there's
no need to create the HashMap for it, and the resolveFunction can just
return the Method for it.
Revision Changes Path
1.9 +12 -2 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.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ELFunctionMapper.java 1 Apr 2003 00:20:01 -0000 1.8
+++ ELFunctionMapper.java 3 Apr 2003 22:22:12 -0000 1.9
@@ -200,13 +200,23 @@
// Generate declaration for the map statically
decName = getMapName();
ss.append("static private org.apache.jasper.runtime.ProtectedFunctionMapper " + decName + ";\n");
- ds.append(" " + decName + " = org.apache.jasper.runtime.ProtectedFunctionMapper.getInstance();\n");
+
+ ds.append(" " + decName + "= ");
+ ds.append("org.apache.jasper.runtime.ProtectedFunctionMapper");
+ // Special case if there is only one function in the map
+ String funcMethod = null;
+ if (functions.size() == 1) {
+ funcMethod = ".getMapForFunction";
+ } else {
+ ds.append(".getInstance();\n");
+ funcMethod = " " + decName + ".mapFunction";
+ }
for (int i = 0; i < functions.size(); i++) {
ELNode.Function f = (ELNode.Function)functions.get(i);
FunctionInfo funcInfo = f.getFunctionInfo();
String key = f.getPrefix()+ ":" + f.getName();
- ds.append(" " + decName + ".mapFunction(\"" + key + "\", " +
+ ds.append(funcMethod + "(\"" + key + "\", " +
funcInfo.getFunctionClass() + ".class, " +
'\"' + f.getMethodName() + "\", " +
"new Class[] {");
1.6 +72 -8 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/runtime/ProtectedFunctionMapper.java
Index: ProtectedFunctionMapper.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/runtime/ProtectedFunctionMapper.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ProtectedFunctionMapper.java 26 Feb 2003 00:11:39 -0000 1.5
+++ ProtectedFunctionMapper.java 3 Apr 2003 22:22:12 -0000 1.6
@@ -80,9 +80,14 @@
public final class ProtectedFunctionMapper implements FunctionMapper {
/**
- * Maps "prefix:name" to java.lang.Method objects. Lazily created.
+ * Maps "prefix:name" to java.lang.Method objects.
*/
- private HashMap fnmap = new java.util.HashMap();
+ private HashMap fnmap = null;
+
+ /**
+ * If there is only one function in the map, this is the Method for it.
+ */
+ private Method theMethod = null;
/**
* Constructor has protected access.
@@ -99,16 +104,19 @@
* @return A new protected function mapper.
*/
public static ProtectedFunctionMapper getInstance() {
+ ProtectedFunctionMapper funcMapper;
if (System.getSecurityManager() != null) {
- return (ProtectedFunctionMapper)AccessController.doPrivileged(
+ funcMapper = (ProtectedFunctionMapper)AccessController.doPrivileged(
new PrivilegedAction() {
public Object run() {
return new ProtectedFunctionMapper();
}
} );
} else {
- return new ProtectedFunctionMapper();
+ funcMapper = new ProtectedFunctionMapper();
}
+ funcMapper.fnmap = new java.util.HashMap();
+ return funcMapper;
}
/**
@@ -153,6 +161,59 @@
}
/**
+ * Creates an instance for this class, and stores the Method for
+ * the given EL function prefix and name. This method is used for
+ * the case when there is only one function in the EL expression.
+ *
+ * @param fnQName The EL function qualified name (including prefix)
+ * @param c The class containing the Java method
+ * @param methodName The name of the Java method
+ * @param args The arguments of the Java method
+ * @throws RuntimeException if no method with the given signature
+ * could be found.
+ */
+ public static ProtectedFunctionMapper getMapForFunction(
+ String fnQName, final Class c,
+ final String methodName, final Class[] args )
+ {
+ java.lang.reflect.Method method;
+ ProtectedFunctionMapper funcMapper;
+ if (System.getSecurityManager() != null){
+ funcMapper = (ProtectedFunctionMapper)AccessController.doPrivileged(
+ new PrivilegedAction(){
+ public Object run() {
+ return new ProtectedFunctionMapper();
+ }
+ });
+
+ try{
+ method = (java.lang.reflect.Method)AccessController.doPrivileged
+(new PrivilegedExceptionAction(){
+
+ public Object run() throws Exception{
+ return c.getDeclaredMethod(methodName, args);
+ }
+ });
+ } catch (PrivilegedActionException ex){
+ throw new RuntimeException(
+ "Invalid function mapping - no such method: "
+ + ex.getException().getMessage());
+ }
+ } else {
+ funcMapper = new ProtectedFunctionMapper();
+ try {
+ method = c.getDeclaredMethod(methodName, args);
+ } catch( NoSuchMethodException e ) {
+ throw new RuntimeException(
+ "Invalid function mapping - no such method: "
+ + e.getMessage());
+ }
+ }
+ funcMapper.theMethod = method;
+ return funcMapper;
+ }
+
+ /**
* Resolves the specified local name and prefix into a Java.lang.Method.
* Returns null if the prefix and local name are not found.
*
@@ -161,7 +222,10 @@
* @return the result of the method mapping. Null means no entry found.
**/
public Method resolveFunction(String prefix, String localName) {
- return (Method) this.fnmap.get(prefix + ":" + localName);
+ if (this.fnmap != null) {
+ return (Method) this.fnmap.get(prefix + ":" + localName);
+ }
+ return theMethod;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org