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 ta...@apache.org on 2007/12/20 23:37:04 UTC
svn commit: r606044 - in
/portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE:
components/portal/src/java/org/apache/jetspeed/container/
components/portal/src/java/org/apache/jetspeed/container/state/impl/
src/webapp/WEB-INF/assembly/
Author: taylor
Date: Thu Dec 20 14:37:04 2007
New Revision: 606044
URL: http://svn.apache.org/viewvc?rev=606044&view=rev
Log:
backport JS2-806
https://issues.apache.org/jira/browse/JS2-806
Added:
portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/PageHistoryValve.java
portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/SessionFullExtendedNavigationalState.java
Modified:
portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/PortletWindowSessionNavigationalStates.java
portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/SessionNavigationalState.java
portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/src/webapp/WEB-INF/assembly/pipelines.xml
portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/src/webapp/WEB-INF/assembly/portal-url-generation.xml
Added: portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/PageHistoryValve.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/PageHistoryValve.java?rev=606044&view=auto
==============================================================================
--- portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/PageHistoryValve.java (added)
+++ portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/PageHistoryValve.java Thu Dec 20 14:37:04 2007
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jetspeed.container;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jetspeed.om.page.Page;
+import org.apache.jetspeed.pipeline.PipelineException;
+import org.apache.jetspeed.pipeline.valve.AbstractValve;
+import org.apache.jetspeed.pipeline.valve.ValveContext;
+import org.apache.jetspeed.request.RequestContext;
+
+
+/**
+ * <p>
+ * Valve basically mantains the page navigation history by maintaining a previous page id in the session.
+ * Required by JS2-806
+ * </p>
+ *
+ * @author <a href="mailto:kmoh.raj@gmail.com">Mohan Kannapareddy</a>
+ * @version $Id$
+ */
+public class PageHistoryValve extends AbstractValve
+{
+ protected final Log log = LogFactory.getLog(getClass());
+
+ // SessionFullExtendedNavigationalState object needs this.
+ public static final String REQUEST_CLEAR_PORTLETS_MODE_AND_WINDOWSTATE_KEY = "clearPortletsModeAndWindowState";
+
+ private final String SESSION_PREVIOUS_PAGEID_KEY = "PreviousPageId";
+ private boolean valveDisabled = false;
+
+ /* (non-Javadoc)
+ * @see org.apache.jetspeed.pipeline.valve.AbstractValve#invoke(org.apache.jetspeed.request.RequestContext, org.apache.jetspeed.pipeline.valve.ValveContext)
+ */
+ public void invoke(RequestContext request, ValveContext context) throws PipelineException
+ {
+ if (valveDisabled)
+ {
+ if (log.isDebugEnabled())
+ {
+ log.debug(toString() + " is DISABLED");
+ }
+ }
+ else
+ { //OK, the valve is enabled check and see if are a inter-page nav.
+ try
+ {
+ // create a session if not already created, necessary for Tomcat 5
+ request.getRequest().getSession(true);
+
+ Page page = request.getPage();
+ String curPageId = page.getId();
+
+ String prevPageId = (String) request.getSessionAttribute(SESSION_PREVIOUS_PAGEID_KEY);
+ if (prevPageId == null)
+ {
+ //First time, lets set it
+ request.setSessionAttribute(SESSION_PREVIOUS_PAGEID_KEY, curPageId);
+ if (log.isDebugEnabled())
+ {
+ log.debug("No previous page Id found in session, setting it for the first time");
+ }
+ }
+ else
+ {
+
+ if (prevPageId.equalsIgnoreCase(curPageId))
+ {
+ if (log.isDebugEnabled())
+ {
+ log.debug("Previous page id is same as current page id, not clearing page state");
+ }
+ }
+ else
+ {
+ if (log.isDebugEnabled())
+ {
+ log.debug("Page Change encountered Current Page:" + curPageId + " Prev Page:" + prevPageId);
+ }
+ // Make sure we set the prevPageId in session
+ request.setSessionAttribute(SESSION_PREVIOUS_PAGEID_KEY, curPageId);
+ // inform NavigationalState object we want to clear all Modes
+ request.setAttribute(REQUEST_CLEAR_PORTLETS_MODE_AND_WINDOWSTATE_KEY, Boolean.TRUE);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ throw new PipelineException(e);
+ }
+ }
+ // Pass control to the next Valve in the Pipeline
+ context.invokeNext(request);
+
+ }
+
+ public String toString()
+ {
+ return "PageHistoryValve";
+ }
+
+ public void setValveDisabled(boolean valveDisabled)
+ {
+ this.valveDisabled = valveDisabled;
+ }
+
+ public boolean isValveDisabled()
+ {
+ return valveDisabled;
+ }
+
+}
Modified: portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/PortletWindowSessionNavigationalStates.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/PortletWindowSessionNavigationalStates.java?rev=606044&r1=606043&r2=606044&view=diff
==============================================================================
--- portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/PortletWindowSessionNavigationalStates.java (original)
+++ portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/PortletWindowSessionNavigationalStates.java Thu Dec 20 14:37:04 2007
@@ -47,6 +47,76 @@
{
this.storeParameters = storeParameters;
}
+ /*
+ * JS2-806 patch
+ * <p>
+ * reset all portlets on page to mode VIEW and window state NORMAL in the case of page navigation.
+ * </p>
+ */
+ public void changeAllPortletsToViewModeAndNormalWindowState(RequestContext context, Page page, PortletWindowRequestNavigationalStates requestStates, JetspeedContentCache cache, JetspeedContentCache decorationCache)
+ {
+ final PortletMode viewMode = PortletMode.VIEW;
+ final WindowState normalWindowState = WindowState.NORMAL;
+
+ PageState pageState = (PageState)pageStates.get(page.getId());
+ if ( pageState == null )
+ {
+ pageState = new PageState();
+ pageStates.put(page.getId(), pageState);
+ }
+
+ PortletWindowRequestNavigationalState requestState = null;
+ PortletWindowBaseNavigationalState sessionState = null;
+
+ //remove any maximized windows
+ if (null != pageState.maximizedWindowId)
+ {
+ pageState.windowStates.remove(pageState.maximizedWindowId);
+ pageState.maximizedWindowId = null;
+ }
+
+ Iterator iter = requestStates.getWindowIdIterator();
+ iter = pageState.windowStates.keySet().iterator();
+ String windowId;
+ while ( iter.hasNext() )
+ {
+ windowId = (String)iter.next();
+ requestState = requestStates.getPortletWindowNavigationalState(windowId);
+ if ( requestState == null )
+ {
+ requestState = new PortletWindowRequestNavigationalState(windowId);
+ }
+ //regardless, reset portlet mode and window state
+ requestState.setPortletMode(viewMode);
+ requestState.setWindowState(normalWindowState);
+ // get the session case just in case and create a new one
+ sessionState = (PortletWindowBaseNavigationalState)pageState.windowStates.get(requestState.getWindowId());
+ if ( sessionState == null )
+ {
+ if ( storeParameters )
+ {
+ sessionState = new PortletWindowExtendedNavigationalState();
+ }
+ else
+ {
+ sessionState = new PortletWindowBaseNavigationalState();
+ }
+ pageState.windowStates.put(requestState.getWindowId(),sessionState);
+ }
+ //Now, sync up. NOTE we should not be in this method if there is an portlet action request.
+ boolean changed = syncStates(false, requestState,(PortletWindowBaseNavigationalState)pageState.windowStates.get(windowId));
+ if (changed)
+ {
+ removeFromCache(context, requestState.getWindowId(), cache);
+ removeFromCache(context, page.getId(), decorationCache);
+ if (storeParameters)
+ {
+ ((PortletWindowExtendedNavigationalState)sessionState).resetDecoratorActionEncodings();
+ }
+ }
+
+ }
+ }
public void sync(RequestContext context, Page page, PortletWindowRequestNavigationalStates requestStates, JetspeedContentCache cache, JetspeedContentCache decorationCache)
{
Added: portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/SessionFullExtendedNavigationalState.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/SessionFullExtendedNavigationalState.java?rev=606044&view=auto
==============================================================================
--- portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/SessionFullExtendedNavigationalState.java (added)
+++ portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/SessionFullExtendedNavigationalState.java Thu Dec 20 14:37:04 2007
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jetspeed.container.state.impl;
+
+import org.apache.jetspeed.cache.JetspeedContentCache;
+import org.apache.jetspeed.container.PageHistoryValve;
+import org.apache.jetspeed.request.RequestContext;
+
+/**
+ * SessionFullClearOnChangePageNavigationalState, stores all nav parameters in the session, including render parameters
+ *
+ * @author <a href="mailto:kmoh.raj@gmail.com">Mohan Kannapareddy</a>
+ * @version $Id$
+ */
+
+public class SessionFullExtendedNavigationalState extends SessionFullNavigationalState
+{
+ private boolean clearStateOnPageChangeEnabled = false;
+
+
+ public SessionFullExtendedNavigationalState(NavigationalStateCodec codec,JetspeedContentCache cache)
+ {
+ super(codec, cache);
+ }
+ public SessionFullExtendedNavigationalState(NavigationalStateCodec codec, JetspeedContentCache cache, JetspeedContentCache decorationCache)
+ {
+ super(codec, cache, decorationCache);
+ }
+
+ public SessionFullExtendedNavigationalState(NavigationalStateCodec codec, JetspeedContentCache cache, JetspeedContentCache decorationCache, boolean clearStateOnPageChangeEnabled)
+ {
+ super(codec, cache, decorationCache);
+ this.clearStateOnPageChangeEnabled = clearStateOnPageChangeEnabled;
+ }
+
+ protected boolean clearPagePortletsModeAndWindowState(RequestContext context)
+ {
+ String contextKey = PageHistoryValve.REQUEST_CLEAR_PORTLETS_MODE_AND_WINDOWSTATE_KEY;
+ boolean result = false;
+ if (clearStateOnPageChangeEnabled)
+ {
+ Boolean pageNavigationEvent = (Boolean) context.getAttribute(contextKey);
+ if ((pageNavigationEvent != null))
+ {
+ result = pageNavigationEvent.booleanValue();
+ }
+ }
+ //Just to be safe make it false
+ context.setAttribute(contextKey, Boolean.FALSE);
+
+ return result;
+ }
+
+ public synchronized void sync(RequestContext context)
+ {
+ // JS2-806, check the session for a psuedo inter page navigation.
+ boolean resetPagePortlets = false;
+ if (clearStateOnPageChangeEnabled)
+ {
+ resetPagePortlets = clearPagePortletsModeAndWindowState(context);
+ if (log.isDebugEnabled())
+ {
+ log.debug("resetPagePortlets:" + resetPagePortlets);
+ }
+ }
+
+ // push the informaion up to SessionNavigationalState, so that we can handle it appropriately there
+ setClearPortletsModeAndWindowStateEnabled(resetPagePortlets);
+ //Inform the super
+ super.sync(context);
+ }
+}
Modified: portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/SessionNavigationalState.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/SessionNavigationalState.java?rev=606044&r1=606043&r2=606044&view=diff
==============================================================================
--- portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/SessionNavigationalState.java (original)
+++ portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/components/portal/src/java/org/apache/jetspeed/container/state/impl/SessionNavigationalState.java Thu Dec 20 14:37:04 2007
@@ -21,6 +21,8 @@
import javax.portlet.WindowState;
import javax.servlet.http.HttpSession;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.jetspeed.JetspeedActions;
import org.apache.jetspeed.cache.JetspeedContentCache;
import org.apache.jetspeed.container.state.NavigationalState;
@@ -31,12 +33,19 @@
/**
* SessionNavigationalState, stores nav parameters in the session, not on URL
*
+ * <p>
+ * Added the ability to reset portlet mode and window states to VIEW and NORMAL in the case
+ * of page navigation. JS2-806
+ * </p>
+ *
* @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
* @version $Id$
*/
public class SessionNavigationalState extends AbstractNavigationalState
{
+ protected final Log log = LogFactory.getLog(getClass());
private Map currentPageWindowStates;
+ private boolean clearPortletsModeAndWindowStateEnabled = false;
public SessionNavigationalState(NavigationalStateCodec codec, JetspeedContentCache cache)
{
@@ -104,7 +113,15 @@
session.setAttribute(NavigationalState.NAVSTATE_SESSION_KEY, sessionStates);
}
Page page = context.getPage();
- sessionStates.sync(context, (Page) context.getPage(), requestStates, cache, decorationCache);
+ // JS2-806
+ if (isClearPortletsModeAndWindowStateEnabled())
+ {
+ sessionStates.changeAllPortletsToViewModeAndNormalWindowState(context, page, requestStates, cache, decorationCache);
+ }
+ else
+ {
+ sessionStates.sync(context, (Page) context.getPage(), requestStates, cache, decorationCache);
+ }
if (isNavigationalParameterStateFull() && isRenderParameterStateFull())
{
currentPageWindowStates = sessionStates.getWindowStates(page);
@@ -126,5 +143,16 @@
public boolean isRenderParameterStateFull()
{
return false;
+ }
+
+ protected void setClearPortletsModeAndWindowStateEnabled(
+ boolean clearPortletsModeAndWindowStateEnabled)
+ {
+ this.clearPortletsModeAndWindowStateEnabled = clearPortletsModeAndWindowStateEnabled;
+ }
+
+ protected boolean isClearPortletsModeAndWindowStateEnabled()
+ {
+ return clearPortletsModeAndWindowStateEnabled;
}
}
Modified: portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/src/webapp/WEB-INF/assembly/pipelines.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/src/webapp/WEB-INF/assembly/pipelines.xml?rev=606044&r1=606043&r2=606044&view=diff
==============================================================================
--- portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/src/webapp/WEB-INF/assembly/pipelines.xml (original)
+++ portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/src/webapp/WEB-INF/assembly/pipelines.xml Thu Dec 20 14:37:04 2007
@@ -147,6 +147,20 @@
</constructor-arg>
</bean>
+ <!--
+ JS2-806
+ - this valve effectively maintains a previous page id in the session giving the downstream valve
+ the ability to manipulate inter-page navigation characterstics.
+
+ default : "true" (effectively disables the valve)
+ : "false" (enables it and sets the previous page id in session)
+ -->
+ <bean id="pageHistoryValve"
+ class="org.apache.jetspeed.container.PageHistoryValve"
+ init-method="initialize">
+ <property name="valveDisabled" value="false" />
+ </bean>
+
<bean id="containerValve"
class="org.apache.jetspeed.container.ContainerValve"
init-method="initialize"
@@ -297,7 +311,7 @@
</constructor-arg>
-->
<!-- When clicking on Edit Mode, also switch to Maximize -->
- <property name="maximizeOnEdit"><value>false</value></property>
+ <property name="maximizeOnEdit"><value>true</value></property>
</bean>
<bean id="loginViewValve"
@@ -344,6 +358,10 @@
<ref bean="passwordCredentialValve"/>
<ref bean="loginValidationValve"/>
<ref bean="profilerValve"/>
+ <!--
+ JS2-806
+ -->
+ <ref bean="pageHistoryValve"/>
<ref bean="containerValve"/>
<ref bean="actionValve"/>
<ref bean="resourceValve"/>
Modified: portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/src/webapp/WEB-INF/assembly/portal-url-generation.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/src/webapp/WEB-INF/assembly/portal-url-generation.xml?rev=606044&r1=606043&r2=606044&view=diff
==============================================================================
--- portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/src/webapp/WEB-INF/assembly/portal-url-generation.xml (original)
+++ portals/jetspeed-2/branches/JETSPEED-2.1.2-POSTRELEASE/src/webapp/WEB-INF/assembly/portal-url-generation.xml Thu Dec 20 14:37:04 2007
@@ -27,18 +27,28 @@
<!-- Navigation state we are currently using -->
<bean id="NavigationalState"
- class="org.apache.jetspeed.container.state.impl.SessionFullNavigationalState"
+ class="org.apache.jetspeed.container.state.impl.SessionFullExtendedNavigationalState"
singleton="false"
>
- <constructor-arg><ref bean="NavigationalStateCodec"/></constructor-arg>
- <constructor-arg>
+ <constructor-arg index='0'><ref bean="NavigationalStateCodec"/></constructor-arg>
+ <constructor-arg index='1'>
<ref bean="portletContentCache"/>
</constructor-arg>
- <constructor-arg>
+ <constructor-arg index='2'>
<ref bean="decorationContentCache"/>
- </constructor-arg>
+ </constructor-arg>
+ <!--
+ JS2-806
+ - set this to true along with PageHistoryValve will enable clearing the mode and window state of
+ all portlets in the current page request.
+ - setting this to false effectively disables this, and reverts to the default
+ SessionFullNavigationalState object behaviour
+ -->
+ <constructor-arg index='3'>
+ <value>true</value>
+ </constructor-arg>
</bean>
-
+
<!-- PortalURL we are currently using -->
<bean id="PortalURL"
class="org.apache.jetspeed.container.url.impl.PathInfoEncodingPortalURL"
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org