Author: tschneider Date: Mon Nov 5 19:30:25 2007 New Revision: 592241 URL: http://svn.apache.org/viewvc?rev=592241&view=rev Log: divorced juel from the value stack so we are only dependent on the java el classes
Added: struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootELResolver.java struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/ExpressionFactoryLocator.java Modified: struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootELContext.java struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootVariableMapper.java struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelReflectionProvider.java struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelValueStack.java struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelValueStackFactory.java Modified: struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootELContext.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootELContext.java?rev=592241&r1=592240&r2=592241&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootELContext.java (original) +++ struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootELContext.java Mon Nov 5 19:30:25 2007 @@ -1,17 +1,36 @@ package com.googlecode.struts2juel; +import javax.el.ArrayELResolver; +import javax.el.BeanELResolver; +import javax.el.CompositeELResolver; +import javax.el.ELContext; +import javax.el.ELResolver; +import javax.el.FunctionMapper; +import javax.el.ListELResolver; +import javax.el.MapELResolver; +import javax.el.ResourceBundleELResolver; import javax.el.VariableMapper; import com.opensymphony.xwork2.util.CompoundRoot; -import de.odysseus.el.util.SimpleContext; - /** - * An implementation of SimpleContext that knows about the CompoundRoot. + * An implementation of SimpleContext that knows about the ValueStack's CompoundRoot. */ -public class CompoundRootELContext extends SimpleContext { +public class CompoundRootELContext extends ELContext { private VariableMapper variableMapper; + private FunctionMapper functionMapper = new NullFunctionMapper(); + private static final ELResolver DEFAULT_RESOLVER_READ_ONLY = new CompositeELResolver() { + { + add(new CompoundRootELResolver()); + add(new ArrayELResolver(false)); + add(new ListELResolver(false)); + add(new MapELResolver(false)); + add(new ResourceBundleELResolver()); + add(new BeanELResolver(false)); + } + }; + public CompoundRootELContext(CompoundRoot root) { variableMapper = new CompoundRootVariableMapper(root); } @@ -20,4 +39,14 @@ public VariableMapper getVariableMapper() { return variableMapper; } + + @Override + public ELResolver getELResolver() { + return DEFAULT_RESOLVER_READ_ONLY; + } + + @Override + public FunctionMapper getFunctionMapper() { + return functionMapper; + } } Added: struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootELResolver.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootELResolver.java?rev=592241&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootELResolver.java (added) +++ struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootELResolver.java Mon Nov 5 19:30:25 2007 @@ -0,0 +1,51 @@ +package com.googlecode.struts2juel; + +import java.beans.FeatureDescriptor; +import java.util.Iterator; + +import javax.el.ELContext; +import javax.el.ELResolver; + +/** + * An ELResolver capable of resolving + */ +public class CompoundRootELResolver extends ELResolver { + + @Override + public Class<?> getCommonPropertyType(ELContext arg0, Object arg1) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext arg0, + Object arg1) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Class<?> getType(ELContext arg0, Object arg1, Object arg2) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getValue(ELContext arg0, Object arg1, Object arg2) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean isReadOnly(ELContext arg0, Object arg1, Object arg2) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void setValue(ELContext arg0, Object arg1, Object arg2, Object arg3) { + // TODO Auto-generated method stub + + } + +} Modified: struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootVariableMapper.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootVariableMapper.java?rev=592241&r1=592240&r2=592241&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootVariableMapper.java (original) +++ struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/CompoundRootVariableMapper.java Mon Nov 5 19:30:25 2007 @@ -1,14 +1,9 @@ package com.googlecode.struts2juel; -import java.util.HashMap; -import java.util.Map; - import javax.el.ValueExpression; import javax.el.VariableMapper; import org.apache.commons.beanutils.PropertyUtils; - -import sun.reflect.generics.reflectiveObjects.NotImplementedException; import com.opensymphony.xwork2.util.CompoundRoot; Added: struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/ExpressionFactoryLocator.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/ExpressionFactoryLocator.java?rev=592241&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/ExpressionFactoryLocator.java (added) +++ struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/ExpressionFactoryLocator.java Mon Nov 5 19:30:25 2007 @@ -0,0 +1,46 @@ +package com.googlecode.struts2juel; + +import javax.el.ExpressionFactory; +import javax.servlet.ServletContext; +import javax.servlet.jsp.JspApplicationContext; +import javax.servlet.jsp.JspFactory; + +import org.apache.struts2.StrutsStatics; + +import com.opensymphony.xwork2.ActionContext; + +/** + * Locates the current ExpressFactory. The preference is to use the app server's + * built-in ExpressFactory. If that isn't available, then JUEL's ExpressFactory + * will be used. + */ +public class ExpressionFactoryLocator { + private static final String JUEL_FACTORY = "de.odysseus.el.ExpressionFactoryImpl"; + + public static ExpressionFactory locateExpressFactory() { + ExpressionFactory factory = null; + // first try to load the default ExpressFactory from the JSP engine + try { + ActionContext actionContext = ActionContext.getContext(); + ServletContext servletContext = (ServletContext) actionContext + .get(StrutsStatics.SERVLET_CONTEXT); + JspFactory jspFactory = JspFactory.getDefaultFactory(); + JspApplicationContext jspAppCtx = jspFactory + .getJspApplicationContext(servletContext); + factory = jspAppCtx.getExpressionFactory(); + } catch (Throwable t) { + // fallback to juel + try { + factory = (ExpressionFactory) Class.forName(JUEL_FACTORY) + .newInstance(); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + return factory; + } +} Modified: struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelReflectionProvider.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelReflectionProvider.java?rev=592241&r1=592240&r2=592241&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelReflectionProvider.java (original) +++ struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelReflectionProvider.java Mon Nov 5 19:30:25 2007 @@ -14,10 +14,17 @@ * A OgnlReflectionProvider based on Juel. */ public class JuelReflectionProvider extends OgnlReflectionProvider { - ExpressionFactory factory = new de.odysseus.el.ExpressionFactoryImpl(); + private ExpressionFactory factory; + public void initExpressionFactory() { + if (factory == null) { + factory = ExpressionFactoryLocator.locateExpressFactory(); + } + } + @Override public Object getValue(String expr, Map context, Object root) throws ReflectionException { + initExpressionFactory(); CompoundRoot compoundRoot = new CompoundRoot(); compoundRoot.add(root); ELContext elContext = new CompoundRootELContext(compoundRoot); @@ -29,6 +36,7 @@ @Override public void setValue(String expr, Map context, Object root, Object value) throws ReflectionException { + initExpressionFactory(); CompoundRoot compoundRoot = new CompoundRoot(); compoundRoot.add(root); ELContext elContext = new CompoundRootELContext(compoundRoot); Modified: struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelValueStack.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelValueStack.java?rev=592241&r1=592240&r2=592241&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelValueStack.java (original) +++ struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelValueStack.java Mon Nov 5 19:30:25 2007 @@ -21,15 +21,17 @@ private Class defaultType; private Map overrides; - private ExpressionFactory factory = new de.odysseus.el.ExpressionFactoryImpl(); + private ExpressionFactory factory; private ELContext elContext; - public JuelValueStack() { + public JuelValueStack(ExpressionFactory factory) { + this.factory = factory; setRoot(new CompoundRoot()); } - public JuelValueStack(ValueStack vs) { + public JuelValueStack(ExpressionFactory factory, ValueStack vs) { + this.factory = factory; setRoot(new CompoundRoot(vs.getRoot())); } Modified: struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelValueStackFactory.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelValueStackFactory.java?rev=592241&r1=592240&r2=592241&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelValueStackFactory.java (original) +++ struts/sandbox/trunk/struts2-juel-plugin/src/main/java/com/googlecode/struts2juel/JuelValueStackFactory.java Mon Nov 5 19:30:25 2007 @@ -1,5 +1,7 @@ package com.googlecode.struts2juel; +import javax.el.ExpressionFactory; + import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.ValueStackFactory; @@ -7,12 +9,21 @@ * Creates JuelValueStacks. */ public class JuelValueStackFactory implements ValueStackFactory { + private ExpressionFactory factory; + public void initExpressionFactory() { + if (factory == null) { + factory = ExpressionFactoryLocator.locateExpressFactory(); + } + } + public ValueStack createValueStack() { - return new JuelValueStack(); + initExpressionFactory(); + return new JuelValueStack(factory); } public ValueStack createValueStack(ValueStack stack) { - return new JuelValueStack(stack); + initExpressionFactory(); + return new JuelValueStack(factory, stack); } }