/uPortal-web/src/main/java/org/apereo/portal/url/PortalUrlProviderImpl.java

https://github.com/Jasig/uPortal · Java · 259 lines · 184 code · 36 blank · 39 comment · 26 complexity · feddbf56724eccbe066546093ef5d0f6 MD5 · raw file

  1. /**
  2. * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
  3. * distributed with this work for additional information regarding copyright ownership. Apereo
  4. * licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use
  5. * this file except in compliance with the License. You may obtain a copy of the License at the
  6. * following location:
  7. *
  8. * <p>http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * <p>Unless required by applicable law or agreed to in writing, software distributed under the
  11. * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
  12. * express or implied. See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. package org.apereo.portal.url;
  16. import java.util.List;
  17. import java.util.Map;
  18. import javax.portlet.PortletMode;
  19. import javax.portlet.WindowState;
  20. import javax.servlet.http.HttpServletRequest;
  21. import org.apereo.portal.IUserPreferencesManager;
  22. import org.apereo.portal.api.portlet.DelegationRequest;
  23. import org.apereo.portal.layout.IUserLayoutManager;
  24. import org.apereo.portal.layout.node.IUserLayoutNodeDescription;
  25. import org.apereo.portal.layout.node.IUserLayoutNodeDescription.LayoutNodeType;
  26. import org.apereo.portal.portlet.delegation.IPortletDelegationManager;
  27. import org.apereo.portal.portlet.om.IPortletEntity;
  28. import org.apereo.portal.portlet.om.IPortletWindow;
  29. import org.apereo.portal.portlet.om.IPortletWindowId;
  30. import org.apereo.portal.portlet.registry.IPortletWindowRegistry;
  31. import org.apereo.portal.user.IUserInstance;
  32. import org.apereo.portal.user.IUserInstanceManager;
  33. import org.slf4j.Logger;
  34. import org.slf4j.LoggerFactory;
  35. import org.springframework.beans.factory.annotation.Autowired;
  36. import org.springframework.stereotype.Service;
  37. /** Generates {@link IPortalUrlBuilder} objects based on various layout and portlet targets. */
  38. @Service
  39. public class PortalUrlProviderImpl implements IPortalUrlProvider {
  40. private static final String PORTAL_ACTION_URL_BUILDER =
  41. PortalUrlProviderImpl.class.getName() + ".PORTAL_ACTION_URL_BUILDER";
  42. protected final Logger logger = LoggerFactory.getLogger(getClass());
  43. private IUrlSyntaxProvider urlSyntaxProvider;
  44. private IUserInstanceManager userInstanceManager;
  45. private IUrlNodeSyntaxHelperRegistry urlNodeSyntaxHelperRegistry;
  46. private IPortletWindowRegistry portletWindowRegistry;
  47. private IPortletDelegationManager portletDelegationManager;
  48. @Autowired
  49. public void setPortletDelegationManager(IPortletDelegationManager portletDelegationManager) {
  50. this.portletDelegationManager = portletDelegationManager;
  51. }
  52. @Autowired
  53. public void setUrlSyntaxProvider(IUrlSyntaxProvider urlSyntaxProvider) {
  54. this.urlSyntaxProvider = urlSyntaxProvider;
  55. }
  56. @Autowired
  57. public void setUserInstanceManager(IUserInstanceManager userInstanceManager) {
  58. this.userInstanceManager = userInstanceManager;
  59. }
  60. @Autowired
  61. public void setUrlNodeSyntaxHelperRegistry(
  62. IUrlNodeSyntaxHelperRegistry urlNodeSyntaxHelperRegistry) {
  63. this.urlNodeSyntaxHelperRegistry = urlNodeSyntaxHelperRegistry;
  64. }
  65. @Autowired
  66. public void setPortletWindowRegistry(IPortletWindowRegistry portletWindowRegistry) {
  67. this.portletWindowRegistry = portletWindowRegistry;
  68. }
  69. @Override
  70. public IPortalActionUrlBuilder getPortalActionUrlBuilder(HttpServletRequest request) {
  71. return (IPortalActionUrlBuilder) request.getAttribute(PORTAL_ACTION_URL_BUILDER);
  72. }
  73. @Override
  74. public IPortalActionUrlBuilder convertToPortalActionUrlBuilder(
  75. HttpServletRequest request, IPortalUrlBuilder portalUrlBuilder) {
  76. request.setAttribute(PORTAL_ACTION_URL_BUILDER, portalUrlBuilder);
  77. return (IPortalActionUrlBuilder) portalUrlBuilder;
  78. }
  79. /* (non-Javadoc)
  80. * @see org.apereo.portal.url.IPortalUrlProvider#getDefaultUrl(javax.servlet.http.HttpServletRequest)
  81. */
  82. @Override
  83. public IPortalUrlBuilder getDefaultUrl(HttpServletRequest request) {
  84. final IUrlNodeSyntaxHelper urlNodeSyntaxHelper =
  85. this.urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request);
  86. final String defaultLayoutNodeId = urlNodeSyntaxHelper.getDefaultLayoutNodeId(request);
  87. return this.getPortalUrlBuilderByLayoutNode(request, defaultLayoutNodeId, UrlType.RENDER);
  88. }
  89. /* (non-Javadoc)
  90. * @see org.apereo.portal.url.IPortalUrlProvider#getPortalUrlBuilderByLayoutNode(javax.servlet.http.HttpServletRequest, java.lang.String, org.apereo.portal.url.UrlType)
  91. */
  92. @Override
  93. public IPortalUrlBuilder getPortalUrlBuilderByLayoutNode(
  94. HttpServletRequest request, String layoutNodeId, UrlType urlType) {
  95. final IPortletWindowId portletWindowId = getPortletWindowId(request, layoutNodeId);
  96. return new PortalUrlBuilder(
  97. this.urlSyntaxProvider, request, layoutNodeId, portletWindowId, urlType);
  98. }
  99. private IPortletWindowId getPortletWindowId(HttpServletRequest request, String layoutNodeId) {
  100. if (layoutNodeId == null) {
  101. return null;
  102. }
  103. final LayoutNodeType layoutNodeType = this.getLayoutNodeType(request, layoutNodeId);
  104. if (layoutNodeType == null) {
  105. throw new IllegalArgumentException("No layout node exists for id: " + layoutNodeId);
  106. }
  107. if (layoutNodeType != LayoutNodeType.PORTLET) {
  108. return null;
  109. }
  110. final IPortletWindow portletWindow =
  111. this.portletWindowRegistry.getOrCreateDefaultPortletWindowByLayoutNodeId(
  112. request, layoutNodeId);
  113. if (portletWindow == null) {
  114. return null;
  115. }
  116. return portletWindow.getPortletWindowId();
  117. }
  118. /* (non-Javadoc)
  119. * @see org.apereo.portal.url.IPortalUrlProvider#getPortalUrlBuilderByPortletWindow(javax.servlet.http.HttpServletRequest, org.apereo.portal.portlet.om.IPortletWindowId, org.apereo.portal.url.UrlType)
  120. */
  121. @Override
  122. public IPortalUrlBuilder getPortalUrlBuilderByPortletWindow(
  123. HttpServletRequest request, IPortletWindowId portletWindowId, UrlType urlType) {
  124. final IPortletWindow portletWindow =
  125. this.portletWindowRegistry.getPortletWindow(request, portletWindowId);
  126. return getPortalUrlBuilderByPortletWindow(request, portletWindow, urlType);
  127. }
  128. /* (non-Javadoc)
  129. * @see org.apereo.portal.url.IPortalUrlProvider#getPortalUrlBuilderByPortletFName(javax.servlet.http.HttpServletRequest, java.lang.String, org.apereo.portal.url.UrlType)
  130. */
  131. @Override
  132. public IPortalUrlBuilder getPortalUrlBuilderByPortletFName(
  133. HttpServletRequest request, String portletFName, UrlType urlType) {
  134. final IPortletWindow portletWindow =
  135. this.portletWindowRegistry.getOrCreateDefaultPortletWindowByFname(
  136. request, portletFName);
  137. if (portletWindow == null) {
  138. throw new IllegalArgumentException(
  139. "Could not find PortletWindow for fname="
  140. + portletFName
  141. + " to create IPortalUrlBuilder");
  142. }
  143. return this.getPortalUrlBuilderByPortletWindow(request, portletWindow, urlType);
  144. }
  145. protected IPortalUrlBuilder getPortalUrlBuilderByPortletWindow(
  146. HttpServletRequest request, IPortletWindow portletWindow, UrlType urlType) {
  147. final IPortletWindowId portletWindowId = portletWindow.getPortletWindowId();
  148. // See if the targeted portlet is actually a delegate
  149. final IPortletWindowId parentPortletWindowId = portletWindow.getDelegationParentId();
  150. if (parentPortletWindowId != null) {
  151. // Get the portal url builder that targets the parent
  152. final IPortalUrlBuilder portalUrlBuilder =
  153. this.getPortalUrlBuilderByPortletWindow(
  154. request, parentPortletWindowId, urlType);
  155. // See if there is additional delegation request data that needs to be added to the URL
  156. final DelegationRequest delegationRequest =
  157. this.portletDelegationManager.getDelegationRequest(request, portletWindowId);
  158. if (delegationRequest != null) {
  159. final IPortletUrlBuilder parentPortletUrlBuilder =
  160. portalUrlBuilder.getPortletUrlBuilder(parentPortletWindowId);
  161. final Map<String, List<String>> parentParameters =
  162. delegationRequest.getParentParameters();
  163. if (parentParameters != null) {
  164. parentPortletUrlBuilder.setParameters(parentParameters);
  165. }
  166. final PortletMode parentPortletMode = delegationRequest.getParentPortletMode();
  167. if (parentPortletMode != null) {
  168. parentPortletUrlBuilder.setPortletMode(parentPortletMode);
  169. }
  170. final WindowState parentWindowState = delegationRequest.getParentWindowState();
  171. if (parentWindowState != null) {
  172. parentPortletUrlBuilder.setWindowState(parentWindowState);
  173. }
  174. }
  175. return portalUrlBuilder;
  176. }
  177. // create the portlet url builder
  178. final String layoutNodeId = this.verifyPortletWindowId(request, portletWindowId);
  179. return new PortalUrlBuilder(
  180. this.urlSyntaxProvider, request, layoutNodeId, portletWindowId, urlType);
  181. }
  182. /**
  183. * Verify the requested portlet window corresponds to a node in the user's layout and return the
  184. * corresponding layout node id
  185. */
  186. protected String verifyPortletWindowId(
  187. HttpServletRequest request, IPortletWindowId portletWindowId) {
  188. final IUserInstance userInstance = this.userInstanceManager.getUserInstance(request);
  189. final IUserPreferencesManager preferencesManager = userInstance.getPreferencesManager();
  190. final IUserLayoutManager userLayoutManager = preferencesManager.getUserLayoutManager();
  191. final IPortletWindow portletWindow =
  192. this.portletWindowRegistry.getPortletWindow(request, portletWindowId);
  193. final IPortletWindowId delegationParentWindowId = portletWindow.getDelegationParentId();
  194. if (delegationParentWindowId != null) {
  195. return verifyPortletWindowId(request, delegationParentWindowId);
  196. }
  197. final IPortletEntity portletEntity = portletWindow.getPortletEntity();
  198. final String channelSubscribeId = portletEntity.getLayoutNodeId();
  199. final IUserLayoutNodeDescription node = userLayoutManager.getNode(channelSubscribeId);
  200. if (node == null) {
  201. throw new IllegalArgumentException(
  202. "No layout node exists for id "
  203. + channelSubscribeId
  204. + " of window "
  205. + portletWindowId);
  206. }
  207. return node.getId();
  208. }
  209. /**
  210. * Verify the requested node exists in the user's layout. Also if the node exists see if it is a
  211. * portlet node and if it is return the {@link IPortletWindowId} of the corresponding portlet.
  212. */
  213. protected LayoutNodeType getLayoutNodeType(HttpServletRequest request, String folderNodeId) {
  214. final IUserInstance userInstance = this.userInstanceManager.getUserInstance(request);
  215. final IUserPreferencesManager preferencesManager = userInstance.getPreferencesManager();
  216. final IUserLayoutManager userLayoutManager = preferencesManager.getUserLayoutManager();
  217. final IUserLayoutNodeDescription node = userLayoutManager.getNode(folderNodeId);
  218. if (node == null) {
  219. return null;
  220. }
  221. return node.getType();
  222. }
  223. }