FileDocCategorySizeDatePackage
ProtectedFunctionMapper.javaAPI DocGlassfish v2 API7977Fri May 04 22:32:54 BST 2007org.apache.jasper.runtime

ProtectedFunctionMapper

public final class ProtectedFunctionMapper extends FunctionMapper
Maps EL functions to their Java method counterparts. Keeps the actual Method objects protected so that JSP pages can't indirectly do reflection.
author
Mark Roth
author
Kin-man Chung

Fields Summary
private HashMap
fnmap
Maps "prefix:name" to java.lang.Method objects.
private Method
theMethod
If there is only one function in the map, this is the Method for it.
Constructors Summary
private ProtectedFunctionMapper()
Constructor has protected access.


             
      
    
Methods Summary
public static org.apache.jasper.runtime.ProtectedFunctionMappergetInstance()
Generated Servlet and Tag Handler implementations call this method to retrieve an instance of the ProtectedFunctionMapper. This is necessary since generated code does not have access to create instances of classes in this package.

return
A new protected function mapper.

        ProtectedFunctionMapper funcMapper;
	if (SecurityUtil.isPackageProtectionEnabled()) {
	    funcMapper = (ProtectedFunctionMapper)AccessController.doPrivileged(
		new PrivilegedAction() {
		public Object run() {
		    return new ProtectedFunctionMapper();
		}
	    } );
	} else {
	    funcMapper = new ProtectedFunctionMapper();
	}
	funcMapper.fnmap = new java.util.HashMap();
	return funcMapper;
    
public static org.apache.jasper.runtime.ProtectedFunctionMappergetMapForFunction(java.lang.String fnQName, java.lang.Class c, java.lang.String methodName, java.lang.Class[] args)
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.

        java.lang.reflect.Method method;
        ProtectedFunctionMapper funcMapper;
        if (SecurityUtil.isPackageProtectionEnabled()){
            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;
    
public voidmapFunction(java.lang.String fnQName, java.lang.Class c, java.lang.String methodName, java.lang.Class[] args)
Stores a mapping from the given EL function prefix and name to the given Java method.

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.

	java.lang.reflect.Method method;
        if (SecurityUtil.isPackageProtectionEnabled()){
            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 {
             try {
                method = c.getDeclaredMethod(methodName, args);
            } catch( NoSuchMethodException e ) {
                throw new RuntimeException(
                    "Invalid function mapping - no such method: "
		    + e.getMessage());
            }
        }

	this.fnmap.put(fnQName, method );
    
public java.lang.reflect.MethodresolveFunction(java.lang.String prefix, java.lang.String localName)
Resolves the specified local name and prefix into a Java.lang.Method. Returns null if the prefix and local name are not found.

param
prefix the prefix of the function
param
localName the short name of the function
return
the result of the method mapping. Null means no entry found.

        if (this.fnmap != null) {
            return (Method) this.fnmap.get(prefix + ":" + localName);
        }
	return theMethod;