svn commit: r1533338 - in /struts/struts2/trunk: core/src/main/java/org/apache/struts2/ core/src/main/java/org/apache/struts2/dispatcher/mapper/ core/src/main/java/org/apache/struts2/dispatcher/ng/ pl

2013-10-18 Thread lukaszlenart
Author: lukaszlenart
Date: Fri Oct 18 07:07:32 2013
New Revision: 158

URL: http://svn.apache.org/r158
Log:
WW-4225 Extracts duplicated code into util class

Modified:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/RequestUtils.java

struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java

struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/PrefixBasedActionMapper.java

struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ng/PrepareOperations.java

struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionMapper.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/RequestUtils.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/RequestUtils.java?rev=158&r1=157&r2=158&view=diff
==
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/RequestUtils.java 
(original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/RequestUtils.java 
Fri Oct 18 07:07:32 2013
@@ -62,4 +62,26 @@ public class RequestUtils {
 return requestUri.substring(startIndex, endIndex);
 }
 
+/**
+ * Gets the uri from the request
+ *
+ * @param request The request
+ * @return The uri
+ */
+public static String getUri(HttpServletRequest request) {
+// handle http dispatcher includes.
+String uri = (String) request
+.getAttribute("javax.servlet.include.servlet_path");
+if (uri != null) {
+return uri;
+}
+
+uri = getServletPath(request);
+if (uri != null && !"".equals(uri)) {
+return uri;
+}
+
+uri = request.getRequestURI();
+return uri.substring(request.getContextPath().length());
+}
 }

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java?rev=158&r1=157&r2=158&view=diff
==
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java
 Fri Oct 18 07:07:32 2013
@@ -236,7 +236,7 @@ public class DefaultActionMapper impleme
  */
 public ActionMapping getMapping(HttpServletRequest request, 
ConfigurationManager configManager) {
 ActionMapping mapping = new ActionMapping();
-String uri = getUri(request);
+String uri = RequestUtils.getUri(request);
 
 int indexOfSemicolon = uri.indexOf(";");
 uri = (indexOfSemicolon > -1) ? uri.substring(0, indexOfSemicolon) : 
uri;
@@ -438,29 +438,6 @@ public class DefaultActionMapper impleme
 }
 }
 
-/**
- * Gets the uri from the request
- *
- * @param request The request
- * @return The uri
- */
-protected String getUri(HttpServletRequest request) {
-// handle http dispatcher includes.
-String uri = (String) request
-.getAttribute("javax.servlet.include.servlet_path");
-if (uri != null) {
-return uri;
-}
-
-uri = RequestUtils.getServletPath(request);
-if (uri != null && !"".equals(uri)) {
-return uri;
-}
-
-uri = request.getRequestURI();
-return uri.substring(request.getContextPath().length());
-}
-
 /*
  * (non-Javadoc)
  *

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/PrefixBasedActionMapper.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/PrefixBasedActionMapper.java?rev=158&r1=157&r2=158&view=diff
==
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/PrefixBasedActionMapper.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/PrefixBasedActionMapper.java
 Fri Oct 18 07:07:32 2013
@@ -5,6 +5,7 @@ import com.opensymphony.xwork2.inject.Co
 import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
+import org.apache.struts2.RequestUtils;
 import org.apache.struts2.StrutsConstants;
 
 import javax.servlet.http.HttpServletRequest;
@@ -73,7 +74,7 @@ public class PrefixBasedActionMapper ext
 
 @SuppressWarnings("unchecked")
 public ActionMapping getMapping(HttpServletRequest request, 
ConfigurationManager co

svn commit: r1533340 - in /struts/struts2/trunk: ./ core/src/main/java/org/apache/struts2/ core/src/main/java/org/apache/struts2/dispatcher/mapper/ core/src/main/resources/org/apache/struts2/ core/src

2013-10-18 Thread lukaszlenart
Author: lukaszlenart
Date: Fri Oct 18 07:22:03 2013
New Revision: 1533340

URL: http://svn.apache.org/r1533340
Log:
Merged from STRUTS_2_3_15_X
Changes archetypes version to match latest release [from revision 1532467]

Modified:
struts/struts2/trunk/   (props changed)

struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java

struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java

struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/ParameterAction.java

struts/struts2/trunk/core/src/main/resources/org/apache/struts2/default.properties

struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java
struts/struts2/trunk/src/site/resources/archetype-catalog.xml

Propchange: struts/struts2/trunk/
--
  Merged /struts/struts2/branches/STRUTS_2_3_15_X:r1532467

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=1533340&r1=159&r2=1533340&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 
Fri Oct 18 07:22:03 2013
@@ -271,4 +271,10 @@ public final class StrutsConstants {
 /** Security firewall **/
 public static final String STRUTS_SECURITY_GATE = "struts.securityGate";
 
