Author: chris.laprun(a)jboss.com
Date: 2008-05-05 19:43:48 -0400 (Mon, 05 May 2008)
New Revision: 10746
Modified:
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/test/wsrp/other/WSRPPortletURLTestCase.java
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/WSRPPortletURL.java
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/WSRPUtils.java
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/consumer/ActionHandler.java
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/consumer/ProducerInfo.java
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/consumer/RenderHandler.java
Log:
- JBPORTAL-2006:
+ Added primitive support for declared custom modes and window states so that they are
recorded in ProducerInfo and can be checked for in WSRPPortletURL.create.
+ URL parameter values are now decoded
+ Standard modes and window states are mapped to corresponding Portal values.
+ Added and fixed test cases.
- Added WSRPUtils.isDefaultWSRPWindowState() and WSRPUtils.isDefaultWSRPMode()
Modified:
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/test/wsrp/other/WSRPPortletURLTestCase.java
===================================================================
---
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/test/wsrp/other/WSRPPortletURLTestCase.java 2008-05-05
14:06:35 UTC (rev 10745)
+++
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/test/wsrp/other/WSRPPortletURLTestCase.java 2008-05-05
23:43:48 UTC (rev 10746)
@@ -24,11 +24,16 @@
package org.jboss.portal.test.wsrp.other;
import junit.framework.TestCase;
+import org.jboss.portal.Mode;
+import org.jboss.portal.WindowState;
import org.jboss.portal.wsrp.WSRPActionURL;
import org.jboss.portal.wsrp.WSRPPortletURL;
import org.jboss.portal.wsrp.WSRPRenderURL;
import org.jboss.portal.wsrp.WSRPRewritingConstants;
+import java.util.HashSet;
+import java.util.Set;
+
/**
* @author <a href="mailto:chris.laprun@jboss.com">Chris
Laprun</a>
* @version $Revision$
@@ -62,12 +67,12 @@
/** Request the Consumer render the Portlet in a different mode and window state */
public void testDifferentModeAndWindowState()
{
- String expected =
"wsrp_rewrite?wsrp-urlType=render&wsrp-mode=help&wsrp-windowState=maximized/wsrp_rewrite";
+ String expected =
"wsrp_rewrite?wsrp-urlType=render&wsrp-mode=wsrp:help&wsrp-windowState=wsrp:maximized/wsrp_rewrite";
WSRPPortletURL url = WSRPPortletURL.create(expected);
assertTrue(url instanceof WSRPRenderURL);
- assertEquals("help", url.getMode().toString());
- assertEquals("maximized", url.getWindowState().toString());
+ assertEquals(Mode.HELP, url.getMode());
+ assertEquals(WindowState.MAXIMIZED, url.getWindowState());
}
public void testMinimal()
@@ -89,6 +94,50 @@
checkInvalidURL(invalid, message, "foo");
}
+ public void testInvalidMode()
+ {
+ String message = "Should have detected invalid mode: ";
+
+ String invalid =
"wsrp_rewrite?wsrp-urlType=render&wsrp-mode=foo/wsrp_rewrite";
+ checkInvalidURL(invalid, message, "foo");
+ }
+
+ public void testCustomModeAndWindowState()
+ {
+ Set<String> modes = new HashSet<String>();
+ modes.add("urn:foo");
+
+ Set<String> windowStates = new HashSet<String>();
+ windowStates.add("urn:bar");
+
+ String urlString =
"wsrp_rewrite?wsrp-urlType=render&wsrp-mode=urn%3Afoo&wsrp-windowState=urn%3Abar/wsrp_rewrite";
+ WSRPPortletURL url = WSRPPortletURL.create(urlString, modes, windowStates);
+ assertEquals("urn:foo", url.getMode().toString());
+ assertEquals("urn:bar", url.getWindowState().toString());
+ }
+
+ public void testEncodedMode()
+ {
+ String encoded =
"wsrp_rewrite?wsrp-urlType=render&wsrp-mode=wsrp%3Aview/wsrp_rewrite";
+ WSRPPortletURL url = WSRPPortletURL.create(encoded);
+ assertEquals(Mode.VIEW, url.getMode());
+
+ encoded =
"wsrp_rewrite?wsrp-urlType=render&wsrp-mode=wsrp%3aedit/wsrp_rewrite";
+ url = WSRPPortletURL.create(encoded);
+ assertEquals(Mode.EDIT, url.getMode());
+ }
+
+ public void testEncodedWindowState()
+ {
+ String encoded =
"wsrp_rewrite?wsrp-urlType=render&wsrp-windowState=wsrp%3Amaximized/wsrp_rewrite";
+ WSRPPortletURL url = WSRPPortletURL.create(encoded);
+ assertEquals(WindowState.MAXIMIZED, url.getWindowState());
+
+ encoded =
"wsrp_rewrite?wsrp-urlType=render&wsrp-windowState=wsrp%3aminimized/wsrp_rewrite";
+ url = WSRPPortletURL.create(encoded);
+ assertEquals(WindowState.MINIMIZED, url.getWindowState());
+ }
+
public void testInvalidResourceURLV1()
{
String message = "Should have detected missing parameter: ";
Modified:
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/WSRPPortletURL.java
===================================================================
---
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/WSRPPortletURL.java 2008-05-05
14:06:35 UTC (rev 10745)
+++
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/WSRPPortletURL.java 2008-05-05
23:43:48 UTC (rev 10746)
@@ -26,14 +26,17 @@
import org.jboss.logging.Logger;
import org.jboss.portal.Mode;
import org.jboss.portal.WindowState;
+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.StateString;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import java.util.Set;
/**
* @author <a href="mailto:chris.laprun@jboss.com">Chris
Laprun</a>
@@ -81,19 +84,7 @@
}
}
- /**
- * Parses a WSRP rewritten URL and extracts each component. <p/> TODO: some
values need to be in pairs or are
- * mutually exclusive, check for this <p/> <p>URL are of the form:
<code>wsrp_rewrite?wsrp-urlType=value&amp;name1=value1&amp;name2=value2
- * .../wsrp_rewrite</code> </p> <ul>Examples: <li>Load a
resource
http://test.com/images/test.gif: <br/>
- *
<code>wsrp_rewrite?wsrp-urlType=resource&amp;wsrp-url=http%3A%2F%2Ftest.com%2Fimages%2Ftest.gif&amp;wsrp-requiresRewrite=true/wsrp_rewrite</code></li>
- * <li>Declare a secure interaction back to the Portlet:<br/>
<code>wsrp_rewrite?wsrp-urlType=blockingAction&amp;wsrp-secureURL=true&amp;wsrp-navigationalState=a8h4K5JD9&amp;wsrp-interactionState=fg4h923mdk/wsrp_rewrite</code></li>
- * <li>Request the Consumer render the Portlet in a different mode and window
state:
- *
<code>wsrp_rewrite?wsrp-urlType=render&amp;wsrp-mode=help&amp;wsrp-windowState=maximized/wsrp_rewrite</code></li>
- * </ul>
- *
- * @param encodedURL
- */
- public static WSRPPortletURL create(String encodedURL)
+ public static WSRPPortletURL create(String encodedURL, Set<String> customModes,
Set<String> customWindowStates)
{
log.debug("Trying to build a WSRPPortletURL from <" + encodedURL +
">");
@@ -162,7 +153,7 @@
encodedURL = encodedURL.substring(urlTypeLength + 1); // +1 for the param
separator
// extract the other parameters
- params = extractParams(encodedURL, originalURL);
+ params = extractParams(encodedURL, originalURL, customModes,
customWindowStates);
}
else if (WSRPRewritingConstants.URL_TYPE_RESOURCE.equals(urlType))
{
@@ -174,6 +165,23 @@
return url;
}
+ /**
+ * Parses a WSRP rewritten URL and extracts each component. <p/> TODO: some
values need to be in pairs or are
+ * mutually exclusive, check for this <p/> <p>URL are of the form:
<code>wsrp_rewrite?wsrp-urlType=value&amp;name1=value1&amp;name2=value2
+ * .../wsrp_rewrite</code> </p> <ul>Examples: <li>Load a
resource
http://test.com/images/test.gif: <br/>
+ *
<code>wsrp_rewrite?wsrp-urlType=resource&amp;wsrp-url=http%3A%2F%2Ftest.com%2Fimages%2Ftest.gif&amp;wsrp-requiresRewrite=true/wsrp_rewrite</code></li>
+ * <li>Declare a secure interaction back to the Portlet:<br/>
<code>wsrp_rewrite?wsrp-urlType=blockingAction&amp;wsrp-secureURL=true&amp;wsrp-navigationalState=a8h4K5JD9&amp;wsrp-interactionState=fg4h923mdk/wsrp_rewrite</code></li>
+ * <li>Request the Consumer render the Portlet in a different mode and window
state:
+ *
<code>wsrp_rewrite?wsrp-urlType=render&amp;wsrp-mode=help&amp;wsrp-windowState=maximized/wsrp_rewrite</code></li>
+ * </ul>
+ *
+ * @param encodedURL
+ */
+ public static WSRPPortletURL create(String encodedURL)
+ {
+ return create(encodedURL, Collections.<String>emptySet(),
Collections.<String>emptySet());
+ }
+
protected WSRPPortletURL(Mode mode, WindowState windowState, boolean secure)
{
this.mode = mode;
@@ -196,14 +204,14 @@
String paramValue = getRawParameterValueFor(params, WSRPRewritingConstants.MODE);
if (paramValue != null)
{
- mode = Mode.create(paramValue);
+ mode = WSRPUtils.getJSR168PortletModeFromWSRPName(paramValue);
}
//
paramValue = getRawParameterValueFor(params, WSRPRewritingConstants.WINDOW_STATE);
if (paramValue != null)
{
- windowState = WindowState.create(paramValue);
+ windowState = WSRPUtils.getJSR168WindowStateFromWSRPName(paramValue);
}
//
@@ -289,7 +297,7 @@
}
}
- private static Map extractParams(String encodedURL, String originalURL)
+ private static Map extractParams(String encodedURL, String originalURL,
Set<String> customModes, Set<String> customWindowStates)
{
Map<String, String> params = new HashMap<String, String>();
boolean finished = false;
@@ -314,16 +322,65 @@
throw new IllegalArgumentException(param + " is not a valid parameter
for " + originalURL);
}
+ // extract param name
String name = param.substring(0, equalsIndex);
if (!name.startsWith("wsrp-"))
{
throw new IllegalArgumentException("Invalid parameter name: '"
+ name + "'");
}
+
+ // extract param value
String value = param.substring(equalsIndex + 1, param.length()); // +1 to ignore
"="
+
+ // check that the given mode is valid if the param is supposed to be one
+ if (WSRPRewritingConstants.MODE.equals(name))
+ {
+ value = checkModeOrWindowState(value, true, customModes);
+ }
+
+ // check that the given window state is valid if the param is supposed to be
one
+ if (WSRPRewritingConstants.WINDOW_STATE.equals(name))
+ {
+ value = checkModeOrWindowState(value, false, customWindowStates);
+ }
+
params.put(name, value);
encodedURL = encodedURL.substring(endParamIndex + 1); // +1 for the param
separator
}
return params;
}
+ private static String checkModeOrWindowState(String value, boolean mode,
Set<String> supportedValues)
+ {
+ // decode potentially encoded value
+ value = FastURLDecoder.getUTF8Instance().encode(value);
+
+ // Check if value is a standard one
+ boolean standard = false;
+ if (mode)
+ {
+ standard = WSRPUtils.isDefaultWSRPMode(value);
+ }
+ else
+ {
+ standard = WSRPUtils.isDefaultWSRPWindowState(value);
+ }
+
+ // the value is not a standard one
+ if (!standard)
+ {
+ // check if this is a supported custom value
+ if (supportedValues.contains(value))
+ {
+ return value;
+ }
+ else
+ {
+ throw new IllegalArgumentException("Unsupported " + (mode ?
"mode: " : "window state: ") + value);
+ }
+ }
+
+ return value;
+ }
+
}
Modified:
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/WSRPUtils.java
===================================================================
---
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/WSRPUtils.java 2008-05-05
14:06:35 UTC (rev 10745)
+++
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/WSRPUtils.java 2008-05-05
23:43:48 UTC (rev 10746)
@@ -96,6 +96,11 @@
return (windowState == null) ? WindowState.create(wsrpWindowStateName) :
windowState;
}
+ public static boolean isDefaultWSRPWindowState(String wsrpWindowStateName)
+ {
+ return WSRP_JSR168_WINDOW_STATES.containsKey(wsrpWindowStateName) ||
WSRPConstants.SOLO_WINDOW_STATE.equals(wsrpWindowStateName);
+ }
+
public static String convertJSR168WindowStateNameToWSRPName(String
jsr168WindowStateName)
{
if (jsr168WindowStateName == null)
@@ -122,6 +127,11 @@
return (mode == null) ? Mode.create(wsrpPortletModeName) : mode;
}
+ public static boolean isDefaultWSRPMode(String wsrpPortletModeName)
+ {
+ return WSRP_JSR168_MODES.containsKey(wsrpPortletModeName) ||
WSRPConstants.PREVIEW_MODE.equals(wsrpPortletModeName);
+ }
+
public static String convertJSR168PortletModeNameToWSRPName(String
jsr168PortletModeName)
{
if (jsr168PortletModeName == null)
@@ -475,9 +485,8 @@
if (formParams != null)
{
sb.append("\n\tForm params:\n");
- for (int i = 0; i < formParams.length; i++)
+ for (NamedString formParam : formParams)
{
- NamedString formParam = formParams[i];
sb.append("\t\t").append(formParam.getName()).append("='").append(formParam.getValue()).append("'\n");
}
}
Modified:
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/consumer/ActionHandler.java
===================================================================
---
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/consumer/ActionHandler.java 2008-05-05
14:06:35 UTC (rev 10745)
+++
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/consumer/ActionHandler.java 2008-05-05
23:43:48 UTC (rev 10746)
@@ -298,8 +298,7 @@
return getActionRequest(request).getRuntimeContext();
}
- protected Object performRequest(Object request)
- throws Exception
+ protected Object performRequest(Object request) throws Exception
{
PerformBlockingInteraction interaction = getActionRequest(request);
log.debug("performBlockingInteraction on '" +
interaction.getPortletContext().getPortletHandle() + "'");
Modified:
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/consumer/ProducerInfo.java
===================================================================
---
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/consumer/ProducerInfo.java 2008-05-05
14:06:35 UTC (rev 10745)
+++
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/consumer/ProducerInfo.java 2008-05-05
23:43:48 UTC (rev 10746)
@@ -40,6 +40,7 @@
import org.jboss.portal.wsrp.core.GetServiceDescription;
import org.jboss.portal.wsrp.core.InvalidHandleFault;
import org.jboss.portal.wsrp.core.InvalidRegistrationFault;
+import org.jboss.portal.wsrp.core.ItemDescription;
import org.jboss.portal.wsrp.core.ModifyRegistration;
import org.jboss.portal.wsrp.core.OperationFailedFault;
import org.jboss.portal.wsrp.core.PortletDescription;
@@ -111,12 +112,12 @@
private static final String REFRESH_MEANING = "Did just refresh?";
private static final String ERASED_LOCAL_REGISTRATION_INFORMATION = "Erased local
registration information!";
+ private Map<String, ItemDescription> customModes;
+ private Map<String, ItemDescription> customWindowStates;
+
/*protected org.jboss.portal.wsrp.core.ItemDescription[] userCategoryDescriptions;
- protected org.jboss.portal.wsrp.core.ItemDescription[]
customUserProfileItemDescriptions;
- protected org.jboss.portal.wsrp.core.ItemDescription[] customWindowStateDescriptions;
- protected org.jboss.portal.wsrp.core.ItemDescription[] customModeDescriptions;
+ protected org.jboss.portal.wsrp.core.ItemDescription[]
customUserProfileItemDescriptions;
- protected org.jboss.portal.wsrp.core.ModelDescription
registrationPropertyDescription;
protected java.lang.String[] locales;
protected org.jboss.portal.wsrp.core.ResourceList resourceList;*/
@@ -146,6 +147,24 @@
this.key = key;
}
+ public Set<String> getSupportedCustomModes()
+ {
+ if (customModes == null)
+ {
+ return Collections.emptySet();
+ }
+ return Collections.unmodifiableSet(customModes.keySet());
+ }
+
+ public Set<String> getSupportedCustomWindowStates()
+ {
+ if (customWindowStates == null)
+ {
+ return Collections.emptySet();
+ }
+ return Collections.unmodifiableSet(customWindowStates.keySet());
+ }
+
public EndpointConfigurationInfo getEndpointConfigurationInfo()
{
return persistentEndpointInfo;
@@ -334,6 +353,12 @@
// do we need to call initCookie or not?
requiresInitCookie = serviceDescription.getRequiresInitCookie();
+ // custom mode descriptions
+ customModes = toMap(serviceDescription.getCustomModeDescriptions());
+
+ // custom window state descriptions
+ customWindowStates =
toMap(serviceDescription.getCustomWindowStateDescriptions());
+
// do we need to register?
if (serviceDescription.isRequiresRegistration())
{
@@ -375,6 +400,23 @@
return new RefreshResult(false, REFRESH_MEANING);
}
+ private Map<String, ItemDescription> toMap(ItemDescription[] itemDescriptions)
+ {
+ if (itemDescriptions == null)
+ {
+ return null;
+ }
+ else
+ {
+ Map<String, ItemDescription> result = new HashMap<String,
ItemDescription>(itemDescriptions.length);
+ for (ItemDescription itemDescription : itemDescriptions)
+ {
+ result.put(itemDescription.getItemName(), itemDescription);
+ }
+ return result;
+ }
+ }
+
public String getId()
{
return persistentId;
Modified:
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/consumer/RenderHandler.java
===================================================================
---
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/consumer/RenderHandler.java 2008-05-05
14:06:35 UTC (rev 10745)
+++
branches/JBoss_Portal_Branch_2_6/wsrp/src/main/org/jboss/portal/wsrp/consumer/RenderHandler.java 2008-05-05
23:43:48 UTC (rev 10746)
@@ -31,6 +31,7 @@
import org.jboss.portal.portlet.invocation.response.FragmentResponse;
import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
import org.jboss.portal.portlet.spi.PortletInvocationContext;
+import org.jboss.portal.wsrp.WSRPConsumer;
import org.jboss.portal.wsrp.WSRPPortletURL;
import org.jboss.portal.wsrp.WSRPResourceURL;
import org.jboss.portal.wsrp.WSRPRewritingConstants;
@@ -192,6 +193,7 @@
WSRPURLRewriter rewriter = (WSRPURLRewriter)wsrpURLRewriterLocal.get();
rewriter.setContext(invocation.getPortletContext());
rewriter.setSecure(invocation.getSecurityContext().isSecure());
+ rewriter.setConsumer(consumer);
String userId = invocation.getUserContext().getId();
rewriter.setAuthenticated(userId != null); // is this correct?
markup = URLTools.replaceURLsBy(markup, rewriter);
@@ -225,6 +227,7 @@
private PortletInvocationContext context;
private Boolean secure;
private Boolean authenticated;
+ private WSRPConsumer consumer;
public void setContext(PortletInvocationContext context)
{
@@ -241,12 +244,18 @@
this.authenticated = Boolean.valueOf(authenticated);
}
+ public void setConsumer(WSRPConsumer consumer)
+ {
+ this.consumer = consumer;
+ }
+
public String getReplacementFor(int currentIndex, URLTools.URLMatch currentMatch)
{
String urlAsString = currentMatch.getURLAsString();
if (urlAsString.startsWith(WSRPRewritingConstants.BEGIN_WSRP_REWRITE))
{
- WSRPPortletURL portletURL = WSRPPortletURL.create(urlAsString);
+ WSRPPortletURL portletURL = WSRPPortletURL.create(urlAsString,
+ consumer.getProducerInfo().getSupportedCustomModes(),
consumer.getProducerInfo().getSupportedCustomWindowStates());
if (portletURL instanceof WSRPResourceURL)
{
log.debug("URL '" + urlAsString + "' seems to refer
to a resource which are not currently supported. " +