package org.jboss.resteasy.links.test;
import javax.el.FunctionMapper;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Resolves Seam Security EL functions, s:hasRole() and s:hasPermission()
* by decorating a delegate Unified EL FunctionMapper
*
* @author Shane Bryzak
*/
public class SeamFunctionMapper extends FunctionMapper
{
private static Map<String,List<Method>> methodCache = new HashMap<String,List<Method>>();
private FunctionMapper functionMapper;
public SeamFunctionMapper(FunctionMapper functionMapper)
{
this.functionMapper = functionMapper;
}
static
{
cacheMethod("hasPermission", SecurityFunctions.class, "hasPermission",
new Class[] {Object.class, String.class});
cacheMethod("hasRole", SecurityFunctions.class, "hasRole",
new Class[] { String.class });
}
@Override
public Method resolveFunction(String prefix, String localName)
{
if ( "s".equals(prefix) )
{
List<Method> methods = methodCache.get(localName);
return methods != null ? methods.get(0) : null;
}
else if (functionMapper != null)
{
return functionMapper.resolveFunction(prefix, localName);
}
else
{
return null;
}
}
@Override
public void mapFunction(String prefix, String localName, Method meth) {
super.mapFunction(prefix, localName, meth);
}
/* @Override
public Method resolveFunction(String prefix, String localName, int paramCount)
{
if ( "s".equals(prefix) )
{
List<Method> methods = methodCache.get(localName);
if (methods != null)
{
for (Method m : methods)
{
if (m.getParameterTypes().length == paramCount) return m;
}
}
return null;
}
else if (functionMapper != null)
{
return functionMapper.resolveFunction(prefix, localName);
}
else
{
return null;
}
} */
private static void cacheMethod(String localName, Class<?> cls, String name, Class<?>[] params)
{
try
{
Method m = cls.getMethod(name, params);
List<Method> methods;
if (methodCache.containsKey(localName))
{
methods = methodCache.get(localName);
}
else
{
methods = new ArrayList<Method>();
methodCache.put(localName, methods);
}
methods.add(m);
}
catch (NoSuchMethodException ex)
{
System.err.println(String.format("Method %s.%s could not be cached", cls.getName(), name));
}
}
}