/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/velocity/trunk/tool/src/java/org/sakaiproject/vm/ActionURL.java $ * $Id: ActionURL.java 105080 2012-02-24 23:10:31Z ottenhoff@longsight.com $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2008 The Sakai Foundation * * Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.sakaiproject.vm; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.sakaiproject.thread_local.cover.ThreadLocalManager; import org.sakaiproject.tool.api.ToolURL; import org.sakaiproject.tool.api.ToolURLManager; /** * <p> * PortletActionURL provides a URL with settable and re-settable parameters based on a portlet window's ActionURL base URL. * </p> */ public class ActionURL { /** The parameter for portlet window id (pid). */ public final static String PARAM_PID = "pid"; /** The parameter for site. */ public final static String PARAM_SITE = "site"; /** The parameter for page. */ public final static String PARAM_PAGE = "page"; /** The parameter for paneld. */ public final static String PARAM_PANEL = "panel"; /** The base url to the portlet. */ protected String m_base = null; /** parameters. */ protected Map m_parameters = new Hashtable(); /** The portlet window id, if any. */ protected String m_pid = null; /** The panel, if any. */ protected String m_panel = null; /** The site, if any. */ protected String m_site = null; /** The site pge, if any. */ protected String m_page = null; /** Is this an Action URL */ protected boolean m_isAction = false; /** Is this a Resource URL */ protected String m_resourcePath = null; /** Pre-formatted query string, in lieu of <name, value> parameters */ protected String m_QueryString = ""; /** HttpServletRequest * */ protected HttpServletRequest m_request; /** * Construct with a base URL to the portlet, no parameters * * @param base * The base URL */ public ActionURL(String base, HttpServletRequest request) { m_base = base; m_request = request; } /** * "Reset" the URL by clearing the parameters. * * @return this. */ public ActionURL reset() { m_parameters = new Hashtable(); m_isAction = false; m_resourcePath = null; m_QueryString = ""; return this; } /** * Set or replace (or remove if value is null) a parameter * * @param name * The parameter name. * @param value * The parameter value. * @return this. */ public ActionURL setParameter(String name, String value) { if (value == null) { m_parameters.remove(name); } else { m_parameters.put(name, value); } return this; } /** * Set this URL to be an 'action' URL, one that usually does a Form POST * * @return this */ public ActionURL setAction() { m_isAction = true; return this; } /** * Set or reset the pid. * * @param pid * The portlet window id. */ public ActionURL setPid(String pid) { m_pid = pid; return this; } /** * Set or reset the site. * * @param site * The site id. */ public ActionURL setSite(String site) { m_site = site; return this; } /** * Set or reset the page. * * @param page * The page id. */ public ActionURL setPage(String page) { m_page = page; return this; } /** * Set or reset the panel. * * @param panel * The panel id. */ public ActionURL setPanel(String panel) { m_panel = panel; return this; } /** * Reneder the URL with parameters * * @return The URL. */ public String toString() { String toolURL = getToolURL(); if (toolURL != null) return toolURL; String rv = m_base; char c = '?'; if (m_parameters.size() > 0) { for (Iterator iEntries = m_parameters.entrySet().iterator(); iEntries.hasNext();) { Map.Entry entry = (Map.Entry) iEntries.next(); rv = rv + c + entry.getKey() + "=" + entry.getValue(); c = '&'; } } // Add pre-formatted query string as is if ((m_QueryString != null) && (m_QueryString.length() > 0)) { rv = rv + c + m_QueryString; c = '&'; } // add the pid if defined and not overridden if ((m_pid != null) && (!m_parameters.containsKey(PARAM_PID))) { rv = rv + c + PARAM_PID + "=" + m_pid; c = '&'; } // add the site if defined and not overridden if ((m_site != null) && (!m_parameters.containsKey(PARAM_SITE))) { rv = rv + c + PARAM_SITE + "=" + m_site; c = '&'; } // add the page if defined and not overridden if ((m_page != null) && (!m_parameters.containsKey(PARAM_PAGE))) { rv = rv + c + PARAM_PAGE + "=" + m_page; c = '&'; } // add the panel if defined and not overridden if ((m_panel != null) && (!m_parameters.containsKey(PARAM_PANEL))) { rv = rv + c + PARAM_PANEL + "=" + m_panel; c = '&'; } reset(); return rv; } private String getToolURL() { ToolURLManager urlManager = getToolURLManager(); // ToolURLManager is not set, use default implementation if (urlManager == null) return null; ToolURL url = null; String path = m_base; if (m_isAction) { url = urlManager.createActionURL(); } else if (m_resourcePath != null) { url = urlManager.createResourceURL(); path = m_resourcePath; } else { url = urlManager.createRenderURL(); } if (url != null) { if ((this.m_QueryString != null) && (this.m_QueryString.length() > 0)) { if (path.indexOf('?') == -1) { path = path + '?' + this.m_QueryString; } else { path = path + '&' + this.m_QueryString; } } url.setPath(path); if ((m_pid != null) && (!m_parameters.containsKey(PARAM_PID))) { m_parameters.put(PARAM_PID, m_pid); } // add the site if defined and not overridden if ((m_site != null) && (!m_parameters.containsKey(PARAM_SITE))) { m_parameters.put(PARAM_SITE, m_site); } // add the page if defined and not overridden if ((m_page != null) && (!m_parameters.containsKey(PARAM_PAGE))) { m_parameters.put(PARAM_PAGE, m_page); } // add the panel if defined and not overridden if ((m_panel != null) && (!m_parameters.containsKey(PARAM_PANEL))) { m_parameters.put(PARAM_PANEL, m_panel); } url.setParameters(m_parameters); reset(); return url.toString(); } return null; } private ToolURLManager getToolURLManager() { HttpServletRequest request = m_request; if (request == null) { request = (HttpServletRequest) ThreadLocalManager.get(ToolURL.HTTP_SERVLET_REQUEST); } if (request != null) { return (ToolURLManager) request.getAttribute(ToolURL.MANAGER); } return null; } /** * {@inheritDoc} */ public boolean equals(Object obj) { boolean equals = false; if ((obj != null) && (obj instanceof ActionURL)) { equals = ((ActionURL) obj).toString().equals(toString()); } return equals; } /** * @param resource * Whether the URL is a resource */ public ActionURL setResourcePath(String path) { m_resourcePath = path; return this; } /** * @param queryString * The m_QueryString to set. */ public ActionURL setQueryString(String queryString) { m_QueryString = queryString; return this; } }