You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2012/03/21 08:11:30 UTC
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/main/java...
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));