You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by rw...@apache.org on 2009/03/22 03:50:29 UTC
svn commit: r757118 [1/2] - in /portals/jetspeed-2/portal/trunk:
components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/providers/
components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/
components/jetspeed-po...
Author: rwatler
Date: Sun Mar 22 02:50:28 2009
New Revision: 757118
URL: http://svn.apache.org/viewvc?rev=757118&view=rev
Log:
Initial Coding for JS2-925->JS2-939
---------------------------------------------------
- added actionScopeId, actionScopeRendered, cacheLevel, resourceId, privateRenderParameters, and publicRenderParameters
render parameters support to request and session navigation state and portal urls
- integrated additional parameters with PortletURLProvider used with Pluto 2.0 interfaces
- supported action scoped request attributes container runtime option
- TODO: ServletRequestImpl needs to merge new render parameters
- TODO: Review rules used to determine when new render parameters are encoded on Portlet/Portal URLs
- TODO: Investigate optimization of public render parameter names on Portlet/Portal URLs using persistently stored short/numeric ids
- TODO: Extend unit test cases to test new render parameters
Modified:
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/providers/PortletURLProviderImpl.java
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/AbstractNavigationalState.java
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/HybridNavigationalState.java
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateCodec.java
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/NavigationalStateCodec.java
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowExtendedNavigationalState.java
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowRequestNavigationalState.java
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowRequestNavigationalStates.java
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowSessionNavigationalStates.java
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/SessionNavigationalState.java
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/url/impl/AbstractPortalURL.java
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/url/impl/DesktopEncodingPortalURL.java
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/om/window/impl/PortletWindowImpl.java
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/container/state/MutableNavigationalState.java
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/container/state/NavigationalState.java
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/container/url/PortalURL.java
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/om/portlet/ContainerRuntimeOption.java
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/providers/PortletURLProviderImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/providers/PortletURLProviderImpl.java?rev=757118&r1=757117&r2=757118&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/providers/PortletURLProviderImpl.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/providers/PortletURLProviderImpl.java Sun Mar 22 02:50:28 2009
@@ -51,6 +51,8 @@
private Map<String, String[]> renderParameters;
private Map<String, String[]> publicRenderParameters;
private Map<String, List<String>> properties;
+ private String actionScopeID;
+ private boolean actionScopeRendered;
private PortalURL url;
@@ -132,6 +134,26 @@
{
this.resourceID = resourceID;
}
+
+ public String getActionScopeID()
+ {
+ return actionScopeID;
+ }
+
+ public void setActionScopeID(String actionScopeID)
+ {
+ this.actionScopeID = actionScopeID;
+ }
+
+ public boolean isActionScopeRendered()
+ {
+ return actionScopeRendered;
+ }
+
+ public void setActionScopeRendered(boolean actionScopeRendered)
+ {
+ this.actionScopeRendered = actionScopeRendered;
+ }
public void apply()
{
@@ -185,8 +207,7 @@
if (toURL)
{
- // TODO: handle public and private render parameters, resourceID, cacheLevel, actionScopeID
- return url.createPortletURL(portletWindow,renderParms,portletMode,windowState,urlType,secure);
+ return url.createPortletURL(portletWindow, renderParms, actionScopeID, actionScopeRendered, cacheLevel, resourceID, privateRenderParms, publicRenderParms, portletMode, windowState, urlType, secure);
}
else
{
@@ -194,7 +215,12 @@
navState.setMode(portletWindow, portletMode);
navState.setState(portletWindow, windowState);
navState.setParametersMap(portletWindow, renderParms);
- // TODO: privateRenderParms, publicRenderParms, resourceID, cacheLevel, actionScopeID
+ navState.setActionScopeId(portletWindow, actionScopeID);
+ navState.setActionScopeRendered(portletWindow, actionScopeRendered);
+ navState.setCacheLevel(portletWindow, cacheLevel);
+ navState.setResourceId(portletWindow, resourceID);
+ navState.setPrivateRenderParametersMap(portletWindow, privateRenderParms);
+ navState.setPublicRenderParametersMap(portletWindow, publicRenderParms);
return null;
}
}
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/AbstractNavigationalState.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/AbstractNavigationalState.java?rev=757118&r1=757117&r2=757118&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/AbstractNavigationalState.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/AbstractNavigationalState.java Sun Mar 22 02:50:28 2009
@@ -20,9 +20,11 @@
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
+import java.util.Set;
import javax.portlet.PortletMode;
import javax.portlet.WindowState;
+import javax.xml.namespace.QName;
import org.apache.jetspeed.JetspeedActions;
import org.apache.jetspeed.cache.JetspeedContentCache;
@@ -70,58 +72,54 @@
return requestStates;
}
- public void setState(PortletWindow window, WindowState windowState)
+ public boolean getActionScopedRequestAttributes(PortletWindow window)
{
- if ( windowState != null )
- {
- if (!JetspeedActions.getStandardWindowStates().contains(windowState))
- {
- PortletApplication pa = (PortletApplication)window.getPortletEntity().getPortletDefinition().getApplication();
- windowState = pa.getMappedWindowState(windowState);
- }
- String windowId = window.getId().toString();
- PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(windowId);
- if (state != null && (state.getWindowState() == null || !state.getWindowState().equals(windowState)))
- {
- state.setWindowState(windowState);
- }
- else
- {
- state = new PortletWindowRequestNavigationalState(windowId);
- requestStates.addPortletWindowNavigationalState(windowId, state);
- state.setWindowState(windowState);
- }
- if (windowState.equals(WindowState.MAXIMIZED))
- {
- requestStates.setMaximizedWindow(window);
- }
- }
+ // utilize codec to access portlet definition runtime options
+ return codec.getActionScopedRequestAttributes(window);
+ }
+
+ public boolean getActionScopedRequestAttributes(String windowId)
+ {
+ // utilize codec to access portlet definition runtime options
+ return codec.getActionScopedRequestAttributes(windowId);
}
- public void setMode(PortletWindow window, PortletMode portletMode)
+ public QName getPublicRenderParameterQName(PortletWindow window, String identifier)
{
- if ( portletMode != null )
- {
- if (!JetspeedActions.getStandardPortletModes().contains(portletMode))
- {
- PortletApplication pa = (PortletApplication)window.getPortletEntity().getPortletDefinition().getApplication();
- portletMode = pa.getMappedPortletMode(portletMode);
- }
- String windowId = window.getId().toString();
- PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(windowId);
- if (state != null && (state.getPortletMode() == null || !state.getPortletMode().equals(portletMode)))
- {
- state.setPortletMode(portletMode);
- }
- else
- {
- state = new PortletWindowRequestNavigationalState(windowId);
- requestStates.addPortletWindowNavigationalState(windowId, state);
- state.setPortletMode(portletMode);
- }
- }
+ // utilize codec to access portlet application public render parameter
+ return codec.getPublicRenderParameterQName(window, identifier);
+ }
+
+ public QName getPublicRenderParameterQName(String windowId, String identifier)
+ {
+ // utilize codec to access portlet application public render parameter
+ return codec.getPublicRenderParameterQName(windowId, identifier);
+ }
+
+ public Map<String, QName> getPublicRenderParameterNamesMap(PortletWindow window)
+ {
+ // utilize codec to access portlet application public render parameter names
+ return codec.getPublicRenderParameterNamesMap(window);
+ }
+
+ public Map<String, QName> getPublicRenderParameterNamesMap(String windowId)
+ {
+ // utilize codec to access portlet application public render parameter names
+ return codec.getPublicRenderParameterNamesMap(windowId);
}
+ public boolean hasPublicRenderParameterQNames(PortletWindow window, Set<QName> qnames)
+ {
+ // utilize codec to access portlet application public render parameter names
+ return codec.hasPublicRenderParameterQNames(window, qnames);
+ }
+
+ public boolean hasPublicRenderParameterQNames(String windowId, Set<QName> qnames)
+ {
+ // utilize codec to access portlet application public render parameter names
+ return codec.hasPublicRenderParameterQNames(windowId, qnames);
+ }
+
public WindowState getMappedState(String windowId)
{
WindowState windowState = null;
@@ -157,6 +155,39 @@
return getMappedState(window.getId().toString());
}
+ public void removeState(PortletWindow window)
+ {
+ requestStates.removePortletWindowNavigationalState(window.getId().toString());
+ }
+
+ public void setState(PortletWindow window, WindowState windowState)
+ {
+ if ( windowState != null )
+ {
+ if (!JetspeedActions.getStandardWindowStates().contains(windowState))
+ {
+ PortletApplication pa = (PortletApplication)window.getPortletEntity().getPortletDefinition().getApplication();
+ windowState = pa.getMappedWindowState(windowState);
+ }
+ String windowId = window.getId().toString();
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(windowId);
+ if (state != null && (state.getWindowState() == null || !state.getWindowState().equals(windowState)))
+ {
+ state.setWindowState(windowState);
+ }
+ else
+ {
+ state = new PortletWindowRequestNavigationalState(windowId, getActionScopedRequestAttributes(window));
+ requestStates.addPortletWindowNavigationalState(windowId, state);
+ state.setWindowState(windowState);
+ }
+ if (windowState.equals(WindowState.MAXIMIZED))
+ {
+ requestStates.setMaximizedWindow(window);
+ }
+ }
+ }
+
public PortletMode getMappedMode(String windowId)
{
PortletMode portletMode = null;
@@ -192,9 +223,28 @@
return getMappedMode(window.getId().toString());
}
- public PortletWindow getMaximizedWindow()
+ public void setMode(PortletWindow window, PortletMode portletMode)
{
- return requestStates.getMaximizedWindow();
+ if ( portletMode != null )
+ {
+ if (!JetspeedActions.getStandardPortletModes().contains(portletMode))
+ {
+ PortletApplication pa = (PortletApplication)window.getPortletEntity().getPortletDefinition().getApplication();
+ portletMode = pa.getMappedPortletMode(portletMode);
+ }
+ String windowId = window.getId().toString();
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(windowId);
+ if (state != null && (state.getPortletMode() == null || !state.getPortletMode().equals(portletMode)))
+ {
+ state.setPortletMode(portletMode);
+ }
+ else
+ {
+ state = new PortletWindowRequestNavigationalState(windowId, getActionScopedRequestAttributes(window));
+ requestStates.addPortletWindowNavigationalState(windowId, state);
+ state.setPortletMode(portletMode);
+ }
+ }
}
@SuppressWarnings("unchecked")
@@ -234,12 +284,160 @@
else
return null;
}
+
+ public void clearParameters(PortletWindow window)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ if (state != null)
+ {
+ Map<String, String[]> map = state.getParametersMap();
+ if (map != null)
+ {
+ map.clear();
+ state.setClearParameters(true);
+ }
+ }
+ }
+
+ public void setParametersMap(PortletWindow window, Map<String, String[]> parametersMap)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ state.setParametersMap(parametersMap);
+ }
+
+ public boolean isActionScopedRequestAttributes(PortletWindow window)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ return ((state != null) ? state.isActionScopedRequestAttributes() : false);
+ }
+
+ public String getActionScopeId(PortletWindow window)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ return ((state != null) ? state.getActionScopeId() : null);
+ }
+
+ public void setActionScopeId(PortletWindow window, String actionScopeId)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ if (state != null)
+ {
+ state.setActionScopeId(actionScopeId);
+ }
+ }
+
+ public boolean isActionScopeRendered(PortletWindow window)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ return ((state != null) ? state.isActionScopeRendered() : false);
+ }
+
+ public void setActionScopeRendered(PortletWindow window, boolean actionScopeRendered)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ if (state != null)
+ {
+ state.setActionScopeRendered(actionScopeRendered);
+ }
+ }
+
+ public String getCacheLevel(PortletWindow window)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ return ((state != null) ? state.getCacheLevel() : null);
+ }
+
+ public void setCacheLevel(PortletWindow window, String cacheLevel)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ if (state != null)
+ {
+ state.setCacheLevel(cacheLevel);
+ }
+ }
+
+ public String getResourceId(PortletWindow window)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ return ((state != null) ? state.getResourceId() : null);
+ }
+
+ public void setResourceId(PortletWindow window, String resourceId)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ if (state != null)
+ {
+ state.setResourceId(resourceId);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Iterator<String> getPrivateRenderParameterNames(PortletWindow window)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ return (((state != null) && (state.getPrivateRenderParametersMap() != null)) ? state.getPrivateRenderParametersMap().keySet().iterator() : Collections.EMPTY_LIST.iterator());
+ }
+
+ public String[] getPrivateRenderParameterValues(PortletWindow window, String parameterName)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ return (((state != null) && (state.getPrivateRenderParametersMap() != null)) ? state.getPrivateRenderParametersMap().get(parameterName) : null);
+ }
+
+ public Map<String, String[]> getPrivateRenderParameterMap(PortletWindow window)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ return ((state != null) ? state.getPrivateRenderParametersMap() : null);
+ }
+
+ public void setPrivateRenderParametersMap(PortletWindow window, Map<String, String[]> privateRenderParametersMap)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ if (state != null)
+ {
+ state.setPrivateRenderParametersMap(privateRenderParametersMap);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Iterator<String> getPublicRenderParameterNames(PortletWindow window)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ return (((state != null) && (state.getPublicRenderParametersMap() != null)) ? state.getPublicRenderParametersMap().keySet().iterator() : Collections.EMPTY_LIST.iterator());
+ }
+
+ public String[] getPublicRenderParameterValues(PortletWindow window, String parameterName)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ return (((state != null) && (state.getPublicRenderParametersMap() != null)) ? state.getPublicRenderParametersMap().get(parameterName) : null);
+ }
+
+ public Map<String, String[]> getPublicRenderParameterMap(PortletWindow window)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ return ((state != null) ? state.getPublicRenderParametersMap() : null);
+ }
+
+ public void setPublicRenderParametersMap(PortletWindow window, Map<String, String[]> publicRenderParametersMap)
+ {
+ PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
+ if (state != null)
+ {
+ // utilize codec to set/update public render parameters on request state and states
+ codec.setStatePublicRenderParametersMap(requestStates, state, publicRenderParametersMap);
+ }
+ }
public PortalURL.URLType getURLType()
{
return requestStates.getURLType();
}
+ public PortletWindow getMaximizedWindow()
+ {
+ return requestStates.getMaximizedWindow();
+ }
+
public PortletWindow getPortletWindowOfAction()
{
return requestStates.getActionWindow();
@@ -250,13 +448,18 @@
return requestStates.getResourceWindow();
}
- public String encode(PortletWindow window, Map<String, String[]> parameters, PortletMode mode, WindowState state, boolean action)
+ public String encode(PortletWindow window, Map<String, String[]> parameters, String actionScopeId, boolean actionScopeRendered,
+ String cacheLevel, String resourceId, Map<String, String[]> privateRenderParameters, Map<String, String[]> publicRenderParameters,
+ PortletMode mode, WindowState state, boolean action)
throws UnsupportedEncodingException
{
- return encode(window, parameters, mode, state, action ? PortalURL.URLType.ACTION : PortalURL.URLType.RENDER);
+ return encode(window, parameters, actionScopeId, actionScopeRendered, cacheLevel, resourceId, privateRenderParameters, publicRenderParameters,
+ mode, state, action ? PortalURL.URLType.ACTION : PortalURL.URLType.RENDER);
}
- public String encode(PortletWindow window, Map<String, String[]> parameters, PortletMode mode, WindowState state, PortalURL.URLType urlType)
+ public String encode(PortletWindow window, Map<String, String[]> parameters, String actionScopeId, boolean actionScopeRendered,
+ String cacheLevel, String resourceId, Map<String, String[]> privateRenderParameters, Map<String, String[]> publicRenderParameters,
+ PortletMode mode, WindowState state, PortalURL.URLType urlType)
throws UnsupportedEncodingException
{
if ( mode != null || state != null )
@@ -276,8 +479,8 @@
state = pa.getMappedWindowState(state);
}
}
- return codec.encode(requestStates, window, parameters, mode, state, urlType, isNavigationalParameterStateFull(),
- isRenderParameterStateFull());
+ return codec.encode(requestStates, window, parameters, actionScopeId, actionScopeRendered, cacheLevel, resourceId, privateRenderParameters, publicRenderParameters,
+ mode, state, urlType, isNavigationalParameterStateFull(), isRenderParameterStateFull());
}
public String encode(PortletWindow window, PortletMode mode, WindowState state)
@@ -332,7 +535,7 @@
{
if (windowNavState == null)
{
- windowNavState = new PortletWindowExtendedNavigationalState();
+ windowNavState = new PortletWindowExtendedNavigationalState(getActionScopedRequestAttributes(window));
currentWindowStates.put(window.getId().toString(), windowNavState);
}
windowNavState.setDecoratorActionEncoding(targetMode, targetState, encodedState);
@@ -350,29 +553,4 @@
{
return requestStates.getWindowIdIterator();
}
-
- public void clearParameters(PortletWindow window)
- {
- PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
- if (state != null)
- {
- Map<String, String[]> map = state.getParametersMap();
- if (map != null)
- {
- map.clear();
- state.setClearParameters(true);
- }
- }
- }
-
- public void removeState(PortletWindow window)
- {
- requestStates.removePortletWindowNavigationalState(window.getId().toString());
- }
-
- public void setParametersMap(PortletWindow window, Map<String, String[]> parametersMap)
- {
- PortletWindowRequestNavigationalState state = requestStates.getPortletWindowNavigationalState(window.getId().toString());
- state.setParametersMap(parametersMap);
- }
}
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/HybridNavigationalState.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/HybridNavigationalState.java?rev=757118&r1=757117&r2=757118&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/HybridNavigationalState.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/HybridNavigationalState.java Sun Mar 22 02:50:28 2009
@@ -46,26 +46,56 @@
this.prefix = prefix;
}
- public String encode(PortletWindow window, Map<String, String[]> parameters, PortletMode mode, WindowState state, boolean action)
+ public String encode(PortletWindow window, Map<String, String[]> parameters, String actionScopeId, boolean actionScopeRendered,
+ String cacheLevel, String resourceId, Map<String, String[]> privateRenderParameters, Map<String, String[]> publicRenderParameters,
+ PortletMode mode, WindowState state, PortalURL.URLType urlType)
throws UnsupportedEncodingException
{
- return encode(window, parameters, mode, state, action ? PortalURL.URLType.ACTION : PortalURL.URLType.RENDER);
- }
- public String encode(PortletWindow window, Map<String, String[]> parameters, PortletMode mode, WindowState state, PortalURL.URLType urlType)
- throws UnsupportedEncodingException
- {
- Map<String, String[]> subset = new HashMap<String, String[]>();
- Iterator<String> params = parameters.keySet().iterator();
- while (params.hasNext())
+ // only encode render parameters that start with prefix
+ Map<String, String[]> paramsSubset = null;
+ if (parameters != null)
+ {
+ paramsSubset = new HashMap<String, String[]>();
+ Iterator<String> params = parameters.keySet().iterator();
+ while (params.hasNext())
+ {
+ String key = params.next();
+ if (key.startsWith(prefix))
+ {
+ paramsSubset.put(key, parameters.get(key));
+ }
+ }
+ }
+ Map<String, String[]> privateRenderParamsSubset = null;
+ if (privateRenderParameters != null)
+ {
+ privateRenderParamsSubset = new HashMap<String, String[]>();
+ Iterator<String> params = privateRenderParameters.keySet().iterator();
+ while (params.hasNext())
+ {
+ String key = params.next();
+ if (key.startsWith(prefix))
+ {
+ privateRenderParamsSubset.put(key, privateRenderParameters.get(key));
+ }
+ }
+ }
+ Map<String, String[]> publicRenderParamsSubset = null;
+ if (publicRenderParameters != null)
{
- String key = params.next();
- if (key.startsWith(prefix))
+ publicRenderParamsSubset = new HashMap<String, String[]>();
+ Iterator<String> params = publicRenderParameters.keySet().iterator();
+ while (params.hasNext())
{
- // only encode params that start with prefix
- subset.put(key, parameters.get(key));
+ String key = params.next();
+ if (key.startsWith(prefix))
+ {
+ publicRenderParamsSubset.put(key, publicRenderParameters.get(key));
+ }
}
}
- return super.encode(window, subset, mode, state, urlType);
+ // encode using subsets
+ return super.encode(window, paramsSubset, actionScopeId, actionScopeRendered, cacheLevel, resourceId, privateRenderParamsSubset, publicRenderParamsSubset, mode, state, urlType);
}
public boolean isNavigationalParameterStateFull()
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateCodec.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateCodec.java?rev=757118&r1=757117&r2=757118&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateCodec.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateCodec.java Sun Mar 22 02:50:28 2009
@@ -18,21 +18,27 @@
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+import java.util.Set;
import javax.portlet.PortletMode;
import javax.portlet.WindowState;
+import javax.xml.namespace.QName;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jetspeed.JetspeedActions;
import org.apache.jetspeed.PortalContext;
-import org.apache.jetspeed.PortalReservedParameters;
import org.apache.jetspeed.container.url.PortalURL;
import org.apache.jetspeed.container.window.PortletWindowAccessor;
import org.apache.jetspeed.container.PortletWindow;
+import org.apache.jetspeed.om.portlet.ContainerRuntimeOption;
+import org.apache.jetspeed.om.portlet.PortletApplication;
+import org.apache.jetspeed.om.portlet.PortletDefinition;
+import org.apache.jetspeed.om.portlet.PublicRenderParameter;
/**
* JetspeedNavigationalStateCodec
@@ -54,6 +60,12 @@
protected static final char PARAM_KEY = 'e';
protected static final char CLEAR_PARAMS_KEY = 'f';
protected static final char RESOURCE_WINDOW_ID_KEY = 'g';
+ protected static final char CACHE_LEVEL_KEY = 'h';
+ protected static final char RESOURCE_ID_KEY = 'i';
+ protected static final char PRIVATE_RENDER_PARAM_KEY = 'j';
+ protected static final char PUBLIC_RENDER_PARAM_KEY = 'k';
+ protected static final char ACTION_SCOPE_ID_KEY = 'l';
+ protected static final char RENDERED_ACTION_SCOPE_ID_KEY = 'm';
protected static final char[] URLTYPE_ID_KEYS = { 'b', 'g', 'a' };
protected static final String keytable = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
@@ -91,18 +103,19 @@
throw new UnsupportedOperationException("Too many supported WindowModes found. Can only handle max: "+keytable.length());
}
}
-
+
public PortletWindowRequestNavigationalStates decode(String parameters, String characterEncoding)
throws UnsupportedEncodingException
{
PortletWindowRequestNavigationalStates states = new PortletWindowRequestNavigationalStates(characterEncoding);
if ( parameters != null && parameters.length() > 0 )
{
+ // decode parameters
String decodedParameters = decodeParameters(parameters, characterEncoding);
-
+
+ // decode arguments and parameters into states
int position = 0;
- StringBuffer buffer = new StringBuffer();
-
+ StringBuffer buffer = new StringBuffer();
PortletWindowRequestNavigationalState currentState = null;
String parameter;
while ( (position = decodeArgument(position, decodedParameters, buffer, PARAMETER_SEPARATOR )) != -1 )
@@ -110,7 +123,35 @@
parameter = buffer.toString();
currentState = decodeParameter( windowAccessor, states, currentState, parameter);
}
-
+
+ // propagate public parameter state to states
+ if (states.getPublicRenderParametersMap() != null)
+ {
+ Iterator<String> windowIdIter = states.getWindowIdIterator();
+ while (windowIdIter.hasNext())
+ {
+ PortletWindowRequestNavigationalState state = states.getPortletWindowNavigationalState(windowIdIter.next());
+ PortletWindow window = windowAccessor.getPortletWindow(state.getWindowId());
+ if (window != null)
+ {
+ PortletApplication pa = window.getPortletEntity().getPortletDefinition().getApplication();
+ if (pa.getPublicRenderParameters() != null)
+ {
+ for (PublicRenderParameter publicRenderParameter : pa.getPublicRenderParameters())
+ {
+ QName parameterQName = publicRenderParameter.getQName();
+ String[] parameterValues = states.getPublicRenderParametersMap().get(parameterQName);
+ if (parameterValues != null)
+ {
+ state.setPublicRenderParameters(publicRenderParameter.getIdentifier(), parameterValues);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // debug decode
if ( log.isDebugEnabled() )
{
logDecode(states, buffer);
@@ -155,49 +196,80 @@
{
buffer.append(",state:"+currentState.getWindowState());
}
+ if (currentState.getCacheLevel() != null )
+ {
+ buffer.append(",cache level:"+currentState.getCacheLevel());
+ }
+ if (currentState.getResourceId() != null )
+ {
+ buffer.append(",resource id:"+currentState.getResourceId());
+ }
+ if (currentState.isActionScopedRequestAttributes())
+ {
+ if (currentState.getActionScopeId() != null )
+ {
+ buffer.append(",action scope id:"+currentState.getActionScopeId());
+ buffer.append(",action scope rendered:"+currentState.isActionScopeRendered());
+ }
+ }
if (!currentState.isClearParameters())
{
if (currentState.getParametersMap() != null)
{
- buffer.append(",parameters:[");
- boolean first = true;
- Iterator<String> parIter = currentState.getParametersMap().keySet().iterator();
- while ( parIter.hasNext() )
- {
- if ( first )
- {
- first = false;
- }
- else
- {
- buffer.append(",");
- }
- String name = parIter.next();
- buffer.append(name+":[");
- String[] values = currentState.getParametersMap().get(name);
- for ( int i = 0; i < values.length; i++ )
- {
- if ( i > 0 )
- {
- buffer.append(",");
- }
- buffer.append(values[i]);
- }
- buffer.append("]");
- }
+ logDecode("parameters", currentState.getParametersMap(), buffer);
+ }
+ if (currentState.getPrivateRenderParametersMap() != null)
+ {
+ logDecode("private render parameters", currentState.getPrivateRenderParametersMap(), buffer);
+ }
+ if (currentState.getPublicRenderParametersMap() != null)
+ {
+ logDecode("public render parameters", currentState.getPublicRenderParametersMap(), buffer);
}
}
buffer.append("]");
}
}
+ private void logDecode(String parameterNameMap, Map<String, String[]> parametersMap, StringBuffer buffer)
+ {
+ buffer.append(",");
+ buffer.append(parameterNameMap);
+ buffer.append(":[");
+ boolean first = true;
+ Iterator<String> parIter = parametersMap.keySet().iterator();
+ while ( parIter.hasNext() )
+ {
+ if ( first )
+ {
+ first = false;
+ }
+ else
+ {
+ buffer.append(",");
+ }
+ String name = parIter.next();
+ buffer.append(name+":[");
+ String[] values = parametersMap.get(name);
+ for ( int i = 0; i < values.length; i++ )
+ {
+ if ( i > 0 )
+ {
+ buffer.append(",");
+ }
+ buffer.append(values[i]);
+ }
+ buffer.append("]");
+ }
+ }
+
public String encode(PortletWindowRequestNavigationalStates states, PortletWindow window, PortletMode portletMode,
- WindowState windowState, boolean navParamsStateFull, boolean renderParamsStateFull)
+ WindowState windowState, boolean navParamsStateFull, boolean renderParamsStateFull)
throws UnsupportedEncodingException
{
String windowId = window.getId().toString();
PortletWindowRequestNavigationalState currentState = states.getPortletWindowNavigationalState(windowId);
- PortletWindowRequestNavigationalState targetState = new PortletWindowRequestNavigationalState(windowId);
+ PortletWindowRequestNavigationalState targetState = new PortletWindowRequestNavigationalState(windowId, getActionScopedRequestAttributes(window));
targetState.setPortletMode(portletMode != null ? portletMode : currentState != null ? currentState.getPortletMode() : null);
targetState.setWindowState(windowState != null ? windowState : currentState != null ? currentState.getWindowState() : null);
@@ -220,17 +292,25 @@
return encode(states, windowId, targetState, PortalURL.URLType.RENDER, navParamsStateFull, renderParamsStateFull);
}
- public String encode(PortletWindowRequestNavigationalStates states, PortletWindow window, Map<String, String[]> parameters,
- PortletMode portletMode, WindowState windowState, PortalURL.URLType urlType, boolean navParamsStateFull,
- boolean renderParamsStateFull)
+ public String encode(PortletWindowRequestNavigationalStates states, PortletWindow window, Map<String, String[]> parameters,
+ String actionScopeId, boolean actionScopeRendered, String cacheLevel, String resourceId,
+ Map<String, String[]> privateRenderParameters, Map<String, String[]> publicRenderParameters,
+ PortletMode portletMode, WindowState windowState, PortalURL.URLType urlType, boolean navParamsStateFull,
+ boolean renderParamsStateFull)
throws UnsupportedEncodingException
{
String windowId = window.getId().toString();
PortletWindowRequestNavigationalState currentState = states.getPortletWindowNavigationalState(windowId);
- PortletWindowRequestNavigationalState targetState = new PortletWindowRequestNavigationalState(windowId);
+ PortletWindowRequestNavigationalState targetState = new PortletWindowRequestNavigationalState(windowId, getActionScopedRequestAttributes(window));
targetState.setPortletMode(portletMode != null ? portletMode : currentState != null ? currentState.getPortletMode() : null);
targetState.setWindowState(windowState != null ? windowState : currentState != null ? currentState.getWindowState() : null);
targetState.setParametersMap(parameters);
+ targetState.setActionScopeId(actionScopeId);
+ targetState.setActionScopeRendered(actionScopeRendered);
+ targetState.setCacheLevel(cacheLevel);
+ targetState.setResourceId(resourceId);
+ targetState.setPrivateRenderParametersMap(privateRenderParameters);
+ setStatePublicRenderParametersMap(states, targetState, publicRenderParameters);
if ( renderParamsStateFull && parameters == null )
{
// Indicate that the saved (in the session) render parameters for this PortletWindow must be cleared
@@ -240,39 +320,80 @@
return encode(states, windowId, targetState, urlType, navParamsStateFull, renderParamsStateFull);
}
+ public void setStatePublicRenderParametersMap(PortletWindowRequestNavigationalStates requestStates, PortletWindowRequestNavigationalState requestState, Map<String, String[]> publicRenderParametersMap)
+ {
+ // set public render parameters map for state
+ boolean resetStatesPublicRenderParameters = (requestState.getPublicRenderParametersMap() != null);
+ requestState.setPublicRenderParametersMap(publicRenderParametersMap);
+ if (resetStatesPublicRenderParameters)
+ {
+ // reset request states public render parameters map
+ requestStates.setPublicRenderParametersMap(null);
+ // repopulate request states public render parameters map
+ Iterator<String> iter = requestStates.getWindowIdIterator();
+ while (iter.hasNext())
+ {
+ String iterWindowId = iter.next();
+ PortletWindowRequestNavigationalState iterRequestState = requestStates.getPortletWindowNavigationalState(iterWindowId);
+ if (iterRequestState != requestState)
+ {
+ updateStatesPublicRenderParametersMap(requestStates, iterRequestState, iterRequestState.getPublicRenderParametersMap());
+ }
+ }
+ }
+ // update request states public render parameters map
+ updateStatesPublicRenderParametersMap(requestStates, requestState, publicRenderParametersMap);
+ }
+
+ public void updateStatesPublicRenderParametersMap(PortletWindowRequestNavigationalStates requestStates, PortletWindowRequestNavigationalState requestState, Map<String, String[]> publicRenderParametersMap)
+ {
+ if (publicRenderParametersMap != null)
+ {
+ // update request states public render parameters map
+ String windowId = requestState.getWindowId();
+ for (Map.Entry<String, String[]> parameter : publicRenderParametersMap.entrySet())
+ {
+ String parameterName = parameter.getKey();
+ String[] parameterValues = parameter.getValue();
+ // get qname for request public render parameter name
+ QName parameterQName = getPublicRenderParameterQName(windowId, parameterName);
+ if (parameterQName != null)
+ {
+ requestStates.setPublicRenderParameters(parameterQName, parameterValues);
+ }
+ }
+ }
+ }
+
public String encode(PortletWindowRequestNavigationalStates states, boolean navParamsStateFull, boolean renderParamsStateFull)
throws UnsupportedEncodingException
{
return encode(states, null, null, PortalURL.URLType.RENDER, navParamsStateFull, renderParamsStateFull);
}
+
protected String encode(PortletWindowRequestNavigationalStates states, String targetWindowId,
- PortletWindowRequestNavigationalState targetState, PortalURL.URLType urlType, boolean navParamsStateFull,
- boolean renderParamsStateFull)
+ PortletWindowRequestNavigationalState targetState, PortalURL.URLType urlType,
+ boolean navParamsStateFull, boolean renderParamsStateFull)
throws UnsupportedEncodingException
{
StringBuffer buffer = new StringBuffer();
- String encodedState;
boolean haveState = false;
+ boolean encodeTargetWindowPublicRenderParams = true;
// skip other states if all non-targeted PortletWindow states are kept in the session
- if ( !navParamsStateFull || !renderParamsStateFull )
+ if (!navParamsStateFull || !renderParamsStateFull)
{
- PortletWindowRequestNavigationalState pwfns;
- String windowId;
+ // encode individual request states, (skip target request state encoded below)
Iterator<String> iter = states.getWindowIdIterator();
- while ( iter.hasNext() )
+ while (iter.hasNext())
{
- windowId = iter.next();
- pwfns = states.getPortletWindowNavigationalState(windowId);
- if ( targetWindowId != null && windowId.equals(targetWindowId))
+ String windowId = iter.next();
+ PortletWindowRequestNavigationalState requestState = states.getPortletWindowNavigationalState(windowId);
+ if ((targetWindowId == null) || !windowId.equals(targetWindowId))
{
- // skip it for now, it will be encoded as the last one below
- }
- else
- {
- encodedState = encodePortletWindowNavigationalState(windowId, pwfns, PortalURL.URLType.RENDER, navParamsStateFull,
- renderParamsStateFull);
- if ( encodedState.length() > 0 )
+ encodeTargetWindowPublicRenderParams = false;
+ String encodedState = encodePortletWindowNavigationalState(windowId, requestState, PortalURL.URLType.RENDER, navParamsStateFull, renderParamsStateFull, false);
+ if (encodedState.length() > 0)
{
if ( !haveState )
{
@@ -287,10 +408,29 @@
}
}
}
+ // encode target request state
if (targetWindowId != null)
{
- encodedState = encodePortletWindowNavigationalState(targetWindowId, targetState, urlType, false, false);
- if ( encodedState.length() > 0 )
+ String encodedState = encodePortletWindowNavigationalState(targetWindowId, targetState, urlType, false, false, encodeTargetWindowPublicRenderParams);
+ if (encodedState.length() > 0)
+ {
+ if (!haveState)
+ {
+ haveState = true;
+ }
+ else
+ {
+ buffer.append(PARAMETER_SEPARATOR);
+ }
+ buffer.append(encodedState);
+ }
+ }
+ // encode shared public render parameter request states
+ // if they have not been encoded on the target window
+ if (haveState && !encodeTargetWindowPublicRenderParams)
+ {
+ String encodedState = encodePublicRenderParameterState(states, urlType, navParamsStateFull, renderParamsStateFull);
+ if (encodedState.length() > 0)
{
if ( !haveState )
{
@@ -302,24 +442,136 @@
}
buffer.append(encodedState);
}
+ }
+ // return encoded state
+ return (haveState ? encodeParameters(buffer.toString(), states.getCharacterEncoding()) : null);
+ }
+
+ public boolean getActionScopedRequestAttributes(PortletWindow window)
+ {
+ // get action scoped request attributes option from portlet definition
+ PortletDefinition pd = window.getPortletEntity().getPortletDefinition();
+ ContainerRuntimeOption actionScopedRequestAttributesOption = pd.getContainerRuntimeOption(ContainerRuntimeOption.ACTION_SCOPED_REQUEST_ATTRIBUTES_OPTION);
+ if (actionScopedRequestAttributesOption == null)
+ {
+ actionScopedRequestAttributesOption = pd.getApplication().getContainerRuntimeOption(ContainerRuntimeOption.ACTION_SCOPED_REQUEST_ATTRIBUTES_OPTION);
+ }
+ return ((actionScopedRequestAttributesOption != null) && (actionScopedRequestAttributesOption.getValues() != null) && (actionScopedRequestAttributesOption.getValues().size() > 0) && "true".equals(actionScopedRequestAttributesOption.getValues().get(0)));
+ }
+
+ public boolean getActionScopedRequestAttributes(String windowId)
+ {
+ // access portlet window and get action scoped request attributes option
+ PortletWindow window = windowAccessor.getPortletWindow(windowId);
+ if ( window != null )
+ {
+ return getActionScopedRequestAttributes(window);
+ }
+ return false;
+ }
+
+ public QName getPublicRenderParameterQName(PortletWindow window, String identifier)
+ {
+ // get public render parameter qname from portlet application
+ PortletApplication pa = window.getPortletEntity().getPortletDefinition().getApplication();
+ PublicRenderParameter publicRenderParameter = pa.getPublicRenderParameter(identifier);
+ return publicRenderParameter.getQName();
+ }
+
+ public QName getPublicRenderParameterQName(String windowId, String identifier)
+ {
+ // access portlet window and get public render parameter qname
+ PortletWindow window = windowAccessor.getPortletWindow(windowId);
+ if (window != null)
+ {
+ return getPublicRenderParameterQName(window, identifier);
+ }
+ return null;
+ }
+
+ public Map<String, QName> getPublicRenderParameterNamesMap(PortletWindow window)
+ {
+ // get public render parameter names from portlet application
+ PortletApplication pa = window.getPortletEntity().getPortletDefinition().getApplication();
+ if (pa.getPublicRenderParameters() != null)
+ {
+ Map<String, QName> parameterNames = new HashMap<String, QName>();
+ for (PublicRenderParameter publicRenderParameter : pa.getPublicRenderParameters())
+ {
+ parameterNames.put(publicRenderParameter.getIdentifier(), publicRenderParameter.getQName());
+ }
+ return parameterNames;
}
- String encodedNavState = null;
- if ( haveState )
+ return null;
+ }
+
+ public Map<String, QName> getPublicRenderParameterNamesMap(String windowId)
+ {
+ // access portlet window and get public render parameter names
+ PortletWindow window = windowAccessor.getPortletWindow(windowId);
+ if (window != null)
{
- encodedNavState = encodeParameters(buffer.toString(), states.getCharacterEncoding());
+ return getPublicRenderParameterNamesMap(window);
}
- return encodedNavState;
+ return null;
+ }
+
+ public boolean hasPublicRenderParameterQNames(PortletWindow window, Set<QName> qnames)
+ {
+ // test public render parameter qnames from portlet application
+ PortletApplication pa = window.getPortletEntity().getPortletDefinition().getApplication();
+ if (pa.getPublicRenderParameters() != null)
+ {
+ for (PublicRenderParameter publicRenderParameter : pa.getPublicRenderParameters())
+ {
+ if (qnames.contains(publicRenderParameter.getQName()))
+ {
+ return true;
+ }
+ }
+ }
+ return false;
}
+ public boolean hasPublicRenderParameterQNames(String windowId, Set<QName> qnames)
+ {
+ // access portlet window and test public render parameter qnames
+ PortletWindow window = windowAccessor.getPortletWindow(windowId);
+ if (window != null)
+ {
+ return hasPublicRenderParameterQNames(window, qnames);
+ }
+ return false;
+ }
+
+ protected String encodePublicRenderParameterState(PortletWindowRequestNavigationalStates states,
+ PortalURL.URLType urlType, boolean navParamsStateFull,
+ boolean renderParamsStateFull)
+ {
+ StringBuffer buffer = new StringBuffer();
+ boolean encoded = false;
+
+ if ((PortalURL.URLType.ACTION.equals(urlType) || !renderParamsStateFull))
+ {
+ if (states.getPublicRenderParametersMap() != null)
+ {
+ encoded = encodeParameterMap(encoded, PARAM_KEY, states.getPublicRenderParametersMap(), buffer);
+ }
+ }
+
+ return encoded ? buffer.toString() : "";
+ }
+
protected String encodePortletWindowNavigationalState(String windowId, PortletWindowRequestNavigationalState state,
PortalURL.URLType urlType, boolean navParamsStateFull,
- boolean renderParamsStateFull)
+ boolean renderParamsStateFull, boolean encodePublicRenderParams)
{
StringBuffer buffer = new StringBuffer();
buffer.append(URLTYPE_ID_KEYS[urlType.ordinal()]);
buffer.append(windowId);
boolean encoded = !PortalURL.URLType.RENDER.equals(urlType);
- if ( PortalURL.URLType.ACTION.equals(urlType) || !navParamsStateFull )
+
+ if (PortalURL.URLType.ACTION.equals(urlType) || !navParamsStateFull)
{
if (state.getPortletMode() != null)
{
@@ -328,7 +580,6 @@
buffer.append(encodePortletMode(state.getPortletMode()));
encoded = true;
}
-
if (state.getWindowState() != null)
{
buffer.append(PARAMETER_SEPARATOR);
@@ -338,38 +589,50 @@
}
}
- if (state.getParametersMap() != null && (PortalURL.URLType.ACTION.equals(urlType) || !renderParamsStateFull) )
+ if ((PortalURL.URLType.ACTION.equals(urlType) || !renderParamsStateFull))
{
- Map.Entry<String, String[]> entry;
- String parameterName;
- String[] parameterValues;
-
- StringBuffer paramBuffer = new StringBuffer();
- Iterator<Map.Entry<String,String[]>> iter = state.getParametersMap().entrySet().iterator();
- while ( iter.hasNext() )
+ if (state.getParametersMap() != null)
{
- encoded = true;
- entry = iter.next();
- parameterName = entry.getKey();
- parameterValues = entry.getValue();
-
- buffer.append(PARAMETER_SEPARATOR);
- buffer.append(PARAM_KEY);
-
- paramBuffer.setLength(0);
- paramBuffer.append(encodeArgument(parameterName, PARAMETER_ELEMENT_SEPARATOR));
- paramBuffer.append(PARAMETER_ELEMENT_SEPARATOR);
- paramBuffer.append(Integer.toHexString(parameterValues.length));
- for ( int i = 0; i < parameterValues.length; i++ )
+ encoded = encodeParameterMap(encoded, PARAM_KEY, state.getParametersMap(), buffer);
+ }
+ if (state.isActionScopedRequestAttributes())
+ {
+ if (state.getActionScopeId() != null)
{
- paramBuffer.append(PARAMETER_ELEMENT_SEPARATOR);
- paramBuffer.append(encodeArgument(parameterValues[i], PARAMETER_ELEMENT_SEPARATOR));
+ encoded = true;
+ buffer.append(PARAMETER_SEPARATOR);
+ if (state.isActionScopeRendered())
+ {
+ buffer.append(RENDERED_ACTION_SCOPE_ID_KEY);
+ }
+ else
+ {
+ buffer.append(ACTION_SCOPE_ID_KEY);
+ }
+ buffer.append(encodeArgument(state.getActionScopeId(), PARAMETER_SEPARATOR));
}
-
- buffer.append(encodeArgument(paramBuffer.toString(),PARAMETER_SEPARATOR));
+ }
+ if (state.getCacheLevel() != null)
+ {
+ encoded = true;
+ buffer.append(PARAMETER_SEPARATOR);
+ buffer.append(CACHE_LEVEL_KEY);
+ buffer.append(encodeArgument(state.getActionScopeId(), PARAMETER_SEPARATOR));
+ }
+ if (state.getResourceId() != null)
+ {
+ encoded = true;
+ buffer.append(PARAMETER_SEPARATOR);
+ buffer.append(CACHE_LEVEL_KEY);
+ buffer.append(encodeArgument(state.getResourceId(), PARAMETER_SEPARATOR));
+ }
+ if (state.getPrivateRenderParametersMap() != null)
+ {
+ encoded = encodeParameterMap(encoded, PRIVATE_RENDER_PARAM_KEY, state.getPrivateRenderParametersMap(), buffer);
}
}
- else if ( state.isClearParameters() )
+
+ if (state.isClearParameters())
{
// Special case: for a targeted PortletWindow for which no parameters are specified
// indicate its saved (in the session) request parameters must be cleared instead of copying them when
@@ -379,9 +642,54 @@
buffer.append(CLEAR_PARAMS_KEY);
encoded = true;
}
+
+ if (encodePublicRenderParams && (state.getPublicRenderParametersMap() != null) && (PortalURL.URLType.ACTION.equals(urlType) || !renderParamsStateFull))
+ {
+ // generate subset of public render parameters for this state
+ Map<QName, String[]> publicRenderParams = new HashMap<QName, String[]>();
+ for (Map.Entry<String, String[]> publicRenderParam : state.getPublicRenderParametersMap().entrySet())
+ {
+ String parameterName = publicRenderParam.getKey();
+ String[] parameterValues = publicRenderParam.getValue();
+ QName parameterQName = getPublicRenderParameterQName(windowId, parameterName);
+ if (parameterQName != null)
+ {
+ publicRenderParams.put(parameterQName, parameterValues);
+ }
+ }
+ encoded = encodeParameterMap(encoded, PUBLIC_RENDER_PARAM_KEY, publicRenderParams, buffer);
+ }
+
return encoded ? buffer.toString() : "";
}
+ protected boolean encodeParameterMap(boolean encoded, char paramsKey, Map<? extends Object, String[]> params, StringBuffer buffer)
+ {
+ StringBuffer paramBuffer = new StringBuffer();
+ for (Map.Entry<? extends Object, String[]> entry : params.entrySet())
+ {
+ encoded = true;
+ buffer.append(PARAMETER_SEPARATOR);
+
+ Object parameterNameObject = entry.getKey();
+ String parameterName = ((parameterNameObject instanceof QName) ? encodeQName((QName)parameterNameObject): parameterNameObject.toString());
+ String [] parameterValues = entry.getValue();
+ paramBuffer.setLength(0);
+ paramBuffer.append(encodeArgument(parameterName, PARAMETER_ELEMENT_SEPARATOR));
+ paramBuffer.append(PARAMETER_ELEMENT_SEPARATOR);
+ paramBuffer.append(Integer.toHexString(parameterValues.length));
+ for ( int i = 0; i < parameterValues.length; i++ )
+ {
+ paramBuffer.append(PARAMETER_ELEMENT_SEPARATOR);
+ paramBuffer.append(encodeArgument(parameterValues[i], PARAMETER_ELEMENT_SEPARATOR));
+ }
+
+ buffer.append(paramsKey);
+ buffer.append(encodeArgument(paramBuffer.toString(),PARAMETER_SEPARATOR));
+ }
+ return encoded;
+ }
+
protected PortletWindowRequestNavigationalState decodeParameter(PortletWindowAccessor accessor, PortletWindowRequestNavigationalStates states, PortletWindowRequestNavigationalState currentState, String parameter)
{
char parameterType = parameter.charAt(0);
@@ -404,7 +712,7 @@
{
window = accessor.createPortletWindow(windowId);
}
- currentState = new PortletWindowRequestNavigationalState(windowId);
+ currentState = new PortletWindowRequestNavigationalState(windowId, getActionScopedRequestAttributes(window));
states.addPortletWindowNavigationalState(windowId, currentState);
if ( parameterType == ACTION_WINDOW_ID_KEY )
{
@@ -417,9 +725,9 @@
states.setURLType(urlType);
}
}
- else if ( currentState != null )
+ else if (currentState != null)
{
- switch ( parameterType )
+ switch (parameterType)
{
case MODE_KEY:
{
@@ -449,33 +757,35 @@
break;
}
case PARAM_KEY:
+ case PRIVATE_RENDER_PARAM_KEY:
+ case PUBLIC_RENDER_PARAM_KEY:
{
- int position = 1;
- StringBuffer buffer = new StringBuffer();
- String parameterName = null;
- int parameterValueCount = -1;
- String parameterValues[] = null;
- int parameterValueIndex = -1;
- while ( (position = decodeArgument(position, parameter, buffer, PARAMETER_ELEMENT_SEPARATOR)) != -1 )
+ String [] parameterName = new String[1];
+ String [][] parameterValues = new String[1][1];
+ if (decodeParamsParameter(parameter, parameterName, parameterValues))
{
- if ( parameterName == null )
+ switch (parameterType)
{
- parameterName = buffer.toString();
- parameterValueCount = -1;
- }
- else if ( parameterValueCount == -1 )
- {
- parameterValueCount = Integer.parseInt(buffer.toString(), 16);
- parameterValues = new String[parameterValueCount];
- parameterValueIndex = 0;
- }
- else
- {
- parameterValues[parameterValueIndex++] = buffer.toString();
- parameterValueCount--;
- if ( parameterValueCount == 0 )
+ case PARAM_KEY:
+ {
+ // set parameter state
+ currentState.setParameters(parameterName[0], parameterValues[0]);
+ break;
+ }
+ case PRIVATE_RENDER_PARAM_KEY:
{
- currentState.setParameters(parameterName, parameterValues);
+ // set private render parameter state
+ currentState.setPrivateRenderParameters(parameterName[0], parameterValues[0]);
+ break;
+ }
+ case PUBLIC_RENDER_PARAM_KEY:
+ {
+ // set public render parameter states
+ QName parameterQName = decodeQName(parameterName[0]);
+ if (parameterQName != null)
+ {
+ states.setPublicRenderParameters(parameterQName, parameterValues[0]);
+ }
break;
}
}
@@ -485,11 +795,97 @@
case CLEAR_PARAMS_KEY:
{
currentState.setClearParameters(true);
+ break;
+ }
+ case CACHE_LEVEL_KEY:
+ case RESOURCE_ID_KEY:
+ case ACTION_SCOPE_ID_KEY:
+ case RENDERED_ACTION_SCOPE_ID_KEY:
+ {
+ parameter = parameter.substring(1);
+ switch (parameterType)
+ {
+ case CACHE_LEVEL_KEY:
+ {
+ currentState.setCacheLevel(parameter);
+ break;
+ }
+ case RESOURCE_ID_KEY:
+ {
+ currentState.setResourceId(parameter);
+ break;
+ }
+ case ACTION_SCOPE_ID_KEY:
+ {
+ currentState.setActionScopeId(parameter);
+ currentState.setActionScopeRendered(false);
+ break;
+ }
+ case RENDERED_ACTION_SCOPE_ID_KEY:
+ {
+ currentState.setActionScopeId(parameter);
+ currentState.setActionScopeRendered(true);
+ break;
+ }
+ }
+ break;
}
}
}
+ else
+ {
+ switch (parameterType)
+ {
+ case PUBLIC_RENDER_PARAM_KEY:
+ {
+ String [] parameterName = new String[1];
+ String [][] parameterValues = new String[1][1];
+ if (decodeParamsParameter(parameter, parameterName, parameterValues))
+ {
+ // set public render parameter states
+ QName parameterQName = decodeQName(parameterName[0]);
+ if (parameterQName != null)
+ {
+ states.setPublicRenderParameters(parameterQName, parameterValues[0]);
+ }
+ }
+ break;
+ }
+ }
+ }
return currentState;
-
+ }
+
+ protected boolean decodeParamsParameter(String parameter, String [] parameterName, String [][] parameterValues)
+ {
+ int position = 1;
+ StringBuffer buffer = new StringBuffer();
+ int parameterValueCount = -1;
+ int parameterValueIndex = -1;
+ while ( (position = decodeArgument(position, parameter, buffer, PARAMETER_ELEMENT_SEPARATOR)) != -1 )
+ {
+ if ( parameterName[0] == null )
+ {
+ parameterName[0] = buffer.toString();
+ parameterValueCount = -1;
+ }
+ else if ( parameterValueCount == -1 )
+ {
+ parameterValueCount = Integer.parseInt(buffer.toString(), 16);
+ parameterValues[0] = new String[parameterValueCount];
+ parameterValueIndex = 0;
+ }
+ else
+ {
+ parameterValues[0][parameterValueIndex++] = buffer.toString();
+ parameterValueCount--;
+ if ( parameterValueCount == 0 )
+ {
+ return true;
+ }
+ }
+ }
+ return false;
}
protected PortletMode decodePortletMode(char mode)
@@ -629,4 +1025,52 @@
}
return buffer.length() > 0 ? position : -1;
}
+
+ protected QName decodeQName(String qnameString)
+ {
+ int namespacePrefixSeparator = qnameString.indexOf("//:");
+ if (namespacePrefixSeparator != -1)
+ {
+ int prefixLocalpartSeparator = qnameString.indexOf(":", namespacePrefixSeparator+3);
+ if (prefixLocalpartSeparator != -1)
+ {
+ String namespace = (namespacePrefixSeparator > 0) ? qnameString.substring(0, namespacePrefixSeparator) : null;
+ String prefix = (prefixLocalpartSeparator-namespacePrefixSeparator > 3) ? qnameString.substring(namespacePrefixSeparator+3, namespacePrefixSeparator): null;
+ String localpart = (namespacePrefixSeparator+1 < qnameString.length()) ? qnameString.substring(namespacePrefixSeparator+1) : null;
+ if (localpart != null)
+ {
+ if (namespace == null)
+ {
+ return new QName(localpart);
+ }
+ else if (prefix == null)
+ {
+ return new QName(namespace, localpart);
+ }
+ else
+ {
+ return new QName(namespace, localpart, prefix);
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ protected String encodeQName(QName qname)
+ {
+ String namespace = qname.getNamespaceURI();
+ namespace = (namespace != null) ? namespace : "";
+ String prefix = qname.getPrefix();
+ prefix = (prefix != null) ? prefix : "";
+ String localpart = qname.getLocalPart();
+
+ StringBuilder builder = new StringBuilder();
+ builder.append(namespace);
+ builder.append("//:");
+ builder.append(prefix);
+ builder.append(":");
+ builder.append(localpart);
+ return builder.toString();
+ }
}
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/NavigationalStateCodec.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/NavigationalStateCodec.java?rev=757118&r1=757117&r2=757118&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/NavigationalStateCodec.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/NavigationalStateCodec.java Sun Mar 22 02:50:28 2009
@@ -18,24 +18,46 @@
import java.io.UnsupportedEncodingException;
import java.util.Map;
+import java.util.Set;
import javax.portlet.PortletMode;
import javax.portlet.WindowState;
+import javax.xml.namespace.QName;
import org.apache.jetspeed.container.PortletWindow;
import org.apache.jetspeed.container.url.PortalURL;
public interface NavigationalStateCodec
{
- PortletWindowRequestNavigationalStates decode(String parameters, String characterEncoding) throws UnsupportedEncodingException;
+ PortletWindowRequestNavigationalStates decode(String parameters, String characterEncoding)
+ throws UnsupportedEncodingException;
String encode(PortletWindowRequestNavigationalStates states, PortletWindow window, PortletMode portletMode,
- WindowState windowState, boolean navParamsStateFull, boolean renderParamsStateFull) throws UnsupportedEncodingException;
+ WindowState windowState, boolean navParamsStateFull, boolean renderParamsStateFull)
+ throws UnsupportedEncodingException;
String encode(PortletWindowRequestNavigationalStates states, PortletWindow window, Map<String, String[]> parameters,
- PortletMode portletMode, WindowState windowState, PortalURL.URLType urlType, boolean navParamsStateFull,
- boolean renderParamsStateFull) throws UnsupportedEncodingException;
+ String actionScopeId, boolean actionScopeRendered, String cacheLevel, String resourceId,
+ Map<String, String[]> privateRenderParameters, Map<String, String[]> publicRenderParameters,
+ PortletMode portletMode, WindowState windowState, PortalURL.URLType urlType, boolean navParamsStateFull,
+ boolean renderParamsStateFull)
+ throws UnsupportedEncodingException;
String encode(PortletWindowRequestNavigationalStates states, boolean navParamsStateFull, boolean renderParamsStateFull)
- throws UnsupportedEncodingException;
+ throws UnsupportedEncodingException;
+
+ void setStatePublicRenderParametersMap(PortletWindowRequestNavigationalStates requestStates, PortletWindowRequestNavigationalState requestState, Map<String, String[]> publicRenderParametersMap);
+ void updateStatesPublicRenderParametersMap(PortletWindowRequestNavigationalStates requestStates, PortletWindowRequestNavigationalState requestState, Map<String, String[]> publicRenderParametersMap);
+
+ boolean getActionScopedRequestAttributes(PortletWindow window);
+ boolean getActionScopedRequestAttributes(String windowId);
+
+ QName getPublicRenderParameterQName(PortletWindow window, String identifier);
+ QName getPublicRenderParameterQName(String windowId, String identifier);
+
+ Map<String, QName> getPublicRenderParameterNamesMap(PortletWindow window);
+ Map<String, QName> getPublicRenderParameterNamesMap(String windowId);
+
+ boolean hasPublicRenderParameterQNames(PortletWindow window, Set<QName> qnames);
+ boolean hasPublicRenderParameterQNames(String windowId, Set<QName> qnames);
}
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowExtendedNavigationalState.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowExtendedNavigationalState.java?rev=757118&r1=757117&r2=757118&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowExtendedNavigationalState.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowExtendedNavigationalState.java Sun Mar 22 02:50:28 2009
@@ -64,10 +64,21 @@
}
}
+ public PortletWindowExtendedNavigationalState(boolean actionScopedRequestAttributes)
+ {
+ this.actionScopedRequestAttributes = actionScopedRequestAttributes;
+ }
+
private Map<String, String[]> parametersMap;
+
+ private boolean actionScopedRequestAttributes;
+
+ private String actionScopeId;
+
+ private boolean actionScopeRendered;
private Map<ModeStateKey, String> decoratorActionEncodings;
-
+
public Map<String, String[]> getParametersMap()
{
return parametersMap;
@@ -87,6 +98,31 @@
this.parametersMap = parametersMap;
}
+ public boolean isActionScopedRequestAttributes()
+ {
+ return actionScopedRequestAttributes;
+ }
+
+ public String getActionScopeId()
+ {
+ return actionScopeId;
+ }
+
+ public void setActionScopeId(String actionScopeId)
+ {
+ this.actionScopeId = actionScopeId;
+ }
+
+ public boolean isActionScopeRendered()
+ {
+ return actionScopeRendered;
+ }
+
+ public void setActionScopeRendered(boolean actionScopeRendered)
+ {
+ this.actionScopeRendered = actionScopeRendered;
+ }
+
public void resetDecoratorActionEncodings()
{
if (decoratorActionEncodings != null)
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowRequestNavigationalState.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowRequestNavigationalState.java?rev=757118&r1=757117&r2=757118&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowRequestNavigationalState.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowRequestNavigationalState.java Sun Mar 22 02:50:28 2009
@@ -16,6 +16,9 @@
*/
package org.apache.jetspeed.container.state.impl;
+import java.util.HashMap;
+import java.util.Map;
+
/**
* PortletWindowRequestNavigationalState
*
@@ -26,7 +29,11 @@
{
private static final long serialVersionUID = 3807035638733358425L;
- private String windowId;
+ private String windowId;
+ private String cacheLevel;
+ private String resourceId;
+ private Map<String, String[]> privateRenderParametersMap;
+ private Map<String, String[]> publicRenderParametersMap;
/**
* true if for a targeted PortletWindow using StateFullParameters the saved (in the session) render parameters
@@ -37,8 +44,9 @@
*/
private boolean clearParameters;
- public PortletWindowRequestNavigationalState(String windowId)
+ public PortletWindowRequestNavigationalState(String windowId, boolean actionScopedRequestAttributes)
{
+ super(actionScopedRequestAttributes);
this.windowId = windowId;
}
@@ -47,6 +55,64 @@
return windowId;
}
+ public String getCacheLevel()
+ {
+ return cacheLevel;
+ }
+
+ public void setCacheLevel(String cacheLevel)
+ {
+ this.cacheLevel = cacheLevel;
+ }
+
+ public String getResourceId()
+ {
+ return resourceId;
+ }
+
+ public void setResourceId(String resourceId)
+ {
+ this.resourceId = resourceId;
+ }
+
+ public Map<String, String[]> getPrivateRenderParametersMap()
+ {
+ return privateRenderParametersMap;
+ }
+
+ public void setPrivateRenderParameters(String name, String[] values)
+ {
+ if (privateRenderParametersMap == null)
+ {
+ privateRenderParametersMap = new HashMap<String, String[]>();
+ }
+ privateRenderParametersMap.put(name, values);
+ }
+
+ public void setPrivateRenderParametersMap(Map<String, String[]> privateRenderParametersMap)
+ {
+ this.privateRenderParametersMap = privateRenderParametersMap;
+ }
+
+ public Map<String, String[]> getPublicRenderParametersMap()
+ {
+ return publicRenderParametersMap;
+ }
+
+ public void setPublicRenderParameters(String name, String[] values)
+ {
+ if ( publicRenderParametersMap == null )
+ {
+ publicRenderParametersMap = new HashMap<String, String[]>();
+ }
+ publicRenderParametersMap.put(name, values);
+ }
+
+ public void setPublicRenderParametersMap(Map<String, String[]> publicRenderParametersMap)
+ {
+ this.publicRenderParametersMap = publicRenderParametersMap;
+ }
+
public boolean isClearParameters()
{
return clearParameters;
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowRequestNavigationalStates.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowRequestNavigationalStates.java?rev=757118&r1=757117&r2=757118&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowRequestNavigationalStates.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/PortletWindowRequestNavigationalStates.java Sun Mar 22 02:50:28 2009
@@ -20,6 +20,8 @@
import java.util.Iterator;
import java.util.Map;
+import javax.xml.namespace.QName;
+
import org.apache.jetspeed.container.PortletWindow;
import org.apache.jetspeed.container.url.PortalURL;
@@ -31,6 +33,7 @@
private PortletWindow maximizedWindow;
private PortletWindow actionWindow;
private PortletWindow resourceWindow;
+ private Map<QName, String[]> publicRenderParametersMap;
public PortletWindowRequestNavigationalStates(String characterEncoding)
{
@@ -113,4 +116,32 @@
{
return resourceWindow;
}
+
+ public Map<QName, String[]> getPublicRenderParametersMap()
+ {
+ return publicRenderParametersMap;
+ }
+
+ public void setPublicRenderParametersMap(Map<QName, String[]> publicRenderParametersMap)
+ {
+ this.publicRenderParametersMap = publicRenderParametersMap;
+ }
+
+ public void setPublicRenderParameters(QName qname, String[] values)
+ {
+ if (publicRenderParametersMap == null)
+ {
+ publicRenderParametersMap = new HashMap<QName, String[]>();
+ }
+ publicRenderParametersMap.put(qname, values);
+ }
+
+ public void addPublicRenderParametersMap(Map<QName, String[]> publicRenderParametersMap)
+ {
+ if (this.publicRenderParametersMap == null)
+ {
+ this.publicRenderParametersMap = new HashMap<QName, String[]>();
+ }
+ this.publicRenderParametersMap.putAll(publicRenderParametersMap);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org