+/** enables action: prefix **/
+public static final String STRUTS_MAPPER_ACTION_PREFIX_ENABLED = 
"struts.mapper.action.prefix.enabled";
+
+/** enables access to actions in other namespaces than current with 
action: prefix **/
+public static final String STRUTS_MAPPER_ACTION_PREFIX_CROSSNAMESPACES = 
"struts.mapper.action.prefix.crossNamespaces";
+
 }

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java?rev=1533340&r1=159&r2=1533340&view=diff
==
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java
 Fri Oct 18 07:22:03 2013
@@ -33,7 +33,6 @@ import org.apache.commons.lang3.StringUt
 import org.apache.struts2.RequestUtils;
 import org.apache.struts2.ServletActionContext;
 import org.apache.struts2.StrutsConstants;
-import org.apache.struts2.dispatcher.ServletDispatcherResult;
 import org.apache.struts2.util.PrefixTrie;
 
 import javax.servlet.http.HttpServletRequest;
@@ -115,13 +114,14 @@ public class DefaultActionMapper impleme
 
 protected static final String METHOD_PREFIX = "method:";
 protected static final String ACTION_PREFIX = "action:";
-private static final String STRUTS2_ACTION_PREFIX_PARSED = 
"_struts2_action_prefix_parsed";
 
 protected boolean allowDynamicMethodCalls = false;
 protected boolean allowSlashesInActionNames = false;
 protected boolean alwaysSelectFullNamespace = false;
 protected PrefixTrie prefixTrie = null;
 protected Pattern allowedActionNames = 
