Author: chris.laprun(a)jboss.com
Date: 2008-06-27 18:23:39 -0400 (Fri, 27 Jun 2008)
New Revision: 11180
Modified:
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/test/wsrp/other/WSRPPortletURLTestCase.java
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPActionURL.java
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPPortletURL.java
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPRenderURL.java
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPResourceURL.java
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/producer/WSRPProducerImpl.java
Log:
- JBPORTAL-2048: Allow extra URL parameters in relaxed validation mode. Added appropriate
tests.
- Some generification and documentation.
- Removed unused WSRPPortletURL(Map) constructor.
Modified:
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/test/wsrp/other/WSRPPortletURLTestCase.java
===================================================================
---
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/test/wsrp/other/WSRPPortletURLTestCase.java 2008-06-27
22:23:07 UTC (rev 11179)
+++
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/test/wsrp/other/WSRPPortletURLTestCase.java 2008-06-27
22:23:39 UTC (rev 11180)
@@ -41,10 +41,17 @@
*/
public class WSRPPortletURLTestCase extends TestCase
{
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ WSRPPortletURL.setStrict(true);
+ }
+
public void testResource()
{
String expected =
"wsrp_rewrite?wsrp-urlType=resource&wsrp-url=http%3A%2F%2Ftest.com%2Fimages%2Ftest.gif"
+
- "&wsrp-requiresRewrite=true/wsrp_rewrite";
+ "&wsrp-requiresRewrite=true/wsrp_rewrite";
WSRPPortletURL url = WSRPPortletURL.create(expected);
assertEquals("http://test.com/images/test.gif", url.toString());
@@ -54,7 +61,7 @@
public void testSecureInteraction()
{
String expected =
"wsrp_rewrite?wsrp-urlType=blockingAction&wsrp-secureURL=true" +
-
"&wsrp-navigationalState=a8h4K5JD9&wsrp-interactionState=fg4h923mdk/wsrp_rewrite";
+
"&wsrp-navigationalState=a8h4K5JD9&wsrp-interactionState=fg4h923mdk/wsrp_rewrite";
WSRPPortletURL url = WSRPPortletURL.create(expected);
assertTrue(url instanceof WSRPActionURL);
@@ -94,6 +101,35 @@
checkInvalidURL(invalid, message, "foo");
}
+ /** Relax validation and test that we now accept normally invalid URLs. */
+ public void testExtraParametersRelaxedValidation()
+ {
+ WSRPPortletURL.setStrict(false);
+
+ String validInRelaxedMode =
"wsrp_rewrite?wsrp-urlType=render&foo=bar/wsrp_rewrite";
+
+ WSRPPortletURL url = WSRPPortletURL.create(validInRelaxedMode);
+ assertTrue(url instanceof WSRPRenderURL);
+ assertTrue(url.toString().contains("foo=bar"));
+
+ validInRelaxedMode =
"wsrp_rewrite?wsrp-urlType=render/wsrp_rewrite&foo=bar";
+ url = WSRPPortletURL.create(validInRelaxedMode);
+ assertTrue(url instanceof WSRPRenderURL);
+ assertTrue(url.toString().endsWith("foo=bar"));
+
+ String stillInvalid =
"wsrp_rewrite?wsrp-urlType=render&foo=bar";
+ checkInvalidURL(stillInvalid, "Should have detected missing end token",
WSRPRewritingConstants.END_WSRP_REWRITE);
+ }
+
+ public void testExtraParameters()
+ {
+ String validInRelaxedMode =
"wsrp_rewrite?wsrp-urlType=render&foo=bar/wsrp_rewrite";
+ checkInvalidURL(validInRelaxedMode, "Should have detected invalid parameter:
", "foo");
+
+ validInRelaxedMode =
"wsrp_rewrite?wsrp-urlType=render/wsrp_rewrite&foo=bar";
+ checkInvalidURL(validInRelaxedMode, "Should have detected URL doesn't end
with end token", WSRPRewritingConstants.END_WSRP_REWRITE);
+ }
+
public void testInvalidMode()
{
String message = "Should have detected invalid mode: ";
Modified:
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPActionURL.java
===================================================================
---
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPActionURL.java 2008-06-27
22:23:07 UTC (rev 11179)
+++
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPActionURL.java 2008-06-27
22:23:39 UTC (rev 11180)
@@ -47,31 +47,28 @@
this.interactionState = interactionState;
}
- protected WSRPActionURL(Map params)
- {
- super(params);
- }
-
-
protected WSRPActionURL()
{
}
- protected void setParams(Map params)
+ @Override
+ protected void dealWithSpecificParams(Map<String, String> params)
{
- super.setParams(params);
-
+ super.dealWithSpecificParams(params);
+
String paramValue = getRawParameterValueFor(params,
WSRPRewritingConstants.INTERACTION_STATE);
if (paramValue != null)
{
interactionState = new OpaqueStateString(paramValue);
+ params.remove(WSRPRewritingConstants.INTERACTION_STATE);
}
paramValue = getRawParameterValueFor(params,
WSRPRewritingConstants.NAVIGATIONAL_STATE);
if (paramValue != null)
{
navigationalState = new OpaqueStateString(paramValue);
- }
+ params.remove(WSRPRewritingConstants.NAVIGATIONAL_STATE);
+ }
}
protected String getURLType()
Modified:
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPPortletURL.java
===================================================================
---
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPPortletURL.java 2008-06-27
22:23:07 UTC (rev 11179)
+++
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPPortletURL.java 2008-06-27
22:23:39 UTC (rev 11180)
@@ -26,11 +26,13 @@
import org.jboss.logging.Logger;
import org.jboss.portal.Mode;
import org.jboss.portal.WindowState;
+import org.jboss.portal.common.NotYetImplemented;
import org.jboss.portal.common.text.FastURLDecoder;
import org.jboss.portal.common.util.Tools;
import org.jboss.portal.portlet.ActionURL;
import org.jboss.portal.portlet.PortletURL;
import org.jboss.portal.portlet.RenderURL;
+import org.jboss.portal.portlet.ResourceURL;
import org.jboss.portal.portlet.StateString;
import java.util.Collections;
@@ -56,6 +58,21 @@
private Mode mode;
private WindowState windowState;
+ /** Are we using strict rewriting parameters validation mode? */
+ private static boolean strict = true;
+
+ /** Holds extra parameters if we are in relaxed validation mode */
+ private Map<String, String> extraParams;
+
+ /** Remember position of extra parameters wrt end token */
+ private boolean extraParamsAfterEndToken = false;
+
+ public static void setStrict(boolean strict)
+ {
+ WSRPPortletURL.strict = strict;
+ log.debug("Using " + (strict ? "strict" : "lenient")
+ " rewriting parameters validation mode.");
+ }
+
public static WSRPPortletURL create(PortletURL portletURL, boolean secure)
{
if (portletURL == null)
@@ -66,22 +83,37 @@
Mode mode = portletURL.getMode();
WindowState windowState = portletURL.getWindowState();
+ WSRPPortletURL url;
if (portletURL instanceof ActionURL)
{
StateString interactionState = ((ActionURL)portletURL).getInteractionState();
StateString navigationalState = ((ActionURL)portletURL).getNavigationalState();
- return new WSRPActionURL(mode, windowState, secure, navigationalState,
interactionState);
+ url = new WSRPActionURL(mode, windowState, secure, navigationalState,
interactionState);
}
else if (portletURL instanceof RenderURL)
{
StateString navigationalState = ((RenderURL)portletURL).getNavigationalState();
- return new WSRPRenderURL(mode, windowState, secure, navigationalState);
+ url = new WSRPRenderURL(mode, windowState, secure, navigationalState);
}
- else /*if(portletURL instanceof ResourceURL)*/
+ else if (portletURL instanceof ResourceURL)
{
- // return new WSRPResourceURL(mode, windowState, secure, ((ResourceURL)
portletURL).getResourceURL(), false);
+// url = new WSRPResourceURL(mode, windowState, secure, ((ResourceURL)
portletURL).getResourceURL(), false);
+ // todo: implement!
+ throw new NotYetImplemented("ResourceURL support not quite yet
implemented!");
+ }
+ else
+ {
throw new IllegalArgumentException("Unknown PortletURL type: " +
portletURL.getClass().getName());
}
+
+ // if we're in relaxed mode, we need to deal with extra params as well
+ if (strict && portletURL instanceof WSRPPortletURL)
+ {
+ WSRPPortletURL other = (WSRPPortletURL)portletURL;
+ url.setParams(other.extraParams);
+ }
+
+ return url;
}
public static WSRPPortletURL create(String encodedURL, Set<String> customModes,
Set<String> customWindowStates)
@@ -94,21 +126,45 @@
}
String originalURL = encodedURL;
+ boolean extraAfterEnd = false;
- // URL needs to start wsrp_rewrite? and end with /wsrp_rewrite
+ // URL needs to start wsrp_rewrite? and end with /wsrp_rewrite in strict validation
mode
if (!encodedURL.startsWith(WSRPRewritingConstants.BEGIN_WSRP_REWRITE))
{
throw new IllegalArgumentException(encodedURL + " does not start with
" + WSRPRewritingConstants.BEGIN_WSRP_REWRITE);
}
if (!encodedURL.endsWith(WSRPRewritingConstants.END_WSRP_REWRITE))
{
- throw new IllegalArgumentException(encodedURL + " does not end with "
+ WSRPRewritingConstants.END_WSRP_REWRITE);
+ if (strict)
+ {
+ throw new IllegalArgumentException(encodedURL + " does not end with
" + WSRPRewritingConstants.END_WSRP_REWRITE);
+ }
+ else
+ {
+ // first remove prefix only (as suffix is not at the end of the string)
+ encodedURL =
encodedURL.substring(WSRPRewritingConstants.WSRP_REWRITE_PREFIX_LENGTH);
+
+ // find end token and extract it
+ int endTokenIndex = encodedURL.indexOf('/');
+ if(endTokenIndex < 0)
+ {
+ throw new IllegalArgumentException(originalURL + " does not contain
" + WSRPRewritingConstants.END_WSRP_REWRITE);
+ }
+
+ encodedURL = encodedURL.substring(0, endTokenIndex)
+ + encodedURL.substring(endTokenIndex +
WSRPRewritingConstants.WSRP_REWRITE_SUFFIX_LENGTH);
+
+ // remember that we should position the extra params after the end token
+ extraAfterEnd = true;
+ }
}
+ else
+ {
+ // remove prefix and suffix
+ encodedURL =
encodedURL.substring(WSRPRewritingConstants.WSRP_REWRITE_PREFIX_LENGTH,
+ encodedURL.length() -
WSRPRewritingConstants.WSRP_REWRITE_SUFFIX_LENGTH);
+ }
- // remove prefix and suffix
- encodedURL =
encodedURL.substring(WSRPRewritingConstants.WSRP_REWRITE_PREFIX_LENGTH,
- encodedURL.length() - WSRPRewritingConstants.WSRP_REWRITE_SUFFIX_LENGTH);
-
// next param should be the url type
if (!encodedURL.startsWith(WSRPRewritingConstants.URL_TYPE_NAME + EQUALS))
{
@@ -145,7 +201,7 @@
}
// other parameters
- Map params = null;
+ Map<String, String> params = null;
int urlTypeLength = urlType.length();
if (encodedURL.length() > urlTypeLength)
{
@@ -158,10 +214,11 @@
else if (WSRPRewritingConstants.URL_TYPE_RESOURCE.equals(urlType))
{
throw new IllegalArgumentException("Both the 'wsrp-url' and
'wsrp-requiresRewrite' parameters MUST also be specified for resource URL
'"
- + originalURL + "'");
+ + originalURL + "'");
}
url.setParams(params);
+ url.setExtraParamsAfterEndToken(extraAfterEnd);
return url;
}
@@ -175,7 +232,8 @@
*
<code>wsrp_rewrite?wsrp-urlType=render&amp;wsrp-mode=help&amp;wsrp-windowState=maximized/wsrp_rewrite</code></li>
* </ul>
*
- * @param encodedURL
+ * @param encodedURL a String representation of the URL to create
+ * @return an appropriate WSRPPortletURL as built from parsing the specified String
*/
public static WSRPPortletURL create(String encodedURL)
{
@@ -189,40 +247,57 @@
this.secure = secure;
}
- protected WSRPPortletURL(Map params)
+ protected WSRPPortletURL()
{
- // populate values
- setParams(params);
}
- protected WSRPPortletURL()
+ protected final void setParams(Map<String, String> params)
{
+ // First extract specific parameters and remove them from the param map...
+ dealWithSpecificParams(params);
+
+ // ... then deal with extra params if in relaxed mode
+ if (!strict)
+ {
+ extraParams = new HashMap<String, String>();
+ extraParams.putAll(params);
+ }
}
- protected void setParams(Map params)
+ /**
+ * Deal with specific parameters first so that we can remove them before dealing with
extra params. Sub-classes
+ * override to provide support for their specific parameters.
+ *
+ * @param params name-value map of the URL parameters
+ */
+ protected void dealWithSpecificParams(Map<String, String> params)
{
+ // mode
String paramValue = getRawParameterValueFor(params, WSRPRewritingConstants.MODE);
if (paramValue != null)
{
mode = WSRPUtils.getJSR168PortletModeFromWSRPName(paramValue);
+ params.remove(WSRPRewritingConstants.MODE);
}
- //
+ // window state
paramValue = getRawParameterValueFor(params, WSRPRewritingConstants.WINDOW_STATE);
if (paramValue != null)
{
windowState = WSRPUtils.getJSR168WindowStateFromWSRPName(paramValue);
+ params.remove(WSRPRewritingConstants.WINDOW_STATE);
}
- //
+ // secure
paramValue = getRawParameterValueFor(params, WSRPRewritingConstants.SECURE_URL);
if (paramValue != null)
{
secure = Boolean.valueOf(paramValue);
+ params.remove(WSRPRewritingConstants.SECURE_URL);
}
}
- public String getRawParameterValueFor(Map params, String parameterName)
+ protected String getRawParameterValueFor(Map params, String parameterName)
{
if (params != null)
{
@@ -257,7 +332,7 @@
//
sb.append(WSRPRewritingConstants.BEGIN_WSRP_REWRITE).append(WSRPRewritingConstants.URL_TYPE_NAME)
- .append(EQUALS).append(getURLType());
+ .append(EQUALS).append(getURLType());
//
if (secure)
@@ -277,13 +352,44 @@
createURLParameter(sb, WSRPRewritingConstants.WINDOW_STATE,
windowState.toString());
}
- // fix-me: not sure how to deal with authenticated
+ // todo: not sure how to deal with authenticated
//
appendEnd(sb);
- //
- sb.append(WSRPRewritingConstants.END_WSRP_REWRITE);
+ // Finish the URL
+ if (strict)
+ {
+ sb.append(WSRPRewritingConstants.END_WSRP_REWRITE);
+ }
+ else
+ {
+ // we're in relaxed mode so we need to deal with extra params if they exist
+ StringBuffer extras = null;
+ if (extraParams != null && !extraParams.isEmpty())
+ {
+ extras = new StringBuffer();
+ for (Map.Entry<String, String> entry : extraParams.entrySet())
+ {
+ createURLParameter(extras, entry.getKey(), entry.getValue());
+ }
+ }
+
+ // if we had extra params, we need to figure out where thwy should be positioned
wrt end token
+ if (extras != null)
+ {
+ if (extraParamsAfterEndToken)
+ {
+ sb.append(WSRPRewritingConstants.END_WSRP_REWRITE);
+ sb.append(extras);
+ }
+ else
+ {
+ sb.append(extras);
+ sb.append(WSRPRewritingConstants.END_WSRP_REWRITE);
+ }
+ }
+ }
return sb.toString();
}
@@ -297,7 +403,7 @@
}
}
- private static Map extractParams(String encodedURL, String originalURL,
Set<String> customModes, Set<String> customWindowStates)
+ private static Map<String, String> extractParams(String encodedURL, String
originalURL, Set<String> customModes, Set<String> customWindowStates)
{
Map<String, String> params = new HashMap<String, String>();
boolean finished = false;
@@ -324,7 +430,7 @@
// extract param name
String name = param.substring(0, equalsIndex);
- if (!name.startsWith("wsrp-"))
+ if (strict && !name.startsWith("wsrp-"))
{
throw new IllegalArgumentException("Invalid parameter name: '"
+ name + "'");
}
@@ -356,7 +462,7 @@
value = FastURLDecoder.getUTF8Instance().encode(value);
// Check if value is a standard one
- boolean standard = false;
+ boolean standard;
if (mode)
{
standard = WSRPUtils.isDefaultWSRPMode(value);
@@ -383,4 +489,8 @@
return value;
}
+ private void setExtraParamsAfterEndToken(boolean extraParamsAfterEndToken)
+ {
+ this.extraParamsAfterEndToken = extraParamsAfterEndToken;
+ }
}
Modified:
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPRenderURL.java
===================================================================
---
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPRenderURL.java 2008-06-27
22:23:07 UTC (rev 11179)
+++
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPRenderURL.java 2008-06-27
22:23:39 UTC (rev 11180)
@@ -45,20 +45,15 @@
this.navigationalState = navigationalState;
}
- protected WSRPRenderURL(Map params)
- {
- super(params);
- }
-
-
protected WSRPRenderURL()
{
}
- protected void setParams(Map params)
+ @Override
+ protected void dealWithSpecificParams(Map<String, String> params)
{
- super.setParams(params);
-
+ super.dealWithSpecificParams(params);
+
String paramValue = getRawParameterValueFor(params,
WSRPRewritingConstants.NAVIGATIONAL_STATE);
if (paramValue != null)
{
Modified:
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPResourceURL.java
===================================================================
---
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPResourceURL.java 2008-06-27
22:23:07 UTC (rev 11179)
+++
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/WSRPResourceURL.java 2008-06-27
22:23:39 UTC (rev 11180)
@@ -72,11 +72,6 @@
this.requiresRewrite = requiresRewrite;
}
- public WSRPResourceURL(Map params)
- {
- super(params);
- }
-
public WSRPResourceURL()
{
super();
@@ -100,11 +95,11 @@
}
}
-
- protected void setParams(Map params)
+ @Override
+ protected void dealWithSpecificParams(Map<String, String> params)
{
- super.setParams(params);
-
+ super.dealWithSpecificParams(params);
+
String paramValue = getRawParameterValueFor(params,
WSRPRewritingConstants.RESOURCE_REQUIRES_REWRITE);
if (paramValue != null)
{
Modified:
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/producer/WSRPProducerImpl.java
===================================================================
---
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/producer/WSRPProducerImpl.java 2008-06-27
22:23:07 UTC (rev 11179)
+++
branches/JBoss_Portal_Branch_2_7/wsrp/src/main/org/jboss/portal/wsrp/producer/WSRPProducerImpl.java 2008-06-27
22:23:39 UTC (rev 11180)
@@ -38,6 +38,7 @@
import org.jboss.portal.wsrp.ResponseDebugFactory;
import org.jboss.portal.wsrp.WSRPConstants;
import org.jboss.portal.wsrp.WSRPExceptionFactory;
+import org.jboss.portal.wsrp.WSRPPortletURL;
import org.jboss.portal.wsrp.WSRPProducer;
import org.jboss.portal.wsrp.WSRPUtils;
import org.jboss.portal.wsrp.core.AccessDeniedFault;
@@ -535,5 +536,6 @@
{
RegistrationUtils.setStrict(strictMode);
WSRPUtils.setStrict(strictMode);
+ WSRPPortletURL.setStrict(strictMode);
}
}