--- /dev/null
+/**\r
+ * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.\r
+ *\r
+ * This library is free software; you can redistribute it and/or modify it under\r
+ * the terms of the GNU Lesser General Public License as published by the Free\r
+ * Software Foundation; either version 2.1 of the License, or (at your option)\r
+ * any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\r
+ * details.\r
+ */\r
+\r
+package com.liferay.portlet;\r
+\r
+import com.liferay.portal.kernel.exception.PortalException;\r
+import com.liferay.portal.kernel.exception.SystemException;\r
+import com.liferay.portal.kernel.log.Log;\r
+import com.liferay.portal.kernel.log.LogFactoryUtil;\r
+import com.liferay.portal.kernel.portlet.FriendlyURLMapper;\r
+import com.liferay.portal.kernel.portlet.LiferayPortletConfig;\r
+import com.liferay.portal.kernel.portlet.LiferayPortletURL;\r
+import com.liferay.portal.kernel.portlet.LiferayWindowState;\r
+import com.liferay.portal.kernel.portlet.PortletModeFactory;\r
+import com.liferay.portal.kernel.portlet.WindowStateFactory;\r
+import com.liferay.portal.kernel.util.ArrayUtil;\r
+import com.liferay.portal.kernel.util.Base64;\r
+import com.liferay.portal.kernel.util.CharPool;\r
+import com.liferay.portal.kernel.util.GetterUtil;\r
+import com.liferay.portal.kernel.util.HtmlUtil;\r
+import com.liferay.portal.kernel.util.Http;\r
+import com.liferay.portal.kernel.util.HttpUtil;\r
+import com.liferay.portal.kernel.util.MapUtil;\r
+import com.liferay.portal.kernel.util.ParamUtil;\r
+import com.liferay.portal.kernel.util.StringBundler;\r
+import com.liferay.portal.kernel.util.StringPool;\r
+import com.liferay.portal.kernel.util.Validator;\r
+import com.liferay.portal.kernel.xml.QName;\r
+import com.liferay.portal.model.Company;\r
+import com.liferay.portal.model.Group;\r
+import com.liferay.portal.model.Layout;\r
+import com.liferay.portal.model.Portlet;\r
+import com.liferay.portal.model.PortletApp;\r
+import com.liferay.portal.model.PublicRenderParameter;\r
+import com.liferay.portal.model.impl.VirtualLayout;\r
+import com.liferay.portal.security.auth.AuthTokenUtil;\r
+import com.liferay.portal.service.GroupLocalServiceUtil;\r
+import com.liferay.portal.service.LayoutLocalServiceUtil;\r
+import com.liferay.portal.service.PortletLocalServiceUtil;\r
+import com.liferay.portal.theme.PortletDisplay;\r
+import com.liferay.portal.theme.ThemeDisplay;\r
+import com.liferay.portal.util.CookieKeys;\r
+import com.liferay.portal.util.PortalUtil;\r
+import com.liferay.portal.util.PortletKeys;\r
+import com.liferay.portal.util.PropsValues;\r
+import com.liferay.portal.util.WebKeys;\r
+import com.liferay.portlet.blogs.service.BlogsEntryLocalServiceUtil;\r
+import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil;\r
+import com.liferay.portlet.social.util.FacebookUtil;\r
+import com.liferay.util.Encryptor;\r
+import com.liferay.util.EncryptorException;\r
+\r
+import java.io.IOException;\r
+import java.io.Serializable;\r
+import java.io.UnsupportedEncodingException;\r
+import java.io.Writer;\r
+\r
+import java.security.Key;\r
+\r
+import java.util.Collections;\r
+import java.util.Iterator;\r
+import java.util.LinkedHashMap;\r
+import java.util.LinkedHashSet;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import javax.portlet.PortletMode;\r
+import javax.portlet.PortletModeException;\r
+import javax.portlet.PortletRequest;\r
+import javax.portlet.PortletURL;\r
+import javax.portlet.ResourceRequest;\r
+import javax.portlet.ResourceURL;\r
+import javax.portlet.WindowState;\r
+import javax.portlet.WindowStateException;\r
+\r
+import javax.servlet.http.HttpServletRequest;\r
+\r
+/**\r
+ * @author Brian Wing Shun Chan\r
+ * @author Jorge Ferrer\r
+ * @author Connor McKay\r
+ */\r
+public class PortletURLImpl\r
+ implements LiferayPortletURL, PortletURL, ResourceURL, Serializable {\r
+\r
+ public PortletURLImpl(\r
+ HttpServletRequest request, String portletId, long plid,\r
+ String lifecycle) {\r
+\r
+ _request = request;\r
+ _portletId = portletId;\r
+ _plid = plid;\r
+ _lifecycle = lifecycle;\r
+ _parametersIncludedInPath = new LinkedHashSet<String>();\r
+ _params = new LinkedHashMap<String, String[]>();\r
+ _removePublicRenderParameters = new LinkedHashMap<String, String[]>();\r
+ _secure = PortalUtil.isSecure(request);\r
+ _search = false;\r
+ _wsrp = ParamUtil.getBoolean(request, "wsrp");\r
+\r
+ Portlet portlet = getPortlet();\r
+\r
+ if (portlet != null) {\r
+ Set<String> autopropagatedParameters =\r
+ portlet.getAutopropagatedParameters();\r
+\r
+ for (String autopropagatedParameter : autopropagatedParameters) {\r
+ if (PortalUtil.isReservedParameter(autopropagatedParameter)) {\r
+ continue;\r
+ }\r
+\r
+ String value = request.getParameter(autopropagatedParameter);\r
+\r
+ if (value != null) {\r
+ setParameter(autopropagatedParameter, value);\r
+ }\r
+ }\r
+\r
+ PortletApp portletApp = portlet.getPortletApp();\r
+\r
+ _escapeXml = MapUtil.getBoolean(\r
+ portletApp.getContainerRuntimeOptions(),\r
+ LiferayPortletConfig.RUNTIME_OPTION_ESCAPE_XML,\r
+ PropsValues.PORTLET_URL_ESCAPE_XML);\r
+ }\r
+\r
+ Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);\r
+\r
+ if ((layout != null) && (layout.getPlid() == _plid) &&\r
+ (layout instanceof VirtualLayout)) {\r
+\r
+ _layout = layout;\r
+ }\r
+ }\r
+ \r
+ public PortletURLImpl(\r
+ HttpServletRequest request, String portletId, long plid,\r
+ String lifecycle, boolean isSearch) {\r
+\r
+ _request = request;\r
+ _portletId = portletId;\r
+ _plid = plid;\r
+ _lifecycle = lifecycle;\r
+ _parametersIncludedInPath = new LinkedHashSet<String>();\r
+ _params = new LinkedHashMap<String, String[]>();\r
+ _removePublicRenderParameters = new LinkedHashMap<String, String[]>();\r
+ _secure = PortalUtil.isSecure(request);\r
+ _search = isSearch;\r
+ _wsrp = ParamUtil.getBoolean(request, "wsrp");\r
+\r
+ Portlet portlet = getPortlet();\r
+\r
+ if (portlet != null) {\r
+ Set<String> autopropagatedParameters =\r
+ portlet.getAutopropagatedParameters();\r
+\r
+ for (String autopropagatedParameter : autopropagatedParameters) {\r
+ if (PortalUtil.isReservedParameter(autopropagatedParameter)) {\r
+ continue;\r
+ }\r
+\r
+ String value = request.getParameter(autopropagatedParameter);\r
+\r
+ if (value != null) {\r
+ setParameter(autopropagatedParameter, value);\r
+ }\r
+ }\r
+\r
+ PortletApp portletApp = portlet.getPortletApp();\r
+\r
+ _escapeXml = MapUtil.getBoolean(\r
+ portletApp.getContainerRuntimeOptions(),\r
+ LiferayPortletConfig.RUNTIME_OPTION_ESCAPE_XML,\r
+ PropsValues.PORTLET_URL_ESCAPE_XML);\r
+ }\r
+\r
+ Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);\r
+\r
+ if ((layout != null) && (layout.getPlid() == _plid) &&\r
+ (layout instanceof VirtualLayout)) {\r
+\r
+ _layout = layout;\r
+ }\r
+ }\r
+\r
+ public PortletURLImpl(\r
+ PortletRequest portletRequest, String portletId, long plid,\r
+ String lifecycle) {\r
+\r
+ this(\r
+ PortalUtil.getHttpServletRequest(portletRequest), portletId, plid,\r
+ lifecycle);\r
+\r
+ _portletRequest = portletRequest;\r
+ }\r
+ \r
+ public boolean is_search() {\r
+ return _search;\r
+ }\r
+\r
+ public void set_search(boolean _search) {\r
+ this._search = _search;\r
+ }\r
+ \r
+ public void addParameterIncludedInPath(String name) {\r
+ _parametersIncludedInPath.add(name);\r
+ }\r
+\r
+ public void addProperty(String key, String value) {\r
+ if (key == null) {\r
+ throw new IllegalArgumentException();\r
+ }\r
+ }\r
+\r
+ public String getCacheability() {\r
+ return _cacheability;\r
+ }\r
+\r
+ public HttpServletRequest getHttpServletRequest() {\r
+ return _request;\r
+ }\r
+\r
+ public Layout getLayout() {\r
+ if (_layout == null) {\r
+ try {\r
+ if (_plid > 0) {\r
+ _layout = LayoutLocalServiceUtil.getLayout(_plid);\r
+ }\r
+ }\r
+ catch (Exception e) {\r
+ if (_log.isWarnEnabled()) {\r
+ _log.warn("Layout cannot be found for " + _plid);\r
+ }\r
+ }\r
+ }\r
+\r
+ return _layout;\r
+ }\r
+\r
+ public String getLayoutFriendlyURL() {\r
+ return _layoutFriendlyURL;\r
+ }\r
+\r
+ public String getLifecycle() {\r
+ return _lifecycle;\r
+ }\r
+\r
+ public String getNamespace() {\r
+ if (_namespace == null) {\r
+ _namespace = PortalUtil.getPortletNamespace(_portletId);\r
+ }\r
+\r
+ return _namespace;\r
+ }\r
+\r
+ public String getParameter(String name) {\r
+ String[] values = _params.get(name);\r
+\r
+ if ((values != null) && (values.length > 0)) {\r
+ return values[0];\r
+ }\r
+ else {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ public Map<String, String[]> getParameterMap() {\r
+ return _params;\r
+ }\r
+\r
+ public Set<String> getParametersIncludedInPath() {\r
+ return _parametersIncludedInPath;\r
+ }\r
+\r
+ public long getPlid() {\r
+ return _plid;\r
+ }\r
+\r
+ public Portlet getPortlet() {\r
+ if (_portlet == null) {\r
+ try {\r
+ _portlet = PortletLocalServiceUtil.getPortletById(\r
+ PortalUtil.getCompanyId(_request), _portletId);\r
+ }\r
+ catch (SystemException se) {\r
+ _log.error(se.getMessage());\r
+ }\r
+ }\r
+\r
+ return _portlet;\r
+ }\r
+\r
+ public String getPortletFriendlyURLPath() {\r
+ String portletFriendlyURLPath = null;\r
+\r
+ Portlet portlet = getPortlet();\r
+\r
+ if (portlet != null) {\r
+ FriendlyURLMapper mapper = portlet.getFriendlyURLMapperInstance();\r
+\r
+ if (mapper != null) {\r
+ portletFriendlyURLPath = mapper.buildPath(this);\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug(\r
+ "Portlet friendly URL path " + portletFriendlyURLPath);\r
+ }\r
+ }\r
+ }\r
+\r
+ return portletFriendlyURLPath;\r
+ }\r
+\r
+ public String getPortletId() {\r
+ return _portletId;\r
+ }\r
+\r
+ public PortletMode getPortletMode() {\r
+ if (_portletModeString == null) {\r
+ return null;\r
+ }\r
+\r
+ return PortletModeFactory.getPortletMode(_portletModeString);\r
+ }\r
+\r
+ public PortletRequest getPortletRequest() {\r
+ return _portletRequest;\r
+ }\r
+\r
+ public Set<String> getRemovedParameterNames() {\r
+ return _removedParameterNames;\r
+ }\r
+\r
+ public Map<String, String> getReservedParameterMap() {\r
+ if (_reservedParameters != null) {\r
+ return _reservedParameters;\r
+ }\r
+\r
+ _reservedParameters = new LinkedHashMap<String, String>();\r
+\r
+ _reservedParameters.put("p_p_id", _portletId);\r
+\r
+ if (_lifecycle.equals(PortletRequest.ACTION_PHASE)) {\r
+ _reservedParameters.put("p_p_lifecycle", "1");\r
+ }\r
+ else if (_lifecycle.equals(PortletRequest.RENDER_PHASE)) {\r
+ _reservedParameters.put("p_p_lifecycle", "0");\r
+ }\r
+ else if (_lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {\r
+ _reservedParameters.put("p_p_lifecycle", "2");\r
+ }\r
+\r
+ if (_windowStateString != null) {\r
+ _reservedParameters.put("p_p_state", _windowStateString);\r
+ }\r
+\r
+ if (_windowStateRestoreCurrentView) {\r
+ _reservedParameters.put("p_p_state_rcv", "1");\r
+ }\r
+\r
+ if (_portletModeString != null) {\r
+ _reservedParameters.put("p_p_mode", _portletModeString);\r
+ }\r
+\r
+ if (_resourceID != null) {\r
+ _reservedParameters.put("p_p_resource_id", _resourceID);\r
+ }\r
+\r
+ if (_lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {\r
+ _reservedParameters.put("p_p_cacheability", _cacheability);\r
+ }\r
+\r
+ ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(\r
+ WebKeys.THEME_DISPLAY);\r
+\r
+ PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();\r
+\r
+ if (Validator.isNotNull(portletDisplay.getColumnId())) {\r
+ _reservedParameters.put("p_p_col_id", portletDisplay.getColumnId());\r
+ }\r
+\r
+ if (portletDisplay.getColumnPos() > 0) {\r
+ _reservedParameters.put(\r
+ "p_p_col_pos", String.valueOf(portletDisplay.getColumnPos()));\r
+ }\r
+\r
+ if (portletDisplay.getColumnCount() > 0) {\r
+ _reservedParameters.put(\r
+ "p_p_col_count",\r
+ String.valueOf(portletDisplay.getColumnCount()));\r
+ }\r
+\r
+ _reservedParameters = Collections.unmodifiableMap(_reservedParameters);\r
+\r
+ return _reservedParameters;\r
+ }\r
+\r
+ public String getResourceID() {\r
+ return _resourceID;\r
+ }\r
+\r
+ public WindowState getWindowState() {\r
+ if (_windowStateString == null) {\r
+ return null;\r
+ }\r
+\r
+ return WindowStateFactory.getWindowState(_windowStateString);\r
+ }\r
+\r
+ public boolean isAnchor() {\r
+ return _anchor;\r
+ }\r
+\r
+ public boolean isCopyCurrentRenderParameters() {\r
+ return _copyCurrentRenderParameters;\r
+ }\r
+\r
+ public boolean isEncrypt() {\r
+ return _encrypt;\r
+ }\r
+\r
+ public boolean isEscapeXml() {\r
+ return _escapeXml;\r
+ }\r
+\r
+ public boolean isParameterIncludedInPath(String name) {\r
+ if (_parametersIncludedInPath.contains(name)) {\r
+ return true;\r
+ }\r
+ else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ public boolean isSecure() {\r
+ return _secure;\r
+ }\r
+\r
+ public void removePublicRenderParameter(String name) {\r
+ if (name == null) {\r
+ throw new IllegalArgumentException();\r
+ }\r
+\r
+ PublicRenderParameter publicRenderParameter =\r
+ _portlet.getPublicRenderParameter(name);\r
+\r
+ if (publicRenderParameter == null) {\r
+ if (_log.isWarnEnabled()) {\r
+ _log.warn("Public parameter " + name + "does not exist");\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+ QName qName = publicRenderParameter.getQName();\r
+\r
+ _removePublicRenderParameters.put(\r
+ PortletQNameUtil.getRemovePublicRenderParameterName(qName),\r
+ new String[] {"1"});\r
+ }\r
+\r
+ public void setAnchor(boolean anchor) {\r
+ _anchor = anchor;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setCacheability(String cacheability) {\r
+ if (cacheability == null) {\r
+ throw new IllegalArgumentException("Cacheability is null");\r
+ }\r
+\r
+ if (!cacheability.equals(FULL) && !cacheability.equals(PORTLET) &&\r
+ !cacheability.equals(PAGE)) {\r
+\r
+ throw new IllegalArgumentException(\r
+ "Cacheability " + cacheability + " is not " + FULL + ", " +\r
+ PORTLET + ", or " + PAGE);\r
+ }\r
+\r
+ if (_portletRequest instanceof ResourceRequest) {\r
+ ResourceRequest resourceRequest = (ResourceRequest)_portletRequest;\r
+\r
+ String parentCacheability = resourceRequest.getCacheability();\r
+\r
+ if (parentCacheability.equals(FULL)) {\r
+ if (!cacheability.equals(FULL)) {\r
+ throw new IllegalStateException(\r
+ "Unable to set a weaker cacheability " + cacheability);\r
+ }\r
+ }\r
+ else if (parentCacheability.equals(PORTLET)) {\r
+ if (!cacheability.equals(FULL) &&\r
+ !cacheability.equals(PORTLET)) {\r
+\r
+ throw new IllegalStateException(\r
+ "Unable to set a weaker cacheability " + cacheability);\r
+ }\r
+ }\r
+ }\r
+\r
+ _cacheability = cacheability;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setControlPanelCategory(String controlPanelCategory) {\r
+ _controlPanelCategory = controlPanelCategory;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setCopyCurrentRenderParameters(\r
+ boolean copyCurrentRenderParameters) {\r
+\r
+ _copyCurrentRenderParameters = copyCurrentRenderParameters;\r
+ }\r
+\r
+ public void setDoAsGroupId(long doAsGroupId) {\r
+ _doAsGroupId = doAsGroupId;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setDoAsUserId(long doAsUserId) {\r
+ _doAsUserId = doAsUserId;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setDoAsUserLanguageId(String doAsUserLanguageId) {\r
+ _doAsUserLanguageId = doAsUserLanguageId;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setEncrypt(boolean encrypt) {\r
+ _encrypt = encrypt;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setEscapeXml(boolean escapeXml) {\r
+ _escapeXml = escapeXml;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setLifecycle(String lifecycle) {\r
+ _lifecycle = lifecycle;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setParameter(String name, String value) {\r
+ setParameter(name, value, PropsValues.PORTLET_URL_APPEND_PARAMETERS);\r
+ }\r
+\r
+ public void setParameter(String name, String value, boolean append) {\r
+ if ((name == null) || (value == null)) {\r
+ throw new IllegalArgumentException();\r
+ }\r
+\r
+ setParameter(name, new String[] {value}, append);\r
+ }\r
+\r
+ public void setParameter(String name, String[] values) {\r
+ setParameter(name, values, PropsValues.PORTLET_URL_APPEND_PARAMETERS);\r
+ }\r
+\r
+ public void setParameter(String name, String[] values, boolean append) {\r
+ if ((name == null) || (values == null)) {\r
+ throw new IllegalArgumentException();\r
+ }\r
+\r
+ for (String value : values) {\r
+ if (value == null) {\r
+ throw new IllegalArgumentException();\r
+ }\r
+ }\r
+\r
+ if (!append) {\r
+ _params.put(name, values);\r
+ }\r
+ else {\r
+ String[] oldValues = _params.get(name);\r
+\r
+ if (oldValues == null) {\r
+ _params.put(name, values);\r
+ }\r
+ else {\r
+ String[] newValues = ArrayUtil.append(oldValues, values);\r
+\r
+ _params.put(name, newValues);\r
+ }\r
+ }\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setParameters(Map<String, String[]> params) {\r
+ if (params == null) {\r
+ throw new IllegalArgumentException();\r
+ }\r
+ else {\r
+ Map<String, String[]> newParams =\r
+ new LinkedHashMap<String, String[]>();\r
+\r
+ for (Map.Entry<String, String[]> entry : params.entrySet()) {\r
+ try {\r
+ String key = entry.getKey();\r
+ String[] value = entry.getValue();\r
+\r
+ if (key == null) {\r
+ throw new IllegalArgumentException();\r
+ }\r
+ else if (value == null) {\r
+ throw new IllegalArgumentException();\r
+ }\r
+\r
+ newParams.put(key, value);\r
+ }\r
+ catch (ClassCastException cce) {\r
+ throw new IllegalArgumentException(cce);\r
+ }\r
+ }\r
+\r
+ _params = newParams;\r
+ }\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setPlid(long plid) {\r
+ _plid = plid;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setPortletId(String portletId) {\r
+ _portletId = portletId;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setPortletMode(PortletMode portletMode)\r
+ throws PortletModeException {\r
+\r
+ if (_portletRequest != null) {\r
+ if (!getPortlet().hasPortletMode(\r
+ _portletRequest.getResponseContentType(), portletMode)) {\r
+\r
+ throw new PortletModeException(\r
+ portletMode.toString(), portletMode);\r
+ }\r
+ }\r
+\r
+ _portletModeString = portletMode.toString();\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setPortletMode(String portletMode) throws PortletModeException {\r
+ setPortletMode(PortletModeFactory.getPortletMode(portletMode));\r
+ }\r
+\r
+ public void setProperty(String key, String value) {\r
+ if (key == null) {\r
+ throw new IllegalArgumentException();\r
+ }\r
+ }\r
+\r
+ public void setRefererPlid(long refererPlid) {\r
+ _refererPlid = refererPlid;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setRemovedParameterNames(Set<String> removedParameterNames) {\r
+ _removedParameterNames = removedParameterNames;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setResourceID(String resourceID) {\r
+ _resourceID = resourceID;\r
+ }\r
+\r
+ public void setSecure(boolean secure) {\r
+ _secure = secure;\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setWindowState(String windowState) throws WindowStateException {\r
+ setWindowState(WindowStateFactory.getWindowState(windowState));\r
+ }\r
+\r
+ public void setWindowState(WindowState windowState)\r
+ throws WindowStateException {\r
+\r
+ if (_portletRequest != null) {\r
+ if (!_portletRequest.isWindowStateAllowed(windowState)) {\r
+ throw new WindowStateException(\r
+ windowState.toString(), windowState);\r
+ }\r
+ }\r
+\r
+ if (LiferayWindowState.isWindowStatePreserved(\r
+ getWindowState(), windowState)) {\r
+\r
+ _windowStateString = windowState.toString();\r
+ }\r
+\r
+ clearCache();\r
+ }\r
+\r
+ public void setWindowStateRestoreCurrentView(\r
+ boolean windowStateRestoreCurrentView) {\r
+\r
+ _windowStateRestoreCurrentView = windowStateRestoreCurrentView;\r
+ }\r
+\r
+ @Override\r
+ public String toString() {\r
+ if (_toString != null) {\r
+ return _toString;\r
+ }\r
+\r
+ if(_search){\r
+ Portlet portlet = getPortlet();\r
+ if(portlet.getPortletId().equals("cahierDeTexte_WAR_cahierDeTexteportlet")){\r
+ _toString = toStringCahierDeTexte();\r
+ } else if(portlet.getPortletId().equals(PortletKeys.BLOGS)){\r
+ _toString = toStringActualites();\r
+ } else if(portlet.getPortletId().equals(PortletKeys.MESSAGE_BOARDS)){\r
+ _toString = toStringForum();\r
+ } else if(portlet.getPortletId().equals(PortletKeys.USERS_ADMIN)){\r
+ _toString = toStringAnnuaire();\r
+ } else if(portlet.getPortletId().equals("internalMessaging_WAR_internalMessagingportlet") || portlet.getPortletId().equals("internalmessagingawarness_WAR_internalMessagingportlet")){\r
+ _toString = toStringMessagerie();\r
+ } else if(portlet.getPortletId().equals("agenda_WAR_agendaportlet")){\r
+ _toString = toStringAgenda();\r
+ } else if(portlet.getPortletId().equals("fluxRss_WAR_internalMessagingportlet")){\r
+ _toString = toStringFluxRss();\r
+ } else {\r
+ _toString = generateToString();\r
+ }\r
+ } \r
+ else if (_wsrp) {\r
+ _toString = generateWSRPToString();\r
+ }\r
+ else {\r
+ _toString = generateToString();\r
+ }\r
+\r
+ return _toString;\r
+ }\r
+\r
+ public String toStringCahierDeTexte(){\r
+ ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(WebKeys.THEME_DISPLAY);\r
+ try {\r
+ return themeDisplay.getURLPortal() + "/user/" + themeDisplay.getUser().getLogin() + "/cahier-de-texte?eventId="+ Long.valueOf(this.getParameter("eventId"));\r
+ } catch (PortalException e) {\r
+ e.printStackTrace();\r
+ } catch (SystemException e) {\r
+ e.printStackTrace();\r
+ }\r
+ return "";\r
+ }\r
+ \r
+ public String toStringActualites() {\r
+ ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(WebKeys.THEME_DISPLAY);\r
+ try {\r
+ Group group = GroupLocalServiceUtil.getGroup(BlogsEntryLocalServiceUtil.getBlogsEntry(Long.valueOf(this.getParameter("entryId"))).getGroupId());\r
+ return themeDisplay.getURLPortal() + "/group" + group.getFriendlyURL() + "?p_p_id=actualites_WAR_actualitesportlet&p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view&entryId=" + Long.valueOf(this.getParameter("entryId"));\r
+ } catch (PortalException e) {\r
+ e.printStackTrace();\r
+ } catch (SystemException e) {\r
+ e.printStackTrace();\r
+ }\r
+ return "";\r
+ }\r
+ \r
+ public String toStringForum() {\r
+ ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(WebKeys.THEME_DISPLAY);\r
+ try {\r
+ Group group = GroupLocalServiceUtil.getGroup(MBMessageLocalServiceUtil.getMBMessage( Long.valueOf(this.getParameter("messageId"))).getGroupId());\r
+ return themeDisplay.getURLPortal() + "/group" + group.getFriendlyURL() + "?p_p_id=forum_WAR_forumportlet&p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view&messageId=" + Long.valueOf(this.getParameter("messageId"));\r
+ } catch (PortalException e) {\r
+ e.printStackTrace();\r
+ } catch (SystemException e) {\r
+ e.printStackTrace();\r
+ }\r
+ return "";\r
+ }\r
+ \r
+ public String toStringAnnuaire() {\r
+ ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(WebKeys.THEME_DISPLAY);\r
+ try {\r
+ return themeDisplay.getURLPortal() + "/user/" + themeDisplay.getUser().getLogin() + "/carnet-d-adresses?userId=" + this.getParameterMap().get("p_u_i_d")[0];\r
+ } catch (PortalException e) {\r
+ e.printStackTrace();\r
+ } catch (SystemException e) {\r
+ e.printStackTrace();\r
+ }\r
+ return "";\r
+ }\r
+ \r
+ public String toStringMessagerie(){\r
+ ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(WebKeys.THEME_DISPLAY);\r
+ try {\r
+ return themeDisplay.getURLPortal() + "/user/" + themeDisplay.getUser().getLogin() + "/messagerie?messageId=" + Long.valueOf(this.getParameter("messageId"));\r
+ } catch (PortalException e) {\r
+ e.printStackTrace();\r
+ } catch (SystemException e) {\r
+ e.printStackTrace();\r
+ }\r
+ return "";\r
+ }\r
+ \r
+ private String toStringAgenda() {\r
+ ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(WebKeys.THEME_DISPLAY);\r
+ try {\r
+ return themeDisplay.getURLPortal() + "/user/" + themeDisplay.getUser().getLogin() + "/agenda?eventAgendaId="+ Long.valueOf(this.getParameter("eventAgendaId"));\r
+ } catch (PortalException e) {\r
+ e.printStackTrace();\r
+ } catch (SystemException e) {\r
+ e.printStackTrace();\r
+ }\r
+ return "";\r
+ }\r
+\r
+ private String toStringFluxRss() {\r
+ ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(WebKeys.THEME_DISPLAY);\r
+ try {\r
+ return themeDisplay.getURLPortal() + "/user/" + themeDisplay.getUser().getLogin() + "/messagerie?rssItemId="+ Long.valueOf(this.getParameter("rssItemId"));\r
+ } catch (PortalException e) {\r
+ e.printStackTrace();\r
+ } catch (SystemException e) {\r
+ e.printStackTrace();\r
+ }\r
+ return "";\r
+ }\r
+ \r
+ public void write(Writer writer) throws IOException {\r
+ write(writer, _escapeXml);\r
+ }\r
+\r
+ public void write(Writer writer, boolean escapeXml) throws IOException {\r
+ String toString = toString();\r
+\r
+ if (escapeXml && !_escapeXml) {\r
+ toString = HtmlUtil.escape(toString);\r
+ }\r
+\r
+ writer.write(toString);\r
+ }\r
+\r
+ protected void addPortalAuthToken(StringBundler sb, Key key) {\r
+ if (!PropsValues.AUTH_TOKEN_CHECK_ENABLED ||\r
+ !_lifecycle.equals(PortletRequest.ACTION_PHASE)) {\r
+\r
+ return;\r
+ }\r
+\r
+ Set<String> authTokenIgnorePortlets =\r
+ PortalUtil.getAuthTokenIgnorePortlets();\r
+\r
+ if (authTokenIgnorePortlets.contains(_portletId)) {\r
+ return;\r
+ }\r
+\r
+ sb.append("p_auth");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(key, AuthTokenUtil.getToken(_request)));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ protected void addPortletAuthToken(StringBundler sb, Key key) {\r
+ if (!PropsValues.PORTLET_ADD_DEFAULT_RESOURCE_CHECK_ENABLED) {\r
+ return;\r
+ }\r
+\r
+ HttpServletRequest request = PortalUtil.getOriginalServletRequest(\r
+ _request);\r
+\r
+ String ppauth = ParamUtil.getString(request, "p_p_auth");\r
+\r
+ String actualPortletAuthenticationToken = AuthTokenUtil.getToken(\r
+ _request, _plid, _portletId);\r
+\r
+ if (Validator.isNotNull(ppauth) &&\r
+ ppauth.equals(actualPortletAuthenticationToken)) {\r
+\r
+ sb.append("p_p_auth");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(key, ppauth));\r
+ sb.append(StringPool.AMPERSAND);\r
+\r
+ return;\r
+ }\r
+\r
+ Portlet portlet = (Portlet)_request.getAttribute(\r
+ WebKeys.RENDER_PORTLET);\r
+\r
+ if (portlet != null) {\r
+ String portletId = portlet.getPortletId();\r
+\r
+ if (portletId.equals(_portletId) ||\r
+ portletId.equals(PortletKeys.CONTROL_PANEL_MENU) ||\r
+ !_portlet.isAddDefaultResource()) {\r
+\r
+ return;\r
+ }\r
+ }\r
+\r
+ Set<String> portletAddDefaultResourceCheckWhiteList =\r
+ PortalUtil.getPortletAddDefaultResourceCheckWhitelist();\r
+\r
+ if (portletAddDefaultResourceCheckWhiteList.contains(_portletId)) {\r
+ return;\r
+ }\r
+\r
+ sb.append("p_p_auth");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(key, actualPortletAuthenticationToken));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ protected void clearCache() {\r
+ _reservedParameters = null;\r
+ _toString = null;\r
+ }\r
+\r
+ protected String generateToString() {\r
+ StringBundler sb = new StringBundler(64);\r
+\r
+ ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(\r
+ WebKeys.THEME_DISPLAY);\r
+\r
+ String portalURL = null;\r
+\r
+ if (themeDisplay.isFacebook()) {\r
+ portalURL =\r
+ FacebookUtil.FACEBOOK_APPS_URL +\r
+ themeDisplay.getFacebookCanvasPageURL();\r
+ }\r
+ else {\r
+ portalURL = PortalUtil.getPortalURL(_request, _secure);\r
+ }\r
+\r
+ try {\r
+ if (_layoutFriendlyURL == null) {\r
+ Layout layout = getLayout();\r
+\r
+ if (layout != null) {\r
+ _layoutFriendlyURL = GetterUtil.getString(\r
+ PortalUtil.getLayoutFriendlyURL(layout, themeDisplay));\r
+\r
+ if (_secure) {\r
+ _layoutFriendlyURL = HttpUtil.protocolize(\r
+ _layoutFriendlyURL, true);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e);\r
+ }\r
+\r
+ Key key = null;\r
+\r
+ try {\r
+ if (_encrypt) {\r
+ Company company = PortalUtil.getCompany(_request);\r
+\r
+ key = company.getKeyObj();\r
+ }\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e);\r
+ }\r
+\r
+ if (Validator.isNull(_layoutFriendlyURL)) {\r
+ sb.append(portalURL);\r
+ sb.append(themeDisplay.getPathMain());\r
+ sb.append("/portal/layout?");\r
+\r
+ addPortalAuthToken(sb, key);\r
+\r
+ sb.append("p_l_id");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(key, _plid));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+ else {\r
+ if (themeDisplay.isFacebook()) {\r
+ sb.append(portalURL);\r
+ }\r
+ else {\r
+\r
+ // A virtual host URL will contain the complete path. Do not\r
+ // append the portal URL if the virtual host URL starts with\r
+ // "http://" or "https://".\r
+\r
+ if (!_layoutFriendlyURL.startsWith(Http.HTTP_WITH_SLASH) &&\r
+ !_layoutFriendlyURL.startsWith(Http.HTTPS_WITH_SLASH)) {\r
+\r
+ sb.append(portalURL);\r
+ }\r
+\r
+ sb.append(_layoutFriendlyURL);\r
+ }\r
+\r
+ String friendlyURLPath = getPortletFriendlyURLPath();\r
+\r
+ if (Validator.isNotNull(friendlyURLPath)) {\r
+ if (themeDisplay.isFacebook()) {\r
+ int pos = friendlyURLPath.indexOf(CharPool.SLASH, 1);\r
+\r
+ if (pos != -1) {\r
+ sb.append(friendlyURLPath.substring(pos));\r
+ }\r
+ else {\r
+ sb.append(friendlyURLPath);\r
+ }\r
+ }\r
+ else {\r
+ sb.append("/-");\r
+ sb.append(friendlyURLPath);\r
+ }\r
+ }\r
+\r
+ sb.append(StringPool.QUESTION);\r
+\r
+ addPortalAuthToken(sb, key);\r
+ }\r
+\r
+ addPortletAuthToken(sb, key);\r
+\r
+ for (Map.Entry<String, String> entry :\r
+ getReservedParameterMap().entrySet()) {\r
+\r
+ String name = entry.getKey();\r
+\r
+ if (!isParameterIncludedInPath(name)) {\r
+ sb.append(name);\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(key, entry.getValue()));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+ }\r
+\r
+ String outerPortletId = PortalUtil.getOuterPortletId(_request);\r
+\r
+ if (outerPortletId != null) {\r
+ sb.append("p_o_p_id");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(key, outerPortletId));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ if (_doAsUserId > 0) {\r
+ try {\r
+ Company company = PortalUtil.getCompany(_request);\r
+\r
+ sb.append("doAsUserId");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(company.getKeyObj(), _doAsUserId));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e);\r
+ }\r
+ }\r
+ else {\r
+ String doAsUserId = themeDisplay.getDoAsUserId();\r
+\r
+ if (Validator.isNotNull(doAsUserId)) {\r
+ sb.append("doAsUserId");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(key, doAsUserId));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+ }\r
+\r
+ String doAsUserLanguageId = _doAsUserLanguageId;\r
+\r
+ if (Validator.isNull(doAsUserLanguageId)) {\r
+ doAsUserLanguageId = themeDisplay.getDoAsUserLanguageId();\r
+ }\r
+\r
+ if (Validator.isNotNull(doAsUserLanguageId)) {\r
+ sb.append("doAsUserLanguageId");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(key, doAsUserLanguageId));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ long doAsGroupId = _doAsGroupId;\r
+\r
+ if (doAsGroupId <= 0) {\r
+ doAsGroupId = themeDisplay.getDoAsGroupId();\r
+ }\r
+\r
+ if (doAsGroupId > 0) {\r
+ sb.append("doAsGroupId");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(key, doAsGroupId));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ long refererPlid = _refererPlid;\r
+\r
+ if (refererPlid <= 0) {\r
+ refererPlid = themeDisplay.getRefererPlid();\r
+ }\r
+\r
+ if (refererPlid > 0) {\r
+ sb.append("refererPlid");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(key, refererPlid));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ String controlPanelCategory = _controlPanelCategory;\r
+\r
+ if (Validator.isNull(controlPanelCategory)) {\r
+ controlPanelCategory = themeDisplay.getControlPanelCategory();\r
+ }\r
+\r
+ if (Validator.isNotNull(controlPanelCategory)) {\r
+ sb.append("controlPanelCategory");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(key, controlPanelCategory));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ Iterator<Map.Entry<String, String[]>> itr =\r
+ _removePublicRenderParameters.entrySet().iterator();\r
+\r
+ while (itr.hasNext()) {\r
+ String lastString = sb.stringAt(sb.index() - 1);\r
+\r
+ if (lastString.charAt(lastString.length() - 1) !=\r
+ CharPool.AMPERSAND) {\r
+\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ Map.Entry<String, String[]> entry = itr.next();\r
+\r
+ sb.append(entry.getKey());\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(key, entry.getValue()[0]));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ if (_copyCurrentRenderParameters) {\r
+ mergeRenderParameters();\r
+ }\r
+\r
+ itr = _params.entrySet().iterator();\r
+\r
+ while (itr.hasNext()) {\r
+ Map.Entry<String, String[]> entry = itr.next();\r
+\r
+ String name = entry.getKey();\r
+ String[] values = entry.getValue();\r
+\r
+ if (isParameterIncludedInPath(name)) {\r
+ continue;\r
+ }\r
+\r
+ String publicRenderParameterName = getPublicRenderParameterName(\r
+ name);\r
+\r
+ if (Validator.isNotNull(publicRenderParameterName)) {\r
+ name = publicRenderParameterName;\r
+ }\r
+\r
+ name = prependNamespace(name);\r
+\r
+ for (int i = 0; i < values.length; i++) {\r
+ sb.append(name);\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(processValue(key, values[i]));\r
+\r
+ if (((i + 1) < values.length) || itr.hasNext()) {\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (_encrypt) {\r
+ sb.append(StringPool.AMPERSAND + WebKeys.ENCRYPT + "=1");\r
+ }\r
+\r
+ if (PropsValues.PORTLET_URL_ANCHOR_ENABLE) {\r
+ if (_anchor && (_windowStateString != null) &&\r
+ !_windowStateString.equals(WindowState.MAXIMIZED.toString()) &&\r
+ !_windowStateString.equals(\r
+ LiferayWindowState.EXCLUSIVE.toString()) &&\r
+ !_windowStateString.equals(\r
+ LiferayWindowState.POP_UP.toString())) {\r
+\r
+ String lastString = sb.stringAt(sb.index() - 1);\r
+\r
+ if (lastString.charAt(lastString.length() - 1) !=\r
+ CharPool.AMPERSAND) {\r
+\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ sb.append("#p_");\r
+ sb.append(_portletId);\r
+ }\r
+ }\r
+\r
+ String result = sb.toString();\r
+\r
+ if (result.endsWith(StringPool.AMPERSAND) ||\r
+ result.endsWith(StringPool.QUESTION)) {\r
+\r
+ result = result.substring(0, result.length() - 1);\r
+ }\r
+\r
+ if (themeDisplay.isFacebook()) {\r
+\r
+ // Facebook requires the path portion of the URL to end with a slash\r
+\r
+ int pos = result.indexOf(CharPool.QUESTION);\r
+\r
+ if (pos == -1) {\r
+ if (!result.endsWith(StringPool.SLASH)) {\r
+ result += StringPool.SLASH;\r
+ }\r
+ }\r
+ else {\r
+ String path = result.substring(0, pos);\r
+\r
+ if (!result.endsWith(StringPool.SLASH)) {\r
+ result = path + StringPool.SLASH + result.substring(pos);\r
+ }\r
+ }\r
+ }\r
+ else if (!CookieKeys.hasSessionId(_request)) {\r
+ result = PortalUtil.getURLWithSessionId(\r
+ result, _request.getSession().getId());\r
+ }\r
+\r
+ if (_escapeXml) {\r
+ result = HtmlUtil.escape(result);\r
+ }\r
+\r
+ if (result.length() > _URL_MAXIMUM_LENGTH) {\r
+ result = shortenURL(result, 2);\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
+ protected String generateWSRPToString() {\r
+ StringBundler sb = new StringBundler("wsrp_rewrite?");\r
+\r
+ sb.append("wsrp-urlType");\r
+ sb.append(StringPool.EQUAL);\r
+\r
+ if (_lifecycle.equals(PortletRequest.ACTION_PHASE)) {\r
+ sb.append(HttpUtil.encodeURL("blockingAction"));\r
+ }\r
+ else if (_lifecycle.equals(PortletRequest.RENDER_PHASE)) {\r
+ sb.append(HttpUtil.encodeURL("render"));\r
+ }\r
+ else if (_lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {\r
+ sb.append(HttpUtil.encodeURL("resource"));\r
+ }\r
+\r
+ sb.append(StringPool.AMPERSAND);\r
+\r
+ if (_windowStateString != null) {\r
+ sb.append("wsrp-windowState");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(HttpUtil.encodeURL("wsrp:" + _windowStateString));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ if (_portletModeString != null) {\r
+ sb.append("wsrp-mode");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(HttpUtil.encodeURL("wsrp:" + _portletModeString));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ if (_resourceID != null) {\r
+ sb.append("wsrp-resourceID");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(HttpUtil.encodeURL(_resourceID));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ if (_lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {\r
+ sb.append("wsrp-resourceCacheability");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(HttpUtil.encodeURL(_cacheability));\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+\r
+ if (PropsValues.PORTLET_URL_ANCHOR_ENABLE) {\r
+ if (_anchor && (_windowStateString != null) &&\r
+ !_windowStateString.equals(WindowState.MAXIMIZED.toString()) &&\r
+ !_windowStateString.equals(\r
+ LiferayWindowState.EXCLUSIVE.toString()) &&\r
+ !_windowStateString.equals(\r
+ LiferayWindowState.POP_UP.toString())) {\r
+\r
+ sb.append("wsrp-fragmentID");\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append("#p_");\r
+ sb.append(_portletId);\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+ }\r
+\r
+ if (_copyCurrentRenderParameters) {\r
+ mergeRenderParameters();\r
+ }\r
+\r
+ StringBundler parameterSb = new StringBundler();\r
+\r
+ Iterator<Map.Entry<String, String[]>> itr =\r
+ _params.entrySet().iterator();\r
+\r
+ while (itr.hasNext()) {\r
+ Map.Entry<String, String[]> entry = itr.next();\r
+\r
+ String name = entry.getKey();\r
+ String[] values = entry.getValue();\r
+\r
+ if (isParameterIncludedInPath(name)) {\r
+ continue;\r
+ }\r
+\r
+ String publicRenderParameterName = getPublicRenderParameterName(\r
+ name);\r
+\r
+ if (Validator.isNotNull(publicRenderParameterName)) {\r
+ name = publicRenderParameterName;\r
+ }\r
+\r
+ name = prependNamespace(name);\r
+\r
+ for (int i = 0; i < values.length; i++) {\r
+ parameterSb.append(name);\r
+ parameterSb.append(StringPool.EQUAL);\r
+ parameterSb.append(HttpUtil.encodeURL(values[i]));\r
+\r
+ if (((i + 1) < values.length) || itr.hasNext()) {\r
+ parameterSb.append(StringPool.AMPERSAND);\r
+ }\r
+ }\r
+ }\r
+\r
+ sb.append("wsrp-navigationalState");\r
+ sb.append(StringPool.EQUAL);\r
+\r
+ byte[] parameterBytes = null;\r
+\r
+ try {\r
+ String parameterString = parameterSb.toString();\r
+\r
+ parameterBytes = parameterString.getBytes(StringPool.UTF8);\r
+ }\r
+ catch (UnsupportedEncodingException uee) {\r
+ if (_log.isWarnEnabled()) {\r
+ _log.warn(uee, uee);\r
+ }\r
+ }\r
+\r
+ String navigationalState = Base64.toURLSafe(\r
+ Base64.encode(parameterBytes));\r
+\r
+ sb.append(navigationalState);\r
+\r
+ sb.append("/wsrp_rewrite");\r
+\r
+ return sb.toString();\r
+ }\r
+\r
+ protected String getPublicRenderParameterName(String name) {\r
+ Portlet portlet = getPortlet();\r
+\r
+ String publicRenderParameterName = null;\r
+\r
+ if (portlet != null) {\r
+ PublicRenderParameter publicRenderParameter =\r
+ portlet.getPublicRenderParameter(name);\r
+\r
+ if (publicRenderParameter != null) {\r
+ QName qName = publicRenderParameter.getQName();\r
+\r
+ publicRenderParameterName =\r
+ PortletQNameUtil.getPublicRenderParameterName(qName);\r
+ }\r
+ }\r
+\r
+ return publicRenderParameterName;\r
+ }\r
+\r
+ protected boolean isBlankValue(String[] value) {\r
+ if ((value != null) && (value.length == 1) &&\r
+ value[0].equals(StringPool.BLANK)) {\r
+\r
+ return true;\r
+ }\r
+ else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ protected void mergeRenderParameters() {\r
+ String namespace = getNamespace();\r
+\r
+ Layout layout = getLayout();\r
+\r
+ Map<String, String[]> renderParameters = RenderParametersPool.get(\r
+ _request, layout.getPlid(), getPortlet().getPortletId());\r
+\r
+ for (Map.Entry<String, String[]> entry : renderParameters.entrySet()) {\r
+ String name = entry.getKey();\r
+\r
+ if (name.indexOf(namespace) != -1) {\r
+ name = name.substring(namespace.length());\r
+ }\r
+\r
+ if (!_lifecycle.equals(PortletRequest.RESOURCE_PHASE) &&\r
+ (_removedParameterNames != null) &&\r
+ _removedParameterNames.contains(name)) {\r
+\r
+ continue;\r
+ }\r
+\r
+ String[] oldValues = entry.getValue();\r
+ String[] newValues = _params.get(name);\r
+\r
+ if (newValues == null) {\r
+ _params.put(name, oldValues);\r
+ }\r
+ else if (isBlankValue(newValues)) {\r
+ _params.remove(name);\r
+ }\r
+ else {\r
+ newValues = ArrayUtil.append(newValues, oldValues);\r
+\r
+ _params.put(name, newValues);\r
+ }\r
+ }\r
+ }\r
+\r
+ protected String prependNamespace(String name) {\r
+ String namespace = getNamespace();\r
+\r
+ if (!PortalUtil.isReservedParameter(name) &&\r
+ !name.startsWith(PortletQName.PUBLIC_RENDER_PARAMETER_NAMESPACE) &&\r
+ !name.startsWith(namespace)) {\r
+\r
+ return namespace.concat(name);\r
+ }\r
+ else {\r
+ return name;\r
+ }\r
+ }\r
+\r
+ protected String processValue(Key key, int value) {\r
+ return processValue(key, String.valueOf(value));\r
+ }\r
+\r
+ protected String processValue(Key key, long value) {\r
+ return processValue(key, String.valueOf(value));\r
+ }\r
+\r
+ protected String processValue(Key key, String value) {\r
+ if (key == null) {\r
+ return HttpUtil.encodeURL(value);\r
+ }\r
+ else {\r
+ try {\r
+ return HttpUtil.encodeURL(Encryptor.encrypt(key, value));\r
+ }\r
+ catch (EncryptorException ee) {\r
+ return value;\r
+ }\r
+ }\r
+ }\r
+\r
+ protected String shortenURL(String url, int count) {\r
+ if (count == 0) {\r
+ return null;\r
+ }\r
+\r
+ StringBundler sb = new StringBundler();\r
+\r
+ String[] params = url.split(StringPool.AMPERSAND);\r
+\r
+ for (int i = 0; i < params.length; i++) {\r
+ String param = params[i];\r
+\r
+ if (param.contains("_backURL=") || param.contains("_redirect=") ||\r
+ param.contains("_returnToFullPageURL=")) {\r
+\r
+ int pos = param.indexOf(StringPool.EQUAL);\r
+\r
+ String qName = param.substring(0, pos);\r
+\r
+ String redirect = param.substring(pos + 1);\r
+\r
+ redirect = HttpUtil.decodeURL(redirect);\r
+\r
+ String newURL = shortenURL(redirect, count - 1);\r
+\r
+ if (newURL != null) {\r
+ newURL = HttpUtil.encodeURL(newURL);\r
+\r
+ sb.append(qName);\r
+ sb.append(StringPool.EQUAL);\r
+ sb.append(newURL);\r
+\r
+ if (i < (params.length - 1)) {\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ sb.append(param);\r
+\r
+ if (i < (params.length - 1)) {\r
+ sb.append(StringPool.AMPERSAND);\r
+ }\r
+ }\r
+ }\r
+\r
+ return sb.toString();\r
+ }\r
+\r
+ private static final long _URL_MAXIMUM_LENGTH = 2083;\r
+\r
+ private static Log _log = LogFactoryUtil.getLog(PortletURLImpl.class);\r
+\r
+ private boolean _anchor = true;\r
+ private String _cacheability = ResourceURL.PAGE;\r
+ private String _controlPanelCategory;\r
+ private boolean _copyCurrentRenderParameters;\r
+ private long _doAsGroupId;\r
+ private long _doAsUserId;\r
+ private String _doAsUserLanguageId;\r
+ private boolean _encrypt;\r
+ private boolean _escapeXml = PropsValues.PORTLET_URL_ESCAPE_XML;\r
+ private Layout _layout;\r
+ private String _layoutFriendlyURL;\r
+ private String _lifecycle;\r
+ private String _namespace;\r
+ private Set<String> _parametersIncludedInPath;\r
+ private Map<String, String[]> _params;\r
+ private long _plid;\r
+ private Portlet _portlet;\r
+ private String _portletId;\r
+ private String _portletModeString;\r
+ private PortletRequest _portletRequest;\r
+ private long _refererPlid;\r
+ private Set<String> _removedParameterNames;\r
+ private Map<String, String[]> _removePublicRenderParameters;\r
+ private HttpServletRequest _request;\r
+ private Map<String, String> _reservedParameters;\r
+ private String _resourceID;\r
+ private boolean _secure;\r
+ private String _toString;\r
+ private boolean _windowStateRestoreCurrentView;\r
+ private String _windowStateString;\r
+ private boolean _search;\r
+ private boolean _wsrp;\r
+\r
+}
\ No newline at end of file