/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * 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 the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>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.apereo.portal.url.xml; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.apereo.portal.portlet.PortletUtils; import org.apereo.portal.portlet.om.IPortletWindow; import org.apereo.portal.portlet.om.IPortletWindowId; import org.apereo.portal.portlet.registry.IPortletWindowRegistry; import org.apereo.portal.url.IPortalUrlBuilder; import org.apereo.portal.url.IPortalUrlProvider; import org.apereo.portal.url.IPortletUrlBuilder; import org.apereo.portal.url.IUrlBuilder; import org.apereo.portal.url.UrlType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * Wrapper class for {@link IPortalUrlProvider} that makes use easier in XSL * */ @Service("xslPortalUrlProvider") public class XsltPortalUrlProvider { public static final String XSLT_PORTAL_URL_PROVIDER = "XSLT_PORTAL_URL_PROVIDER"; public static final String CURRENT_REQUEST = "CURRENT_REQUEST"; protected final Logger logger = LoggerFactory.getLogger(this.getClass()); public static XsltPortalUrlProvider getUrlProvider(Object urlProvider) { return (XsltPortalUrlProvider) urlProvider; } public static HttpServletRequest getHttpServletRequest(Object request) { return (HttpServletRequest) request; } /** Needed due to compile-time type checking limitations of the XSLTC compiler */ public static void addParameter(IUrlBuilder urlBuilder, String name, String value) { urlBuilder.addParameter(name, value); } private IPortalUrlProvider portalUrlProvider; private IPortletWindowRegistry portletWindowRegistry; @Autowired public void setPortalUrlProvider(IPortalUrlProvider urlProvider) { this.portalUrlProvider = urlProvider; } @Autowired public void setPortletWindowRegistry(IPortletWindowRegistry portletWindowRegistry) { this.portletWindowRegistry = portletWindowRegistry; } /** Create a portal URL builder for the specified fname or layoutId (fname takes precedence) */ public IPortalUrlBuilder getPortalUrlBuilder( HttpServletRequest request, String fname, String layoutId, String type) { try { final UrlType urlType; if (StringUtils.isEmpty(type)) { urlType = UrlType.RENDER; } else { urlType = UrlType.valueOfIngoreCase(type); } if (StringUtils.isNotEmpty(fname)) { final IPortalUrlBuilder portalUrlBuilderByPortletFName = this.portalUrlProvider.getPortalUrlBuilderByPortletFName( request, fname, urlType); return portalUrlBuilderByPortletFName; } if (StringUtils.isNotEmpty(layoutId)) { final IPortalUrlBuilder portalUrlBuilderByLayoutNode = this.portalUrlProvider.getPortalUrlBuilderByLayoutNode( request, layoutId, urlType); return portalUrlBuilderByLayoutNode; } return this.portalUrlProvider.getDefaultUrl(request); } catch (Exception e) { this.logger.error( "Failed to create IPortalUrlBuilder for fname='" + fname + "', layoutId='" + layoutId + "', type='" + type + "'. # will be returned instead.", e); return new FailSafePortalUrlBuilder(); } } /** * Get the portlet URL builder for the specified fname or layoutId (fname takes precedence) * @param request * @param portalUrlBuilder * @param fname * @param layoutId * @param state * @param mode * @param copyCurrentRenderParameters * @return * @deprecated As of uPortal release 4.1, replaced by * {@link #getPortletUrlBuilder(HttpServletRequest request, IPortalUrlBuilder portalUrlBuilder, String fname, String layoutId, String state, String mode, String copyCurrentRenderParameters, String resourceId)) */ @Deprecated public IPortletUrlBuilder getPortletUrlBuilder( HttpServletRequest request, IPortalUrlBuilder portalUrlBuilder, String fname, String layoutId, String state, String mode, String copyCurrentRenderParameters) { return this.getPortletUrlBuilder( request, portalUrlBuilder, fname, layoutId, state, mode, copyCurrentRenderParameters, null); } /** * Get the portlet URL builder for the specified fname or layoutId (fname takes precedence) * * @param request * @param portalUrlBuilder * @param fname - can be empty string * @param layoutId - can by empty string * @param state - can be empty string * @param mode - can be empty string * @param copyCurrentRenderParameters * @param resourceId - can be empty string * @return IPortletUrlBuilder * @since 4.1 */ public IPortletUrlBuilder getPortletUrlBuilder( HttpServletRequest request, IPortalUrlBuilder portalUrlBuilder, String fname, String layoutId, String state, String mode, String copyCurrentRenderParameters, String resourceId) { final IPortletUrlBuilder portletUrlBuilder; if (StringUtils.isNotEmpty(fname)) { final IPortletWindow portletWindow = this.portletWindowRegistry.getOrCreateDefaultPortletWindowByFname( request, fname); final IPortletWindowId portletWindowId = portletWindow.getPortletWindowId(); portletUrlBuilder = portalUrlBuilder.getPortletUrlBuilder(portletWindowId); } else if (StringUtils.isNotEmpty(layoutId)) { final IPortletWindow portletWindow = this.portletWindowRegistry.getOrCreateDefaultPortletWindowByLayoutNodeId( request, layoutId); final IPortletWindowId portletWindowId = portletWindow.getPortletWindowId(); portletUrlBuilder = portalUrlBuilder.getPortletUrlBuilder(portletWindowId); } else { final IPortletWindowId targetPortletWindowId = portalUrlBuilder.getTargetPortletWindowId(); if (targetPortletWindowId == null) { if (this.logger.isDebugEnabled()) { this.logger.warn( "Can only target the default portlet if the root portal-url targets a portlet.", new Throwable()); } else { this.logger.warn( "Can only target the default portlet if the root portal-url targets a portlet. Enable debug for stack trace."); } return new FailSafePortletUrlBuilder(null, portalUrlBuilder); } portletUrlBuilder = portalUrlBuilder.getTargetedPortletUrlBuilder(); } portletUrlBuilder.setCopyCurrentRenderParameters( Boolean.parseBoolean(copyCurrentRenderParameters)); if (StringUtils.isNotEmpty(state)) { portletUrlBuilder.setWindowState(PortletUtils.getWindowState(state)); } if (StringUtils.isNotEmpty(mode)) { portletUrlBuilder.setPortletMode(PortletUtils.getPortletMode(mode)); } if (StringUtils.isNotEmpty(resourceId) && portletUrlBuilder.getPortalUrlBuilder().getUrlType() == UrlType.RESOURCE) { portletUrlBuilder.setResourceId(resourceId); } return portletUrlBuilder; } }