Changes necessary for XWork 2.1:

* New EL abstraction to allow ONGL to be replaced
 * Got rid of static factories and state, in favor of dep injection
 * New plugin API points for the EL abstraction

XW-566 XW-461 XW-561


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@577728 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Donald J. Brown
2007-09-20 12:51:41 +00:00
parent 895682acd0
commit cbdf6f296c
70 changed files with 516 additions and 498 deletions
@@ -26,7 +26,7 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.views.freemarker.FreemarkerManager;
import org.apache.struts2.views.freemarker.ScopesHashModel;
import com.opensymphony.xwork2.util.OgnlValueStack;
import com.opensymphony.xwork2.ognl.OgnlValueStack;
import com.opensymphony.xwork2.util.ValueStack;
/**
@@ -12,6 +12,7 @@
<constant name="struts.devMode" value="true" />
<constant name="struts.configuration.xml.reload" value="false" />
<constant name="struts.custom.i18n.resources" value="globalMessages" />
<constant name="struts.action.extension" value="action,," />
<constant name="struts.codebehind.defaultPackage" value="person" />
<constant name="struts.freemarker.manager.classname" value="customFreemarkerManager" />
@@ -165,4 +165,16 @@ public final class StrutsConstants {
/** The name of the parameter to determine whether static method access will be allowed in OGNL expressions or not */
public static final String STRUTS_ALLOW_STATIC_METHOD_ACCESS = "struts.ognl.allowStaticMethodAccess";
/** The com.opensymphony.xwork2.validator.ActionValidatorManager implementation class */
public static final String STRUTS_ACTIONVALIDATORMANAGER = "struts.actionValidatorManager";
/** The {@link com.opensymphony.xwork2.util.ValueStackFactory} implementation class */
public static final String STRUTS_VALUESTACKFACTORY = "struts.valueStackFactory";
/** The {@link com.opensymphony.xwork2.reflection.ReflectionProvider} implementation class */
public static final String STRUTS_REFLECTIONPROVIDER = "struts.reflectionProvider";
/** The {@link com.opensymphony.xwork2.reflection.ReflectionContextFactory} implementation class */
public static final String STRUTS_REFLECTIONCONTEXTFACTORY = "struts.reflectionContextFactory";
}
@@ -120,6 +120,7 @@ public class ActionComponent extends ContextBean {
protected HttpServletResponse res;
protected HttpServletRequest req;
protected ValueStackFactory valueStackFactory;
protected ActionProxyFactory actionProxyFactory;
protected ActionProxy proxy;
protected String name;
@@ -141,6 +142,11 @@ public class ActionComponent extends ContextBean {
public void setActionProxyFactory(ActionProxyFactory actionProxyFactory) {
this.actionProxyFactory = actionProxyFactory;
}
@Inject
public void setValueStackFactory(ValueStackFactory valueStackFactory) {
this.valueStackFactory = valueStackFactory;
}
public boolean end(Writer writer, String body) {
boolean end = super.end(writer, "", false);
@@ -192,7 +198,7 @@ public class ActionComponent extends ContextBean {
res,
servletContext);
ValueStack newStack = ValueStackFactory.getFactory().createValueStack(stack);
ValueStack newStack = valueStackFactory.createValueStack(stack);
extraContext.put(ActionContext.VALUE_STACK, newStack);
// add page context, such that ServletDispatcherResult will do an include
@@ -30,8 +30,8 @@ import org.apache.struts2.views.annotations.StrutsTagAttribute;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.ClassLoaderUtil;
import com.opensymphony.xwork2.ObjectFactory;
import com.opensymphony.xwork2.util.OgnlUtil;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.reflection.ReflectionProvider;
/**
* <!-- START SNIPPET: javadoc -->
@@ -101,6 +101,7 @@ public class Bean extends ContextBean {
protected Object bean;
protected String name;
protected ObjectFactory objectFactory;
protected ReflectionProvider reflectionProvider;
public Bean(ValueStack stack) {
super(stack);
@@ -110,6 +111,11 @@ public class Bean extends ContextBean {
public void setObjectFactory(ObjectFactory objectFactory) {
this.objectFactory = objectFactory;
}
@Inject
public void setReflectionProvider(ReflectionProvider prov) {
this.reflectionProvider = prov;
}
public boolean start(Writer writer) {
boolean result = super.start(writer);
@@ -142,7 +148,7 @@ public class Bean extends ContextBean {
}
public void addParameter(String key, Object value) {
OgnlUtil.setProperty(key, value, bean, getStack().getContext());
reflectionProvider.setProperty(key, value, bean, getStack().getContext());
}
@StrutsTagAttribute(description="The class name of the bean to be instantiated (must respect JavaBean specification)",
@@ -342,7 +342,7 @@ public class Component {
boolean includeContext, boolean encodeResult, boolean forceAddSchemeHostAndPort,
boolean escapeAmp) {
String finalAction = findString(action);
String finalMethod = method != null ? findString(method) : method;
String finalMethod = method != null ? findString(method) : method;
String finalNamespace = determineNamespace(namespace, getStack(), req);
ActionMapping mapping = new ActionMapping(finalAction, finalNamespace, finalMethod, parameters);
String uri = actionMapper.getUriFromActionMapping(mapping);
@@ -20,8 +20,9 @@
*/
package org.apache.struts2.components;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.OgnlUtil;
import com.opensymphony.xwork2.util.reflection.ReflectionProvider;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
@@ -38,11 +39,20 @@ import org.apache.struts2.StrutsException;
description="Prints debugging information")
public class Debug extends UIBean {
public static final String TEMPLATE = "debug";
protected ReflectionProvider reflectionProvider;
public Debug(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
super(stack, request, response);
}
@Inject
public void setReflectionProvider(ReflectionProvider prov) {
this.reflectionProvider = prov;
}
protected String getDefaultTemplate() {
return TEMPLATE;
}
@@ -57,7 +67,7 @@ public class Debug extends UIBean {
Object o = iter.next();
Map values;
try {
values = OgnlUtil.getBeanMap(o);
values = reflectionProvider.getBeanMap(o);
} catch (Exception e) {
throw new StrutsException("Caught an exception while getting the property values of " + o, e);
}
@@ -28,7 +28,7 @@ import com.opensymphony.xwork2.config.entities.InterceptorMapping;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptorUtil;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.validator.ActionValidatorManagerFactory;
import com.opensymphony.xwork2.validator.ActionValidatorManager;
import com.opensymphony.xwork2.validator.FieldValidator;
import com.opensymphony.xwork2.validator.ValidationInterceptor;
import com.opensymphony.xwork2.validator.Validator;
@@ -107,6 +107,7 @@ public class Form extends ClosingUIBean {
protected Configuration configuration;
protected ObjectFactory objectFactory;
protected UrlRenderer urlRenderer;
protected ActionValidatorManager actionValidatorManager;
public Form(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
super(stack, request, response);
@@ -143,6 +144,11 @@ public class Form extends ClosingUIBean {
public void setUrlRenderer(UrlRenderer urlRenderer) {
this.urlRenderer = urlRenderer;
}
@Inject
public void setActionValidatorManager(ActionValidatorManager mgr) {
this.actionValidatorManager = mgr;
}
/*
@@ -264,7 +270,7 @@ public class Form extends ClosingUIBean {
return Collections.EMPTY_LIST;
}
List<Validator> all = ActionValidatorManagerFactory.getInstance().getValidators(actionClass, (String) getParameters().get("actionName"));
List<Validator> all = actionValidatorManager.getValidators(actionClass, (String) getParameters().get("actionName"));
List<Validator> validators = new ArrayList<Validator>();
for (Validator validator : all) {
if (validator instanceof FieldValidator) {
@@ -115,7 +115,7 @@ public class Include extends Component {
}
@Inject(StrutsConstants.STRUTS_I18N_ENCODING)
public static void setDefaultEncoding(String encoding) {
public void setDefaultEncoding(String encoding) {
defaultEncoding = encoding;
}
@@ -47,7 +47,11 @@ import com.opensymphony.xwork2.inject.Factory;
import com.opensymphony.xwork2.inject.Scope;
import com.opensymphony.xwork2.util.ClassLoaderUtil;
import com.opensymphony.xwork2.util.LocalizedTextUtil;
import com.opensymphony.xwork2.util.ValueStackFactory;
import com.opensymphony.xwork2.util.location.LocatableProperties;
import com.opensymphony.xwork2.util.reflection.ReflectionContextFactory;
import com.opensymphony.xwork2.util.reflection.ReflectionProvider;
import com.opensymphony.xwork2.validator.ActionValidatorManager;
/**
* Selects the implementations of key framework extension points, using the loaded
@@ -161,6 +165,10 @@ public class BeanSelectionProvider implements ConfigurationProvider {
alias(FreemarkerManager.class, StrutsConstants.STRUTS_FREEMARKER_MANAGER_CLASSNAME, builder, props);
alias(VelocityManager.class, StrutsConstants.STRUTS_VELOCITY_MANAGER_CLASSNAME, builder, props);
alias(UrlRenderer.class, StrutsConstants.STRUTS_URL_RENDERER, builder, props);
alias(ActionValidatorManager.class, StrutsConstants.STRUTS_ACTIONVALIDATORMANAGER, builder, props);
alias(ValueStackFactory.class, StrutsConstants.STRUTS_VALUESTACKFACTORY, builder, props);
alias(ReflectionProvider.class, StrutsConstants.STRUTS_REFLECTIONPROVIDER, builder, props);
alias(ReflectionContextFactory.class, StrutsConstants.STRUTS_REFLECTIONCONTEXTFACTORY, builder, props);
if ("true".equalsIgnoreCase(props.getProperty(StrutsConstants.STRUTS_DEVMODE))) {
props.setProperty(StrutsConstants.STRUTS_I18N_RELOAD, "true");
@@ -27,6 +27,7 @@ import com.opensymphony.xwork2.config.RuntimeConfiguration;
import com.opensymphony.xwork2.config.entities.ActionConfig;
import com.opensymphony.xwork2.config.entities.PackageConfig;
import com.opensymphony.xwork2.inject.ContainerBuilder;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.location.LocatableProperties;
import com.opensymphony.xwork2.ObjectFactory;
@@ -141,24 +142,11 @@ public class MethodConfigurationProvider implements ConfigurationProvider {
* Updates ObjectFactory property.
* @param factory
*/
@Inject
public void setObjectFactory(ObjectFactory factory) {
this.factory = factory;
}
/**
* Provides ObjectFactory property.
* @return
* @throws ConfigurationException if ObjectFactory has not been set.
*/
private ObjectFactory getObjectFactory() throws ConfigurationException {
if (factory == null) {
factory = ObjectFactory.getObjectFactory();
if (factory == null) throw new
ConfigurationException("MethodConfigurationProvider.getObjectFactory: ObjectFactory==null");
}
return factory;
}
/**
* Verifies that character at a String position is upper case.
* @param pos Position to test
@@ -205,7 +193,6 @@ public class MethodConfigurationProvider implements ConfigurationProvider {
String className = actionConfig.getClassName();
Set actionMethods = new HashSet();
Class actionClass;
ObjectFactory factory = getObjectFactory();
try {
actionClass = factory.getClassInstance(className);
} catch (ClassNotFoundException e) {
@@ -40,7 +40,11 @@ import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsConstants;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.config.*;
import org.apache.struts2.config.BeanSelectionProvider;
import org.apache.struts2.config.ClasspathConfigurationProvider;
import org.apache.struts2.config.DefaultPropertiesProvider;
import org.apache.struts2.config.LegacyPropertiesConfigurationProvider;
import org.apache.struts2.config.StrutsXmlConfigurationProvider;
import org.apache.struts2.config.ClasspathConfigurationProvider.ClasspathPageLocator;
import org.apache.struts2.config.ClasspathConfigurationProvider.PageLocator;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
@@ -51,25 +55,26 @@ import org.apache.struts2.util.ClassLoaderUtils;
import org.apache.struts2.util.ObjectFactoryDestroyable;
import org.apache.struts2.views.freemarker.FreemarkerManager;
import com.opensymphony.xwork2.util.FileManager;
import com.opensymphony.xwork2.*;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.ActionProxyFactory;
import com.opensymphony.xwork2.ObjectFactory;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.config.Configuration;
import com.opensymphony.xwork2.config.ConfigurationException;
import com.opensymphony.xwork2.config.ConfigurationManager;
import com.opensymphony.xwork2.config.ConfigurationProvider;
import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider;
import com.opensymphony.xwork2.conversion.ObjectTypeDeterminer;
import com.opensymphony.xwork2.conversion.ObjectTypeDeterminerFactory;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.ContainerBuilder;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.FileManager;
import com.opensymphony.xwork2.util.LocalizedTextUtil;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.ValueStackFactory;
import com.opensymphony.xwork2.util.location.LocatableProperties;
import com.opensymphony.xwork2.util.location.Location;
import com.opensymphony.xwork2.util.location.LocationUtils;
import com.opensymphony.xwork2.util.location.LocatableProperties;
import com.opensymphony.xwork2.util.profiling.UtilTimerStack;
import freemarker.template.Template;
@@ -155,18 +160,6 @@ public class Dispatcher {
*/
public static void setInstance(Dispatcher instance) {
Dispatcher.instance.set(instance);
// Tie the ObjectFactory threadlocal instance to this Dispatcher instance
if (instance != null) {
Container cont = instance.getContainer();
if (cont != null) {
ObjectFactory.setObjectFactory(cont.getInstance(ObjectFactory.class));
} else {
LOG.warn("This dispatcher instance doesn't have a container, so the object factory won't be set.");
}
} else {
ObjectFactory.setObjectFactory(null);
}
}
/**
@@ -190,6 +183,8 @@ public class Dispatcher {
private ServletContext servletContext;
private Map<String, String> initParams;
private ValueStackFactory valueStackFactory;
/**
* Create the Dispatcher instance for a given ServletContext and set of initialization parameters.
@@ -207,7 +202,7 @@ public class Dispatcher {
* @param mode New setting
*/
@Inject(StrutsConstants.STRUTS_DEVMODE)
public static void setDevMode(String mode) {
public void setDevMode(String mode) {
devMode = "true".equals(mode);
}
@@ -216,7 +211,7 @@ public class Dispatcher {
* @param val New setting
*/
@Inject(value=StrutsConstants.STRUTS_LOCALE, required=false)
public static void setDefaultLocale(String val) {
public void setDefaultLocale(String val) {
defaultLocale = val;
}
@@ -225,7 +220,7 @@ public class Dispatcher {
* @param val New setting
*/
@Inject(StrutsConstants.STRUTS_I18N_ENCODING)
public static void setDefaultEncoding(String val) {
public void setDefaultEncoding(String val) {
defaultEncoding = val;
}
@@ -234,9 +229,14 @@ public class Dispatcher {
* @param val New setting
*/
@Inject(StrutsConstants.STRUTS_MULTIPART_SAVEDIR)
public static void setMultipartSaveDir(String val) {
public void setMultipartSaveDir(String val) {
multipartSaveDir = val;
}
@Inject
public void setValueStackFactory(ValueStackFactory valueStackFactory) {
this.valueStackFactory = valueStackFactory;
}
/**
* Releases all instances bound to this dispatcher instance.
@@ -392,9 +392,6 @@ Caused by: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyExcepti
boolean reloadi18n = Boolean.valueOf(container.getInstance(String.class, StrutsConstants.STRUTS_I18N_RELOAD));
LocalizedTextUtil.setReloadBundles(reloadi18n);
ObjectTypeDeterminer objectTypeDeterminer = container.getInstance(ObjectTypeDeterminer.class);
ObjectTypeDeterminerFactory.setInstance(objectTypeDeterminer);
return container;
}
@@ -444,6 +441,7 @@ Caused by: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyExcepti
init_AliasStandardObjects() ; // [7]
Container container = init_PreloadConfiguration();
container.inject(this);
init_CheckConfigurationReloading(container);
init_CheckWebLogicWorkaround(container);
@@ -474,7 +472,7 @@ Caused by: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyExcepti
// If there was a previous value stack, then create a new copy and pass it in to be used by the new Action
ValueStack stack = (ValueStack) request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
if (stack != null) {
extraContext.put(ActionContext.VALUE_STACK, ValueStackFactory.getFactory().createValueStack(stack));
extraContext.put(ActionContext.VALUE_STACK, valueStackFactory.createValueStack(stack));
}
String timerKey = "Handling request from Dispatcher";
@@ -161,22 +161,22 @@ public class FilterDispatcher implements StrutsStatics, Filter {
/**
* Store state of StrutsConstants.STRUTS_SERVE_STATIC_CONTENT setting.
*/
private static boolean serveStatic;
private boolean serveStatic;
/**
* Store state of StrutsConstants.STRUTS_SERVE_STATIC_BROWSER_CACHE setting.
*/
private static boolean serveStaticBrowserCache;
private boolean serveStaticBrowserCache;
/**
* Store state of StrutsConstants.STRUTS_I18N_ENCODING setting.
*/
private static String encoding;
private String encoding;
/**
* Provide ActionMapper instance, set by injection.
*/
private static ActionMapper actionMapper;
private ActionMapper actionMapper;
/**
* Provide FilterConfig instance, set on init.
@@ -199,6 +199,7 @@ public class FilterDispatcher implements StrutsStatics, Filter {
dispatcher = createDispatcher(filterConfig);
dispatcher.init();
dispatcher.getContainer().inject(this);
String param = filterConfig.getInitParameter("packages");
String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
@@ -244,7 +245,7 @@ public class FilterDispatcher implements StrutsStatics, Filter {
* @param val New setting
*/
@Inject(StrutsConstants.STRUTS_SERVE_STATIC_CONTENT)
public static void setServeStaticContent(String val) {
public void setServeStaticContent(String val) {
serveStatic = "true".equals(val);
}
@@ -253,7 +254,7 @@ public class FilterDispatcher implements StrutsStatics, Filter {
* @param val New setting
*/
@Inject(StrutsConstants.STRUTS_SERVE_STATIC_BROWSER_CACHE)
public static void setServeStaticBrowserCache(String val) {
public void setServeStaticBrowserCache(String val) {
serveStaticBrowserCache = "true".equals(val);
}
@@ -262,7 +263,7 @@ public class FilterDispatcher implements StrutsStatics, Filter {
* @param val New setting
*/
@Inject(StrutsConstants.STRUTS_I18N_ENCODING)
public static void setEncoding(String val) {
public void setEncoding(String val) {
encoding = val;
}
@@ -271,7 +272,7 @@ public class FilterDispatcher implements StrutsStatics, Filter {
* @param mapper New instance
*/
@Inject
public static void setActionMapper(ActionMapper mapper) {
public void setActionMapper(ActionMapper mapper) {
actionMapper = mapper;
}
@@ -27,6 +27,8 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.dispatcher.mapper.ActionMapper;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
import org.apache.struts2.views.util.UrlHelper;
@@ -34,6 +36,8 @@ import org.apache.struts2.views.util.UrlHelper;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.config.entities.ResultConfig;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.reflection.ReflectionException;
import com.opensymphony.xwork2.util.reflection.ReflectionExceptionHandler;
/**
* <!-- START SNIPPET: description -->
@@ -111,12 +115,14 @@ import com.opensymphony.xwork2.inject.Inject;
*
* @see ActionMapper
*/
public class ServletActionRedirectResult extends ServletRedirectResult {
public class ServletActionRedirectResult extends ServletRedirectResult implements ReflectionExceptionHandler {
private static final long serialVersionUID = -9042425229314584066L;
/** The default parameter */
public static final String DEFAULT_PARAM = "actionName";
private static final Log LOG = LogFactory.getLog(ServletActionRedirectResult.class);
protected String actionName;
protected String namespace;
@@ -225,4 +231,9 @@ public class ServletActionRedirectResult extends ServletRedirectResult {
return this;
}
public void handle(ReflectionException ex) {
// Only log as debug as they are probably parameters to be appended to the url
LOG.debug(ex.getMessage(), ex);
}
}
@@ -23,6 +23,7 @@
package org.apache.struts2.impl;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.DefaultActionProxy;
import java.util.Map;
@@ -31,9 +32,9 @@ public class StrutsActionProxy extends DefaultActionProxy {
private static final long serialVersionUID = -2434901249671934080L;
public StrutsActionProxy(String namespace, String actionName, Map extraContext,
public StrutsActionProxy(ActionInvocation inv, String namespace, String actionName, Map extraContext,
boolean executeResult, boolean cleanupContext) throws Exception {
super(namespace, actionName, extraContext, executeResult, cleanupContext);
super(inv, namespace, actionName, extraContext, executeResult, cleanupContext);
}
public String execute() throws Exception {
@@ -24,19 +24,17 @@ package org.apache.struts2.impl;
import java.util.Map;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.DefaultActionInvocation;
import com.opensymphony.xwork2.DefaultActionProxy;
import com.opensymphony.xwork2.DefaultActionProxyFactory;
public class StrutsActionProxyFactory extends DefaultActionProxyFactory {
public ActionProxy createActionProxy(String namespace, String actionName, Map extraContext)
throws Exception {
return createActionProxy(namespace, actionName, extraContext, true, true);
}
public ActionProxy createActionProxy(String namespace, String actionName, Map extraContext,
boolean executeResult, boolean cleanupContext) throws Exception {
ActionProxy proxy = new StrutsActionProxy(namespace, actionName, extraContext, executeResult, cleanupContext);
public ActionProxy createActionProxy(ActionInvocation inv, String namespace, String actionName, Map extraContext, boolean executeResult, boolean cleanupContext) throws Exception {
ActionProxy proxy = new StrutsActionProxy(inv, namespace, actionName, extraContext, executeResult, cleanupContext);
container.inject(proxy);
proxy.prepare();
return proxy;
@@ -28,7 +28,6 @@ import com.opensymphony.xwork2.config.ConfigurationException;
import com.opensymphony.xwork2.config.entities.InterceptorConfig;
import com.opensymphony.xwork2.config.entities.ResultConfig;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.util.OgnlUtil;
import java.util.HashMap;
import java.util.Map;
@@ -51,7 +50,7 @@ public class StrutsObjectFactory extends ObjectFactory {
// interceptor instances are long-lived and used across user sessions, so don't try to pass in any extra
// context
Object o = buildBean(className, null);
OgnlUtil.setProperties(params, o);
reflectionProvider.setProperties(params, o);
if (o instanceof Interceptor) {
Interceptor interceptor = (Interceptor) o;
@@ -92,7 +91,7 @@ public class StrutsObjectFactory extends ObjectFactory {
return null;
Object result = buildBean(resultClassName, extraContext);
OgnlUtil.setProperties(resultConfig.getParams(), result, extraContext);
reflectionProvider.setProperties(resultConfig.getParams(), result, extraContext);
if (result instanceof Result)
return (Result) result;
@@ -50,6 +50,7 @@ import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.interceptor.PreResultListener;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.reflection.ReflectionProvider;
/**
* <!-- START SNIPPET: description -->
@@ -116,6 +117,7 @@ public class DebuggingInterceptor implements Interceptor {
private FreemarkerManager freemarkerManager;
private boolean consoleEnabled = false;
private ReflectionProvider reflectionProvider;
@Inject(StrutsConstants.STRUTS_DEVMODE)
public void setDevMode(String mode) {
@@ -126,6 +128,11 @@ public class DebuggingInterceptor implements Interceptor {
public void setFreemarkerManager(FreemarkerManager mgr) {
this.freemarkerManager = mgr;
}
@Inject
public void setReflectionProvider(ReflectionProvider reflectionProvider) {
this.reflectionProvider = reflectionProvider;
}
/**
* Unused.
@@ -226,7 +233,7 @@ public class DebuggingInterceptor implements Interceptor {
try {
StringWriter writer = new StringWriter();
ObjectToHTMLWriter htmlWriter = new ObjectToHTMLWriter(writer);
htmlWriter.write(rootObject, rootObjectExpression);
htmlWriter.write(reflectionProvider, rootObject, rootObjectExpression);
String html = writer.toString();
writer.close();
@@ -28,9 +28,8 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import ognl.OgnlException;
import com.opensymphony.xwork2.util.OgnlUtil;
import com.opensymphony.xwork2.util.reflection.ReflectionException;
import com.opensymphony.xwork2.util.reflection.ReflectionProvider;
/**
* Writes an object as a table, where each field can be expanded if it is an Object/Collection/Array
@@ -45,8 +44,8 @@ class ObjectToHTMLWriter {
}
@SuppressWarnings("unchecked")
public void write(Object root, String expr) throws IntrospectionException,
OgnlException {
public void write(ReflectionProvider reflectionProvider, Object root, String expr) throws IntrospectionException,
ReflectionException {
prettyWriter.startNode("table");
prettyWriter.addAttribute("class", "debugTable");
@@ -76,7 +75,7 @@ class ObjectToHTMLWriter {
}
} else {
//print properties
Map<String, Object> properties = OgnlUtil.getBeanMap(root);
Map<String, Object> properties = reflectionProvider.getBeanMap(root);
for (Map.Entry<String, Object> property : properties.entrySet()) {
String name = property.getKey();
Object value = property.getValue();
@@ -1,152 +0,0 @@
/*
* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.struts2.util;
import java.util.Comparator;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.ValueStackFactory;
/**
* Sorters. Utility sorters for use with the "sort" tag.
*
* @see org.apache.struts2.views.jsp.iterator.SortIteratorTag
* @see SortIteratorFilter
*/
public class Sorter {
public Comparator getAscending() {
return new Comparator() {
public int compare(Object o1, Object o2) {
if (o1 instanceof Comparable) {
return ((Comparable) o1).compareTo(o2);
} else {
String s1 = o1.toString();
String s2 = o2.toString();
return s1.compareTo(s2);
}
}
};
}
public Comparator getAscending(final String anExpression) {
return new Comparator() {
private ValueStack stack = ValueStackFactory.getFactory().createValueStack();
public int compare(Object o1, Object o2) {
// Get value for first object
stack.push(o1);
Object v1 = stack.findValue(anExpression);
stack.pop();
// Get value for second object
stack.push(o2);
Object v2 = stack.findValue(anExpression);
stack.pop();
// Ensure non-null
if (v1 == null) {
v1 = "";
}
if (v2 == null) {
v2 = "";
}
// Compare them
if (v1 instanceof Comparable && v1.getClass().equals(v2.getClass())) {
return ((Comparable) v1).compareTo(v2);
} else {
String s1 = v1.toString();
String s2 = v2.toString();
return s1.compareTo(s2);
}
}
};
}
public Comparator getComparator(String anExpression, boolean ascending) {
if (ascending) {
return getAscending(anExpression);
} else {
return getDescending(anExpression);
}
}
public Comparator getDescending() {
return new Comparator() {
public int compare(Object o1, Object o2) {
if (o2 instanceof Comparable) {
return ((Comparable) o2).compareTo(o1);
} else {
String s1 = o1.toString();
String s2 = o2.toString();
return s2.compareTo(s1);
}
}
};
}
public Comparator getDescending(final String anExpression) {
return new Comparator() {
private ValueStack stack = ValueStackFactory.getFactory().createValueStack();
public int compare(Object o1, Object o2) {
// Get value for first object
stack.push(o1);
Object v1 = stack.findValue(anExpression);
stack.pop();
// Get value for second object
stack.push(o2);
Object v2 = stack.findValue(anExpression);
stack.pop();
// Ensure non-null
if (v1 == null) {
v1 = "";
}
if (v2 == null) {
v2 = "";
}
// Compare them
if (v2 instanceof Comparable && v1.getClass().equals(v2.getClass())) {
return ((Comparable) v2).compareTo(v1);
} else {
String s1 = v1.toString();
String s2 = v2.toString();
return s2.compareTo(s1);
}
}
};
}
}
@@ -26,7 +26,10 @@ import java.util.Map;
import org.apache.struts2.dispatcher.Dispatcher;
import org.springframework.mock.web.MockServletContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.LocalizedTextUtil;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.ValueStackFactory;
/**
* Generic test setup methods to be used with any unit testing framework.
@@ -48,10 +51,17 @@ public class StrutsTestCaseHelper {
Dispatcher du = new Dispatcher(new MockServletContext(), params);
du.init();
Dispatcher.setInstance(du);
// Reset the value stack
ValueStack stack = du.getContainer().getInstance(ValueStackFactory.class).createValueStack();
stack.getContext().put(ActionContext.CONTAINER, du.getContainer());
ActionContext.setContext(new ActionContext(stack.getContext()));
return du;
}
public static void tearDown() throws Exception {
Dispatcher.setInstance(null);
ActionContext.setContext(null);
}
}
@@ -44,8 +44,10 @@ import org.apache.commons.logging.LogFactory;
import org.apache.struts2.views.jsp.ui.OgnlTool;
import org.apache.struts2.views.util.UrlHelper;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.util.TextUtils;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ObjectFactory;
@@ -61,7 +63,7 @@ public class StrutsUtil {
protected HttpServletRequest request;
protected HttpServletResponse response;
protected Map classes = new Hashtable();
protected OgnlTool ognl = OgnlTool.getInstance();
protected OgnlTool ognl;
protected ValueStack stack;
@@ -69,6 +71,7 @@ public class StrutsUtil {
this.stack = stack;
this.request = request;
this.response = response;
this.ognl = ((Container)stack.getContext().get(ActionContext.CONTAINER)).getInstance(OgnlTool.class);
}
@@ -37,7 +37,9 @@ import org.apache.struts2.dispatcher.SessionMap;
import uk.ltd.getahead.dwr.WebContextFactory;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.ActionProxyFactory;
import com.opensymphony.xwork2.DefaultActionInvocation;
import com.opensymphony.xwork2.DefaultActionProxy;
import com.opensymphony.xwork2.ObjectFactory;
@@ -46,6 +48,7 @@ import com.opensymphony.xwork2.ValidationAware;
import com.opensymphony.xwork2.ValidationAwareSupport;
import com.opensymphony.xwork2.config.Configuration;
import com.opensymphony.xwork2.config.entities.ActionConfig;
import com.opensymphony.xwork2.inject.Inject;
/**
* <p/>
@@ -66,6 +69,13 @@ import com.opensymphony.xwork2.config.entities.ActionConfig;
*/
public class DWRValidator {
private static final Log LOG = LogFactory.getLog(DWRValidator.class);
private ActionProxyFactory actionProxyFactory;
@Inject
public void setActionProxyFactory(ActionProxyFactory fac) {
this.actionProxyFactory = fac;
}
public ValidationAwareSupport doPost(String namespace, String action, Map params) throws Exception {
HttpServletRequest req = WebContextFactory.get().getHttpServletRequest();
@@ -92,9 +102,8 @@ public class DWRValidator {
try {
Configuration cfg = du.getConfigurationManager().getConfiguration();
ValidatorActionProxy proxy = new ValidatorActionProxy(namespace, action, ctx);
cfg.getContainer().inject(proxy);
proxy.prepare();
ActionInvocation inv = new ValidatorActionInvocation(ctx, true);
ActionProxy proxy = actionProxyFactory.createActionProxy(inv, namespace, action, ctx, true, true);
proxy.execute();
Object a = proxy.getAction();
@@ -118,8 +127,8 @@ public class DWRValidator {
public static class ValidatorActionInvocation extends DefaultActionInvocation {
private static final long serialVersionUID = -7645433725470191275L;
protected ValidatorActionInvocation(ObjectFactory objectFactory, UnknownHandler handler, ActionProxy proxy, Map extraContext) throws Exception {
super(objectFactory, handler, proxy, extraContext, true);
protected ValidatorActionInvocation(Map extraContext, boolean pushAction) throws Exception {
super(extraContext, pushAction);
}
protected String invokeAction(Object action, ActionConfig actionConfig) throws Exception {
@@ -127,16 +136,4 @@ public class DWRValidator {
}
}
public static class ValidatorActionProxy extends DefaultActionProxy {
private static final long serialVersionUID = 5754781916414047963L;
protected ValidatorActionProxy(String namespace, String actionName, Map extraContext) throws Exception {
super(namespace, actionName, extraContext, false, true);
}
public void prepare() throws Exception {
super.prepare();
invocation = new ValidatorActionInvocation(objectFactory, unknownHandler, this, extraContext);
}
}
}
@@ -52,7 +52,7 @@ public class TagUtils {
ValueStack stack = (ValueStack) req.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
if (stack == null) {
stack = ValueStackFactory.getFactory().createValueStack();
stack = Dispatcher.getInstance().getContainer().getInstance(ValueStackFactory.class).createValueStack();
HttpServletResponse res = (HttpServletResponse) pageContext.getResponse();
Dispatcher du = Dispatcher.getInstance();
@@ -23,24 +23,30 @@ package org.apache.struts2.views.jsp.ui;
import ognl.Ognl;
import ognl.OgnlException;
import com.opensymphony.xwork2.util.OgnlUtil;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.ognl.OgnlUtil;
/**
*/
public class OgnlTool {
private static OgnlTool instance = new OgnlTool();
private OgnlTool() {
private OgnlUtil ognlUtil;
public OgnlTool() {
}
@Inject
public void setOgnlUtil(OgnlUtil ognlUtil) {
this.ognlUtil = ognlUtil;
}
public static OgnlTool getInstance() {
return instance;
}
public Object findValue(String expr, Object context) {
try {
return Ognl.getValue(OgnlUtil.compile(expr), context);
return Ognl.getValue(ognlUtil.compile(expr), context);
} catch (OgnlException e) {
return null;
}
@@ -32,6 +32,8 @@ import org.apache.struts2.views.jsp.ui.OgnlTool;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.conversion.impl.XWorkConverter;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.ValueStack;
@@ -51,13 +53,6 @@ public class ContextUtil {
public static final String STRUTS = "struts";
public static final String ACTION = "action";
public static boolean altSyntax;
@Inject(StrutsConstants.STRUTS_TAG_ALTSYNTAX)
public static void setAltSyntax(String val) {
altSyntax = "true".equals(val);
}
public static Map getStandardContext(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
HashMap map = new HashMap();
map.put(REQUEST, req);
@@ -67,7 +62,7 @@ public class ContextUtil {
map.put(SESSION, req.getSession(false));
map.put(BASE, req.getContextPath());
map.put(STACK, stack);
map.put(OGNL, OgnlTool.getInstance());
map.put(OGNL, ((Container)stack.getContext().get(ActionContext.CONTAINER)).getInstance(OgnlTool.class));
map.put(STRUTS, new StrutsUtil(stack, req, res));
ActionInvocation invocation = (ActionInvocation) stack.getContext().get(ActionContext.ACTION_INVOCATION);
@@ -86,12 +81,12 @@ public class ContextUtil {
// We didn't make altSyntax static cause, if so, struts.configuration.xml.reload will not work
// plus the Configuration implementation should cache the properties, which the framework's
// configuration implementation does
return altSyntax ||(
return "true".equals(((Container)context.get(ActionContext.CONTAINER)).getInstance(String.class, StrutsConstants.STRUTS_TAG_ALTSYNTAX)) ||(
(context.containsKey("useAltSyntax") &&
context.get("useAltSyntax") != null &&
"true".equals(context.get("useAltSyntax").toString())));
}
/**
* Returns a String for overriding the default templateSuffix if templateSuffix is on the stack
* @param context stack's context
@@ -38,6 +38,8 @@ import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsConstants;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.TextParseUtil;
import com.opensymphony.xwork2.util.ValueStack;
@@ -62,25 +64,6 @@ public class UrlHelper {
private static final String AMP = "&amp;";
private static int httpPort = DEFAULT_HTTP_PORT;
private static int httpsPort = DEFAULT_HTTPS_PORT;
private static String customEncoding;
@Inject(StrutsConstants.STRUTS_URL_HTTP_PORT)
public static void setHttpPort(String val) {
httpPort = Integer.parseInt(val);
}
@Inject(StrutsConstants.STRUTS_URL_HTTPS_PORT)
public static void setHttpsPort(String val) {
httpsPort = Integer.parseInt(val);
}
@Inject(StrutsConstants.STRUTS_I18N_ENCODING)
public static void setCustomEncoding(String val) {
customEncoding = val;
}
public static String buildUrl(String action, HttpServletRequest request, HttpServletResponse response, Map params) {
return buildUrl(action, request, response, params, null, true, true);
}
@@ -97,6 +80,11 @@ public class UrlHelper {
StringBuffer link = new StringBuffer();
boolean changedScheme = false;
// FIXME: temporary hack until class is made a properly injected bean
Container cont = ActionContext.getContext().getContainer();
int httpPort = Integer.parseInt(cont.getInstance(String.class, StrutsConstants.STRUTS_URL_HTTP_PORT));
int httpsPort = Integer.parseInt(cont.getInstance(String.class, StrutsConstants.STRUTS_URL_HTTPS_PORT));
// only append scheme if it is different to the current scheme *OR*
// if we explicity want it to be appended by having forceAddSchemeHostAndPort = true
@@ -301,6 +289,11 @@ public class UrlHelper {
private static String getEncodingFromConfiguration() {
final String encoding;
// FIXME: temporary hack until class is made a properly injected bean
Container cont = ActionContext.getContext().getContainer();
String customEncoding = cont.getInstance(String.class, StrutsConstants.STRUTS_I18N_ENCODING);
if (customEncoding != null) {
encoding = customEncoding;
} else {
+33 -10
View File
@@ -57,22 +57,45 @@
<bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter" name="struts" class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" />
<bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter" name="xwork1" class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" />
<bean class="com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter" />
<bean type="com.opensymphony.xwork2.TextProvider" name="xwork1" class="com.opensymphony.xwork2.TextProviderSupport" />
<bean type="com.opensymphony.xwork2.TextProvider" name="struts" class="com.opensymphony.xwork2.TextProviderSupport" />
<bean type="org.apache.struts2.components.UrlRenderer" name="struts" class="org.apache.struts2.components.ServletUrlRenderer"/>
<!-- Only have static injections -->
<bean class="com.opensymphony.xwork2.ObjectFactory" static="true" />
<bean class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" static="true" />
<bean class="com.opensymphony.xwork2.util.OgnlValueStack" static="true" />
<bean class="org.apache.struts2.dispatcher.Dispatcher" static="true" />
<bean class="org.apache.struts2.components.Include" static="true" />
<bean class="org.apache.struts2.dispatcher.FilterDispatcher" static="true" />
<bean class="org.apache.struts2.views.util.ContextUtil" static="true" />
<bean class="org.apache.struts2.views.util.UrlHelper" static="true" />
<bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="struts" class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory" />
<bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider" name="struts" class="com.opensymphony.xwork2.ognl.OgnlReflectionProvider" />
<bean type="com.opensymphony.xwork2.util.reflection.ReflectionContextFactory" name="struts" class="com.opensymphony.xwork2.ognl.OgnlReflectionContextFactory" />
<bean type="com.opensymphony.xwork2.TextProvider" name="system" class="com.opensymphony.xwork2.DefaultTextProvider" />
<bean type="com.opensymphony.xwork2.conversion.NullHandler" name="java.lang.Object" class="com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler" />
<bean type="com.opensymphony.xwork2.validator.ActionValidatorManager" name="struts" class="com.opensymphony.xwork2.validator.AnnotationActionValidatorManager" />
<bean type="com.opensymphony.xwork2.validator.ActionValidatorManager" name="no-annotations" class="com.opensymphony.xwork2.validator.DefaultActionValidatorManager" />
<bean class="com.opensymphony.xwork2.ognl.OgnlUtil" />
<bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" />
<bean type="ognl.PropertyAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Iterator" class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Enumeration" class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.List" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Set" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Map" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Collection" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.ognl.ObjectProxy" class="com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor" />
<bean type="ognl.MethodAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor" />
<bean type="ognl.MethodAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" />
<bean class="org.apache.struts2.views.jsp.ui.OgnlTool" />
<!-- Silly workarounds for OGNL since there is currently no way to flush its internal caches -->
<bean type="ognl.PropertyAccessor" name="java.util.ArrayList" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.HashSet" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.HashMap" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />
<package name="struts-default" abstract="true">
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
@@ -24,6 +24,7 @@ import org.apache.struts2.StrutsTestCase;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.ValueStackFactory;
@@ -36,7 +37,7 @@ public class FormButtonTest extends StrutsTestCase {
public void testPopulateComponentHtmlId1() throws Exception {
MockHttpServletRequest req = new MockHttpServletRequest();
MockHttpServletResponse res = new MockHttpServletResponse();
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
Form form = new Form(stack, req, res);
form.getParameters().put("id", "formId");
@@ -52,7 +53,7 @@ public class FormButtonTest extends StrutsTestCase {
public void testPopulateComponentHtmlId2() throws Exception {
MockHttpServletRequest req = new MockHttpServletRequest();
MockHttpServletResponse res = new MockHttpServletResponse();
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
Form form = new Form(stack, req, res);
form.getParameters().put("id", "formId");
@@ -68,7 +69,7 @@ public class FormButtonTest extends StrutsTestCase {
public void testPopulateComponentHtmlId3() throws Exception {
MockHttpServletRequest req = new MockHttpServletRequest();
MockHttpServletResponse res = new MockHttpServletResponse();
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
Form form = new Form(stack, req, res);
form.getParameters().put("id", "formId");
@@ -85,7 +86,7 @@ public class FormButtonTest extends StrutsTestCase {
public void testPopulateComponentHtmlId4() throws Exception {
MockHttpServletRequest req = new MockHttpServletRequest();
MockHttpServletResponse res = new MockHttpServletResponse();
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
Submit submit = new Submit(stack, req, res);
submit.setId("submitId");
@@ -98,7 +99,7 @@ public class FormButtonTest extends StrutsTestCase {
public void testPopulateComponentHtmlId5() throws Exception {
MockHttpServletRequest req = new MockHttpServletRequest();
MockHttpServletResponse res = new MockHttpServletResponse();
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
Submit submit = new Submit(stack, req, res);
submit.setName("submitName");
@@ -111,7 +112,7 @@ public class FormButtonTest extends StrutsTestCase {
public void testPopulateComponentHtmlId6() throws Exception {
MockHttpServletRequest req = new MockHttpServletRequest();
MockHttpServletResponse res = new MockHttpServletResponse();
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
Submit submit = new Submit(stack, req, res);
submit.setAction("submitAction");
@@ -36,6 +36,7 @@ public class FormTest extends AbstractUITagTest {
public void testTestFormGetValidators() {
Form form = new Form(stack, request, response);
container.inject(form);
form.getParameters().put("actionClass", TestAction.class);
List v = form.getValidators("foo");
assertEquals(1, v.size());
@@ -26,8 +26,10 @@ import java.util.Map;
import junit.framework.TestCase;
import ognl.Ognl;
import org.apache.struts2.StrutsTestCase;
import org.apache.struts2.util.StrutsTypeConverter;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.conversion.impl.XWorkConverter;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.ValueStackFactory;
@@ -35,9 +37,9 @@ import com.opensymphony.xwork2.util.ValueStackFactory;
/**
*
*/
public class PropertyTest extends TestCase {
public class PropertyTest extends StrutsTestCase {
public void testNormalBehaviour() {
final ValueStack stack = ValueStackFactory.getFactory().createValueStack();
final ValueStack stack = ActionContext.getContext().getValueStack();
stack.push(new FooBar("foo-value", "bar-value"));
final Property property = new Property(stack);
property.setDefault("default");
@@ -46,7 +48,7 @@ public class PropertyTest extends TestCase {
}
public void testDefaultShouldBeOutputIfBeanNotAvailable() {
final ValueStack stack = ValueStackFactory.getFactory().createValueStack();
final ValueStack stack = ActionContext.getContext().getValueStack();
final Property property = new Property(stack);
property.setDefault("default");
property.setValue("foo");
@@ -54,7 +56,7 @@ public class PropertyTest extends TestCase {
}
public void testDefaultShouldBeOutputIfPropertyIsNull() {
final ValueStack stack = ValueStackFactory.getFactory().createValueStack();
final ValueStack stack = ActionContext.getContext().getValueStack();
stack.push(new FooBar(null, "bar-value"));
final Property property = new Property(stack);
property.setDefault("default");
@@ -63,7 +65,7 @@ public class PropertyTest extends TestCase {
}
public void testTopValueShouldReturnTopOfValueStack() {
final ValueStack stack = ValueStackFactory.getFactory().createValueStack();
final ValueStack stack = ActionContext.getContext().getValueStack();
stack.push(new FooBar("foo-value", "bar-value"));
final Property property = new Property(stack);
property.setDefault("default");
@@ -72,7 +74,7 @@ public class PropertyTest extends TestCase {
}
public void testTypeConverterShouldBeUsed() {
final ValueStack stack = ValueStackFactory.getFactory().createValueStack();
final ValueStack stack = ActionContext.getContext().getValueStack();
Ognl.setTypeConverter(stack.getContext(), new TestDefaultConverter());
stack.push(new FooBar("foo-value", "bar-value"));
@@ -83,7 +85,7 @@ public class PropertyTest extends TestCase {
}
public void testTypeConverterReturningNullShouldLeadToDisplayOfDefaultValue() {
final ValueStack stack = ValueStackFactory.getFactory().createValueStack();
final ValueStack stack = ActionContext.getContext().getValueStack();
Ognl.setTypeConverter(stack.getContext(), new TestDefaultConverter());
stack.push(new FooBar("foo-value", null));
@@ -24,6 +24,7 @@ import org.apache.struts2.StrutsTestCase;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.ValueStackFactory;
@@ -34,7 +35,7 @@ import com.opensymphony.xwork2.util.ValueStackFactory;
public class UIBeanTest extends StrutsTestCase {
public void testPopulateComponentHtmlId1() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
MockHttpServletRequest req = new MockHttpServletRequest();
MockHttpServletResponse res = new MockHttpServletResponse();
@@ -50,7 +51,7 @@ public class UIBeanTest extends StrutsTestCase {
}
public void testPopulateComponentHtmlIdWithOgnl() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
MockHttpServletRequest req = new MockHttpServletRequest();
MockHttpServletResponse res = new MockHttpServletResponse();
@@ -66,7 +67,7 @@ public class UIBeanTest extends StrutsTestCase {
}
public void testPopulateComponentHtmlId2() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
MockHttpServletRequest req = new MockHttpServletRequest();
MockHttpServletResponse res = new MockHttpServletResponse();
@@ -29,6 +29,7 @@ import com.opensymphony.xwork2.config.ConfigurationManager;
import com.opensymphony.xwork2.config.entities.*;
import com.opensymphony.xwork2.config.impl.DefaultConfiguration;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ObjectFactory;
import junit.framework.TestCase;
@@ -61,7 +62,6 @@ public class MethodConfigurationProviderTest extends TestCase {
* Creates a mock Dispatcher and seeds Configuration.
*/
public void setUp() {
InternalConfigurationManager configurationManager = new InternalConfigurationManager();
dispatcher = new Dispatcher(new MockServletContext(), new HashMap<String, String>());
dispatcher.setConfigurationManager(configurationManager);
@@ -93,6 +93,7 @@ public class MethodConfigurationProviderTest extends TestCase {
provider = new MethodConfigurationProvider();
provider.init(configuration);
provider.setObjectFactory(new ObjectFactory());
provider.loadPackages();
}
@@ -23,16 +23,31 @@ package org.apache.struts2.dispatcher;
import java.util.HashMap;
import java.util.Locale;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.StrutsConstants;
import org.apache.struts2.StrutsTestCase;
import org.apache.struts2.dispatcher.FilterDispatcherTest.InnerActionMapper;
import org.apache.struts2.dispatcher.FilterDispatcherTest.InnerDestroyableObjectFactory;
import org.apache.struts2.dispatcher.FilterDispatcherTest.InnerDispatcher;
import org.springframework.mock.web.MockFilterConfig;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockServletContext;
import com.mockobjects.dynamic.C;
import com.mockobjects.dynamic.Mock;
import com.mockobjects.servlet.MockFilterChain;
import com.opensymphony.xwork2.ObjectFactory;
import com.opensymphony.xwork2.config.Configuration;
import com.opensymphony.xwork2.config.ConfigurationManager;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.ContainerBuilder;
import com.opensymphony.xwork2.inject.Context;
import com.opensymphony.xwork2.inject.Factory;
import com.opensymphony.xwork2.util.LocalizedTextUtil;
/**
@@ -131,6 +146,27 @@ public class DispatcherTest extends StrutsTestCase {
}
}
public void testObjectFactoryDestroy() throws Exception {
final InnerDestroyableObjectFactory destroyedObjectFactory = new InnerDestroyableObjectFactory();
Dispatcher du = new Dispatcher(new MockServletContext(), new HashMap<String, String>());
ConfigurationManager cm = new ConfigurationManager();
Mock mockConfiguration = new Mock(Configuration.class);
cm.setConfiguration((Configuration)mockConfiguration.proxy());
Mock mockContainer = new Mock(Container.class);
mockConfiguration.expectAndReturn("getContainer", mockContainer.proxy());
mockContainer.expectAndReturn("getInstance", C.args(C.eq(ObjectFactory.class)), destroyedObjectFactory);
mockConfiguration.expect("destroy");
du.setConfigurationManager(cm);
assertFalse(destroyedObjectFactory.destroyed);
du.cleanup();
assertTrue(destroyedObjectFactory.destroyed);
mockConfiguration.verify();
mockContainer.verify();
}
class InternalConfigurationManager extends ConfigurationManager {
public boolean destroyConfiguration = false;
@@ -83,32 +83,7 @@ public class FilterDispatcherTest extends StrutsTestCase {
assertEquals(result4[3], "foo/bar/package4/");
}
public void testObjectFactoryDestroy() throws Exception {
final InnerDestroyableObjectFactory destroyedObjectFactory = new InnerDestroyableObjectFactory();
FilterDispatcher filterDispatcher = new FilterDispatcher() {
@Override
protected Dispatcher createDispatcher(FilterConfig cfg) {
return new Dispatcher(cfg.getServletContext(), new HashMap()) {
Container cont = new ContainerBuilder()
.factory(ObjectFactory.class, new Factory() {
public Object create(Context context) throws Exception { return destroyedObjectFactory; }
})
.create(false);
@Override
public Container getContainer() {
return cont;
}
};
}
};
filterDispatcher.init(new MockFilterConfig((ServletContext) null));
assertFalse(destroyedObjectFactory.destroyed);
filterDispatcher.destroy();
assertTrue(destroyedObjectFactory.destroyed);
}
public void testIfActionMapperIsNullDontServiceAction() throws Exception {
MockServletContext servletContext = new MockServletContext();
@@ -125,8 +100,6 @@ public class FilterDispatcherTest extends StrutsTestCase {
ObjectFactory.setObjectFactory(new InnerObjectFactory());
FilterDispatcher filter = new FilterDispatcher() {
protected Dispatcher createDispatcher() {
return _dispatcher;
@@ -138,7 +111,7 @@ public class FilterDispatcherTest extends StrutsTestCase {
assertFalse(_dispatcher.serviceRequest);
}
public void testCharacterEncodingSetBeforeRequestWrappingAndActionService() throws Exception {
MockServletContext servletContext = new MockServletContext();
MockFilterConfig filterConfig = new MockFilterConfig(servletContext);
@@ -148,20 +121,6 @@ public class FilterDispatcherTest extends StrutsTestCase {
final InnerDispatcher _dispatcher = new InnerDispatcher(servletContext);
Dispatcher.setInstance(null);
DefaultConfiguration conf = new DefaultConfiguration() {
@Override
public Container getContainer() {
return new ContainerBuilder().create(false);
}
};
ConfigurationManager confManager = new ConfigurationManager();
confManager.setConfiguration(conf);
_dispatcher.setConfigurationManager(confManager);
ObjectFactory.setObjectFactory(new InnerObjectFactory());
_dispatcher.setDefaultEncoding("UTF-16_DUMMY");
FilterDispatcher filter = new FilterDispatcher() {
@@ -171,13 +130,13 @@ public class FilterDispatcherTest extends StrutsTestCase {
};
filter.setActionMapper(new InnerActionMapper());
filter.init(filterConfig);
_dispatcher.setDefaultEncoding("UTF-16_DUMMY");
filter.doFilter(req, res, chain);
assertTrue(_dispatcher.wrappedRequest);
assertTrue(_dispatcher.serviceRequest);
}
// === inner class ========
public static class InnerObjectFactory extends ObjectFactory {
@@ -217,7 +176,7 @@ public class FilterDispatcherTest extends StrutsTestCase {
// if we set the chracter encoding AFTER we do wrap request, we will get
// a failing test
assertNotNull(request.getCharacterEncoding());
assertEquals(request.getCharacterEncoding(), "UTF-16_DUMMY");
assertEquals("UTF-16_DUMMY", request.getCharacterEncoding());
return request;
}
@@ -227,7 +186,7 @@ public class FilterDispatcherTest extends StrutsTestCase {
// if we set the chracter encoding AFTER we do wrap request, we will get
// a failing test
assertNotNull(request.getCharacterEncoding());
assertEquals(request.getCharacterEncoding(), "UTF-16_DUMMY");
assertEquals("UTF-16_DUMMY", request.getCharacterEncoding());
}
}
@@ -33,6 +33,7 @@ import javax.servlet.http.HttpServletResponse;
import junit.framework.TestCase;
import org.apache.struts2.StrutsTestCase;
import org.apache.struts2.dispatcher.mapper.ActionMapper;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
import org.springframework.mock.web.MockFilterConfig;
@@ -50,7 +51,7 @@ import com.opensymphony.xwork2.inject.Container;
*
* @version $Date$ $Id$
*/
public class FilterTest extends TestCase {
public class FilterTest extends StrutsTestCase {
protected MockFilterConfig filterConfig;
protected MockHttpServletRequest request;
@@ -70,6 +71,7 @@ public class FilterTest extends TestCase {
@Override
protected void tearDown() throws Exception {
super.tearDown();
filterConfig = null;
request = null;
response = null;
@@ -84,6 +86,7 @@ public class FilterTest extends TestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
Dispatcher.setInstance(null);
filterConfig = new MockFilterConfig();
@@ -145,7 +148,7 @@ public class FilterTest extends TestCase {
assertFalse(_dispatcher2.service);
filterDispatcher.init(filterConfig);
FilterDispatcher.setActionMapper(new FilterTest.InnerMapper());
filterDispatcher.setActionMapper(new FilterTest.InnerMapper());
filterDispatcher.doFilter(request, response, filterChain2);
filterDispatcher.destroy();
@@ -180,7 +183,7 @@ public class FilterTest extends TestCase {
assertFalse(_dispatcher2.cleanUp);
filterDispatcher.init(filterConfig);
FilterDispatcher.setActionMapper(new FilterTest.InnerMapper());
filterDispatcher.setActionMapper(new FilterTest.InnerMapper());
filterDispatcher.doFilter(request, response, filterChain2);
filterDispatcher.doFilter(request, response, filterChain2);
filterDispatcher.destroy();
@@ -296,7 +299,7 @@ public class FilterTest extends TestCase {
@Override
public Container getContainer() {
return null;
return container;
}
@Override
@@ -32,7 +32,8 @@ import com.mockobjects.dynamic.C;
import com.mockobjects.dynamic.Mock;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.util.OgnlUtil;
import com.opensymphony.xwork2.ognl.OgnlUtil;
import com.opensymphony.xwork2.util.reflection.ReflectionProvider;
/**
@@ -45,6 +46,7 @@ public class HttpHeaderResultTest extends StrutsTestCase {
HttpHeaderResult result;
HttpServletResponse response;
Mock responseMock;
ReflectionProvider reflectionProvider;
public void testHeaderValuesAreNotParsedWhenParseIsFalse() throws Exception {
@@ -56,7 +58,7 @@ public class HttpHeaderResultTest extends StrutsTestCase {
values.put("bar", "abc");
ActionContext.getContext().getValueStack().push(values);
OgnlUtil.setProperties(params, result);
reflectionProvider.setProperties(params, result);
responseMock.expect("addHeader", C.args(C.eq("foo"), C.eq("${bar}")));
responseMock.expect("addHeader", C.args(C.eq("baz"), C.eq("baz")));
@@ -74,7 +76,7 @@ public class HttpHeaderResultTest extends StrutsTestCase {
values.put("bar", "abc");
ActionContext.getContext().getValueStack().push(values);
OgnlUtil.setProperties(params, result);
reflectionProvider.setProperties(params, result);
responseMock.expect("addHeader", C.args(C.eq("foo"), C.eq("abc")));
responseMock.expect("addHeader", C.args(C.eq("baz"), C.eq("baz")));
@@ -123,12 +125,12 @@ public class HttpHeaderResultTest extends StrutsTestCase {
responseMock = new Mock(HttpServletResponse.class);
response = (HttpServletResponse) responseMock.proxy();
invocation = (ActionInvocation) new Mock(ActionInvocation.class).proxy();
reflectionProvider = container.getInstance(ReflectionProvider.class);
ServletActionContext.setResponse(response);
}
protected void tearDown() throws Exception {
super.tearDown();
ServletActionContext.setResponse(null);
ActionContext.setContext(null);
}
}
@@ -27,6 +27,7 @@ import java.io.StringWriter;
import junit.framework.TestCase;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.StrutsTestCase;
import org.apache.struts2.views.jsp.AbstractUITagTest;
import org.apache.struts2.views.jsp.StrutsMockHttpServletResponse;
import org.apache.struts2.views.jsp.StrutsMockServletContext;
@@ -41,7 +42,7 @@ import com.opensymphony.xwork2.util.ValueStack;
* Test case for PlainTextResult.
*
*/
public class PlainTextResultTest extends TestCase {
public class PlainTextResultTest extends StrutsTestCase {
ValueStack stack;
MockActionInvocation invocation;
@@ -133,7 +134,7 @@ public class PlainTextResultTest extends TestCase {
response = new StrutsMockHttpServletResponse();
response.setWriter(writer);
servletContext = new StrutsMockServletContext();
stack = ValueStackFactory.getFactory().createValueStack();
stack = ActionContext.getContext().getValueStack();
context = new ActionContext(stack.getContext());
context.put(StrutsStatics.HTTP_RESPONSE, response);
context.put(StrutsStatics.SERVLET_CONTEXT, servletContext);
@@ -144,6 +145,7 @@ public class PlainTextResultTest extends TestCase {
protected void tearDown() throws Exception {
super.tearDown();
stack = null;
invocation = null;
context = null;
@@ -132,6 +132,6 @@ public class ServletRedirectResultTest extends StrutsTestCase implements StrutsS
MockActionInvocation ai = new MockActionInvocation();
ai.setInvocationContext(ac);
this.ai = ai;
ai.setStack(ValueStackFactory.getFactory().createValueStack());
ai.setStack(ActionContext.getContext().getValueStack());
}
}
@@ -29,6 +29,7 @@ import java.net.URL;
import junit.framework.TestCase;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsTestCase;
import org.springframework.mock.web.MockHttpServletResponse;
import com.opensymphony.xwork2.util.ClassLoaderUtil;
@@ -42,7 +43,7 @@ import com.opensymphony.xwork2.util.ValueStack;
* Unit test for {@link StreamResult}.
*
*/
public class StreamResultTest extends TestCase {
public class StreamResultTest extends StrutsTestCase {
private StreamResult result;
private MockHttpServletResponse response;
@@ -166,11 +167,11 @@ public class StreamResultTest extends TestCase {
}
protected void setUp() throws Exception {
super.setUp();
response = new MockHttpServletResponse();
result = new StreamResult();
stack = ValueStackFactory.getFactory().createValueStack();
ActionContext.getContext().setValueStack(stack);
stack = ActionContext.getContext().getValueStack();
MyImageAction action = new MyImageAction();
contentLength = (int) action.getContentLength();
@@ -186,7 +187,8 @@ public class StreamResultTest extends TestCase {
protected void tearDown() {
protected void tearDown() throws Exception {
super.tearDown();
response = null;
result = null;
stack = null;
@@ -23,6 +23,7 @@ package org.apache.struts2.dispatcher;
import org.apache.struts2.StrutsTestCase;
import org.easymock.EasyMock;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
@@ -35,7 +36,7 @@ public class StrutsResultSupportTest extends StrutsTestCase {
public void testParse() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
stack.push(new ActionSupport() {
public String getMyLocation() {
return "ThisIsMyLocation";
@@ -60,7 +61,7 @@ public class StrutsResultSupportTest extends StrutsTestCase {
}
public void testParseAndEncode() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
stack.push(new ActionSupport() {
public String getMyLocation() {
return "/myPage?param=value&param1=value1";
@@ -86,7 +87,7 @@ public class StrutsResultSupportTest extends StrutsTestCase {
public void testNoParseAndEncode() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
stack.push(new ActionSupport() {
public String getMyLocation() {
return "myLocation.jsp";
@@ -22,6 +22,7 @@ package org.apache.struts2.dispatcher;
import junit.framework.TestCase;
import org.apache.struts2.StrutsTestCase;
import org.apache.velocity.Template;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.ParseErrorException;
@@ -38,7 +39,7 @@ import com.opensymphony.xwork2.util.ValueStackFactory;
/**
*
*/
public class VelocityResultTest extends TestCase {
public class VelocityResultTest extends StrutsTestCase {
ActionInvocation actionInvocation;
Mock mockActionProxy;
@@ -91,9 +92,10 @@ public class VelocityResultTest extends TestCase {
}
protected void setUp() throws Exception {
super.setUp();
namespace = "/html";
result = new VelocityResult();
stack = ValueStackFactory.getFactory().createValueStack();
stack = ActionContext.getContext().getValueStack();
ActionContext.getContext().setValueStack(stack);
velocity = new TestVelocityEngine();
mockActionProxy = new Mock(ActionProxy.class);
@@ -86,7 +86,7 @@ public class StrutsConversionErrorInterceptorTest extends StrutsTestCase {
interceptor = new StrutsConversionErrorInterceptor();
mockInvocation = new Mock(ActionInvocation.class);
invocation = (ActionInvocation) mockInvocation.proxy();
stack = ValueStackFactory.getFactory().createValueStack();
stack = ActionContext.getContext().getValueStack();
context = new ActionContext(stack.getContext());
conversionErrors = new HashMap();
context.setConversionErrors(conversionErrors);
@@ -121,7 +121,7 @@ public class TokenInterceptorTest extends StrutsTestCase {
request.setParameterMap(params);
extraContext.put(ServletActionContext.HTTP_REQUEST, request);
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
stack.getContext().putAll(extraContext);
oldContext = new ActionContext(stack.getContext());
ActionContext.setContext(oldContext);
@@ -132,7 +132,6 @@ public class TokenInterceptorTest extends StrutsTestCase {
}
protected void tearDown() throws Exception {
configurationManager.destroyConfiguration();
ActionContext.setContext(null);
super.tearDown();
}
}
@@ -38,6 +38,7 @@ public class AnnotationValidationInterceptorTest extends StrutsTestCase {
super.setUp();
test = new TestAction();
interceptor = new AnnotationValidationInterceptor();
container.inject(interceptor);
mockActionInvocation = new Mock(ActionInvocation.class);
mockActionProxy = new Mock(ActionProxy.class);
mockActionInvocation.matchAndReturn("getProxy", (ActionProxy) mockActionProxy.proxy());
@@ -126,16 +126,15 @@ public class JSONValidationInterceptorTest extends StrutsTestCase {
this.action = new TestAction();
this.interceptor = new JSONValidationInterceptor();
this.validationInterceptor = new AnnotationValidationInterceptor();
container.inject(validationInterceptor);
this.request = new StrutsMockHttpServletRequest();
stringWriter = new StringWriter();
PrintWriter writer = new PrintWriter(stringWriter);
this.response = new StrutsMockHttpServletResponse();
response.setWriter(writer);
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ActionContext context = new ActionContext(stack.getContext());
ActionContext context = ActionContext.getContext();
ActionContext.setContext(context);
context.put(StrutsStatics.HTTP_REQUEST, request);
context.put(StrutsStatics.HTTP_RESPONSE, response);
@@ -67,7 +67,8 @@ public class InvocationSessionStoreTest extends StrutsTestCase {
}
protected void setUp() throws Exception {
stack = ValueStackFactory.getFactory().createValueStack();
super.setUp();
stack = ActionContext.getContext().getValueStack();
ActionContext actionContext = new ActionContext(stack.getContext());
ActionContext.setContext(actionContext);
@@ -35,6 +35,7 @@ import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockRequestDispatcher;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.ValueStackFactory;
@@ -195,7 +196,7 @@ public class StrutsUtilTest extends StrutsTestCase {
protected void setUp() throws Exception {
super.setUp();
stack = ValueStackFactory.getFactory().createValueStack();
stack = ActionContext.getContext().getValueStack();
request = new InternalMockHttpServletRequest();
response = new MockHttpServletResponse();
strutsUtil = new StrutsUtil(stack, request, response);
@@ -27,6 +27,7 @@ import junit.framework.TestCase;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.StrutsTestCase;
import org.apache.struts2.views.jsp.StrutsMockHttpServletResponse;
import org.apache.struts2.views.jsp.StrutsMockServletContext;
import org.springframework.mock.web.MockHttpServletRequest;
@@ -40,7 +41,7 @@ import com.opensymphony.xwork2.util.ValueStackFactory;
* Test case for FreeMarkerResult.
*
*/
public class FreeMarkerResultTest extends TestCase {
public class FreeMarkerResultTest extends StrutsTestCase {
ValueStack stack;
MockActionInvocation invocation;
@@ -89,7 +90,7 @@ public class FreeMarkerResultTest extends TestCase {
response.setWriter(writer);
request = new MockHttpServletRequest();
servletContext = new StrutsMockServletContext();
stack = ValueStackFactory.getFactory().createValueStack();
stack = ActionContext.getContext().getValueStack();
context = new ActionContext(stack.getContext());
context.put(StrutsStatics.HTTP_RESPONSE, response);
context.put(StrutsStatics.HTTP_REQUEST, request);
@@ -24,6 +24,7 @@ import java.util.List;
import junit.framework.TestCase;
import org.apache.struts2.StrutsTestCase;
import org.apache.struts2.util.ListEntry;
import org.apache.struts2.util.StrutsUtil;
@@ -37,22 +38,13 @@ import freemarker.template.ObjectWrapper;
/**
*/
public class FreemarkerTest extends TestCase {
public class FreemarkerTest extends StrutsTestCase {
TestAction testAction = null;
/**
*
*/
public FreemarkerTest(String name) {
super(name);
}
public void testSelectHelper() {
StrutsUtil wwUtil = new StrutsUtil(ActionContext.getContext().getValueStack(), null, null);
List selectList = null;
selectList = wwUtil.makeSelectList("ignored", "stringList", null, null);
@@ -79,9 +71,6 @@ public class FreemarkerTest extends TestCase {
protected void setUp() throws Exception {
super.setUp();
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ActionContext.setContext(new ActionContext(stack.getContext()));
testAction = new TestAction();
ActionContext.getContext().getValueStack().push(testAction);
}
@@ -33,7 +33,8 @@ import org.apache.struts2.views.freemarker.tags.TagModel;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import com.opensymphony.xwork2.util.OgnlValueStack;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ognl.OgnlValueStack;
import freemarker.ext.util.WrapperTemplateModel;
import freemarker.template.AdapterTemplateModel;
@@ -56,7 +57,7 @@ public class TagModelTest extends StrutsTestCase {
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
OgnlValueStack stack = new OgnlValueStack();
OgnlValueStack stack = (OgnlValueStack)ActionContext.getContext().getValueStack();
Map params = new LinkedHashMap();
@@ -184,8 +185,8 @@ public class TagModelTest extends StrutsTestCase {
public void testGetWriter() throws Exception {
OgnlValueStack stack = new OgnlValueStack();
OgnlValueStack stack = (OgnlValueStack)ActionContext.getContext().getValueStack();
final InternalBean bean = new InternalBean(stack);
MockHttpServletRequest request = new MockHttpServletRequest();
@@ -82,7 +82,7 @@ public abstract class AbstractTagTest extends StrutsTestCase {
* create our standard mock objects
*/
action = this.getAction();
stack = ValueStackFactory.getFactory().createValueStack();
stack = ActionContext.getContext().getValueStack();
context = stack.getContext();
stack.push(action);
@@ -251,10 +251,7 @@ public class ActionTagTest extends AbstractTagTest {
}
protected void tearDown() throws Exception {
configurationManager.destroyConfiguration();
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ActionContext.setContext(new ActionContext(stack.getContext()));
super.tearDown();
}
}
@@ -30,6 +30,8 @@ import org.apache.struts2.components.If;
import com.mockobjects.servlet.MockJspWriter;
import com.mockobjects.servlet.MockPageContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ognl.OgnlValueStack;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.ValueStackFactory;
@@ -98,7 +100,7 @@ public class ElseIfTagTest extends StrutsTestCase {
protected void setUp() throws Exception {
super.setUp();
stack = ValueStackFactory.getFactory().createValueStack();
stack = ActionContext.getContext().getValueStack();
jspWriter = new MockJspWriter();
@@ -29,6 +29,7 @@ import org.apache.struts2.components.If;
import com.mockobjects.servlet.MockJspWriter;
import com.mockobjects.servlet.MockPageContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.ValueStackFactory;
@@ -93,7 +94,7 @@ public class ElseTagTest extends StrutsTestCase {
super.setUp();
// create the needed objects
elseTag = new ElseTag();
stack = ValueStackFactory.getFactory().createValueStack();
stack = ActionContext.getContext().getValueStack();
// create the mock http servlet request
StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
@@ -324,7 +324,7 @@ public class IfTagTest extends StrutsTestCase {
super.setUp();
// create the needed objects
tag = new IfTag();
stack = ValueStackFactory.getFactory().createValueStack();
stack = ActionContext.getContext().getValueStack();
// create the mock http servlet request
StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
@@ -42,7 +42,7 @@ import com.opensymphony.xwork2.util.ValueStackFactory;
public class PropertyTagTest extends StrutsTestCase {
StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack;
public void testDefaultValue() {
@@ -279,7 +279,7 @@ public class PropertyTagTest extends StrutsTestCase {
protected void setUp() throws Exception {
super.setUp();
ActionContext.getContext().setValueStack(stack);
stack = ActionContext.getContext().getValueStack();
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack);
}
@@ -172,8 +172,9 @@ public class TextTagTest extends AbstractTagTest {
assertEquals(value1, writer.toString());
final StringBuffer buffer = writer.getBuffer();
buffer.delete(0, buffer.length());
ValueStack newStack = ValueStackFactory.getFactory().createValueStack();
ValueStack newStack = container.getInstance(ValueStackFactory.class).createValueStack();
newStack.getContext().put(ActionContext.LOCALE, foreignLocale);
newStack.getContext().put(ActionContext.CONTAINER, container);
newStack.push(new TestAction1());
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, newStack);
assertNotSame(ActionContext.getContext().getValueStack().peek(), newStack.peek());
@@ -203,8 +204,9 @@ public class TextTagTest extends AbstractTagTest {
buffer.delete(0, buffer.length());
String value_int = getLocalizedMessage(foreignLocale);
assertFalse(value_default.equals(value_int));
ValueStack newStack = ValueStackFactory.getFactory().createValueStack(stack);
ValueStack newStack = container.getInstance(ValueStackFactory.class).createValueStack(stack);
newStack.getContext().put(ActionContext.LOCALE, foreignLocale);
newStack.getContext().put(ActionContext.CONTAINER, container);
assertNotSame(newStack.getContext().get(ActionContext.LOCALE), ActionContext.getContext().getLocale());
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, newStack);
assertEquals(ActionContext.getContext().getValueStack().peek(), newStack.peek());
@@ -275,7 +277,6 @@ public class TextTagTest extends AbstractTagTest {
}
protected void tearDown() throws Exception {
ValueStack valueStack = ValueStackFactory.getFactory().createValueStack();
ActionContext.setContext(new ActionContext(valueStack.getContext()));
super.tearDown();
}
}
@@ -184,17 +184,6 @@ public class FormTagTest extends AbstractUITagTest {
}
});
// used by form tag to get "actionClass" parameter
ObjectFactory.setObjectFactory(new ObjectFactory() {
public Class getClassInstance(String className) throws ClassNotFoundException {
if (DefaultActionMapper.class.getName().equals(className)) {
return DefaultActionMapper.class;
}
return ActionSupport.class;
}
});
FormTag tag = new FormTag();
tag.setPageContext(pageContext);
tag.setName("myForm");
@@ -221,7 +210,6 @@ public class FormTagTest extends AbstractUITagTest {
}
finally {
configurationManager.setConfiguration(originalConfiguration);
ObjectFactory.setObjectFactory(originalObjectFactory);
}
}
@@ -289,17 +277,6 @@ public class FormTagTest extends AbstractUITagTest {
}
});
// used by form tag to get "actionClass" parameter
ObjectFactory.setObjectFactory(new ObjectFactory() {
public Class getClassInstance(String className) throws ClassNotFoundException {
if (DefaultActionMapper.class.getName().equals(className)) {
return DefaultActionMapper.class;
}
return ActionSupport.class;
}
});
FormTag tag = new FormTag();
tag.setPageContext(pageContext);
tag.setName("myForm");
@@ -326,7 +303,6 @@ public class FormTagTest extends AbstractUITagTest {
}
finally {
configurationManager.setConfiguration(originalConfiguration);
ObjectFactory.setObjectFactory(originalObjectFactory);
}
}
@@ -23,7 +23,12 @@ package org.apache.struts2.views.util;
import junit.framework.TestCase;
import org.apache.struts2.StrutsConstants;
import org.apache.struts2.StrutsTestCase;
import com.mockobjects.dynamic.C;
import com.mockobjects.dynamic.Mock;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.ValueStackFactory;
@@ -31,77 +36,83 @@ import com.opensymphony.xwork2.util.ValueStackFactory;
* Test case for ContextUtil
*
*/
public class ContextUtilTest extends TestCase {
public class ContextUtilTest extends StrutsTestCase {
private void setAltSyntax(ValueStack stack, String val) {
Mock container = new Mock(Container.class);
container.expectAndReturn("getInstance", C.args(C.eq(String.class), C.eq(StrutsConstants.STRUTS_TAG_ALTSYNTAX)), val);
stack.getContext().put(ActionContext.CONTAINER, container.proxy());
}
public void testAltSyntaxMethod1() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
stack.getContext().put("useAltSyntax", "true");
ContextUtil.setAltSyntax("true");
setAltSyntax(stack, "true");
assertTrue(ContextUtil.isUseAltSyntax(stack.getContext()));
}
public void testAltSyntaxMethod2() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
stack.getContext().put("useAltSyntax", "false");
ContextUtil.setAltSyntax("true");
setAltSyntax(stack, "true");
assertTrue(ContextUtil.isUseAltSyntax(stack.getContext()));
}
public void testAltSyntaxMethod3() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
stack.getContext().put("useAltSyntax", "true");
ContextUtil.setAltSyntax("false");
setAltSyntax(stack, "false");
assertTrue(ContextUtil.isUseAltSyntax(stack.getContext()));
}
public void testAltSyntaxMethod4() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
stack.getContext().put("useAltSyntax", "false");
ContextUtil.setAltSyntax("false");
setAltSyntax(stack, "false");
assertFalse(ContextUtil.isUseAltSyntax(stack.getContext()));
}
//========================================================
public void testAltSyntaxMethod5() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
stack.getContext().put("useAltSyntax", Boolean.TRUE);
ContextUtil.setAltSyntax("true");
setAltSyntax(stack, "true");
assertTrue(ContextUtil.isUseAltSyntax(stack.getContext()));
}
public void testAltSyntaxMethod6() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
stack.getContext().put("useAltSyntax", Boolean.FALSE);
ContextUtil.setAltSyntax("true");
setAltSyntax(stack, "true");
assertTrue(ContextUtil.isUseAltSyntax(stack.getContext()));
}
public void testAltSyntaxMethod7() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
stack.getContext().put("useAltSyntax", Boolean.TRUE);
ContextUtil.setAltSyntax("false");
setAltSyntax(stack, "false");
assertTrue(ContextUtil.isUseAltSyntax(stack.getContext()));
}
public void testAltSyntaxMethod8() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
stack.getContext().put("useAltSyntax", Boolean.FALSE);
ContextUtil.setAltSyntax("false");
setAltSyntax(stack, "false");
assertFalse(ContextUtil.isUseAltSyntax(stack.getContext()));
}
// ==========================================
public void testAltSyntaxMethod9() throws Exception {
ValueStack stack = ValueStackFactory.getFactory().createValueStack();
ValueStack stack = ActionContext.getContext().getValueStack();
stack.getContext().put("useAltSyntax", null);
ContextUtil.setAltSyntax("true");
setAltSyntax(stack, "true");
assertTrue(ContextUtil.isUseAltSyntax(stack.getContext()));
}
}
@@ -20,16 +20,24 @@
*/
package org.apache.struts2.views.util;
import com.mockobjects.dynamic.C;
import com.mockobjects.dynamic.Mock;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.conversion.impl.XWorkConverter;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.Scope.Strategy;
import com.opensymphony.xwork2.util.ValueStack;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.StrutsConstants;
import org.apache.struts2.StrutsTestCase;
@@ -38,6 +46,8 @@ import org.apache.struts2.StrutsTestCase;
*
*/
public class UrlHelperTest extends StrutsTestCase {
private StubContainer stubContainer;
public void testForceAddSchemeHostAndPort() throws Exception {
String expectedUrl = "http://localhost/contextPath/path1/path2/myAction.action";
@@ -252,8 +262,8 @@ public class UrlHelperTest extends StrutsTestCase {
String expectedString = "https://www.mydomain.com:7002/mywebapp/MyAction.action?foo=bar&amp;hello=earth&amp;hello=mars";
UrlHelper.setHttpPort("7001");
UrlHelper.setHttpsPort("7002");
setProp(StrutsConstants.STRUTS_URL_HTTP_PORT, "7001");
setProp(StrutsConstants.STRUTS_URL_HTTPS_PORT, "7002");
Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
@@ -281,8 +291,8 @@ public class UrlHelperTest extends StrutsTestCase {
String expectedString = "http://www.mydomain.com:7001/mywebapp/MyAction.action?foo=bar&amp;hello=earth&amp;hello=mars";
UrlHelper.setHttpPort("7001");
UrlHelper.setHttpsPort("7002");
setProp(StrutsConstants.STRUTS_URL_HTTP_PORT, "7001");
setProp(StrutsConstants.STRUTS_URL_HTTPS_PORT, "7002");
Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
@@ -354,7 +364,7 @@ public class UrlHelperTest extends StrutsTestCase {
public void testTranslateAndEncode() throws Exception {
UrlHelper.setCustomEncoding("UTF-8");
setProp(StrutsConstants.STRUTS_I18N_ENCODING, "UTF-8");
String result = UrlHelper.translateAndEncode("\u65b0\u805e");
String expectedResult = "%E6%96%B0%E8%81%9E";
@@ -362,10 +372,64 @@ public class UrlHelperTest extends StrutsTestCase {
}
public void testTranslateAndDecode() throws Exception {
UrlHelper.setCustomEncoding("UTF-8");
setProp(StrutsConstants.STRUTS_I18N_ENCODING, "UTF-8");
String result = UrlHelper.translateAndDecode("%E6%96%B0%E8%81%9E");
String expectedResult = "\u65b0\u805e";
assertEquals(result, expectedResult);
}
public void setUp() throws Exception {
super.setUp();
stubContainer = new StubContainer(container);
ActionContext.getContext().put(ActionContext.CONTAINER, stubContainer);
}
private void setProp(String key, String val) {
stubContainer.overrides.put(key, val);
}
class StubContainer implements Container {
Container parent;
public StubContainer(Container parent) {
super();
this.parent = parent;
}
public Map<String, Object> overrides = new HashMap<String,Object>();
public <T> T getInstance(Class<T> type, String name) {
if (String.class.isAssignableFrom(type) && overrides.containsKey(name)) {
return (T) overrides.get(name);
} else {
return parent.getInstance(type, name);
}
}
public <T> T getInstance(Class<T> type) {
return parent.getInstance(type);
}
public Set<String> getInstanceNames(Class<?> type) {
return parent.getInstanceNames(type);
}
public void inject(Object o) {
parent.inject(o);
}
public <T> T inject(Class<T> implementation) {
return parent.inject(implementation);
}
public void removeScopeStrategy() {
parent.removeScopeStrategy();
}
public void setScopeStrategy(Strategy scopeStrategy) {
parent.setScopeStrategy(scopeStrategy);
}
}
}
@@ -142,13 +142,13 @@ public class XSLTResultTest extends StrutsTestCase {
}
protected void setUp() throws Exception {
super.setUp();
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
servletContext = new MockServletContext();
result = new XSLTResult();
stack = ValueStackFactory.getFactory().createValueStack();
ActionContext.getContext().setValueStack(stack);
stack = ActionContext.getContext().getValueStack();
MyAction action = new MyAction();
@@ -163,7 +163,8 @@ public class XSLTResultTest extends StrutsTestCase {
ActionContext.getContext().put(ServletActionContext.SERVLET_CONTEXT, servletContext);
}
protected void tearDown() {
protected void tearDown() throws Exception {
super.tearDown();
request = null;
response = null;
servletContext = null;
@@ -27,7 +27,8 @@ import org.apache.struts2.util.ClassLoaderUtils;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.ActionValidatorManagerFactory;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.validator.ActionValidatorManager;
/**
* ListValidatorsAction loads the validations for a given class and context
@@ -40,7 +41,14 @@ public class ListValidatorsAction extends ActionSupport {
private String clazz;
private String context;
List validators = Collections.EMPTY_LIST;
private ActionValidatorManager actionValidatorManager;
@Inject
public void setActionValidatorManager(ActionValidatorManager mgr) {
this.actionValidatorManager = mgr;
}
public String getClazz() {
return clazz;
}
@@ -77,7 +85,7 @@ public class ListValidatorsAction extends ActionSupport {
protected void loadValidators() {
Class value = getClassInstance();
if ( value != null ) {
validators = ActionValidatorManagerFactory.getInstance().getValidators(value, context);
validators = actionValidatorManager.getValidators(value, context);
}
}
@@ -24,8 +24,6 @@ import java.beans.PropertyDescriptor;
import java.util.Set;
import java.util.TreeSet;
import ognl.OgnlRuntime;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -33,6 +31,7 @@ import com.opensymphony.xwork2.ObjectFactory;
import com.opensymphony.xwork2.config.Configuration;
import com.opensymphony.xwork2.config.entities.ActionConfig;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.reflection.ReflectionProvider;
/**
* ShowConfigAction
@@ -53,6 +52,7 @@ public class ShowConfigAction extends ActionNamesAction {
private ConfigurationHelper configHelper;
private ObjectFactory objectFactory;
private ReflectionProvider reflectionProvider;
public String getDetailView() {
return detailView;
@@ -79,6 +79,11 @@ public class ShowConfigAction extends ActionNamesAction {
public void setObjectFactory(ObjectFactory fac) {
this.objectFactory = fac;
}
@Inject
public void setReflectionProvider(ReflectionProvider prov) {
this.reflectionProvider = prov;
}
public String stripPackage(Class clazz) {
return clazz.getName().substring(clazz.getName().lastIndexOf('.') + 1);
@@ -111,8 +116,7 @@ public class ShowConfigAction extends ActionNamesAction {
new TreeSet(configHelper.getActionNames(namespace));
try {
Class clazz = objectFactory.getClassInstance(getConfig().getClassName());
java.util.Collection pds = OgnlRuntime.getPropertyDescriptors(clazz).values();
properties = (PropertyDescriptor[]) pds.toArray(PDSAT);
properties = reflectionProvider.getPropertyDescriptors(clazz);
} catch (Exception e) {
log.error("Unable to get properties for action " + actionName, e);
addActionError("Unable to retrieve action properties: " + e.toString());
@@ -29,13 +29,13 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import ognl.Ognl;
import ognl.OgnlException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.opensymphony.xwork2.util.OgnlUtil;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.reflection.ReflectionContextFactory;
import com.opensymphony.xwork2.util.reflection.ReflectionException;
import com.opensymphony.xwork2.util.reflection.ReflectionProvider;
import com.opensymphony.xwork2.validator.Validator;
/**
@@ -49,7 +49,20 @@ public class ShowValidatorAction extends ListValidatorsAction {
Set properties = Collections.EMPTY_SET;
int selected = 0;
ReflectionProvider reflectionProvider;
ReflectionContextFactory reflectionContextFactory;
@Inject
public void setReflectionProvider(ReflectionProvider prov) {
this.reflectionProvider = prov;
}
@Inject
public void setReflectionContextFactory(ReflectionContextFactory fac) {
this.reflectionContextFactory = fac;
}
public int getSelected() {
return selected;
}
@@ -71,7 +84,7 @@ public class ShowValidatorAction extends ListValidatorsAction {
Validator validator = getSelectedValidator();
properties = new TreeSet();
try {
Map context = Ognl.createDefaultContext(validator);
Map context = reflectionContextFactory.createDefaultContext(validator);
BeanInfo beanInfoFrom = null;
try {
beanInfoFrom = Introspector.getBeanInfo(validator.getClass(), Object.class);
@@ -91,10 +104,9 @@ public class ShowValidatorAction extends ListValidatorsAction {
value = "No read method for property";
} else {
try {
Object expr = OgnlUtil.compile(name);
value = Ognl.getValue(expr, context, validator);
} catch (OgnlException e) {
addActionError("Caught OGNL exception while getting property value for '" + name + "' on validator of type " + validator.getClass().getName());
value = reflectionProvider.getValue(name, context, validator);
} catch (ReflectionException e) {
addActionError("Caught exception while getting property value for '" + name + "' on validator of type " + validator.getClass().getName());
}
}
properties.add(new PropertyInfo(name, pd.getPropertyType(), value));
@@ -83,7 +83,7 @@ public abstract class AbstractTagTest extends StrutsTestCase {
* create our standard mock objects
*/
action = this.getAction();
stack = ValueStackFactory.getFactory().createValueStack();
stack = ActionContext.getContext().getValueStack();
context = stack.getContext();
stack.push(action);
context.put(Head.PARSE_CONTENT, false);
@@ -24,7 +24,7 @@ import javax.faces.context.FacesContext;
import javax.faces.el.EvaluationException;
import javax.faces.el.VariableResolver;
import com.opensymphony.xwork2.util.OgnlValueStack;
import com.opensymphony.xwork2.ognl.OgnlValueStack;
import com.opensymphony.xwork2.ActionContext;
/**
@@ -38,7 +38,6 @@ import com.opensymphony.xwork2.config.entities.InterceptorConfig;
import com.opensymphony.xwork2.config.entities.ResultConfig;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.util.OgnlUtil;
import com.opensymphony.xwork2.validator.Validator;
/**
@@ -144,7 +143,7 @@ public class PlexusObjectFactory extends ObjectFactory {
Map extraContext = new HashMap();
extraContext.put(PLEXUS_COMPONENT_TYPE, Interceptor.class.getName());
Interceptor interceptor = (Interceptor) buildBean(interceptorClassName, extraContext);
OgnlUtil.setProperties(params, interceptor);
reflectionProvider.setProperties(params, interceptor);
interceptor.init();
return interceptor;
@@ -195,7 +194,7 @@ public class PlexusObjectFactory extends ObjectFactory {
Map context = new HashMap();
context.put(PLEXUS_COMPONENT_TYPE, Validator.class.getName());
Validator validator = (Validator) buildBean(className, context);
OgnlUtil.setProperties(params, validator);
reflectionProvider.setProperties(params, validator);
return validator;
}
@@ -43,7 +43,9 @@ import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.interceptor.PreResultListener;
import com.opensymphony.xwork2.util.OgnlValueStack;
import com.opensymphony.xwork2.ognl.OgnlValueStack;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.ValueStackFactory;
/**
* An abstract template page filter that sets up the proper contexts for
@@ -97,8 +99,8 @@ public abstract class TemplatePageFilter extends PageFilter {
ServletContext servletContext = filterConfig.getServletContext();
ActionContext ctx = ServletActionContext.getActionContext(req);
if (ctx == null) {
// ok, one isn't associated with the request, so let's get a ThreadLocal one (which will create one if needed)
OgnlValueStack vs = new OgnlValueStack();
// ok, one isn't associated with the request, so let's create one using the current Dispatcher
ValueStack vs = Dispatcher.getInstance().getContainer().getInstance(ValueStackFactory.class).createValueStack();
vs.getContext().putAll(Dispatcher.getInstance().createContextMap(req, res, null, servletContext));
ctx = new ActionContext(vs.getContext());
if (ctx.getActionInvocation() == null) {
@@ -165,7 +167,7 @@ public abstract class TemplatePageFilter extends PageFilter {
public void setResultCode(String resultCode) {
}
public OgnlValueStack getStack() {
public ValueStack getStack() {
return null;
}
@@ -182,5 +184,8 @@ public abstract class TemplatePageFilter extends PageFilter {
public void setActionEventListener(ActionEventListener listener) {
}
public void init(ActionProxy proxy) throws Exception {
}
}
}
@@ -38,6 +38,7 @@ import org.apache.struts2.dispatcher.Dispatcher;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ObjectFactory;
import com.opensymphony.xwork2.config.entities.ActionConfig;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.interceptor.ScopedModelDriven;
/**
@@ -61,13 +62,19 @@ public class Struts1Action extends DefaultActionSupport implements ScopedModelDr
private String className;
private boolean validate;
private String scopeKey;
private ObjectFactory objectFactory;
@Inject
public void setObjectFactory(ObjectFactory fac) {
this.objectFactory = fac;
}
public String execute() throws Exception {
ActionContext ctx = ActionContext.getContext();
ActionConfig actionConfig = ctx.getActionInvocation().getProxy().getConfig();
Action action = null;
try {
action = (Action) ObjectFactory.getObjectFactory().buildBean(className, null);
action = (Action) objectFactory.buildBean(className, null);
} catch (Exception e) {
throw new StrutsException("Unable to create the legacy Struts Action", e, actionConfig);
}