/* * Copyright 2000-2001,2004 The Apache Software Foundation. * * Licensed 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.portal.controllers; // Turbine stuff import org.apache.turbine.util.DynamicURI; import org.apache.turbine.util.RunData; // Jetspeed stuff import org.apache.jetspeed.portal.Portlet; import org.apache.jetspeed.portal.PanedPortletController; import org.apache.jetspeed.util.template.JetspeedLink; import org.apache.jetspeed.util.template.JetspeedLinkFactory; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.jetspeed.services.statemanager.SessionState; import org.apache.jetspeed.services.rundata.JetspeedRunData; import org.apache.jetspeed.services.resources.JetspeedResources; /** * A Velocity based portlet controller implementation that can be used * to manage paned content (ie, where a only a subset of all portlets * is visible at any given time) * * @author <a href="mailto:raphael@apache.org">Rapha謖 Luta</a> * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a> * * @version $Id: VelocityPanedPortletController.java,v 1.13 2004/02/23 03:25:06 jford Exp $ */ public class VelocityPanedPortletController extends VelocityPortletController implements PanedPortletController { /** * Static initialization of the logger for this class */ private static final JetspeedLogger logger = JetspeedLogFactoryService.getLogger(VelocityPanedPortletController.class.getName()); public static final String DEFAULT_PARAMETER = "pane"; /* * @return the pane parameter name * */ public String getPaneParameter() { return JetspeedResources.PATH_PANEID_KEY; } /** * Test whether the selected portlet is considered selected for the current * request. * * @param p the Portlet to check * @param rundata the RunData for the request * @return true if the portlet is selected, false otherwise */ public boolean isSelected( Portlet p, RunData rundata ) { String peid = rundata.getParameters().getString( getPaneParameter() ); String pname = rundata.getParameters().getString(JetspeedResources.PATH_PANENAME_KEY); String last = retrievePaneIDFromSession(rundata); //match by portlet name if appropriate. if (pname != null && pname.equals(p.getName())) { return true; } if (peid == null) { if (last == null) { return (getPortlets().getPortletAt( 0 ) == p); } else { if (pname == null) { return (p.getID().equals(last)); } else { //If the current portlet set has a portlet with the same name as the one we're trying to select //we don't want to select anything else b/c we'll select the one we want AND the last-used portlet. //If the portlet set doesn't have a portlet by this name, we WANT to select the last //used, otherwise nothing will be selected in this set. return (getPortlets().getPortletByName(pname) == null && p.getID().equals(last)); } } } else { String subPane = null; int index = peid.indexOf(JetspeedResources.PATH_SUBPANE_SEPARATOR); if (index > -1) { subPane = peid.substring(index + 1); peid = peid.substring(0, index); } if ( p.getID().equals(peid) ) // && subPane == null ) { return true; } // is this the sub pane? if (subPane!=null && p.getID().equals(subPane)) { // change the currently selected pane in the user session // If this is not done, the tab selection works, but the // content is picked up from the pane in the session!! if(!p.getAttribute("_menustate", "open", rundata).equals("closed")) { SessionState state = ((JetspeedRunData)rundata).getPortletSessionState(getPortlets().getID()); state.setAttribute(JetspeedResources.PATH_PANEID_KEY, subPane); } return true; } // is the peid for this tab set? if (getPortlets().getPortletByID(peid) != null) { // its for another tab in this set return false; } if (subPane == null) { if (last == null) { return (getPortlets().getPortletAt( 0 ) == p); } else { return (p.getID().equals(last)); } } else { if (p.getID().equals( subPane )) { // change the currently selected pane in the user session // If this is not done, the tab selection works, but the // content is picked up from the pane in the session!! if(!p.getAttribute("_menustate", "open", rundata).equals("closed")) { SessionState state = ((JetspeedRunData)rundata).getPortletSessionState(getPortlets().getID()); state.setAttribute(JetspeedResources.PATH_PANEID_KEY, subPane); } return true; } } } return false; } /** * Builds the link to access to a given pane. * * @param rundata The request data. * @param portlet The portlet to build the link for by id. * @return DynamicURI A new Dynamic URI with the query parameter */ public DynamicURI getPortletURI( Portlet portlet, RunData rundata ) { JetspeedLink jsLink = null; try { jsLink = JetspeedLinkFactory.getInstance(rundata); } catch( Exception e) { logger.error("Exception", e); } DynamicURI uri = jsLink.getPaneById(portlet.getID()); JetspeedLinkFactory.putInstance(jsLink); return uri; } /** * Returns the pane id of the parameter used for pane selection * * @param rundata The request data. * @param byParameter Set to true to look by query parameter first. * @return String The pane id for the selected pane. * */ public String retrievePaneID(RunData rundata, boolean byParameter) { if (false == byParameter) return retrievePaneIDFromSession(rundata); String pane = rundata.getParameters().getString( getPaneParameter() ); if (pane == null) { // the parameter is undefined, search for sticky value in session String id = getPortlets().getID(); pane = retrievePaneIDFromSession(rundata); } if(pane != null) { int index = pane.indexOf(JetspeedResources.PATH_SUBPANE_SEPARATOR); if (index > -1) { //return pane.substring(index + 1); return pane.substring(0, index); } } return pane; } /** * Returns the pane id from the session for pane selection of this portlet set / portal page * * @param rundata The request data. * @return String The pane id for the selected pane. * */ protected String retrievePaneIDFromSession(RunData rundata) { // get the state for this portlet (portlet set) in this page in this session SessionState state = ((JetspeedRunData)rundata).getPortletSessionState(getPortlets().getID()); // get the PANE_PARAMETER attribute String pane = (String) state.getAttribute(JetspeedResources.PATH_PANEID_KEY); // if not yet defined, select the first portlet set if (pane == null) { // use default if(getPortlets().size() > 0) { pane = getPortlets().getPortletAt(0).getID(); } } return pane; } /** * Saves the pane id to the session to remember selection state of menu or tab for this portlet set / portal page. * * @param rundata The request data. * @param id The tab id to save for this controller */ public void savePaneID( RunData data, String id ) { // get the state for this portlet (portlet set) in this page in this session SessionState state = ((JetspeedRunData)data).getPortletSessionState(getPortlets().getID()); // set the PANE_PARAMETER attribute state.setAttribute(JetspeedResources.PATH_PANEID_KEY, id); } /** * Sets the name of the parameter that will define which pane should * be displayed * * @deprecated * * @param name the selection parameter name */ public void setParameterName( String name ) { getConfig().setInitParameter( "parameter", name ); } /** * Returns the name of the parameter used for pane selection * * @deprecated */ public String getParameterName() { return getConfig().getInitParameter( "parameter", DEFAULT_PARAMETER ) + getPortlets().getName(); } /** * Returns the name of the parameter used for pane selection * * @deprecated * */ public String retrievePaneName(RunData rundata) { String pane = rundata.getParameters().getString( getParameterName() ); if (pane == null) { // the parameter is undefined, search for sticky value in session pane = (String)rundata.getUser().getTemp( "pane-"+getParameterName() ); if (pane == null) { // use default pane = getConfig().getInitParameter( "defaultpane", "0" ); } } return pane; } /** * Sets the name of the parameter that will define which pane should * be displayed * * @deprecated * * @param name the selection parameter name */ public void savePaneName( RunData data, String name ) { data.getUser().setTemp( "pane-"+getParameterName(), name ); } }