You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by Maurizio Cucchiara <mc...@apache.org> on 2012/03/21 12:01:49 UTC
Re: svn commit: r1303298 - in /struts/struts2/trunk:
core/src/main/java/org/apache/struts2/ core/src/main/java/org/apache/struts2/components/
core/src/main/java/org/apache/struts2/config/ core/src/main/java/org/apache/struts2/dispatcher/
core/src/mai
Hi Lukasz,
good catch!
further potential improvement:
URLHelper has a lot of versions of *buildUrl* methods, each one with a
bunch of arguments.
I wonder if it could get that arguments using the stack (since it was no
longer a static instance and it is context-aware).
Twitter :http://www.twitter.com/m_cucchiara
G+ :https://plus.google.com/107903711540963855921
Linkedin :http://www.linkedin.com/in/mauriziocucchiara
Maurizio Cucchiara
On 21 March 2012 08:11, <lu...@apache.org> wrote:
> Author: lukaszlenart
> Date: Wed Mar 21 07:11:29 2012
> New Revision: 1303298
>
> URL: http://svn.apache.org/viewvc?rev=1303298&view=rev
> Log:
> WW-3777 converts UrlHelper into an interface with default implementation,
> cleanups code and adds support for generics
>
> Added:
>
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java
> - copied, changed from r1302803,
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
>
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
>
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/DefaultUrlHelperTest.java
> - copied, changed from r1302803,
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java
> Removed:
>
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java
> Modified:
>
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
>
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Component.java
>
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java
>
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
>
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java
>
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletDispatcherResult.java
>
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java
>
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/StrutsUtil.java
>
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/URLBean.java
> struts/struts2/trunk/core/src/main/resources/struts-default.xml
>
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletActionRedirectResultTest.java
>
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java
>
> struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/JSPRuntime.java
>
> struts/struts2/trunk/plugins/embeddedjsp/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
>
> struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/result/PortletActionRedirectResult.java
>
> Modified:
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
> (original)
> +++
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
> Wed Mar 21 07:11:29 2012
> @@ -223,4 +223,8 @@ public final class StrutsConstants {
>
> /** Enables caching of parsed OGNL expressions **/
> public static final String STRUTS_ENABLE_OGNL_EXPRESSION_CACHE =
> "struts.ognl.enableExpressionCache";
> +
> + /** The{@link org.apache.struts2.views.util.UrlHelper}
> implementation class **/
> + public static final String STRUTS_URL_HELPER =
> "struts.view.urlHelper";
> +
> }
>
> Modified:
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Component.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Component.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Component.java
> (original)
> +++
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Component.java
> Wed Mar 21 07:11:29 2012
> @@ -21,19 +21,11 @@
>
> package org.apache.struts2.components;
>
> -import java.io.IOException;
> -import java.io.PrintWriter;
> -import java.io.Writer;
> -import java.util.Iterator;
> -import java.util.LinkedHashMap;
> -import java.util.Map;
> -import java.util.Stack;
> -
> -import javax.servlet.http.HttpServletRequest;
> -import javax.servlet.http.HttpServletResponse;
> -
> -import org.apache.struts2.StrutsException;
> +import com.opensymphony.xwork2.inject.Inject;
> +import com.opensymphony.xwork2.util.TextParseUtil;
> +import com.opensymphony.xwork2.util.ValueStack;
> import org.apache.struts2.StrutsConstants;
> +import org.apache.struts2.StrutsException;
> import org.apache.struts2.dispatcher.mapper.ActionMapper;
> import org.apache.struts2.dispatcher.mapper.ActionMapping;
> import org.apache.struts2.util.FastByteArrayOutputStream;
> @@ -41,9 +33,14 @@ import org.apache.struts2.views.jsp.TagU
> import org.apache.struts2.views.util.ContextUtil;
> import org.apache.struts2.views.util.UrlHelper;
>
> -import com.opensymphony.xwork2.inject.Inject;
> -import com.opensymphony.xwork2.util.ValueStack;
> -import com.opensymphony.xwork2.util.TextParseUtil;
> +import javax.servlet.http.HttpServletRequest;
> +import javax.servlet.http.HttpServletResponse;
> +import java.io.IOException;
> +import java.io.PrintWriter;
> +import java.io.Writer;
> +import java.util.LinkedHashMap;
> +import java.util.Map;
> +import java.util.Stack;
>
> /**
> * Base class to extend for UI components.
> @@ -52,12 +49,14 @@ import com.opensymphony.xwork2.util.Text
> *
> */
> public class Component {
> +
> public static final String COMPONENT_STACK = "__component_stack";
>
> protected ValueStack stack;
> protected Map parameters;
> protected ActionMapper actionMapper;
> protected boolean throwExceptionOnELFailure;
> + private UrlHelper urlHelper;
>
> /**
> * Constructor.
> @@ -91,7 +90,11 @@ public class Component {
> public void setThrowExceptionsOnELFailure(String throwException) {
> this.throwExceptionOnELFailure = "true".equals(throwException);
> }
> -
> +
> + @Inject
> + public void setUrlHelper(UrlHelper urlHelper) {
> + this.urlHelper = urlHelper;
> + }
> /**
> * Gets the OGNL value stack assoicated with this component.
> * @return the OGNL value stack assoicated with this component.
> @@ -407,7 +410,7 @@ public class Component {
> String finalNamespace = determineNamespace(namespace, getStack(),
> req);
> ActionMapping mapping = new ActionMapping(finalAction,
> finalNamespace, finalMethod, parameters);
> String uri = actionMapper.getUriFromActionMapping(mapping);
> - return UrlHelper.buildUrl(uri, req, res, parameters, scheme,
> includeContext, encodeResult, forceAddSchemeHostAndPort, escapeAmp);
> + return urlHelper.buildUrl(uri, req, res, parameters, scheme,
> includeContext, encodeResult, forceAddSchemeHostAndPort, escapeAmp);
> }
>
> /**
> @@ -445,8 +448,8 @@ public class Component {
> stack.push(parameters);
> stack.push(this);
> try {
> - for (Iterator iterator = params.entrySet().iterator();
> iterator.hasNext();) {
> - Map.Entry entry = (Map.Entry) iterator.next();
> + for (Object o : params.entrySet()) {
> + Map.Entry entry = (Map.Entry) o;
> String key = (String) entry.getKey();
> stack.setValue(key, entry.getValue());
> }
>
> Modified:
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java
> (original)
> +++
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java
> Wed Mar 21 07:11:29 2012
> @@ -27,16 +27,15 @@ import com.opensymphony.xwork2.config.en
> import com.opensymphony.xwork2.inject.Inject;
> import com.opensymphony.xwork2.util.logging.Logger;
> import com.opensymphony.xwork2.util.logging.LoggerFactory;
> +import org.apache.commons.lang3.StringUtils;
> import org.apache.struts2.StrutsException;
> import org.apache.struts2.dispatcher.mapper.ActionMapper;
> import org.apache.struts2.dispatcher.mapper.ActionMapping;
> import org.apache.struts2.views.util.UrlHelper;
> -import org.apache.commons.lang3.StringUtils;
>
> import java.io.IOException;
> import java.io.Writer;
> import java.util.Collections;
> -import java.util.Iterator;
> import java.util.LinkedHashMap;
> import java.util.Map;
>
> @@ -51,12 +50,17 @@ public class ServletUrlRenderer implemen
> private static final Logger LOG =
> LoggerFactory.getLogger(ServletUrlRenderer.class);
>
> private ActionMapper actionMapper;
> + private UrlHelper urlHelper;
>
> @Inject
> public void setActionMapper(ActionMapper mapper) {
> this.actionMapper = mapper;
> }
>
> + @Inject
> + public void setUrlHelper(UrlHelper urlHelper) {
> + this.urlHelper = urlHelper;
> + }
>
> /**
> * {@inheritDoc}
> @@ -87,7 +91,7 @@ public class ServletUrlRenderer implemen
> if (_value != null && _value.indexOf("?") > 0) {
> _value = _value.substring(0,
> _value.indexOf("?"));
> }
> - result = UrlHelper.buildUrl(_value,
> urlComponent.getHttpServletRequest(),
> urlComponent.getHttpServletResponse(), urlComponent.getParameters(),
> scheme, urlComponent.isIncludeContext(), urlComponent.isEncode(),
> urlComponent.isForceAddSchemeHostAndPort(), urlComponent.isEscapeAmp());
> + result = urlHelper.buildUrl(_value,
> urlComponent.getHttpServletRequest(),
> urlComponent.getHttpServletResponse(), urlComponent.getParameters(),
> scheme, urlComponent.isIncludeContext(), urlComponent.isEncode(),
> urlComponent.isForceAddSchemeHostAndPort(), urlComponent.isEscapeAmp());
> }
> String anchor = urlComponent.getAnchor();
> if (StringUtils.isNotEmpty(anchor)) {
> @@ -121,8 +125,7 @@ public class ServletUrlRenderer implemen
> * {@inheritDoc}
> */
> public void renderFormUrl(Form formComponent) {
> - String namespace =
> formComponent.determineNamespace(formComponent.namespace,
> formComponent.getStack(),
> - formComponent.request);
> + String namespace =
> formComponent.determineNamespace(formComponent.namespace,
> formComponent.getStack(), formComponent.request);
> String action;
>
> if(formComponent.action != null) {
> @@ -151,8 +154,8 @@ public class ServletUrlRenderer implemen
> if (actionConfig != null) {
>
> ActionMapping mapping = new
> ActionMapping(actionName, namespace, actionMethod,
> formComponent.parameters);
> - String result =
> UrlHelper.buildUrl(formComponent.actionMapper.getUriFromActionMapping(mapping),
> - formComponent.request,
> formComponent.response, null, null, formComponent.includeContext, true);
> + String result =
> urlHelper.buildUrl(formComponent.actionMapper.getUriFromActionMapping(mapping),
> + formComponent.request, formComponent.response, null,
> null, formComponent.includeContext, true);
> formComponent.addParameter("action", result);
>
> // let's try to get the actual action class and name
> @@ -187,7 +190,7 @@ public class ServletUrlRenderer implemen
> LOG.warn("No configuration found for the specified action:
> '" + actionName + "' in namespace: '" + namespace + "'. Form action
> defaulting to 'action' attribute's literal value.");
> }
>
> - String result = UrlHelper.buildUrl(action,
> formComponent.request, formComponent.response, null, null,
> formComponent.includeContext, true);
> + String result = urlHelper.buildUrl(action,
> formComponent.request, formComponent.response, null, null,
> formComponent.includeContext, true);
> formComponent.addParameter("action", result);
>
> // namespace: cut out anything between the start
> and the last /
> @@ -236,7 +239,7 @@ public class ServletUrlRenderer implemen
> }
>
> if (UrlProvider.NONE.equalsIgnoreCase(includeParams)) {
> - mergeRequestParameters(urlComponent.getValue(),
> urlComponent.getParameters(), Collections.EMPTY_MAP);
> + mergeRequestParameters(urlComponent.getValue(),
> urlComponent.getParameters(), Collections.<String, Object>emptyMap());
> } else if (UrlProvider.ALL.equalsIgnoreCase(includeParams)) {
> mergeRequestParameters(urlComponent.getValue(),
> urlComponent.getParameters(),
> urlComponent.getHttpServletRequest().getParameterMap());
>
> @@ -267,7 +270,7 @@ public class ServletUrlRenderer implemen
> }
> private void includeGetParameters(UrlProvider urlComponent) {
> String query = extractQueryString(urlComponent);
> - mergeRequestParameters(urlComponent.getValue(),
> urlComponent.getParameters(), UrlHelper.parseQueryString(query));
> + mergeRequestParameters(urlComponent.getValue(),
> urlComponent.getParameters(), urlHelper.parseQueryString(query));
> }
>
> private String extractQueryString(UrlProvider urlComponent) {
> @@ -304,9 +307,9 @@ public class ServletUrlRenderer implemen
> * @param parameters component parameters
> * @param contextParameters request parameters
> */
> - protected void mergeRequestParameters(String value, Map parameters,
> Map contextParameters){
> + protected void mergeRequestParameters(String value, Map<String,
> Object> parameters, Map<String, Object> contextParameters){
>
> - Map mergedParams = new LinkedHashMap(contextParameters);
> + Map<String, Object> mergedParams = new LinkedHashMap<String,
> Object>(contextParameters);
>
> // Merge contextParameters (from current request) with parameters
> specified in value attribute
> // eg. value="someAction.action?id=someId&venue=someVenue"
> @@ -315,30 +318,23 @@ public class ServletUrlRenderer implemen
> if (value != null && value.trim().length() > 0 &&
> value.indexOf("?") > 0) {
> String queryString = value.substring(value.indexOf("?")+1);
>
> - mergedParams = UrlHelper.parseQueryString(queryString);
> - for (Iterator iterator =
> contextParameters.entrySet().iterator(); iterator.hasNext();) {
> - Map.Entry entry = (Map.Entry) iterator.next();
> - Object key = entry.getKey();
> -
> - if (!mergedParams.containsKey(key)) {
> - mergedParams.put(key, entry.getValue());
> + mergedParams = urlHelper.parseQueryString(queryString);
> + for (Map.Entry<String, Object> entry :
> contextParameters.entrySet()) {
> + if (!mergedParams.containsKey(entry.getKey())) {
> + mergedParams.put(entry.getKey(), entry.getValue());
> }
> }
> }
>
> -
> // Merge parameters specified in value attribute
> // eg. value="someAction.action?id=someId&venue=someVenue"
> // with parameters specified though param tag
> // eg. <param name="id" value="%{'someId'}" />
> // where parameters specified through param tag takes priority.
>
> - for (Iterator iterator = mergedParams.entrySet().iterator();
> iterator.hasNext();) {
> - Map.Entry entry = (Map.Entry) iterator.next();
> - Object key = entry.getKey();
> -
> - if (!parameters.containsKey(key)) {
> - parameters.put(key, entry.getValue());
> + for (Map.Entry<String, Object> entry : mergedParams.entrySet()) {
> + if (!parameters.containsKey(entry.getKey())) {
> + parameters.put(entry.getKey(), entry.getValue());
> }
> }
> }
>
> Modified:
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
> (original)
> +++
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
> Wed Mar 21 07:11:29 2012
> @@ -21,17 +21,6 @@
>
> package org.apache.struts2.config;
>
> -import java.util.Properties;
> -import java.util.StringTokenizer;
> -
> -import org.apache.struts2.StrutsConstants;
> -import org.apache.struts2.components.UrlRenderer;
> -import org.apache.struts2.dispatcher.StaticContentLoader;
> -import org.apache.struts2.dispatcher.mapper.ActionMapper;
> -import org.apache.struts2.dispatcher.multipart.MultiPartRequest;
> -import org.apache.struts2.views.freemarker.FreemarkerManager;
> -import org.apache.struts2.views.velocity.VelocityManager;
> -
> import com.opensymphony.xwork2.ActionProxyFactory;
> import com.opensymphony.xwork2.ObjectFactory;
> import com.opensymphony.xwork2.TextProvider;
> @@ -46,13 +35,27 @@ import com.opensymphony.xwork2.inject.Co
> import com.opensymphony.xwork2.inject.Context;
> import com.opensymphony.xwork2.inject.Factory;
> import com.opensymphony.xwork2.inject.Scope;
> -import com.opensymphony.xwork2.util.*;
> +import com.opensymphony.xwork2.util.ClassLoaderUtil;
> +import com.opensymphony.xwork2.util.LocalizedTextUtil;
> +import com.opensymphony.xwork2.util.PatternMatcher;
> +import com.opensymphony.xwork2.util.ValueStackFactory;
> import com.opensymphony.xwork2.util.location.LocatableProperties;
> import com.opensymphony.xwork2.util.logging.Logger;
> import com.opensymphony.xwork2.util.logging.LoggerFactory;
> import com.opensymphony.xwork2.util.reflection.ReflectionContextFactory;
> import com.opensymphony.xwork2.util.reflection.ReflectionProvider;
> import com.opensymphony.xwork2.validator.ActionValidatorManager;
> +import org.apache.struts2.StrutsConstants;
> +import org.apache.struts2.components.UrlRenderer;
> +import org.apache.struts2.dispatcher.StaticContentLoader;
> +import org.apache.struts2.dispatcher.mapper.ActionMapper;
> +import org.apache.struts2.dispatcher.multipart.MultiPartRequest;
> +import org.apache.struts2.views.freemarker.FreemarkerManager;
> +import org.apache.struts2.views.util.UrlHelper;
> +import org.apache.struts2.views.velocity.VelocityManager;
> +
> +import java.util.Properties;
> +import java.util.StringTokenizer;
>
> /**
> * Selects the implementations of key framework extension points, using
> the loaded
> @@ -178,7 +181,9 @@ import com.opensymphony.xwork2.validator
> * </ul>
> */
> public class BeanSelectionProvider implements ConfigurationProvider {
> +
> public static final String DEFAULT_BEAN_NAME = "struts";
> +
> private static final Logger LOG =
> LoggerFactory.getLogger(BeanSelectionProvider.class);
>
> public void destroy() {
> @@ -191,7 +196,6 @@ public class BeanSelectionProvider imple
>
> public void init(Configuration configuration) throws
> ConfigurationException {
> // NO-OP
> -
> }
>
> public boolean needsReload() {
> @@ -216,6 +220,7 @@ public class BeanSelectionProvider imple
> alias(PatternMatcher.class, StrutsConstants.STRUTS_PATTERNMATCHER,
> builder, props);
> alias(StaticContentLoader.class,
> StrutsConstants.STRUTS_STATIC_CONTENT_LOADER, builder, props);
> alias(UnknownHandlerManager.class,
> StrutsConstants.STRUTS_UNKNOWN_HANDLER_MANAGER, builder, props);
> + alias(UrlHelper.class, StrutsConstants.STRUTS_URL_HELPER,
> builder, props);
>
> if
> ("true".equalsIgnoreCase(props.getProperty(StrutsConstants.STRUTS_DEVMODE)))
> {
> props.setProperty(StrutsConstants.STRUTS_I18N_RELOAD, "true");
> @@ -271,7 +276,7 @@ public class BeanSelectionProvider imple
> String foundName = props.getProperty(key, DEFAULT_BEAN_NAME);
> if (builder.contains(type, foundName)) {
> if (LOG.isInfoEnabled()) {
> - LOG.info("Choosing bean ("+foundName+") for "+type);
> + LOG.info("Choosing bean (" + foundName + ") for " +
> type);
> }
> builder.alias(type, foundName, Container.DEFAULT_NAME);
> } else {
> @@ -305,8 +310,10 @@ public class BeanSelectionProvider imple
> }
>
> static class ObjectFactoryDelegateFactory implements Factory {
> +
> String name;
> Class type;
> +
> ObjectFactoryDelegateFactory(String name, Class type) {
> this.name = name;
> this.type = type;
> @@ -320,5 +327,7 @@ public class BeanSelectionProvider imple
> throw new ConfigurationException("Unable to load bean
> "+type.getName()+" ("+name+")");
> }
> }
> +
> }
> +
> }
>
> Modified:
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java
> (original)
> +++
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletActionRedirectResult.java
> Wed Mar 21 07:11:29 2012
> @@ -21,20 +21,17 @@
>
> package org.apache.struts2.dispatcher;
>
> -import java.util.Arrays;
> -import java.util.List;
> -
> +import com.opensymphony.xwork2.ActionInvocation;
> +import com.opensymphony.xwork2.util.reflection.ReflectionExceptionHandler;
> import org.apache.struts2.dispatcher.mapper.ActionMapper;
> import org.apache.struts2.dispatcher.mapper.ActionMapping;
>
> -import com.opensymphony.xwork2.ActionInvocation;
> -import com.opensymphony.xwork2.util.logging.Logger;
> -import com.opensymphony.xwork2.util.logging.LoggerFactory;
> -import com.opensymphony.xwork2.util.reflection.ReflectionExceptionHandler;
> +import java.util.Arrays;
> +import java.util.List;
>
> /**
> * <!-- START SNIPPET: description -->
> - *
> + *
> * This result uses the {@link ActionMapper} provided by the
> * {@link ActionMapperFactory} to redirect the browser to a URL that
> invokes the
> * specified action and (optional) namespace. This is better than the
> @@ -44,40 +41,40 @@ import com.opensymphony.xwork2.util.refl
> * and your application will still work. It is strongly recommended that
> if you
> * are redirecting to another action, you use this result rather than the
> * standard redirect result.
> - *
> + *
> * See examples below for an example of how request parameters could be
> passed
> * in.
> - *
> + *
> * <!-- END SNIPPET: description -->
> - *
> + *
> * <b>This result type takes the following parameters:</b>
> - *
> + *
> * <!-- START SNIPPET: params -->
> - *
> + *
> * <ul>
> - *
> + *
> * <li><b>actionName (default)</b> - The name of the action that will be
> * redirected to.</li>
> - *
> + *
> * <li><b>namespace</b> - Used to determine which namespace the action is
> in
> * that we're redirecting to. If namespace is null, the default will be
> the
> * current namespace.</li>
> - *
> + *
> * <li><b>suppressEmptyParameters</b> - Optional boolean (defaults to
> false) that
> * can prevent parameters with no values from being included in the
> redirect
> * URL.</li>
> *
> - * <li><b>parse</b> - Boolean, true by default. If set to false, the
> actionName
> + * <li><b>parse</b> - Boolean, true by default. If set to false, the
> actionName
> * param will not be parsed for Ognl expressions.</li>
> *
> - * <li><b>anchor</b> - Optional. Also known as "fragment" or
> colloquially as
> + * <li><b>anchor</b> - Optional. Also known as "fragment" or
> colloquially as
> * "hash". You can specify an anchor for a result.</li>
> * </ul>
> - *
> + *
> * <!-- END SNIPPET: params -->
> - *
> + *
> * <b>Example:</b>
> - *
> + *
> * <pre>
> * <!-- START SNIPPET: example -->
> * <package name="public" extends="struts-default">
> @@ -89,19 +86,19 @@ import com.opensymphony.xwork2.util.refl
> * </result>
> * </action>
> * </package>
> - *
> + *
> * <package name="secure" extends="struts-default"
> namespace="/secure">
> * <-- Redirect to an action in the same namespace -->
> * <action name="dashboard" class="...">
> * <result>dashboard.jsp</result>
> * <result name="error"
> type="redirectAction">error</result>
> * </action>
> - *
> + *
> * <action name="error" class="...">
> * <result>error.jsp</result>
> * </action>
> * </package>
> - *
> + *
> * <package name="passingRequestParameters" extends="struts-default"
> namespace="/passingRequestParameters">
> * <!-- Pass parameters (reportType, width and height) -->
> * <!--
> @@ -121,18 +118,18 @@ import com.opensymphony.xwork2.util.refl
> * </result>
> * </action>
> * </package>
> - *
> - *
> + *
> + *
> * <!-- END SNIPPET: example -->
> * </pre>
> - *
> + *
> * @see ActionMapper
> */
> public class ServletActionRedirectResult extends ServletRedirectResult
> implements ReflectionExceptionHandler {
>
> private static final long serialVersionUID = -9042425229314584066L;
>
> - /** The default parameter */
> + /* The default parameter */
> public static final String DEFAULT_PARAM = "actionName";
>
> protected String actionName;
> @@ -165,68 +162,55 @@ public class ServletActionRedirectResult
> /**
> * @see
> com.opensymphony.xwork2.Result#execute(com.opensymphony.xwork2.ActionInvocation)
> */
> - public void execute(ActionInvocation invocation) throws Exception
> - {
> + public void execute(ActionInvocation invocation) throws Exception {
> actionName = conditionalParse(actionName, invocation);
> - if (namespace == null)
> - {
> + if (namespace == null) {
> namespace = invocation.getProxy().getNamespace();
> - }
> - else
> - {
> + } else {
> namespace = conditionalParse(namespace, invocation);
> }
> - if (method == null)
> - {
> + if (method == null) {
> method = "";
> - }
> - else
> - {
> + } else {
> method = conditionalParse(method, invocation);
> }
>
> - StringBuilder tmpLocation = new
> StringBuilder(actionMapper.getUriFromActionMapping(new
> ActionMapping(actionName, namespace, method, null)));
> + String tmpLocation = actionMapper.getUriFromActionMapping(new
> ActionMapping(actionName, namespace, method, null));
>
> - setLocation(tmpLocation.toString());
> + setLocation(tmpLocation);
>
> super.execute(invocation);
> }
>
> /**
> * Sets the action name
> - *
> - * @param actionName
> - * The name
> + *
> + * @param actionName The name
> */
> - public void setActionName(String actionName)
> - {
> + public void setActionName(String actionName) {
> this.actionName = actionName;
> }
>
> /**
> * Sets the namespace
> - *
> - * @param namespace
> - * The namespace
> + *
> + * @param namespace The namespace
> */
> - public void setNamespace(String namespace)
> - {
> + public void setNamespace(String namespace) {
> this.namespace = namespace;
> }
>
> /**
> * Sets the method
> - *
> - * @param method
> - * The method
> + *
> + * @param method The method
> */
> - public void setMethod(String method)
> - {
> + public void setMethod(String method) {
> this.method = method;
> }
>
> - protected List<String> getProhibitedResultParams()
> - {
> + protected List<String> getProhibitedResultParams() {
> return Arrays.asList(DEFAULT_PARAM, "namespace", "method",
> "encode", "parse", "location", "prependServletContext",
> "suppressEmptyParameters", "anchor");
> }
> +
> }
>
> Modified:
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletDispatcherResult.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletDispatcherResult.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletDispatcherResult.java
> (original)
> +++
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletDispatcherResult.java
> Wed Mar 21 07:11:29 2012
> @@ -22,8 +22,10 @@
> package org.apache.struts2.dispatcher;
>
> import com.opensymphony.xwork2.ActionInvocation;
> +import com.opensymphony.xwork2.inject.Inject;
> import com.opensymphony.xwork2.util.logging.Logger;
> import com.opensymphony.xwork2.util.logging.LoggerFactory;
> +import org.apache.commons.lang.StringUtils;
> import org.apache.commons.lang3.ObjectUtils;
> import org.apache.struts2.ServletActionContext;
> import org.apache.struts2.StrutsStatics;
> @@ -95,6 +97,8 @@ public class ServletDispatcherResult ext
>
> private static final Logger LOG =
> LoggerFactory.getLogger(ServletDispatcherResult.class);
>
> + private UrlHelper urlHelper;
> +
> public ServletDispatcherResult() {
> super();
> }
> @@ -103,6 +107,11 @@ public class ServletDispatcherResult ext
> super(location);
> }
>
> + @Inject
> + public void setUrlHelper(UrlHelper urlHelper) {
> + this.urlHelper = urlHelper;
> + }
> +
> /**
> * Dispatches to the given location. Does its forward via a
> RequestDispatcher. If the
> * dispatch fails a 404 error will be sent back in the http response.
> @@ -128,11 +137,10 @@ public class ServletDispatcherResult ext
>
> //add parameters passed on the location to #parameters
> // see WW-2120
> - if (invocation != null && finalLocation != null &&
> finalLocation.length() > 0
> - && finalLocation.indexOf("?") > 0) {
> + if (StringUtils.isNotEmpty(finalLocation) &&
> finalLocation.indexOf("?") > 0) {
> String queryString =
> finalLocation.substring(finalLocation.indexOf("?") + 1);
> - Map parameters = (Map)
> invocation.getInvocationContext().getContextMap().get("parameters");
> - Map queryParams = UrlHelper.parseQueryString(queryString,
> true);
> + Map<String, Object> parameters =
> getParameters(invocation);
> + Map<String, Object> queryParams =
> urlHelper.parseQueryString(queryString, true);
> if (queryParams != null && !queryParams.isEmpty())
> parameters.putAll(queryParams);
> }
> @@ -140,7 +148,6 @@ public class ServletDispatcherResult ext
> // if the view doesn't exist, let's do a 404
> if (dispatcher == null) {
> response.sendError(404, "result '" + finalLocation + "'
> not found");
> -
> return;
> }
>
> @@ -160,4 +167,10 @@ public class ServletDispatcherResult ext
> }
> }
> }
> +
> + @SuppressWarnings("unchecked")
> + private Map<String, Object> getParameters(ActionInvocation
> invocation) {
> + return (Map<String, Object>)
> invocation.getInvocationContext().getContextMap().get("parameters");
> + }
> +
> }
>
> Modified:
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java
> (original)
> +++
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java
> Wed Mar 21 07:11:29 2012
> @@ -100,17 +100,14 @@ public class ServletRedirectResult exten
> private static final Logger LOG =
> LoggerFactory.getLogger(ServletRedirectResult.class);
>
> protected boolean prependServletContext = true;
> -
> protected ActionMapper actionMapper;
> -
> protected int statusCode = SC_FOUND;
> -
> protected boolean suppressEmptyParameters = false;
> -
> - protected Map<String, String> requestParameters = new
> LinkedHashMap<String, String>();
> -
> + protected Map<String, Object> requestParameters = new
> LinkedHashMap<String, Object>();
> protected String anchor;
>
> + private UrlHelper urlHelper;
> +
> public ServletRedirectResult() {
> super();
> }
> @@ -125,13 +122,16 @@ public class ServletRedirectResult exten
> }
>
> @Inject
> - public void setActionMapper(ActionMapper mapper)
> - {
> + public void setActionMapper(ActionMapper mapper) {
> this.actionMapper = mapper;
> }
>
> - public void setStatusCode(int code)
> - {
> + @Inject
> + public void setUrlHelper(UrlHelper urlHelper) {
> + this.urlHelper = urlHelper;
> + }
> +
> + public void setStatusCode(int code) {
> this.statusCode = code;
> }
>
> @@ -140,8 +140,7 @@ public class ServletRedirectResult exten
> *
> * @param anchor
> */
> - public void setAnchor(String anchor)
> - {
> + public void setAnchor(String anchor) {
> this.anchor = anchor;
> }
>
> @@ -149,22 +148,16 @@ public class ServletRedirectResult exten
> * Sets whether or not to prepend the servlet context path to the
> redirected
> * URL.
> *
> - * @param prependServletContext
> - * <tt>true</tt> to prepend the location with the servlet
> context
> - * path, <tt>false</tt> otherwise.
> + * @param prependServletContext <tt>true</tt> to prepend the location
> with the servlet context path, <tt>false</tt> otherwise.
> */
> - public void setPrependServletContext(boolean prependServletContext)
> - {
> + public void setPrependServletContext(boolean prependServletContext) {
> this.prependServletContext = prependServletContext;
> }
>
> - public void execute(ActionInvocation invocation) throws Exception
> - {
> - if (anchor != null)
> - {
> + public void execute(ActionInvocation invocation) throws Exception {
> + if (anchor != null) {
> anchor = conditionalParse(anchor, invocation);
> }
> -
> super.execute(invocation);
> }
>
> @@ -172,58 +165,43 @@ public class ServletRedirectResult exten
> * Redirects to the location specified by calling
> * {@link HttpServletResponse#sendRedirect(String)}.
> *
> - * @param finalLocation
> - * the location to redirect to.
> - * @param invocation
> - * an encapsulation of the action execution state.
> - * @throws Exception
> - * if an error occurs when redirecting.
> + * @param finalLocation the location to redirect to.
> + * @param invocation an encapsulation of the action execution state.
> + * @throws Exception if an error occurs when redirecting.
> */
> - protected void doExecute(String finalLocation, ActionInvocation
> invocation) throws Exception
> - {
> + protected void doExecute(String finalLocation, ActionInvocation
> invocation) throws Exception {
> ActionContext ctx = invocation.getInvocationContext();
> HttpServletRequest request = (HttpServletRequest)
> ctx.get(ServletActionContext.HTTP_REQUEST);
> HttpServletResponse response = (HttpServletResponse)
> ctx.get(ServletActionContext.HTTP_RESPONSE);
>
> - if (isPathUrl(finalLocation))
> - {
> - if (!finalLocation.startsWith("/"))
> - {
> + if (isPathUrl(finalLocation)) {
> + if (!finalLocation.startsWith("/")) {
> ActionMapping mapping = actionMapper.getMapping(request,
> Dispatcher.getInstance().getConfigurationManager());
> String namespace = null;
> - if (mapping != null)
> - {
> + if (mapping != null) {
> namespace = mapping.getNamespace();
> }
>
> - if ((namespace != null) && (namespace.length() > 0) &&
> (!"/".equals(namespace)))
> - {
> + if ((namespace != null) && (namespace.length() > 0) &&
> (!"/".equals(namespace))) {
> finalLocation = namespace + "/" + finalLocation;
> - }
> - else
> - {
> + } else {
> finalLocation = "/" + finalLocation;
> }
> }
>
> // if the URL's are relative to the servlet context, append
> the servlet context path
> - if (prependServletContext && (request.getContextPath() !=
> null) && (request.getContextPath().length() > 0))
> - {
> + if (prependServletContext && (request.getContextPath() !=
> null) && (request.getContextPath().length() > 0)) {
> finalLocation = request.getContextPath() + finalLocation;
> }
>
> ResultConfig resultConfig =
> invocation.getProxy().getConfig().getResults().get(invocation.getResultCode());
> - if (resultConfig != null)
> - {
> + if (resultConfig != null) {
> Map<String, String> resultConfigParams =
> resultConfig.getParams();
>
> - for (Map.Entry<String, String> e :
> resultConfigParams.entrySet())
> - {
> - if (!getProhibitedResultParams().contains(e.getKey()))
> - {
> + for (Map.Entry<String, String> e :
> resultConfigParams.entrySet()) {
> + if
> (!getProhibitedResultParams().contains(e.getKey())) {
> String potentialValue = e.getValue() == null ? ""
> : conditionalParse(e.getValue(), invocation);
> - if (!suppressEmptyParameters || ((potentialValue
> != null) && (potentialValue.length() > 0)))
> - {
> + if (!suppressEmptyParameters || ((potentialValue
> != null) && (potentialValue.length() > 0))) {
> requestParameters.put(e.getKey(),
> potentialValue);
> }
> }
> @@ -231,27 +209,24 @@ public class ServletRedirectResult exten
> }
>
> StringBuilder tmpLocation = new StringBuilder(finalLocation);
> - UrlHelper.buildParametersString(requestParameters,
> tmpLocation, "&");
> + urlHelper.buildParametersString(requestParameters,
> tmpLocation, "&");
>
> // add the anchor
> - if (anchor != null)
> - {
> + if (anchor != null) {
> tmpLocation.append('#').append(anchor);
> }
>
> finalLocation =
> response.encodeRedirectURL(tmpLocation.toString());
> }
>
> - if (LOG.isDebugEnabled())
> - {
> + if (LOG.isDebugEnabled()) {
> LOG.debug("Redirecting to finalLocation " + finalLocation);
> }
>
> sendRedirect(response, finalLocation);
> }
>
> - protected List<String> getProhibitedResultParams()
> - {
> + protected List<String> getProhibitedResultParams() {
> return Arrays.asList(DEFAULT_PARAM, "namespace", "method",
> "encode", "parse", "location", "prependServletContext",
> "suppressEmptyParameters", "anchor");
> }
>
> @@ -259,20 +234,14 @@ public class ServletRedirectResult exten
> * Sends the redirection. Can be overridden to customize how the
> redirect is
> * handled (i.e. to use a different status code)
> *
> - * @param response
> - * The response
> - * @param finalLocation
> - * The location URI
> + * @param response The response
> + * @param finalLocation The location URI
> * @throws IOException
> */
> - protected void sendRedirect(HttpServletResponse response, String
> finalLocation) throws IOException
> - {
> - if (SC_FOUND == statusCode)
> - {
> + protected void sendRedirect(HttpServletResponse response, String
> finalLocation) throws IOException {
> + if (SC_FOUND == statusCode) {
> response.sendRedirect(finalLocation);
> - }
> - else
> - {
> + } else {
> response.setStatus(statusCode);
> response.setHeader("Location", finalLocation);
> response.getWriter().write(finalLocation);
> @@ -281,8 +250,7 @@ public class ServletRedirectResult exten
>
> }
>
> - private static boolean isPathUrl(String url)
> - {
> + private static boolean isPathUrl(String url) {
> // filter out "http:", "https:", "mailto:", "file:", "ftp:"
> // since the only valid places for : in URL's is before the path
> specification
> // either before the port, or after the protocol
> @@ -292,31 +260,28 @@ public class ServletRedirectResult exten
> /**
> * Sets the suppressEmptyParameters option
> *
> - * @param suppressEmptyParameters
> - * The new value for this option
> + * @param suppressEmptyParameters The new value for this option
> */
> - public void setSuppressEmptyParameters(boolean
> suppressEmptyParameters)
> - {
> + public void setSuppressEmptyParameters(boolean
> suppressEmptyParameters) {
> this.suppressEmptyParameters = suppressEmptyParameters;
> }
>
> /**
> * Adds a request parameter to be added to the redirect url
> *
> - * @param key
> - * The parameter name
> - * @param value
> - * The parameter value
> + * @param key The parameter name
> + * @param value The parameter value
> */
> - public ServletRedirectResult addParameter(String key, Object value)
> - {
> + public ServletRedirectResult addParameter(String key, Object value) {
> requestParameters.put(key, String.valueOf(value));
> return this;
> }
>
> - public void handle(ReflectionException ex)
> - {
> + 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);
> + if (LOG.isDebugEnabled()) {
> + LOG.debug(ex.getMessage(), ex);
> + }
> }
> +
> }
>
> Modified:
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/StrutsUtil.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/StrutsUtil.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/StrutsUtil.java
> (original)
> +++
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/StrutsUtil.java
> Wed Mar 21 07:11:29 2012
> @@ -45,53 +45,49 @@ import java.util.ArrayList;
> import java.util.Arrays;
> import java.util.Collection;
> import java.util.Hashtable;
> -import java.util.Iterator;
> import java.util.List;
> import java.util.Map;
>
> -
> /**
> * Struts base utility class, for use in Velocity and Freemarker templates
> - *
> */
> public class StrutsUtil {
>
> protected static final Logger LOG =
> LoggerFactory.getLogger(StrutsUtil.class);
>
> -
> protected HttpServletRequest request;
> protected HttpServletResponse response;
> - protected Map classes = new Hashtable();
> + protected Map<String, Class> classes = new Hashtable<String, Class>();
> protected OgnlTool ognl;
> protected ValueStack stack;
>
> + private UrlHelper urlHelper;
> + private ObjectFactory objectFactory;
>
> public StrutsUtil(ValueStack stack, HttpServletRequest request,
> HttpServletResponse response) {
> this.stack = stack;
> this.request = request;
> this.response = response;
> this.ognl =
> ((Container)stack.getContext().get(ActionContext.CONTAINER)).getInstance(OgnlTool.class);
> + this.urlHelper =
> ((Container)stack.getContext().get(ActionContext.CONTAINER)).getInstance(UrlHelper.class);
> + this.objectFactory =
> ((Container)stack.getContext().get(ActionContext.CONTAINER)).getInstance(ObjectFactory.class);
> }
>
> -
> public Object bean(Object aName) throws Exception {
> String name = aName.toString();
> - Class c = (Class) classes.get(name);
> + Class c = classes.get(name);
>
> if (c == null) {
> c = ClassLoaderUtil.loadClass(name, StrutsUtil.class);
> classes.put(name, c);
> }
>
> - return ObjectFactory.getObjectFactory().buildBean(c,
> stack.getContext());
> + return objectFactory.buildBean(c, stack.getContext());
> }
>
> public boolean isTrue(String expression) {
> Boolean retVal = (Boolean) stack.findValue(expression,
> Boolean.class);
> - if (retVal == null) {
> - return false;
> - }
> - return retVal.booleanValue();
> + return retVal != null && retVal;
> }
>
> public Object findString(String name) {
> @@ -134,7 +130,7 @@ public class StrutsUtil {
> }
>
> public String buildUrl(String url) {
> - return UrlHelper.buildUrl(url, request, response, null);
> + return urlHelper.buildUrl(url, request, response, null);
> }
>
> public Object findValue(String expression, String className) throws
> ClassNotFoundException {
> @@ -190,9 +186,8 @@ public class StrutsUtil {
> Collection items = (Collection) stack.findValue(list);
>
> if (items != null) {
> - for (Iterator iter = items.iterator(); iter.hasNext();) {
> - Object element = (Object) iter.next();
> - Object key = null;
> + for (Object element : items) {
> + Object key;
>
> if ((listKey == null) || (listKey.length() == 0)) {
> key = element;
> @@ -284,4 +279,5 @@ public class StrutsUtil {
> writer.write(aByte);
> }
> }
> +
> }
>
> Modified:
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/URLBean.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/URLBean.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/URLBean.java
> (original)
> +++
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/URLBean.java
> Wed Mar 21 07:11:29 2012
> @@ -21,13 +21,14 @@
>
> package org.apache.struts2.util;
>
> -import java.util.HashMap;
> -import java.util.Map;
> +import org.apache.struts2.ServletActionContext;
> +import org.apache.struts2.views.util.DefaultUrlHelper;
> +import org.apache.struts2.views.util.UrlHelper;
>
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpServletResponse;
> -
> -import org.apache.struts2.views.util.UrlHelper;
> +import java.util.HashMap;
> +import java.util.Map;
>
>
> /**
> @@ -36,11 +37,12 @@ import org.apache.struts2.views.util.Url
> */
> public class URLBean {
>
> - HashMap params;
> + HashMap<String, String> params;
> HttpServletRequest request;
> HttpServletResponse response;
> String page;
>
> + private UrlHelper urlHelper;
>
> public URLBean setPage(String page) {
> this.page = page;
> @@ -49,6 +51,7 @@ public class URLBean {
>
> public void setRequest(HttpServletRequest request) {
> this.request = request;
> + urlHelper =
> ServletActionContext.getContext().getInstance(DefaultUrlHelper.class);
> }
>
> public void setResponse(HttpServletResponse response) {
> @@ -57,10 +60,10 @@ public class URLBean {
>
> public String getURL() {
> // all this trickier with maps is to reduce the number of objects
> created
> - Map fullParams = null;
> + Map<String, Object> fullParams = null;
>
> if (params != null) {
> - fullParams = new HashMap();
> + fullParams = new HashMap<String, Object>();
> }
>
> if (page == null) {
> @@ -78,12 +81,12 @@ public class URLBean {
> fullParams.putAll(params);
> }
>
> - return UrlHelper.buildUrl(page, request, response, fullParams);
> + return urlHelper.buildUrl(page, request, response, fullParams);
> }
>
> public URLBean addParameter(String name, Object value) {
> if (params == null) {
> - params = new HashMap();
> + params = new HashMap<String, String>();
> }
>
> if (value == null) {
>
> Copied:
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java
> (from r1302803,
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java)
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java?p2=struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java&p1=struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java&r1=1302803&r2=1303298&rev=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
> (original)
> +++
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java
> Wed Mar 21 07:11:29 2012
> @@ -23,6 +23,7 @@ package org.apache.struts2.views.util;
>
> 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;
> import com.opensymphony.xwork2.util.logging.Logger;
> @@ -37,46 +38,44 @@ import javax.servlet.http.HttpServletRes
> import java.io.UnsupportedEncodingException;
> import java.net.URLDecoder;
> import java.net.URLEncoder;
> -import java.util.ArrayList;
> import java.util.Arrays;
> import java.util.Iterator;
> import java.util.LinkedHashMap;
> import java.util.List;
> import java.util.Map;
>
> -
> /**
> - * UrlHelper
> - *
> + * Default implementation of UrlHelper
> */
> -public class UrlHelper {
> - private static final Logger LOG =
> LoggerFactory.getLogger(UrlHelper.class);
> +public class DefaultUrlHelper implements UrlHelper {
>
> - /**
> - * Default HTTP port (80).
> - */
> - private static final int DEFAULT_HTTP_PORT = 80;
> + private static final Logger LOG =
> LoggerFactory.getLogger(DefaultUrlHelper.class);
>
> - /**
> - * Default HTTPS port (443).
> - */
> - private static final int DEFAULT_HTTPS_PORT = 443;
> + private String encoding = "UTF-8";
>
> - private static final String AMP = "&";
> + @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
> + public void setEncoding(String encoding) {
> + if (StringUtils.isNotEmpty(encoding)) {
> + this.encoding = encoding;
> + }
> + }
>
> - public static String buildUrl(String action, HttpServletRequest
> request, HttpServletResponse response, Map params) {
> + public String buildUrl(String action, HttpServletRequest request,
> HttpServletResponse response, Map<String, Object> params) {
> return buildUrl(action, request, response, params, null, true,
> true);
> }
>
> - public static String buildUrl(String action, HttpServletRequest
> request, HttpServletResponse response, Map params, String scheme, boolean
> includeContext, boolean encodeResult) {
> + public String buildUrl(String action, HttpServletRequest request,
> HttpServletResponse response, Map<String, Object> params, String scheme,
> + boolean includeContext, boolean encodeResult) {
> return buildUrl(action, request, response, params, scheme,
> includeContext, encodeResult, false);
> }
>
> - public static String buildUrl(String action, HttpServletRequest
> request, HttpServletResponse response, Map params, String scheme, boolean
> includeContext, boolean encodeResult, boolean forceAddSchemeHostAndPort) {
> + public String buildUrl(String action, HttpServletRequest request,
> HttpServletResponse response, Map<String, Object> params, String scheme,
> + boolean includeContext, boolean encodeResult,
> boolean forceAddSchemeHostAndPort) {
> return buildUrl(action, request, response, params, scheme,
> includeContext, encodeResult, forceAddSchemeHostAndPort, true);
> }
>
> - public static String buildUrl(String action, HttpServletRequest
> request, HttpServletResponse response, Map params, String scheme, boolean
> includeContext, boolean encodeResult, boolean forceAddSchemeHostAndPort,
> boolean escapeAmp) {
> + public String buildUrl(String action, HttpServletRequest request,
> HttpServletResponse response, Map<String, Object> params, String scheme,
> + boolean includeContext, boolean encodeResult,
> boolean forceAddSchemeHostAndPort, boolean escapeAmp) {
> StringBuilder link = new StringBuilder();
>
> boolean changedScheme = false;
> @@ -191,28 +190,25 @@ public class UrlHelper {
> return result;
> }
>
> - public static void buildParametersString(Map params, StringBuilder
> link) {
> + public void buildParametersString(Map<String, Object> params,
> StringBuilder link) {
> buildParametersString(params, link, AMP);
> }
>
> - public static void buildParametersString(Map params, StringBuilder
> link, String paramSeparator) {
> + public void buildParametersString(Map<String, Object> params,
> StringBuilder link, String paramSeparator) {
> if ((params != null) && (params.size() > 0)) {
> - if (link.toString().indexOf("?") == -1) {
> + if (!link.toString().contains("?")) {
> link.append("?");
> } else {
> link.append(paramSeparator);
> }
>
> // Set params
> - Iterator iter = params.entrySet().iterator();
> -
> -
> + Iterator<Map.Entry<String, Object>> iter =
> params.entrySet().iterator();
> while (iter.hasNext()) {
> - Map.Entry entry = (Map.Entry) iter.next();
> - String name = (String) entry.getKey();
> + Map.Entry<String, Object> entry = iter.next();
> + String name = entry.getKey();
> Object value = entry.getValue();
>
> -
> if (value instanceof Iterable) {
> for (Iterator iterator = ((Iterable)
> value).iterator(); iterator
> .hasNext();) {
> @@ -237,19 +233,19 @@ public class UrlHelper {
> link.append(buildParameterSubstring(name, value !=
> null ? value.toString() : StringUtils.EMPTY));
> }
>
> - if (iter.hasNext())
> + if (iter.hasNext()) {
> link.append(paramSeparator);
> + }
> }
> }
> }
>
>
> - private static String buildParameterSubstring(String name, String
> value) {
> + private String buildParameterSubstring(String name, String value) {
> StringBuilder builder = new StringBuilder();
> builder.append(translateAndEncode(name));
> builder.append('=');
> builder.append(translateAndEncode(value));
> -
> return builder.toString();
> }
>
> @@ -260,66 +256,46 @@ public class UrlHelper {
> * @param input
> * @return the translated and encoded string
> */
> - public static String translateAndEncode(String input) {
> + public String translateAndEncode(String input) {
> String translatedInput = translateVariable(input);
> - String encoding = getEncodingFromConfiguration();
> -
> try {
> return URLEncoder.encode(translatedInput, encoding);
> } catch (UnsupportedEncodingException e) {
> if (LOG.isWarnEnabled()) {
> - LOG.warn("Could not encode URL parameter '" + input + "',
> returning value un-encoded");
> + LOG.warn("Could not encode URL parameter '" + input + "',
> returning value un-encoded");
> }
> return translatedInput;
> }
> }
>
> - public static String translateAndDecode(String input) {
> + public String translateAndDecode(String input) {
> String translatedInput = translateVariable(input);
> - String encoding = getEncodingFromConfiguration();
> -
> try {
> return URLDecoder.decode(translatedInput, encoding);
> } catch (UnsupportedEncodingException e) {
> if (LOG.isWarnEnabled()) {
> - LOG.warn("Could not encode URL parameter '" + input + "',
> returning value un-encoded");
> + LOG.warn("Could not encode URL parameter '" + input + "',
> returning value un-encoded");
> }
> return translatedInput;
> }
> }
>
> - private static String translateVariable(String input) {
> + private String translateVariable(String input) {
> ValueStack valueStack =
> ServletActionContext.getContext().getValueStack();
> - String output = TextParseUtil.translateVariables(input,
> valueStack);
> - return output;
> - }
> -
> - 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 {
> - encoding = "UTF-8";
> - }
> - return encoding;
> + return TextParseUtil.translateVariables(input, valueStack);
> }
>
> - public static Map parseQueryString(String queryString) {
> + public Map<String, Object> parseQueryString(String queryString) {
> return parseQueryString(queryString, false);
> }
>
> - public static Map parseQueryString(String queryString, boolean
> forceValueArray) {
> - Map queryParams = new LinkedHashMap();
> + public Map<String, Object> parseQueryString(String queryString,
> boolean forceValueArray) {
> + Map<String, Object> queryParams = new LinkedHashMap<String,
> Object>();
> if (queryString != null) {
> String[] params = queryString.split("&");
> - for (int a=0; a< params.length; a++) {
> - if (params[a].trim().length() > 0) {
> - String[] tmpParams = params[a].split("=");
> + for (String param : params) {
> + if (param.trim().length() > 0) {
> + String[] tmpParams = param.split("=");
> String paramName = null;
> String paramValue = "";
> if (tmpParams.length > 0) {
> @@ -332,24 +308,19 @@ public class UrlHelper {
> paramName = translateAndDecode(paramName);
> String translatedParamValue =
> translateAndDecode(paramValue);
>
> - if(queryParams.containsKey(paramName) ||
> forceValueArray) {
> + if (queryParams.containsKey(paramName) ||
> forceValueArray) {
> // WW-1619 append new param value to existing
> value(s)
> Object currentParam =
> queryParams.get(paramName);
> - if(currentParam instanceof String) {
> - queryParams.put(paramName, new String[] {
> - (String) currentParam,
> translatedParamValue});
> + if (currentParam instanceof String) {
> + queryParams.put(paramName, new
> String[]{(String) currentParam, translatedParamValue});
> } else {
> String currentParamValues[] = (String[])
> currentParam;
> if (currentParamValues != null) {
> - List paramList = new ArrayList(Arrays
> - .asList(currentParamValues));
> + List<String> paramList =
> Arrays.asList(currentParamValues);
> paramList.add(translatedParamValue);
> - String newParamValues[] = new
> String[paramList
> - .size()];
> - queryParams.put(paramName, paramList
> - .toArray(newParamValues));
> + queryParams.put(paramName,
> paramList.toArray(new String[paramList.size()]));
> } else {
> - queryParams.put(paramName, new
> String[] {translatedParamValue});
> + queryParams.put(paramName, new
> String[]{translatedParamValue});
> }
> }
> } else {
>
> Added:
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java?rev=1303298&view=auto
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
> (added)
> +++
> struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
> Wed Mar 21 07:11:29 2012
> @@ -0,0 +1,43 @@
> +package org.apache.struts2.views.util;
> +
> +import javax.servlet.http.HttpServletRequest;
> +import javax.servlet.http.HttpServletResponse;
> +import java.util.Map;
> +
> +/**
> + * Helper class used to build Urls or parse request params
> + */
> +public interface UrlHelper {
> +
> + /**
> + * Default HTTP port (80).
> + */
> + static final int DEFAULT_HTTP_PORT = 80;
> +
> + /**
> + * Default HTTPS port (443).
> + */
> + static final int DEFAULT_HTTPS_PORT = 443;
> +
> + static final String AMP = "&";
> +
> + String buildUrl(String action, HttpServletRequest request,
> HttpServletResponse response, Map<String, Object> params);
> +
> + String buildUrl(String action, HttpServletRequest request,
> HttpServletResponse response, Map<String, Object> params, String scheme,
> + boolean includeContext, boolean encodeResult);
> +
> + String buildUrl(String action, HttpServletRequest request,
> HttpServletResponse response, Map<String, Object> params, String scheme,
> + boolean includeContext, boolean encodeResult, boolean
> forceAddSchemeHostAndPort);
> +
> + String buildUrl(String action, HttpServletRequest request,
> HttpServletResponse response, Map<String, Object> params, String scheme,
> + boolean includeContext, boolean encodeResult, boolean
> forceAddSchemeHostAndPort, boolean escapeAmp);
> +
> + void buildParametersString(Map<String, Object> params, StringBuilder
> link);
> +
> + void buildParametersString(Map<String, Object> params, StringBuilder
> link, String paramSeparator);
> +
> + Map<String, Object> parseQueryString(String queryString);
> +
> + Map<String, Object> parseQueryString(String queryString, boolean
> forceValueArray);
> +
> +}
>
> Modified: struts/struts2/trunk/core/src/main/resources/struts-default.xml
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/struts-default.xml?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> --- struts/struts2/trunk/core/src/main/resources/struts-default.xml
> (original)
> +++ struts/struts2/trunk/core/src/main/resources/struts-default.xml Wed
> Mar 21 07:11:29 2012
> @@ -73,6 +73,7 @@
> <bean type="com.opensymphony.xwork2.TextProvider" name="struts"
> class="com.opensymphony.xwork2.TextProviderSupport" scope="default" />
>
> <bean type="org.apache.struts2.components.UrlRenderer" name="struts"
> class="org.apache.struts2.components.ServletUrlRenderer"/>
> + <bean type="org.apache.struts2.views.util.UrlHelper" name="struts"
> class="org.apache.struts2.views.util.DefaultUrlHelper"/>
>
> <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" />
>
> Modified:
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletActionRedirectResultTest.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletActionRedirectResultTest.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletActionRedirectResultTest.java
> (original)
> +++
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletActionRedirectResultTest.java
> Wed Mar 21 07:11:29 2012
> @@ -31,6 +31,7 @@ import com.opensymphony.xwork2.util.Valu
> import org.apache.struts2.ServletActionContext;
> import org.apache.struts2.StrutsTestCase;
> import org.apache.struts2.dispatcher.mapper.ActionMapper;
> +import org.apache.struts2.views.util.DefaultUrlHelper;
> import org.easymock.IMocksControl;
> import org.springframework.mock.web.MockHttpServletRequest;
> import org.springframework.mock.web.MockHttpServletResponse;
> @@ -89,6 +90,7 @@ public class ServletActionRedirectResult
> result.setEncode(false);
> result.setPrependServletContext(false);
> result.setAnchor("fragment");
> + result.setUrlHelper(new DefaultUrlHelper());
>
> IMocksControl control = createControl();
> ActionProxy mockActionProxy =
> control.createMock(ActionProxy.class);
> @@ -143,6 +145,7 @@ public class ServletActionRedirectResult
> result.setEncode(false);
> result.setPrependServletContext(false);
> result.setAnchor("fragment");
> + result.setUrlHelper(new DefaultUrlHelper());
>
> IMocksControl control = createControl();
> ActionProxy mockActionProxy =
> control.createMock(ActionProxy.class);
> @@ -177,7 +180,7 @@ public class ServletActionRedirectResult
> .build();
>
> ObjectFactory factory = container.getInstance(ObjectFactory.class);
> - ServletActionRedirectResult result =
> (ServletActionRedirectResult) factory.buildResult(resultConfig, new
> HashMap());
> + ServletActionRedirectResult result =
> (ServletActionRedirectResult) factory.buildResult(resultConfig, new
> HashMap<String, Object>());
> assertNotNull(result);
> }
>
>
> Modified:
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java
> (original)
> +++
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java
> Wed Mar 21 07:11:29 2012
> @@ -35,19 +35,24 @@ import org.apache.struts2.ServletActionC
> import org.apache.struts2.StrutsStatics;
> import org.apache.struts2.StrutsTestCase;
> import org.apache.struts2.dispatcher.mapper.ActionMapper;
> -import static org.easymock.EasyMock.*;
> +import org.apache.struts2.views.util.DefaultUrlHelper;
> import org.easymock.IMocksControl;
> import org.springframework.mock.web.MockHttpServletRequest;
> import org.springframework.mock.web.MockHttpServletResponse;
>
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpServletResponse;
> -import static javax.servlet.http.HttpServletResponse.SC_SEE_OTHER;
> import java.io.PrintWriter;
> import java.io.StringWriter;
> import java.util.HashMap;
> import java.util.Map;
>
> +import static javax.servlet.http.HttpServletResponse.SC_SEE_OTHER;
> +import static org.easymock.EasyMock.createControl;
> +import static org.easymock.EasyMock.createNiceMock;
> +import static org.easymock.EasyMock.expect;
> +import static org.easymock.EasyMock.replay;
> +
>
> /**
> */
> @@ -188,6 +193,7 @@ public class ServletRedirectResultTest e
> result.setEncode(false);
> result.setPrependServletContext(false);
> result.setAnchor("fragment");
> + result.setUrlHelper(new DefaultUrlHelper());
>
> IMocksControl control = createControl();
> ActionProxy mockActionProxy =
> control.createMock(ActionProxy.class);
>
> Copied:
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/DefaultUrlHelperTest.java
> (from r1302803,
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java)
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/DefaultUrlHelperTest.java?p2=struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/DefaultUrlHelperTest.java&p1=struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java&r1=1302803&r2=1303298&rev=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java
> (original)
> +++
> struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/DefaultUrlHelperTest.java
> Wed Mar 21 07:11:29 2012
> @@ -38,12 +38,13 @@ import java.util.TreeMap;
>
>
> /**
> - * Test case for UrlHelper.
> + * Test case for DefaultUrlHelper.
> *
> */
> -public class UrlHelperTest extends StrutsTestCase {
> +public class DefaultUrlHelperTest extends StrutsTestCase {
>
> private StubContainer stubContainer;
> + private DefaultUrlHelper urlHelper;
>
> public void testForceAddSchemeHostAndPort() throws Exception {
> String expectedUrl = "
> http://localhost/contextPath/path1/path2/myAction.action";
> @@ -57,7 +58,7 @@ public class UrlHelperTest extends Strut
> Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
> mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl,
> expectedUrl);
>
> - String result =
> UrlHelper.buildUrl("/path1/path2/myAction.action", (HttpServletRequest)
> mockHttpServletRequest.proxy(),
> (HttpServletResponse)mockHttpServletResponse.proxy(), null, "http", true,
> true, true);
> + String result =
> urlHelper.buildUrl("/path1/path2/myAction.action", (HttpServletRequest)
> mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), null, "http", true, true, true);
> assertEquals(expectedUrl, result);
> mockHttpServletRequest.verify();
> }
> @@ -73,7 +74,7 @@ public class UrlHelperTest extends Strut
> Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
> mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl,
> expectedUrl);
>
> - String result =
> UrlHelper.buildUrl("/path1/path2/myAction.action",
> (HttpServletRequest)mockHttpServletRequest.proxy(),
> (HttpServletResponse)mockHttpServletResponse.proxy(), null, "http", true,
> true, false);
> + String result =
> urlHelper.buildUrl("/path1/path2/myAction.action", (HttpServletRequest)
> mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), null, "http", true, true, false);
>
> assertEquals(expectedUrl, result);
> }
> @@ -90,7 +91,7 @@ public class UrlHelperTest extends Strut
> Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
> mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl,
> expectedUrl);
>
> - String result =
> UrlHelper.buildUrl("/path1/path2/myAction.action", (HttpServletRequest)
> mockHttpServletRequest.proxy(),
> (HttpServletResponse)mockHttpServletResponse.proxy(), null, "http", true,
> true, true);
> + String result =
> urlHelper.buildUrl("/path1/path2/myAction.action", (HttpServletRequest)
> mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), null, "http", true, true, true);
> assertEquals(expectedUrl, result);
> mockHttpServletRequest.verify();
> }
> @@ -105,7 +106,7 @@ public class UrlHelperTest extends Strut
>
> StringBuilder url = new StringBuilder("
> http://localhost:8080/myContext/myPage.jsp?initParam=initValue");
>
> - UrlHelper.buildParametersString(parameters, url);
> + urlHelper.buildParametersString(parameters, url);
>
> assertEquals(
> expectedUrl, url.toString());
> @@ -121,7 +122,7 @@ public class UrlHelperTest extends Strut
>
> StringBuilder url = new StringBuilder("
> http://localhost:8080/myContext/myPage.jsp?initParam=initValue");
>
> - UrlHelper.buildParametersString(parameters, url);
> + urlHelper.buildParametersString(parameters, url);
>
> assertEquals(
> expectedUrl, url.toString());
> @@ -140,10 +141,10 @@ public class UrlHelperTest extends Strut
> mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl,
> expectedUrl);
>
> - String result = UrlHelper.buildUrl("/path1/path2/myAction.action",
> - (HttpServletRequest) mockHttpServletRequest.proxy(),
> - (HttpServletResponse) mockHttpServletResponse.proxy(), null,
> - null, true, true, true);
> + String result = urlHelper.buildUrl("/path1/path2/myAction.action",
> + (HttpServletRequest) mockHttpServletRequest.proxy(),
> + (HttpServletResponse) mockHttpServletResponse.proxy(),
> null,
> + null, true, true, true);
> assertEquals(expectedUrl, result);
> mockHttpServletRequest.verify();
> }
> @@ -158,7 +159,7 @@ public class UrlHelperTest extends Strut
> Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
> mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl,
> expectedUrl);
>
> - String actualUrl = UrlHelper.buildUrl(expectedUrl,
> (HttpServletRequest) mockHttpServletRequest.proxy(),
> + String actualUrl = urlHelper.buildUrl(expectedUrl,
> (HttpServletRequest) mockHttpServletRequest.proxy(),
> (HttpServletResponse) mockHttpServletResponse.proxy(), new
> HashMap());
> assertEquals(expectedUrl, actualUrl);
> }
> @@ -178,7 +179,7 @@ public class UrlHelperTest extends Strut
> params.put("hello", "world");
> params.put("foo", "bar");
>
> - String urlString = UrlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params);
> + String urlString = urlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params);
> assertEquals(expectedString, urlString);
> }
>
> @@ -197,7 +198,7 @@ public class UrlHelperTest extends Strut
> params.put("hello", "world");
> params.put("foo", "bar");
>
> - String urlString = UrlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params, null, true, true, false, false);
> + String urlString = urlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params, null, true, true, false, false);
> assertEquals(expectedString, urlString);
> }
>
> @@ -213,7 +214,7 @@ public class UrlHelperTest extends Strut
> params.put("hello", new String[]{"earth", "mars"});
> params.put("foo", "bar");
>
> - String urlString = UrlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params);
> + String urlString = urlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params);
> assertEquals(expectedString, urlString);
> }
>
> @@ -238,7 +239,7 @@ public class UrlHelperTest extends Strut
> params.put("hello", new String[]{"earth", "mars"});
> params.put("foo", "bar");
>
> - String urlString = UrlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params, "https", true, true);
> + String urlString = urlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params, "https", true, true);
> assertEquals(expectedString, urlString);
> }
>
> @@ -263,7 +264,7 @@ public class UrlHelperTest extends Strut
> params.put("hello", new String[]{"earth", "mars"});
> params.put("foo", "bar");
>
> - String urlString = UrlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params, "http", true, true);
> + String urlString = urlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params, "http", true, true);
> assertEquals(expectedString, urlString);
> }
>
> @@ -292,7 +293,7 @@ public class UrlHelperTest extends Strut
> params.put("hello", new String[]{"earth", "mars"});
> params.put("foo", "bar");
>
> - String urlString = UrlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params, "https", true, true);
> + String urlString = urlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params, "https", true, true);
> assertEquals(expectedString, urlString);
> }
>
> @@ -321,7 +322,7 @@ public class UrlHelperTest extends Strut
> params.put("hello", new String[]{"earth", "mars"});
> params.put("foo", "bar");
>
> - String urlString = UrlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params, "http", true, true);
> + String urlString = urlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params, "http", true, true);
> assertEquals(expectedString, urlString);
> }
>
> @@ -348,13 +349,13 @@ public class UrlHelperTest extends Strut
> String actionName = "promo.html";
> Map params = new TreeMap();
>
> - String urlString = UrlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params, "https", true, true);
> + String urlString = urlHelper.buildUrl(actionName,
> (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)
> mockHttpServletResponse.proxy(), params, "https", true, true);
> assertEquals(expectedString, urlString);
> }
>
>
> public void testParseQuery() throws Exception {
> - Map result =
> UrlHelper.parseQueryString("aaa=aaaval&bbb=bbbval&ccc=&%3Ca%22%3E=%3Cval%3E");
> + Map result =
> urlHelper.parseQueryString("aaa=aaaval&bbb=bbbval&ccc=&%3Ca%22%3E=%3Cval%3E");
>
> assertEquals(result.get("aaa"), "aaaval");
> assertEquals(result.get("bbb"), "bbbval");
> @@ -363,14 +364,14 @@ public class UrlHelperTest extends Strut
> }
>
> public void testParseEmptyQuery() throws Exception {
> - Map result = UrlHelper.parseQueryString("");
> + Map result = urlHelper.parseQueryString("");
>
> assertNotNull(result);
> assertEquals(result.size(), 0);
> }
>
> public void testParseNullQuery() throws Exception {
> - Map result = UrlHelper.parseQueryString(null);
> + Map result = urlHelper.parseQueryString(null);
>
> assertNotNull(result);
> assertEquals(result.size(), 0);
> @@ -379,7 +380,7 @@ public class UrlHelperTest extends Strut
>
> public void testTranslateAndEncode() throws Exception {
> setProp(StrutsConstants.STRUTS_I18N_ENCODING, "UTF-8");
> - String result = UrlHelper.translateAndEncode("\u65b0\u805e");
> + String result = urlHelper.translateAndEncode("\u65b0\u805e");
> String expectedResult = "%E6%96%B0%E8%81%9E";
>
> assertEquals(result, expectedResult);
> @@ -387,7 +388,7 @@ public class UrlHelperTest extends Strut
>
> public void testTranslateAndDecode() throws Exception {
> setProp(StrutsConstants.STRUTS_I18N_ENCODING, "UTF-8");
> - String result =
> UrlHelper.translateAndDecode("%E6%96%B0%E8%81%9E");
> + String result =
> urlHelper.translateAndDecode("%E6%96%B0%E8%81%9E");
> String expectedResult = "\u65b0\u805e";
>
> assertEquals(result, expectedResult);
> @@ -397,6 +398,7 @@ public class UrlHelperTest extends Strut
> super.setUp();
> stubContainer = new StubContainer(container);
> ActionContext.getContext().put(ActionContext.CONTAINER,
> stubContainer);
> + urlHelper = new DefaultUrlHelper();
> }
>
> private void setProp(String key, String val) {
>
> Modified:
> struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/JSPRuntime.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/JSPRuntime.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/JSPRuntime.java
> (original)
> +++
> struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/JSPRuntime.java
> Wed Mar 21 07:11:29 2012
> @@ -48,13 +48,14 @@ public abstract class JSPRuntime {
> public static void handle(String location, boolean flush) throws
> Exception {
> final HttpServletResponse response =
> ServletActionContext.getResponse();
> final HttpServletRequest request =
> ServletActionContext.getRequest();
> + final UrlHelper urlHelper =
> ServletActionContext.getContext().getInstance(UrlHelper.class);
>
> int i = location.indexOf("?");
> if (i > 0) {
> //extract params from the url and add them to the request
> - Map parameters = ActionContext.getContext().getParameters();
> + Map<String, Object> parameters =
> ActionContext.getContext().getParameters();
> String query = location.substring(i + 1);
> - Map queryParams = UrlHelper.parseQueryString(query, true);
> + Map<String, Object> queryParams =
> urlHelper.parseQueryString(query, true);
> if (queryParams != null && !queryParams.isEmpty())
> parameters.putAll(queryParams);
> location = location.substring(0, i);
>
> Modified:
> struts/struts2/trunk/plugins/embeddedjsp/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/embeddedjsp/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/plugins/embeddedjsp/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
> (original)
> +++
> struts/struts2/trunk/plugins/embeddedjsp/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
> Wed Mar 21 07:11:29 2012
> @@ -28,6 +28,8 @@ import com.opensymphony.xwork2.util.find
> import com.opensymphony.xwork2.util.finder.ClassLoaderInterfaceDelegate;
> import junit.framework.TestCase;
> import org.apache.commons.lang3.StringUtils;
> +import org.apache.struts2.views.util.DefaultUrlHelper;
> +import org.apache.struts2.views.util.UrlHelper;
> import org.easymock.EasyMock;
> import org.easymock.IAnswer;
> import org.springframework.mock.web.MockHttpServletResponse;
> @@ -266,6 +268,10 @@ public class EmbeddedJSPResultTest exten
> //mock container
> Container container = EasyMock.createNiceMock(Container.class);
>
> EasyMock.expect(container.getInstance(XWorkConverter.class)).andReturn(converter).anyTimes();
> +
> + UrlHelper urlHelper = new DefaultUrlHelper();
> +
> EasyMock.expect(container.getInstance(UrlHelper.class)).andReturn(urlHelper).anyTimes();
> +
> EasyMock.replay(container);
> stackContext.put(ActionContext.CONTAINER, container);
> actionContext.setContainer(container);
>
> Modified:
> struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/result/PortletActionRedirectResult.java
> URL:
> http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/result/PortletActionRedirectResult.java?rev=1303298&r1=1303297&r2=1303298&view=diff
>
> ==============================================================================
> ---
> struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/result/PortletActionRedirectResult.java
> (original)
> +++
> struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/result/PortletActionRedirectResult.java
> Wed Mar 21 07:11:29 2012
> @@ -28,15 +28,16 @@ import java.util.Map;
>
> import javax.portlet.PortletMode;
>
> +import org.apache.struts2.StrutsConstants;
> import org.apache.struts2.dispatcher.ServletActionRedirectResult;
> import org.apache.struts2.dispatcher.mapper.ActionMapper;
> import org.apache.struts2.dispatcher.mapper.ActionMapping;
> import org.apache.struts2.portlet.PortletActionConstants;
> -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 org.apache.struts2.views.util.UrlHelper;
>
> /**
> *
> @@ -133,14 +134,12 @@ public class PortletActionRedirectResult
> public static final String DEFAULT_PARAM = "actionName";
>
> protected String actionName;
> -
> protected String namespace;
> -
> protected String method;
>
> - private Map<String, String> requestParameters = new
> LinkedHashMap<String, String>();
> -
> + private Map<String, Object> requestParameters = new
> LinkedHashMap<String, Object>();
> private ActionMapper actionMapper;
> + private UrlHelper urlHelper;
>
> public PortletActionRedirectResult() {
> super();
> @@ -161,23 +160,27 @@ public class PortletActionRedirectResult
> this.method = method;
> }
>
> - protected List<String> prohibitedResultParam = Arrays.asList(new
> String[] { DEFAULT_PARAM, "namespace", "method",
> - "encode", "parse", "location",
> "prependServletContext" });
> + protected List<String> prohibitedResultParam =
> Arrays.asList(DEFAULT_PARAM, "namespace", "method", "encode", "parse",
> + "location", "prependServletContext");
>
> @Inject
> public void setActionMapper(ActionMapper actionMapper) {
> this.actionMapper = actionMapper;
> }
>
> - /**
> + @Inject
> + public void setUrlHelper(UrlHelper urlHelper) {
> + this.urlHelper = urlHelper;
> + }
> +
> + /**
> * @see
> com.opensymphony.xwork2.Result#execute(com.opensymphony.xwork2.ActionInvocation)
> */
> public void execute(ActionInvocation invocation) throws Exception {
> actionName = conditionalParse(actionName, invocation);
> String portletNamespace =
> (String)invocation.getInvocationContext().get(PortletActionConstants.PORTLET_NAMESPACE);
> if (portletMode != null) {
> - Map<PortletMode, String> namespaceMap =
> (Map<PortletMode, String>) invocation.getInvocationContext().get(
> -
> PortletActionConstants.MODE_NAMESPACE_MAP);
> + Map<PortletMode, String> namespaceMap =
> getNamespaceMap(invocation);
> namespace = namespaceMap.get(portletMode);
> }
> if (namespace == null) {
> @@ -194,30 +197,32 @@ public class PortletActionRedirectResult
> String resultCode = invocation.getResultCode();
> if (resultCode != null) {
> ResultConfig resultConfig =
> invocation.getProxy().getConfig().getResults().get(resultCode);
> - Map resultConfigParams = resultConfig.getParams();
> - for (Iterator i =
> resultConfigParams.entrySet().iterator(); i.hasNext();) {
> - Map.Entry e = (Map.Entry) i.next();
> - if
> (!prohibitedResultParam.contains(e.getKey())) {
> -
> requestParameters.put(e.getKey().toString(), e.getValue() == null ? "" :
> conditionalParse(e
> -
> .getValue().toString(), invocation));
> - }
> - }
> + Map<String, String> resultConfigParams =
> resultConfig.getParams();
> + for (Map.Entry<String, String> e :
> resultConfigParams.entrySet()) {
> + if (!prohibitedResultParam.contains(e.getKey())) {
> + requestParameters.put(e.getKey(), e.getValue() ==
> null ? "" : conditionalParse(e.getValue(), invocation));
> + }
> + }
> }
>
> StringBuilder tmpLocation = new
> StringBuilder(actionMapper.getUriFromActionMapping(new
> ActionMapping(actionName,
> (portletNamespace == null ? namespace :
> portletNamespace + namespace), method, null)));
> - UrlHelper.buildParametersString(requestParameters,
> tmpLocation, "&");
> + urlHelper.buildParametersString(requestParameters,
> tmpLocation, "&");
>
> setLocation(tmpLocation.toString());
>
> super.execute(invocation);
> }
>
> - /**
> + @SuppressWarnings("unchecked")
> + private Map<PortletMode, String> getNamespaceMap(ActionInvocation
> invocation) {
> + return (Map<PortletMode, String>)
> invocation.getInvocationContext().get(PortletActionConstants.MODE_NAMESPACE_MAP);
> + }
> +
> + /**
> * Sets the action name
> *
> - * @param actionName
> - * The name
> + * @param actionName The name
> */
> public void setActionName(String actionName) {
> this.actionName = actionName;
> @@ -226,8 +231,7 @@ public class PortletActionRedirectResult
> /**
> * Sets the namespace
> *
> - * @param namespace
> - * The namespace
> + * @param namespace The namespace
> */
> public void setNamespace(String namespace) {
> this.namespace = namespace;
> @@ -236,8 +240,7 @@ public class PortletActionRedirectResult
> /**
> * Sets the method
> *
> - * @param method
> - * The method
> + * @param method The method
> */
> public void setMethod(String method) {
> this.method = method;
> @@ -246,10 +249,8 @@ public class PortletActionRedirectResult
> /**
> * Adds a request parameter to be added to the redirect url
> *
> - * @param key
> - * The parameter name
> - * @param value
> - * The parameter value
> + * @param key The parameter name
> + * @param value The parameter value
> */
> public PortletActionRedirectResult addParameter(String key, Object
> value) {
> requestParameters.put(key, String.valueOf(value));
>
>
>
Re: svn commit: r1303298 - in /struts/struts2/trunk:
core/src/main/java/org/apache/struts2/ core/src/main/java/org/apache/struts2/components/
core/src/main/java/org/apache/struts2/config/ core/src/main/java/org/apache/struts2/dispatcher/
core/src/mai
Posted by Łukasz Lenart <lu...@googlemail.com>.
2012/3/21 Maurizio Cucchiara <mc...@apache.org>:
> further potential improvement:
> URLHelper has a lot of versions of *buildUrl* methods, each one with a
> bunch of arguments.
> I wonder if it could get that arguments using the stack (since it was no
> longer a static instance and it is context-aware).
Yeah, if think the whole class can base on ServletActionContext, but
the problem is that the ServletActionContext has only static accessors
:/
Maybe it can be converted to more as ActionContext and then instance
of ServletActionContext can be passed into UrlHelper's methods.
Regards
--
Łukasz http://www.lenart.org.pl/
mobile +48 606 323 122, office +27 11 0838747
Warszawa JUG conference - Confitura http://confitura.pl/
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org