Pattern.compile("[a-zA-Z0-9._!/\\-]*");
+private boolean allowActionPrefix = false;
+private boolean allowActionCrossNamespaceAccess = false;
 
 protected List extensions = new ArrayList() {{
 add("action");
@@ -134,7 +134,7 @@ public class DefaultActionMapper impleme
 prefixTrie = new PrefixTrie() {
 {
 put(METHOD_PREFIX, new ParameterAction() {
-public void execute(String key, ActionMapping mapping, 
HttpServletRequest request) {
+public void execute(String key, ActionMapping mapping) {
 if (allowDynamicMethodCalls) {
 
mapping.setMethod(key.substring(METHOD_PREFIX.length()));
 }
@@ -142,9 +142,8 @@ public class DefaultActionMapper impleme
 });
 
 put(ACTION_PREFIX, new ParameterAction() {
-public void execute(final String key, ActionMapping 
mapping, HttpServletRequest request) {
-if (request != null && 
request.getAttribute(STRUTS2_ACTION_PREFIX_PARSED) == null) {
-request.setAttribute(STRUTS2_ACTION_PREFIX_PARSED, 
true);
+public void execute(final String key, ActionMapping 
mapping) {
+if (allowActionPrefix) {
 String

svn commit: r1533346 - /struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java

2013-10-18 Thread lukaszlenart
Author: lukaszlenart
Date: Fri Oct 18 07:39:20 2013
New Revision: 1533346

URL: http://svn.apache.org/r1533346
Log:
WW-4182 Adds additional check to avoid NPE

Modified:

struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java?rev=1533346&r1=1533345&r2=1533346&view=diff
==
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java
 Fri Oct 18 07:39:20 2013
@@ -214,7 +214,7 @@ public class DefaultUrlHelper implements
 if (value instanceof Iterable) {
 for (Iterator iterator = ((Iterable) value).iterator(); 
iterator.hasNext();) {
 Object paramValue = iterator.next();
-link.append(buildParameterSubstring(name, 
paramValue.toString()));
+link.append(buildParameterSubstring(name, paramValue 
!= null ? paramValue.toString() : StringUtils.EMPTY));
 
 if (iterator.hasNext()) {
 link.append(paramSeparator);
@@ -224,7 +224,7 @@ public class DefaultUrlHelper implements
 Object[] array = (Object[]) value;
 for (int i = 0; i < array.length; i++) {
 Object paramValue = array[i];
-link.append(buildParameterSubstring(name, 
paramValue.toString()));
+link.append(buildParameterSubstring(name, paramValue 
!= null ? paramValue.toString() : StringUtils.EMPTY));
 
 if (i < array.length - 1) {
 link.append(paramSeparator);




svn commit: r1533354 - in /struts/struts2/trunk/plugins/config-browser/src/main/java/org/apache/struts2/config_browser: ActionNamesAction.java ShowConfigAction.java

2013-10-18 Thread lukaszlenart
Author: lukaszlenart
Date: Fri Oct 18 08:10:07 2013
New Revision: 1533354

URL: http://svn.apache.org/r1533354
Log:
WW-4213 Sanitises input param namespace to avoid XSS

Modified:

struts/struts2/trunk/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ActionNamesAction.java

struts/struts2/trunk/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ShowConfigAction.java

Modified: 
struts/struts2/trunk/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ActionNamesAction.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ActionNamesAction.java?rev=1533354&r1=1533353&r2=1533354&view=diff
==
--- 
struts/struts2/trunk/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ActionNamesAction.java
 (original)
+++ 
struts/struts2/trunk/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ActionNamesAction.java
 Fri Oct 18 08:10:07 2013
@@ -24,6 +24,7 @@ package org.apache.struts2.config_browse
 import com.opensymphony.xwork2.ActionSupport;
 import com.opensymphony.xwork2.config.entities.ActionConfig;
 import com.opensymphony.xwork2.inject.Inject;
+import org.apache.commons.lang3.StringEscapeUtils;
 import org.apache.struts2.StrutsConstants;
 
 import java.util.Set;
@@ -57,7 +58,7 @@ public class ActionNamesAction extends A
 }
 
 public void setNamespace(String namespace) {
-this.namespace = namespace;
+this.namespace = StringEscapeUtils.escapeEcmaScript(namespace);
 }
 
 @Inject(StrutsConstants.STRUTS_ACTION_EXTENSION)

Modified: 
struts/struts2/trunk/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ShowConfigAction.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ShowConfigAction.java?rev=1533354&r1=1533353&r2=1533354&view=diff
==
--- 
struts/struts2/trunk/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ShowConfigAction.java
 (original)
+++ 
struts/struts2/trunk/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ShowConfigAction.java
 Fri Oct 18 08:10:07 2013
@@ -27,6 +27,7 @@ import com.opensymphony.xwork2.inject.In
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import com.opensymphony.xwork2.util.reflection.ReflectionProvider;
+import org.apache.commons.lang3.StringEscapeUtils;
 
 import java.beans.PropertyDescriptor;
 import java.util.Set;
@@ -81,7 +82,7 @@ public class ShowConfigAction extends Ac
 }
 
 public void setNamespace(String namespace) {
-this.namespace = namespace;
+this.namespace = StringEscapeUtils.escapeEcmaScript(namespace);
 }
 
 public String getActionName() {




svn commit: r1533359 - in /struts/struts2/trunk/core/src: main/java/org/apache/struts2/interceptor/RolesInterceptor.java test/java/org/apache/struts2/interceptor/RolesInterceptorTest.java

2013-10-18 Thread lukaszlenart
Author: lukaszlenart
Date: Fri Oct 18 08:33:22 2013
New Revision: 1533359

URL: http://svn.apache.org/r1533359
Log:
WW-4118 Adds logic to allow validate defined roles and changes precedence that 
disallowedRoles are examined first

Modified:

struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/RolesInterceptor.java

struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/RolesInterceptorTest.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/RolesInterceptor.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/RolesInterceptor.java?rev=1533359&r1=1533358&r2=1533359&view=diff
==
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/RolesInterceptor.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/RolesInterceptor.java
 Fri Oct 18 08:33:22 2013
@@ -23,19 +23,20 @@ package org.apache.struts2.interceptor;
 
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.ServletActionContext;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
 /**
- *  This interceptor ensures that the action
- * will only be executed if the user has the correct role. 
+ * 
+ * This interceptor ensures that the action will only be executed if the user 
has the correct role.
+ * 
  *
  *  Interceptor parameters:
  *
@@ -49,15 +50,26 @@ import java.util.List;
  *
  * 
  *
+ * 
+ * When both allowedRoles and disallowedRoles are configured, then 
disallowedRoles
+ * takes precedence, applying the following logic: 
+ *  (if ((inRole(role1) || inRole(role2) || ... inRole(roleN)) && 
+ *   !inRole(roleA) && !inRole(roleB) && ... !inRole(roleZ))
+ *  { //permit ...
+ * 
  * 
  *
- *  There are two extensions to the
- * existing interceptor:
+ * 
+ * There are three extensions to the existing interceptor:
  * 
  *   isAllowed(HttpServletRequest,Object) - whether or not to allow
  *   the passed action execution with this request
  *   handleRejection(ActionInvocation) - handles an unauthorized
  *   request.
+ *   areRolesValid(List roles) - allows subclasses to lookup roles
+ *   to ensure they are valid.  If not valid, RolesInterceptor will log the 
error and 
+ *   cease to function.  This helps prevent security misconfiguration flaws.
+ *   
  * 
  * 
  *
@@ -76,27 +88,42 @@ import java.util.List;
  */
 public class RolesInterceptor extends AbstractInterceptor {
 
-protected List allowedRoles = new ArrayList();
-protected List disallowedRoles = new ArrayList();
+private static final Logger LOG = 
LoggerFactory.getLogger(RolesInterceptor.class);
+
+private boolean isProperlyConfigured = true;
+
+protected List allowedRoles = Collections.emptyList();
+protected List disallowedRoles = Collections.emptyList();
 
 public void setAllowedRoles(String roles) {
-this.allowedRoles = stringToList(roles);
+allowedRoles = stringToList(roles);
+checkRoles(allowedRoles);
 }
 
 public void setDisallowedRoles(String roles) {
-this.disallowedRoles = stringToList(roles);
+disallowedRoles = stringToList(roles);
+checkRoles(disallowedRoles);
+}
+
+private void checkRoles(List roles){
+if (!areRolesValid(roles)){
+  LOG.fatal("An unknown Role was configured: #0", roles.toString());
+  isProperlyConfigured = false;
+  throw new IllegalArgumentException("An unknown role was configured: 
" + roles);
+}
 }
 
 public String intercept(ActionInvocation invocation) throws Exception {
 HttpServletRequest request = ServletActionContext.getRequest();
 HttpServletResponse response = ServletActionContext.getResponse();
-String result;
+if (!isProperlyConfigured) {
+  throw new IllegalArgumentException("RolesInterceptor is 
misconfigured, check logs for erroneous configuration!");
+}
 if (!isAllowed(request, invocation.getAction())) {
-result = handleRejection(invocation, response);
+return handleRejection(invocation, response);
 } else {
-result = invocation.invoke();
+return invocation.invoke();
 }
-return result;
 }
 
 /**
@@ -119,23 +146,23 @@ public class RolesInterceptor extends Ab
  * @return True if allowed, false otherwise
  */
 protected boolean isAllowed(HttpServletRequest request, Object action) {
-if (allowedRoles.size() > 0) {
-

svn commit: r1533360 - /struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java

2013-10-18 Thread lukaszlenart
Author: lukaszlenart
Date: Fri Oct 18 08:39:11 2013
New Revision: 1533360

URL: http://svn.apache.org/r1533360
Log:
WW-4162 Doesn't check for disallowed ognl expressions if getting from 
expression cache

Modified:

struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java?rev=1533360&r1=1533359&r2=1533360&view=diff
==
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
 Fri Oct 18 08:39:11 2013
@@ -266,17 +266,21 @@ public class OgnlUtil {
 tree = expressions.get(expression);
 if (tree == null) {
 tree = Ognl.parseExpression(expression);
+checkEnableEvalExpression(tree, context);
 expressions.putIfAbsent(expression, tree);
 }
 } else {
 tree = Ognl.parseExpression(expression);
+checkEnableEvalExpression(tree, context);
 }
 
+return tree;
+}
+
+private void checkEnableEvalExpression(Object tree, Map 
context) throws OgnlException {
 if (!enableEvalExpression && isEvalExpression(tree, context)) {
-throw new OgnlException("Eval expressions has been disabled");
+throw new OgnlException("Eval expressions has been disabled!");
 }
-
-return tree;
 }
 
 /**




svn commit: r1533366 - in /struts/struts2/trunk/core/src: main/java/org/apache/struts2/components/Param.java main/java/org/apache/struts2/views/jsp/ParamTag.java site/resources/tags/param.html

2013-10-18 Thread lukaszlenart
Author: lukaszlenart
Date: Fri Oct 18 09:16:34 2013
New Revision: 1533366

URL: http://svn.apache.org/r1533366
Log:
WW-4088 Defines new suppressEmptyParams flag

Modified:

struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Param.java

struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/ParamTag.java
struts/struts2/trunk/core/src/site/resources/tags/param.html

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Param.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Param.java?rev=1533366&r1=1533365&r2=1533366&view=diff
==
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Param.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Param.java
 Fri Oct 18 09:16:34 2013
@@ -44,6 +44,7 @@ import java.io.Writer;
  * 
  *  name (String) - the name of the parameter
  *  value (Object) - the value of the parameter
+ *  suppressEmptyParameters (boolean) - whether to suppress empty 
parameters
  * 
  * 
  * 
@@ -67,6 +68,17 @@ import java.io.Writer;
  *  
  * 
  * 
+ * 
+ * Whether to suppress empty parameters:
+ * 
+ * 
+ *   
+ *   
+ *   
+ *   
+ *   
+ * 
+ * 
  * 
  * 
  * 
@@ -91,8 +103,10 @@ import java.io.Writer;
  */
 @StrutsTag(name="param", tldTagClass="org.apache.struts2.views.jsp.ParamTag", 
description="Parametrize other tags")
 public class Param extends Component {
+
 protected String name;
 protected String value;
+protected boolean suppressEmptyParameters;
 
 public Param(ValueStack stack) {
 super(stack);
@@ -111,7 +125,14 @@ public class Param extends Component {
 }
 
 Object value = findValue(this.value);
-component.addParameter(name, value);
+if (suppressEmptyParameters) {
+String potentialValue = (String) value;
+if (potentialValue != null && potentialValue.length() > 0) 
{
+component.addParameter(name, value);
+}
+} else {
+component.addParameter(name, value);
+}
 }
 } else {
 if (component instanceof UnnamedParametric) {
@@ -123,7 +144,7 @@ public class Param extends Component {
 
 return super.end(writer, "");
 }
-
+
 public boolean usesBody() {
 return true;
 }
@@ -138,6 +159,11 @@ public class Param extends Component {
 this.value = value;
 }
 
+@StrutsTagAttribute(description="Whether to suppress empty parameters", 
type="Boolean", defaultValue="false")
+public void setSuppressEmptyParameters(boolean suppressEmptyParameters) {
+this.suppressEmptyParameters = suppressEmptyParameters;
+}
+
 /**
  * Tags can implement this to support nested param tags without the 
name attribute.
  * 

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/ParamTag.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/ParamTag.java?rev=1533366&r1=1533365&r2=1533366&view=diff
==
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/ParamTag.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/ParamTag.java
 Fri Oct 18 09:16:34 2013
@@ -21,13 +21,12 @@
 
 package org.apache.struts2.views.jsp;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import com.opensymphony.xwork2.util.ValueStack;
 import org.apache.struts2.components.Component;
 import org.apache.struts2.components.Param;
 
-import com.opensymphony.xwork2.util.ValueStack;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 /**
  * @see Param
@@ -38,6 +37,7 @@ public class ParamTag extends ComponentT
 
 protected String name;
 protected String value;
+protected boolean suppressEmptyParameters;
 
 public Component getBean(ValueStack stack, HttpServletRequest req, 
HttpServletResponse res) {
 return new Param(stack);
@@ -49,6 +49,7 @@ public class ParamTag extends ComponentT
 Param param = (Param) component;
 param.setName(name);
 param.setValue(value);
+param.setSuppressEmptyParameters(suppressEmptyParameters);

[CONF] Confluence Changes in the last 24 hours

2013-10-18 Thread Anonymous (Confluence)







   Apache ACE


Pages

 Page:
 Analysis and design for batch jobs
edited by Marcel Offermans[10:42 AM]
(view changes)



   Apache Ambari (Incubating)


Pages

 Page:
 Instructions for installing Ambari-1.4.1 bits
edited by Sumit Mohanty[05:00 AM]
(view changes)



   Apache Camel


Pages

 Page:
 HDFS
edited by Ben O'Day[11:21 PM]
(view changes)

 Page:
 Camel 2.13.0 Release
edited by Ben O'Day[11:12 PM]
(view changes)

 Page:
 Splunk
edited by Claus Ibsen[09:17 AM]
(view changes)



   Apache Cloudstack


Pages

 Page:
 Cloudstack 4.3 Release
edited by Amogh Vasekar[11:10 PM]
(view changes)

 Page:
 Improve SystemVm upgrades
created by Kishan Kavala[01:19 PM]

 Page:
 Baremetal KickStart
edited by Jijun[10:20 AM]
(view changes)

 Page:
 Dynamic Compute Offering FS
edited by Bharat Kumar[06:41 AM]
(view changes)



   Apache cTAKES



Comments

 Page:
 cTAKES 3.1 User Install Guide
has 2 new comments
[ Anonymous]


   Apache Flex


Pages

 Page:
 Adding new features
edited by Mark Kessler[08:59 PM]
(view changes)

 Page:
 Mojos
edited by Mark Kessler[08:59 PM]
(view changes)

 Page:
 Maven Plugin
edited by Mark Kessler[08:58 PM]
(view changes)

 Page:
 4.1 How to find JIRA issues to work on
edited by Mark Kessler[08:50 PM]
(view changes)




Comments

 Page:
 Adobe Flash Builder 'New Project' Bug
has a new comment
[ Raghav Kulshrestha]


   Apache Hive


Pages

 Page:
 LanguageManual Types
edited by Lars Francke[03:27 PM]
(view changes)

 Page:
 Security
edited by Lars Francke[03:09 PM]
(view changes)

 Page: