/** * 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; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import com.google.common.base.Function; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import java.util.Arrays; import java.util.Collections; import java.util.Map; import java.util.Set; import javax.portlet.PortletMode; import javax.portlet.ResourceURL; import javax.portlet.WindowState; import org.apereo.portal.IUserPreferencesManager; import org.apereo.portal.layout.IUserLayout; import org.apereo.portal.layout.IUserLayoutManager; import org.apereo.portal.mock.portlet.om.MockPortletWindowId; import org.apereo.portal.portlet.om.IPortletEntity; import org.apereo.portal.portlet.om.IPortletWindow; import org.apereo.portal.portlet.om.IPortletWindowId; import org.apereo.portal.portlet.registry.IPortletEntityRegistry; import org.apereo.portal.portlet.registry.IPortletWindowRegistry; import org.apereo.portal.portlet.rendering.IPortletRenderer; import org.apereo.portal.user.IUserInstance; import org.apereo.portal.user.IUserInstanceManager; import org.apereo.portal.utils.Tuple; import org.apereo.portal.xml.xpath.XPathOperations; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.mock.web.MockHttpServletRequest; /** * Test harness for {@link UrlSyntaxProviderImpl}. */ @RunWith(MockitoJUnitRunner.class) public class UrlSyntaxProviderImplTest { @InjectMocks private UrlSyntaxProviderImpl urlSyntaxProvider = new UrlSyntaxProviderImpl(); @Mock private IPortalRequestUtils portalRequestUtils; @Mock private IUrlNodeSyntaxHelperRegistry urlNodeSyntaxHelperRegistry; @Mock private IUrlNodeSyntaxHelper urlNodeSyntaxHelper; @Mock private IPortalUrlProvider portalUrlProvider; @Mock private IPortletEntityRegistry portletEntityRegistry; @Mock private IPortletWindowRegistry portletWindowRegistry; @Mock private XPathOperations xpathOperations; @Mock private IUserInstanceManager userInstanceManager; @Mock private IUserInstance userInstance; @Mock private IUserPreferencesManager userPreferencesManager; @Mock private IUserLayoutManager userLayoutManager; @Mock private IUserLayout userLayout; @Mock private IPortletEntity portletEntity1; @Mock private IPortletEntity portletEntity2; @Mock private IPortletWindow portletWindow1; @Mock private IPortletWindow portletWindow2; @Test public void getCleanedContextPath() throws Exception { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); String path = urlSyntaxProvider.getCleanedContextPath(request); assertEquals("uPortal", path); request.setContextPath(""); path = urlSyntaxProvider.getCleanedContextPath(request); assertEquals("", path); } @Test public void testNonTargetedGeneration() throws Exception { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); when(portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(urlNodeSyntaxHelper.getFolderNamesForLayoutNode(request, null)) .thenReturn(Collections.<String>emptyList()); final PortalUrlBuilder portalUrlBuilder = new PortalUrlBuilder(urlSyntaxProvider, request, null, null, UrlType.RENDER); final String url = portalUrlBuilder.getUrlString(); assertEquals("/uPortal/normal/render.uP", url); } @Test public void testSingleFolderUrlWithStateTypeGeneration() throws Exception { final String layoutNodeId = "n2"; final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); when(portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(urlNodeSyntaxHelper.getFolderNamesForLayoutNode(request, layoutNodeId)) .thenReturn(Arrays.asList(layoutNodeId)); final PortalUrlBuilder portalUrlBuilder = new PortalUrlBuilder( urlSyntaxProvider, request, layoutNodeId, null, UrlType.RENDER); final String url = portalUrlBuilder.getUrlString(); assertEquals("/uPortal/f/n2/normal/render.uP", url); } @Test public void testSingleFolderPortletFnameSubscribeIdRenderUrlGeneration() throws Exception { final String layoutNodeId = "n2"; final String subscribeId = "s3"; final String fname = "fname"; final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); final MockPortletWindowId portletWindowId = new MockPortletWindowId("pw1"); when(portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(urlNodeSyntaxHelper.getFolderNamesForLayoutNode(request, subscribeId)) .thenReturn(Arrays.asList(layoutNodeId)); when(urlNodeSyntaxHelper.getFolderNameForPortlet(request, portletWindowId)) .thenReturn(fname + "." + subscribeId); when(portletWindowRegistry.getPortletWindow(request, portletWindowId)) .thenReturn(portletWindow1); when(portletWindow1.getPortletEntity()).thenReturn(portletEntity1); when(portletEntity1.getLayoutNodeId()).thenReturn(subscribeId); final PortalUrlBuilder portalUrlBuilder = new PortalUrlBuilder( urlSyntaxProvider, request, layoutNodeId, portletWindowId, UrlType.RENDER); final String url = portalUrlBuilder.getUrlString(); assertEquals("/uPortal/f/n2/normal/render.uP?pCt=fname.s3", url); } @Test public void testSingleFolderPortletFnameSubscribeIdDetachedRenderUrlGeneration() throws Exception { final String layoutNodeId = "n2"; final String subscribeId = "s3"; final String fname = "fname"; final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); final MockPortletWindowId portletWindowId = new MockPortletWindowId("pw1"); when(portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(urlNodeSyntaxHelper.getFolderNamesForLayoutNode(request, subscribeId)) .thenReturn(Arrays.asList(layoutNodeId)); when(urlNodeSyntaxHelper.getFolderNameForPortlet(request, portletWindowId)) .thenReturn(fname + "." + subscribeId); when(portletWindowRegistry.getPortletWindow(request, portletWindowId)) .thenReturn(portletWindow1); when(portletWindow1.getPortletEntity()).thenReturn(portletEntity1); when(portletWindow1.getWindowState()).thenReturn(IPortletRenderer.DETACHED); when(portletWindow1.getPortletMode()).thenReturn(PortletMode.VIEW); when(portletEntity1.getLayoutNodeId()).thenReturn(subscribeId); final PortalUrlBuilder portalUrlBuilder = new PortalUrlBuilder( urlSyntaxProvider, request, layoutNodeId, portletWindowId, UrlType.RENDER); final IPortletUrlBuilder portletUrlBuilder = portalUrlBuilder.getPortletUrlBuilder(portletWindowId); portletUrlBuilder.setPortletMode(PortletMode.EDIT); final String url = portalUrlBuilder.getUrlString(); assertEquals("/uPortal/f/n2/p/fname.s3/detached/render.uP?pCm=edit", url); } @Test public void testSingleFolderPortletFnameSubscribeIdMaximizedActionUrlGeneration() throws Exception { final String layoutNodeId = "n2"; final String subscribeId = "s3"; final String fname = "fname"; final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); final MockPortletWindowId portletWindowId = new MockPortletWindowId("pw1"); when(portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(urlNodeSyntaxHelper.getFolderNamesForLayoutNode(request, subscribeId)) .thenReturn(Arrays.asList(layoutNodeId)); when(urlNodeSyntaxHelper.getFolderNameForPortlet(request, portletWindowId)) .thenReturn(fname + "." + subscribeId); when(portletWindowRegistry.getPortletWindow(request, portletWindowId)) .thenReturn(portletWindow1); when(portletWindow1.getPortletEntity()).thenReturn(portletEntity1); when(portletEntity1.getLayoutNodeId()).thenReturn(subscribeId); final PortalUrlBuilder portalUrlBuilder = new PortalUrlBuilder( urlSyntaxProvider, request, layoutNodeId, portletWindowId, UrlType.ACTION); final IPortletUrlBuilder portletUrlBuilder = portalUrlBuilder.getPortletUrlBuilder(portletWindowId); portletUrlBuilder.setWindowState(WindowState.MAXIMIZED); final String url = portalUrlBuilder.getUrlString(); assertEquals("/uPortal/f/n2/p/fname.s3/max/action.uP", url); } @Test public void testSingleFolderPortletFnameSubscribeIdMinimizedRenderUrlGeneration() throws Exception { final String layoutNodeId = "n2"; final String subscribeId = "s3"; final String fname = "fname"; final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); final MockPortletWindowId portletWindowId = new MockPortletWindowId("pw1"); when(portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(urlNodeSyntaxHelper.getFolderNamesForLayoutNode(request, subscribeId)) .thenReturn(Arrays.asList(layoutNodeId)); when(urlNodeSyntaxHelper.getFolderNameForPortlet(request, portletWindowId)) .thenReturn(fname + "." + subscribeId); when(portletWindowRegistry.getPortletWindow(request, portletWindowId)) .thenReturn(portletWindow1); when(portletWindow1.getPortletEntity()).thenReturn(portletEntity1); when(portletEntity1.getLayoutNodeId()).thenReturn(subscribeId); final PortalUrlBuilder portalUrlBuilder = new PortalUrlBuilder( urlSyntaxProvider, request, layoutNodeId, portletWindowId, UrlType.RENDER); final IPortletUrlBuilder portletUrlBuilder = portalUrlBuilder.getPortletUrlBuilder(portletWindowId); portletUrlBuilder.setWindowState(WindowState.MINIMIZED); portletUrlBuilder.setParameter("action", "dashboard"); final String url = portalUrlBuilder.getUrlString(); assertEquals( "/uPortal/f/n2/normal/render.uP?pCt=fname.s3&pCs=minimized&pP_action=dashboard", url); } @Test public void testSingleFolderMultiplePortletFnameSubscribeIdMinimizedRenderUrlGeneration() throws Exception { final String layoutNodeId = "n2"; final String subscribeId = "s3"; final String fname = "fname"; final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); final MockPortletWindowId portletWindowId1 = new MockPortletWindowId("pw1"); final MockPortletWindowId portletWindowId2 = new MockPortletWindowId("pw2"); when(portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(urlNodeSyntaxHelper.getFolderNamesForLayoutNode(request, subscribeId)) .thenReturn(Arrays.asList(layoutNodeId)); when(urlNodeSyntaxHelper.getFolderNameForPortlet(request, portletWindowId1)) .thenReturn(fname + "." + subscribeId); when(portletWindowRegistry.getPortletWindow(request, portletWindowId1)) .thenReturn(portletWindow1); when(portletWindowRegistry.getPortletWindow(request, portletWindowId2)) .thenReturn(portletWindow2); when(portletWindow1.getPortletEntity()).thenReturn(portletEntity1); when(portletEntity1.getLayoutNodeId()).thenReturn(subscribeId); final PortalUrlBuilder portalUrlBuilder = new PortalUrlBuilder( urlSyntaxProvider, request, layoutNodeId, portletWindowId1, UrlType.RENDER); final IPortletUrlBuilder portletUrlBuilder1 = portalUrlBuilder.getPortletUrlBuilder(portletWindowId1); portletUrlBuilder1.setWindowState(WindowState.MINIMIZED); portletUrlBuilder1.setParameter("action", "dashboard"); final IPortletUrlBuilder portletUrlBuilder2 = portalUrlBuilder.getPortletUrlBuilder(portletWindowId2); portletUrlBuilder2.setParameter("a", "b"); portletUrlBuilder2.setParameter("b", "c"); portletUrlBuilder2.setPortletMode(PortletMode.HELP); final String url = portalUrlBuilder.getUrlString(); assertEquals( "/uPortal/f/n2/normal/render.uP?pCt=fname.s3&pCs=minimized&pP_action=dashboard&pCm_pw2=help&pP_pw2_a=b&pP_pw2_b=c&pCa=pw2", url); } @Test public void testSingleFolderMultiplePortletFnameSubscribeIdMinimizedRenderUrlParsing() throws Exception { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); request.setRequestURI("/f/n2/normal/render.uP"); request.setQueryString( "?pCt=fname.s3&pCs=minimized&pP_action=dashboard&pCm_pw2=help&pP_pw2_a=b&pP_pw2_b=c&pCa=pw2"); request.addParameter("pCt", "fname.s3"); request.addParameter("pCs", "minimized"); request.addParameter("pP_action", "dashboard"); request.addParameter("pCa", "pw2"); request.addParameter("pCm_pw2", "help"); request.addParameter("pP_pw2_a", "b"); request.addParameter("pP_pw2_b", "c"); request.addParameter("postedParameter", "foobar"); final MockPortletWindowId portletWindowId = new MockPortletWindowId("s3"); final MockPortletWindowId portletWindowId2 = new MockPortletWindowId("pw2"); when(this.portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(this.urlNodeSyntaxHelper.getLayoutNodeForFolderNames(request, Arrays.asList("n2"))) .thenReturn("n2"); when(this.urlNodeSyntaxHelper.getPortletForFolderName(request, "n2", "fname.s3")) .thenReturn(portletWindowId); when(this.portletWindowRegistry.getPortletWindowId(request, "pw2")) .thenReturn(portletWindowId2); final IPortalRequestInfo portalRequestInfo = this.urlSyntaxProvider.getPortalRequestInfo(request); assertNotNull(portalRequestInfo); assertEquals("n2", portalRequestInfo.getTargetedLayoutNodeId()); assertEquals(portletWindowId, portalRequestInfo.getTargetedPortletWindowId()); assertEquals(UrlState.NORMAL, portalRequestInfo.getUrlState()); assertEquals(UrlType.RENDER, portalRequestInfo.getUrlType()); final Map<IPortletWindowId, ? extends IPortletRequestInfo> portletRequestInfoMap = portalRequestInfo.getPortletRequestInfoMap(); assertNotNull(portletRequestInfoMap); assertEquals(2, portletRequestInfoMap.size()); final IPortletRequestInfo portletRequestInfo = portletRequestInfoMap.get(portletWindowId); assertNotNull(portletRequestInfo); assertEquals(portletWindowId, portletRequestInfo.getPortletWindowId()); assertEquals( ImmutableMap.of( "action", Arrays.asList("dashboard"), "postedParameter", Arrays.asList("foobar")), portletRequestInfo.getPortletParameters()); assertEquals(WindowState.MINIMIZED, portletRequestInfo.getWindowState()); assertNull(portletRequestInfo.getPortletMode()); final IPortletRequestInfo portletRequestInfo2 = portletRequestInfoMap.get(portletWindowId2); assertNotNull(portletRequestInfo2); assertEquals(portletWindowId2, portletRequestInfo2.getPortletWindowId()); assertEquals( ImmutableMap.of("a", Arrays.asList("b"), "b", Arrays.asList("c")), portletRequestInfo2.getPortletParameters()); assertNull(portletRequestInfo2.getWindowState()); assertEquals(PortletMode.HELP, portletRequestInfo2.getPortletMode()); } @Test public void testSingleFolderPortletResourceDelegationFnameSubscribeIdResourceUrlGeneration() throws Exception { final String layoutNodeId = "n2"; final String subscribeId1 = "s3"; final String subscribeId2 = "dlg-71-44"; final String fname = "fname"; final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); final MockPortletWindowId portletWindowId1 = new MockPortletWindowId("pw1"); final MockPortletWindowId portletWindowId2 = new MockPortletWindowId("pw2"); when(portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(urlNodeSyntaxHelper.getFolderNamesForLayoutNode(request, subscribeId1)) .thenReturn(Arrays.asList(layoutNodeId)); when(urlNodeSyntaxHelper.getFolderNameForPortlet(request, portletWindowId1)) .thenReturn(fname + "." + subscribeId1); when(portletWindowRegistry.getPortletWindow(request, portletWindowId1)) .thenReturn(portletWindow1); when(portletWindow1.getPortletEntity()).thenReturn(portletEntity1); when(portletEntity1.getLayoutNodeId()).thenReturn(subscribeId1); when(portletWindowRegistry.getPortletWindow(request, portletWindowId2)) .thenReturn(portletWindow2); when(portletWindow2.getPortletEntity()).thenReturn(portletEntity2); when(portletWindow2.getDelegationParentId()).thenReturn(portletWindowId1); when(portletEntity2.getLayoutNodeId()).thenReturn(subscribeId2); final PortalUrlBuilder portalUrlBuilder = new PortalUrlBuilder( urlSyntaxProvider, request, layoutNodeId, portletWindowId1, UrlType.RESOURCE); final IPortletUrlBuilder portletUrlBuilder1 = portalUrlBuilder.getPortletUrlBuilder(portletWindowId1); portletUrlBuilder1.setWindowState(WindowState.NORMAL); portletUrlBuilder1.setParameter("action", "dashboard"); final IPortletUrlBuilder portletUrlBuilder2 = portalUrlBuilder.getPortletUrlBuilder(portletWindowId2); portletUrlBuilder2.setParameter("a", "b"); portletUrlBuilder2.setParameter("b", "c"); portletUrlBuilder2.setPortletMode(PortletMode.HELP); portletUrlBuilder2.setResourceId("delegateResourceId"); final String url = portalUrlBuilder.getUrlString(); assertEquals( "/uPortal/f/n2/p/fname.s3/normal/resource.uP?pP_action=dashboard&pCd_pw2=pw1&pCr_pw2=delegateResourceId&pP_pw2_a=b&pP_pw2_b=c&pCa=pw2", url); } @Test public void testSingleFolderPortletResourceDelegationFnameSubscribeIdResourceUrlParsing() throws Exception { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); request.setRequestURI("/f/n2/p/fname.s3/normal/resource.uP"); request.setQueryString( "?pP_action=dashboard&pCd_pw2=pw1&pCr_pw2=delegateResourceId&pP_pw2_a=b&pP_pw2_b=c&pCa=pw2"); request.addParameter("pP_action", "dashboard"); request.addParameter("pCa", "pw2"); request.addParameter("pCd_pw2", "pw1"); request.addParameter("pCr_pw2", "delegateResourceId"); request.addParameter("pP_pw2_a", "b"); request.addParameter("pP_pw2_b", "c"); final MockPortletWindowId portletWindowId1 = new MockPortletWindowId("pw1"); final MockPortletWindowId portletWindowId2 = new MockPortletWindowId("pw2"); when(this.portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(this.urlNodeSyntaxHelper.getLayoutNodeForFolderNames(request, Arrays.asList("n2"))) .thenReturn("n2"); when(this.urlNodeSyntaxHelper.getPortletForFolderName(request, "n2", "fname.s3")) .thenReturn(portletWindowId1); when(this.portletWindowRegistry.getPortletWindowId(request, "pw2")) .thenReturn(portletWindowId2); when(this.portletWindowRegistry.getPortletWindowId(request, "pw1")) .thenReturn(portletWindowId1); final IPortalRequestInfo portalRequestInfo = this.urlSyntaxProvider.getPortalRequestInfo(request); assertNotNull(portalRequestInfo); assertEquals("n2", portalRequestInfo.getTargetedLayoutNodeId()); assertEquals(portletWindowId1, portalRequestInfo.getTargetedPortletWindowId()); assertEquals(UrlState.NORMAL, portalRequestInfo.getUrlState()); assertEquals(UrlType.RESOURCE, portalRequestInfo.getUrlType()); final Map<IPortletWindowId, ? extends IPortletRequestInfo> portletRequestInfoMap = portalRequestInfo.getPortletRequestInfoMap(); assertNotNull(portletRequestInfoMap); assertEquals(2, portletRequestInfoMap.size()); final IPortletRequestInfo portletRequestInfo = portletRequestInfoMap.get(portletWindowId1); assertNotNull(portletRequestInfo); assertEquals(portletWindowId1, portletRequestInfo.getPortletWindowId()); assertEquals( ImmutableMap.of("action", Arrays.asList("dashboard")), portletRequestInfo.getPortletParameters()); assertNull(portletRequestInfo.getWindowState()); assertNull(portletRequestInfo.getPortletMode()); assertNull(portletRequestInfo.getDelegateParentWindowId()); assertNull(portletRequestInfo.getResourceId()); final IPortletRequestInfo portletRequestInfo2 = portletRequestInfoMap.get(portletWindowId2); assertNotNull(portletRequestInfo2); assertEquals(portletWindowId2, portletRequestInfo2.getPortletWindowId()); assertEquals( ImmutableMap.of("a", Arrays.asList("b"), "b", Arrays.asList("c")), portletRequestInfo2.getPortletParameters()); assertNull(portletRequestInfo2.getWindowState()); assertNull(portletRequestInfo2.getPortletMode()); assertEquals(portletWindowId1, portletRequestInfo2.getDelegateParentWindowId()); assertEquals("delegateResourceId", portletRequestInfo2.getResourceId()); } @Test public void testSingleFolderPortletDelegationFnameSubscribeIdMinimizedRenderUrlGeneration() throws Exception { final String layoutNodeId = "n2"; final String subscribeId1 = "s3"; final String subscribeId2 = "dlg-71-44"; final String fname = "fname"; final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); final MockPortletWindowId portletWindowId1 = new MockPortletWindowId("pw1"); final MockPortletWindowId portletWindowId2 = new MockPortletWindowId("pw2"); when(portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(urlNodeSyntaxHelper.getFolderNamesForLayoutNode(request, subscribeId1)) .thenReturn(Arrays.asList(layoutNodeId)); when(urlNodeSyntaxHelper.getFolderNameForPortlet(request, portletWindowId1)) .thenReturn(fname + "." + subscribeId1); when(portletWindowRegistry.getPortletWindow(request, portletWindowId1)) .thenReturn(portletWindow1); when(portletWindow1.getPortletEntity()).thenReturn(portletEntity1); when(portletEntity1.getLayoutNodeId()).thenReturn(subscribeId1); when(portletWindowRegistry.getPortletWindow(request, portletWindowId2)) .thenReturn(portletWindow2); when(portletWindow2.getPortletEntity()).thenReturn(portletEntity2); when(portletWindow2.getDelegationParentId()).thenReturn(portletWindowId1); when(portletEntity2.getLayoutNodeId()).thenReturn(subscribeId2); final PortalUrlBuilder portalUrlBuilder = new PortalUrlBuilder( urlSyntaxProvider, request, layoutNodeId, portletWindowId1, UrlType.RENDER); final IPortletUrlBuilder portletUrlBuilder1 = portalUrlBuilder.getPortletUrlBuilder(portletWindowId1); portletUrlBuilder1.setWindowState(WindowState.MINIMIZED); portletUrlBuilder1.setParameter("action", "dashboard"); final IPortletUrlBuilder portletUrlBuilder2 = portalUrlBuilder.getPortletUrlBuilder(portletWindowId2); portletUrlBuilder2.setParameter("a", "b"); portletUrlBuilder2.setParameter("b", "c"); portletUrlBuilder2.setPortletMode(PortletMode.HELP); final String url = portalUrlBuilder.getUrlString(); assertEquals( "/uPortal/f/n2/normal/render.uP?pCt=fname.s3&pCs=minimized&pP_action=dashboard&pCd_pw2=pw1&pCm_pw2=help&pP_pw2_a=b&pP_pw2_b=c&pCa=pw2", url); } @Test public void testSingleFolderPortletDelegationFnameSubscribeIdMinimizedRenderUrlParsing() throws Exception { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); request.setRequestURI("/f/n2/normal/render.uP"); request.setQueryString( "?pCt=fname.s3&pCs=minimized&pP_action=dashboard&pCd_pw2=pw1&pCm_pw2=help&pP_pw2_a=b&pP_pw2_b=c&pCa=pw2"); request.addParameter("pCt", "fname.s3"); request.addParameter("pCs", "minimized"); request.addParameter("pP_action", "dashboard"); request.addParameter("pCa", "pw2"); request.addParameter("pCd_pw2", "pw1"); request.addParameter("pCm_pw2", "help"); request.addParameter("pP_pw2_a", "b"); request.addParameter("pP_pw2_b", "c"); request.addParameter("postedParameter", "foobar"); final MockPortletWindowId portletWindowId1 = new MockPortletWindowId("pw1"); final MockPortletWindowId portletWindowId2 = new MockPortletWindowId("pw2"); when(this.portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(this.urlNodeSyntaxHelper.getLayoutNodeForFolderNames(request, Arrays.asList("n2"))) .thenReturn("n2"); when(this.urlNodeSyntaxHelper.getPortletForFolderName(request, "n2", "fname.s3")) .thenReturn(portletWindowId1); when(this.portletWindowRegistry.getPortletWindowId(request, "pw2")) .thenReturn(portletWindowId2); when(this.portletWindowRegistry.getPortletWindowId(request, "pw1")) .thenReturn(portletWindowId1); final IPortalRequestInfo portalRequestInfo = this.urlSyntaxProvider.getPortalRequestInfo(request); assertNotNull(portalRequestInfo); assertEquals("n2", portalRequestInfo.getTargetedLayoutNodeId()); assertEquals(portletWindowId1, portalRequestInfo.getTargetedPortletWindowId()); assertEquals(UrlState.NORMAL, portalRequestInfo.getUrlState()); assertEquals(UrlType.RENDER, portalRequestInfo.getUrlType()); final Map<IPortletWindowId, ? extends IPortletRequestInfo> portletRequestInfoMap = portalRequestInfo.getPortletRequestInfoMap(); assertNotNull(portletRequestInfoMap); assertEquals(2, portletRequestInfoMap.size()); final IPortletRequestInfo portletRequestInfo = portletRequestInfoMap.get(portletWindowId1); assertNotNull(portletRequestInfo); assertEquals(portletWindowId1, portletRequestInfo.getPortletWindowId()); assertEquals( ImmutableMap.of("action", Arrays.asList("dashboard")), portletRequestInfo.getPortletParameters()); assertEquals(WindowState.MINIMIZED, portletRequestInfo.getWindowState()); assertNull(portletRequestInfo.getPortletMode()); assertNull(portletRequestInfo.getDelegateParentWindowId()); final IPortletRequestInfo portletRequestInfo2 = portletRequestInfoMap.get(portletWindowId2); assertNotNull(portletRequestInfo2); assertEquals(portletWindowId2, portletRequestInfo2.getPortletWindowId()); assertEquals( ImmutableMap.of( "a", Arrays.asList("b"), "b", Arrays.asList("c"), "postedParameter", Arrays.asList("foobar")), portletRequestInfo2.getPortletParameters()); assertNull(portletRequestInfo2.getWindowState()); assertEquals(PortletMode.HELP, portletRequestInfo2.getPortletMode()); assertEquals(portletWindowId1, portletRequestInfo2.getDelegateParentWindowId()); } @Test public void testSingleFolderPortletDelegationFnameSubscribeIdMinimizedRenderUrlParsingTwo() throws Exception { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); request.setRequestURI("/p/portlet-admin.ctf3/max/action.uP"); request.setQueryString( "?pCa=71_dlg-44-ctf3-8_8&pCd_71_dlg-44-ctf3-8_8=44_ctf3_8&pP_71_dlg-44-ctf3-8_8_action=updateKey&pP_execution=e4s4&pP__eventId=configModeAction"); request.addParameter("pCa", "71_dlg-44-ctf3-8_8"); request.addParameter("pCd_71_dlg-44-ctf3-8_8", "44_ctf3_8"); request.addParameter("pP_71_dlg-44-ctf3-8_8_action", "updateKey"); request.addParameter("pP_execution", "e4s4"); request.addParameter("pP__eventId", "configModeAction"); request.addParameter("googleApiKey", "12345"); final MockPortletWindowId portletWindowId1 = new MockPortletWindowId("44_ctf3_8"); final MockPortletWindowId portletWindowId2 = new MockPortletWindowId("71_dlg-44-ctf3-8_8"); when(this.portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(this.urlNodeSyntaxHelper.getPortletForFolderName(request, null, "portlet-admin.ctf3")) .thenReturn(portletWindowId1); when(this.portletWindowRegistry.getPortletWindowId(request, "71_dlg-44-ctf3-8_8")) .thenReturn(portletWindowId2); when(this.portletWindowRegistry.getPortletWindowId(request, "44_ctf3_8")) .thenReturn(portletWindowId1); final IPortalRequestInfo portalRequestInfo = this.urlSyntaxProvider.getPortalRequestInfo(request); assertNotNull(portalRequestInfo); assertNull(portalRequestInfo.getTargetedLayoutNodeId()); assertEquals(portletWindowId1, portalRequestInfo.getTargetedPortletWindowId()); assertEquals(UrlState.MAX, portalRequestInfo.getUrlState()); assertEquals(UrlType.ACTION, portalRequestInfo.getUrlType()); final Map<IPortletWindowId, ? extends IPortletRequestInfo> portletRequestInfoMap = portalRequestInfo.getPortletRequestInfoMap(); assertNotNull(portletRequestInfoMap); assertEquals(2, portletRequestInfoMap.size()); final IPortletRequestInfo portletRequestInfo = portletRequestInfoMap.get(portletWindowId1); assertNotNull(portletRequestInfo); assertEquals(portletWindowId1, portletRequestInfo.getPortletWindowId()); assertEquals( ImmutableMap.of( "execution", Arrays.asList("e4s4"), "_eventId", Arrays.asList("configModeAction")), portletRequestInfo.getPortletParameters()); assertEquals(WindowState.MAXIMIZED, portletRequestInfo.getWindowState()); assertNull(portletRequestInfo.getPortletMode()); assertNull(portletRequestInfo.getDelegateParentWindowId()); final IPortletRequestInfo portletRequestInfo2 = portletRequestInfoMap.get(portletWindowId2); assertNotNull(portletRequestInfo2); assertEquals(portletWindowId2, portletRequestInfo2.getPortletWindowId()); assertEquals( ImmutableMap.of( "action", Arrays.asList("updateKey"), "googleApiKey", Arrays.asList("12345")), portletRequestInfo2.getPortletParameters()); assertNull(portletRequestInfo2.getWindowState()); assertNull(portletRequestInfo2.getPortletMode()); assertEquals(portletWindowId1, portletRequestInfo2.getDelegateParentWindowId()); } @Test public void testSingleFolderPortletDelegationFnameSubscribeIdPostUrlParsing() throws Exception { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); request.setRequestURI("/p/portlet-admin.ctf3/max/resource.uP"); request.setQueryString( "?pCa=30_dlg-16-ctf3-5_5&pCd_30_dlg-16-ctf3-5_5=16_ctf3_5&pCr_30_dlg-16-ctf3-5_5=preview&pP_execution=e2s3&pP__eventId=configModeAction"); request.addParameter("pCa", "30_dlg-16-ctf3-5_5"); request.addParameter("pCd_30_dlg-16-ctf3-5_5", "16_ctf3_5"); request.addParameter("pCr_30_dlg-16-ctf3-5_5", "preview"); request.addParameter("pP_execution", "e2s3"); request.addParameter("pP__eventId", "configModeAction"); request.addParameter("content", "<div>some content</div>"); //not on URL, was posted final MockPortletWindowId portletWindowId1 = new MockPortletWindowId("16_ctf3_5"); final MockPortletWindowId portletWindowId2 = new MockPortletWindowId("30_dlg-16-ctf3-5_5"); when(this.portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(this.urlNodeSyntaxHelper.getPortletForFolderName(request, null, "portlet-admin.ctf3")) .thenReturn(portletWindowId1); when(this.portletWindowRegistry.getPortletWindowId(request, "30_dlg-16-ctf3-5_5")) .thenReturn(portletWindowId2); when(this.portletWindowRegistry.getPortletWindowId(request, "16_ctf3_5")) .thenReturn(portletWindowId1); final IPortalRequestInfo portalRequestInfo = this.urlSyntaxProvider.getPortalRequestInfo(request); assertNotNull(portalRequestInfo); assertNull(portalRequestInfo.getTargetedLayoutNodeId()); assertEquals(portletWindowId1, portalRequestInfo.getTargetedPortletWindowId()); assertEquals(UrlState.MAX, portalRequestInfo.getUrlState()); assertEquals(UrlType.RESOURCE, portalRequestInfo.getUrlType()); final Map<IPortletWindowId, ? extends IPortletRequestInfo> portletRequestInfoMap = portalRequestInfo.getPortletRequestInfoMap(); assertNotNull(portletRequestInfoMap); assertEquals(2, portletRequestInfoMap.size()); final IPortletRequestInfo portletRequestInfo = portletRequestInfoMap.get(portletWindowId1); assertNotNull(portletRequestInfo); assertEquals(portletWindowId1, portletRequestInfo.getPortletWindowId()); assertEquals( ImmutableMap.of( "execution", Arrays.asList("e2s3"), "_eventId", Arrays.asList("configModeAction")), portletRequestInfo.getPortletParameters()); assertNull(portletRequestInfo.getDelegateParentWindowId()); final IPortletRequestInfo portletRequestInfo2 = portletRequestInfoMap.get(portletWindowId2); assertNotNull(portletRequestInfo2); assertEquals(portletWindowId2, portletRequestInfo2.getPortletWindowId()); assertEquals( ImmutableMap.of("content", Arrays.asList("<div>some content</div>")), portletRequestInfo2.getPortletParameters()); assertEquals(portletWindowId1, portletRequestInfo2.getDelegateParentWindowId()); } @Test public void testDetachedResourceUrlGeneration() throws Exception { final String layoutNodeId = "u12l1s5"; final String subscribeId = "u12l1n7"; final String fname = "news"; final String resourceId = "calendar.2012-06-01.7"; final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); final MockPortletWindowId portletWindowId1 = new MockPortletWindowId("pw1"); when(portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(urlNodeSyntaxHelper.getFolderNamesForLayoutNode(request, subscribeId)) .thenReturn(Arrays.asList(layoutNodeId)); when(urlNodeSyntaxHelper.getFolderNameForPortlet(request, portletWindowId1)) .thenReturn(fname + "." + subscribeId); when(portletWindowRegistry.getPortletWindow(request, portletWindowId1)) .thenReturn(portletWindow1); when(portletWindow1.getPortletEntity()).thenReturn(portletEntity1); when(portletWindow1.getWindowState()).thenReturn(IPortletRenderer.DETACHED); when(portletEntity1.getLayoutNodeId()).thenReturn(subscribeId); final PortalUrlBuilder portalUrlBuilder = new PortalUrlBuilder( urlSyntaxProvider, request, layoutNodeId, portletWindowId1, UrlType.RESOURCE); final IPortletUrlBuilder portletUrlBuilder1 = portalUrlBuilder.getPortletUrlBuilder(portletWindowId1); portletUrlBuilder1.setResourceId(resourceId); portletUrlBuilder1.setCacheability(ResourceURL.PAGE); final String url = portalUrlBuilder.getUrlString(); assertEquals( "/uPortal/f/u12l1s5/p/news.u12l1n7/detached/calendar.2012-06-01.7.resource.uP?pCc=cacheLevelPage", url); } @Test public void testLegacyDetachedResourceUrlParsing() throws Exception { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); request.setRequestURI("/f/u12l1s5/p/news.u12l1n7/detached/resource.uP"); request.setQueryString("?pCc=cacheLevelPage&pCr=calendar.2012-06-01.7"); request.addParameter("pCc", "cacheLevelPage"); request.addParameter("pCr", "calendar.2012-06-01.7"); final MockPortletWindowId portletWindowId = new MockPortletWindowId("s3"); final MockPortletWindowId detachedPortletWindowId = new MockPortletWindowId("d3"); when(this.portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(this.urlNodeSyntaxHelper.getLayoutNodeForFolderNames( request, Arrays.asList("u12l1s5"))) .thenReturn("u12l1s5"); when(this.urlNodeSyntaxHelper.getPortletForFolderName(request, "u12l1s5", "news.u12l1n7")) .thenReturn(portletWindowId); when(this.portletWindowRegistry.getOrCreateStatelessPortletWindow(request, portletWindowId)) .thenReturn(portletWindow1); when(portletWindow1.getPortletWindowId()).thenReturn(detachedPortletWindowId); final IPortalRequestInfo portalRequestInfo = this.urlSyntaxProvider.getPortalRequestInfo(request); assertNotNull(portalRequestInfo); assertEquals("u12l1s5", portalRequestInfo.getTargetedLayoutNodeId()); assertEquals(detachedPortletWindowId, portalRequestInfo.getTargetedPortletWindowId()); assertEquals(UrlState.DETACHED, portalRequestInfo.getUrlState()); assertEquals(UrlType.RESOURCE, portalRequestInfo.getUrlType()); final Map<IPortletWindowId, ? extends IPortletRequestInfo> portletRequestInfoMap = portalRequestInfo.getPortletRequestInfoMap(); assertNotNull(portletRequestInfoMap); assertEquals(1, portletRequestInfoMap.size()); final IPortletRequestInfo portletRequestInfo = portletRequestInfoMap.get(detachedPortletWindowId); assertNotNull(portletRequestInfo); assertEquals(detachedPortletWindowId, portletRequestInfo.getPortletWindowId()); assertEquals(Collections.EMPTY_MAP, portletRequestInfo.getPortletParameters()); assertEquals(IPortletRenderer.DETACHED, portletRequestInfo.getWindowState()); assertNull(portletRequestInfo.getPortletMode()); assertEquals(ResourceURL.PAGE, portletRequestInfo.getCacheability()); assertEquals("calendar.2012-06-01.7", portletRequestInfo.getResourceId()); final PortalUrlBuilder portalUrlBuilder = new PortalUrlBuilder( urlSyntaxProvider, request, "u12l1s5", detachedPortletWindowId, UrlType.RESOURCE); when(this.portalUrlProvider.getPortalUrlBuilderByPortletWindow( request, detachedPortletWindowId, UrlType.RESOURCE)) .thenReturn(portalUrlBuilder); when(this.portletWindowRegistry.getPortletWindow(request, detachedPortletWindowId)) .thenReturn(portletWindow2); when(portletWindow2.getPortletEntity()).thenReturn(portletEntity1); when(portletEntity1.getLayoutNodeId()).thenReturn("u12l1s5"); when(urlNodeSyntaxHelper.getFolderNameForPortlet(request, detachedPortletWindowId)) .thenReturn("news.u12l1n7"); when(urlNodeSyntaxHelper.getFolderNamesForLayoutNode(request, "u12l1s5")) .thenReturn(Collections.singletonList("u12l1s5")); final String canonicalUrl = this.urlSyntaxProvider.getCanonicalUrl(request); assertEquals( "/uPortal/f/u12l1s5/p/news.u12l1n7/detached/calendar.2012-06-01.7.resource.uP?pCc=cacheLevelPage", canonicalUrl); } @Test public void testDetachedResourceUrlParsing() throws Exception { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); request.setRequestURI( "/f/u12l1s5/p/news.u12l1n7/detached/calendar.2012-06-01.7.resource.uP"); request.setQueryString("?pCc=cacheLevelPage"); request.addParameter("pCc", "cacheLevelPage"); final MockPortletWindowId portletWindowId = new MockPortletWindowId("s3"); final MockPortletWindowId detachedPortletWindowId = new MockPortletWindowId("d3"); when(this.portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(urlNodeSyntaxHelperRegistry.getCurrentUrlNodeSyntaxHelper(request)) .thenReturn(urlNodeSyntaxHelper); when(this.urlNodeSyntaxHelper.getLayoutNodeForFolderNames( request, Arrays.asList("u12l1s5"))) .thenReturn("u12l1s5"); when(this.urlNodeSyntaxHelper.getPortletForFolderName(request, "u12l1s5", "news.u12l1n7")) .thenReturn(portletWindowId); when(this.portletWindowRegistry.getOrCreateStatelessPortletWindow(request, portletWindowId)) .thenReturn(portletWindow1); when(portletWindow1.getPortletWindowId()).thenReturn(detachedPortletWindowId); final IPortalRequestInfo portalRequestInfo = this.urlSyntaxProvider.getPortalRequestInfo(request); assertNotNull(portalRequestInfo); assertEquals("u12l1s5", portalRequestInfo.getTargetedLayoutNodeId()); assertEquals(detachedPortletWindowId, portalRequestInfo.getTargetedPortletWindowId()); assertEquals(UrlState.DETACHED, portalRequestInfo.getUrlState()); assertEquals(UrlType.RESOURCE, portalRequestInfo.getUrlType()); final Map<IPortletWindowId, ? extends IPortletRequestInfo> portletRequestInfoMap = portalRequestInfo.getPortletRequestInfoMap(); assertNotNull(portletRequestInfoMap); assertEquals(1, portletRequestInfoMap.size()); final IPortletRequestInfo portletRequestInfo = portletRequestInfoMap.get(detachedPortletWindowId); assertNotNull(portletRequestInfo); assertEquals(detachedPortletWindowId, portletRequestInfo.getPortletWindowId()); assertEquals(Collections.EMPTY_MAP, portletRequestInfo.getPortletParameters()); assertEquals(IPortletRenderer.DETACHED, portletRequestInfo.getWindowState()); assertNull(portletRequestInfo.getPortletMode()); assertEquals(ResourceURL.PAGE, portletRequestInfo.getCacheability()); assertEquals("calendar.2012-06-01.7", portletRequestInfo.getResourceId()); final PortalUrlBuilder portalUrlBuilder = new PortalUrlBuilder( urlSyntaxProvider, request, "u12l1s5", detachedPortletWindowId, UrlType.RESOURCE); when(this.portalUrlProvider.getPortalUrlBuilderByPortletWindow( request, detachedPortletWindowId, UrlType.RESOURCE)) .thenReturn(portalUrlBuilder); when(this.portletWindowRegistry.getPortletWindow(request, detachedPortletWindowId)) .thenReturn(portletWindow2); when(portletWindow2.getPortletEntity()).thenReturn(portletEntity1); when(portletEntity1.getLayoutNodeId()).thenReturn("u12l1s5"); when(urlNodeSyntaxHelper.getFolderNameForPortlet(request, detachedPortletWindowId)) .thenReturn("news.u12l1n7"); when(urlNodeSyntaxHelper.getFolderNamesForLayoutNode(request, "u12l1s5")) .thenReturn(Collections.singletonList("u12l1s5")); final String canonicalUrl = this.urlSyntaxProvider.getCanonicalUrl(request); assertEquals( "/uPortal/f/u12l1s5/p/news.u12l1n7/detached/calendar.2012-06-01.7.resource.uP?pCc=cacheLevelPage", canonicalUrl); } @Test public void testParsePortletWindowIdSuffix() { final MockHttpServletRequest request = new MockHttpServletRequest(); final Set<String> ids = ImmutableSet.of("pw2"); final MockPortletWindowId expectedPortletWindowId = new MockPortletWindowId("pw2"); when(this.portletWindowRegistry.getPortletWindowId(request, "pw2")) .thenReturn(expectedPortletWindowId); IPortletWindowId portletWindowId = this.urlSyntaxProvider.parsePortletWindowIdSuffix( request, UrlSyntaxProviderImpl.PARAM_WINDOW_STATE, ids, UrlSyntaxProviderImpl.PARAM_WINDOW_STATE + UrlSyntaxProviderImpl.SEPARATOR + "pw2"); assertEquals(expectedPortletWindowId, portletWindowId); portletWindowId = this.urlSyntaxProvider.parsePortletWindowIdSuffix( request, UrlSyntaxProviderImpl.PARAM_WINDOW_STATE, ids, UrlSyntaxProviderImpl.PARAM_WINDOW_STATE + UrlSyntaxProviderImpl.SEPARATOR + UrlSyntaxProviderImpl.SEPARATOR + "pw2"); assertNull(portletWindowId); portletWindowId = this.urlSyntaxProvider.parsePortletWindowIdSuffix( request, UrlSyntaxProviderImpl.PARAM_WINDOW_STATE, ids, UrlSyntaxProviderImpl.PARAM_WINDOW_STATE); assertNull(portletWindowId); } @Test public void testParsePortletParameterName() { final MockHttpServletRequest request = new MockHttpServletRequest(); final Set<String> ids = ImmutableSet.of("pw2"); final MockPortletWindowId expectedPortletWindowId = new MockPortletWindowId("pw2"); when(this.portletWindowRegistry.getPortletWindowId(request, "pw2")) .thenReturn(expectedPortletWindowId); Tuple<String, IPortletWindowId> portletParameterInfo = this.urlSyntaxProvider.parsePortletParameterName( request, UrlSyntaxProviderImpl.PORTLET_PARAM_PREFIX + "pw2" + UrlSyntaxProviderImpl.SEPARATOR + "foo", ids); assertNotNull(portletParameterInfo); assertEquals("foo", portletParameterInfo.first); assertEquals(expectedPortletWindowId, portletParameterInfo.second); portletParameterInfo = this.urlSyntaxProvider.parsePortletParameterName( request, UrlSyntaxProviderImpl.PORTLET_PARAM_PREFIX + UrlSyntaxProviderImpl.SEPARATOR + "foo", ids); assertNotNull(portletParameterInfo); assertEquals("_foo", portletParameterInfo.first); assertNull(portletParameterInfo.second); portletParameterInfo = this.urlSyntaxProvider.parsePortletParameterName( request, UrlSyntaxProviderImpl.PORTLET_PARAM_PREFIX + "pw1" + UrlSyntaxProviderImpl.SEPARATOR + "foo", ids); assertNotNull(portletParameterInfo); assertEquals("pw1_foo", portletParameterInfo.first); assertNull(portletParameterInfo.second); } @Test public void testLegacyPortletUrlParsing() throws Exception { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); request.setRequestURI("/render.userLayoutRootNode.uP"); request.setQueryString( "?uP_fname=CourseGuide-Browse-Courses&pltc_type=ACTION&pltc_state=detached&pltc_mode=view&pltp_action=advancedSearch&pltp_subjectChoice=512"); request.addParameter("uP_fname", "CourseGuide-Browse-Courses"); request.addParameter("pltc_type", "ACTION"); request.addParameter("pltc_state", "detached"); request.addParameter("pltc_mode", "view"); request.addParameter("pltp_action", "advancedSearch"); request.addParameter("pltp_subjectChoice", "512"); final MockPortletWindowId portletWindowId1 = new MockPortletWindowId("16_ctf3_5"); when(this.portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(this.portletWindowRegistry.getOrCreateDefaultPortletWindowByFname( request, "CourseGuide-Browse-Courses")) .thenReturn(this.portletWindow1); when(this.portletWindow1.getPortletWindowId()).thenReturn(portletWindowId1); final IPortalRequestInfo portalRequestInfo = this.urlSyntaxProvider.getPortalRequestInfo(request); assertNotNull(portalRequestInfo); assertNull(portalRequestInfo.getTargetedLayoutNodeId()); assertEquals(portletWindowId1, portalRequestInfo.getTargetedPortletWindowId()); assertEquals(UrlState.DETACHED, portalRequestInfo.getUrlState()); assertEquals(UrlType.ACTION, portalRequestInfo.getUrlType()); final Map<IPortletWindowId, ? extends IPortletRequestInfo> portletRequestInfoMap = portalRequestInfo.getPortletRequestInfoMap(); assertNotNull(portletRequestInfoMap); assertEquals(1, portletRequestInfoMap.size()); final IPortletRequestInfo portletRequestInfo = portletRequestInfoMap.get(portletWindowId1); assertNotNull(portletRequestInfo); assertEquals(portletWindowId1, portletRequestInfo.getPortletWindowId()); assertEquals( ImmutableMap.of( "action", Arrays.asList("advancedSearch"), "subjectChoice", Arrays.asList("512")), portletRequestInfo.getPortletParameters()); assertEquals(IPortletRenderer.DETACHED, portletRequestInfo.getWindowState()); assertEquals(PortletMode.VIEW, portletRequestInfo.getPortletMode()); assertNull(portletRequestInfo.getDelegateParentWindowId()); } @Test public void testLegacyPortletUrlParsingNoParams() throws Exception { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/portal"); request.setRequestURI("/render.userLayoutRootNode.uP"); request.setQueryString("?uP_fname=contact-information"); request.addParameter("uP_fname", "contact-information"); final MockPortletWindowId portletWindowId1 = new MockPortletWindowId("u110l1n41"); when(this.portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(this.portletWindowRegistry.getOrCreateDefaultPortletWindowByFname( request, "contact-information")) .thenReturn(this.portletWindow1); when(this.portletWindow1.getPortletWindowId()).thenReturn(portletWindowId1); final IPortalRequestInfo portalRequestInfo = this.urlSyntaxProvider.getPortalRequestInfo(request); assertNotNull(portalRequestInfo); assertNull(portalRequestInfo.getTargetedLayoutNodeId()); assertEquals(portletWindowId1, portalRequestInfo.getTargetedPortletWindowId()); assertEquals(UrlState.MAX, portalRequestInfo.getUrlState()); assertEquals(UrlType.RENDER, portalRequestInfo.getUrlType()); final Map<IPortletWindowId, ? extends IPortletRequestInfo> portletRequestInfoMap = portalRequestInfo.getPortletRequestInfoMap(); assertNotNull(portletRequestInfoMap); assertEquals(1, portletRequestInfoMap.size()); final IPortletRequestInfo portletRequestInfo = portletRequestInfoMap.get(portletWindowId1); assertNotNull(portletRequestInfo); assertEquals(portletWindowId1, portletRequestInfo.getPortletWindowId()); assertEquals(Collections.emptyMap(), portletRequestInfo.getPortletParameters()); assertEquals(WindowState.MAXIMIZED, portletRequestInfo.getWindowState()); assertNull(portletRequestInfo.getDelegateParentWindowId()); } @Test public void testLegacyTargetedTabParsing() throws Exception { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/uPortal"); request.setRequestURI("/render.userLayoutRootNode.uP"); request.setQueryString("?root=uP_root&uP_sparam=activeTab&activeTab=1"); request.addParameter("root", "uP_root"); request.addParameter("uP_sparam", "activeTab"); request.addParameter("activeTab", "1"); when(this.portalRequestUtils.getOriginalPortalRequest(request)).thenReturn(request); when(this.xpathOperations.doWithExpression( Mockito.eq( "/layout/folder/folder[@type='regular' and @hidden='false'][position() = $activeTabId]/@ID"), Mockito.eq(Collections.singletonMap("activeTabId", "1")), Mockito.<Function>anyObject())) .thenReturn("n12"); when(this.userInstanceManager.getUserInstance(request)).thenReturn(userInstance); when(userInstance.getPreferencesManager()).thenReturn(userPreferencesManager); when(userPreferencesManager.getUserLayoutManager()).thenReturn(userLayoutManager); when(userLayoutManager.getUserLayout()).thenReturn(userLayout); final IPortalRequestInfo portalRequestInfo = this.urlSyntaxProvider.getPortalRequestInfo(request); assertNotNull(portalRequestInfo); assertEquals("n12", portalRequestInfo.getTargetedLayoutNodeId()); assertNull(portalRequestInfo.getTargetedPortletWindowId()); assertEquals(UrlState.NORMAL, portalRequestInfo.getUrlState()); assertEquals(UrlType.RENDER, portalRequestInfo.getUrlType()); final Map<IPortletWindowId, ? extends IPortletRequestInfo> portletRequestInfoMap = portalRequestInfo.getPortletRequestInfoMap(); assertNotNull(portletRequestInfoMap); assertEquals(0, portletRequestInfoMap.size()); } @Test public void testDoesRequestPathReferToSpecificAndDifferentContentVsCanonicalPathSameUrl() { assertFalse( "identical paths should be equal", this.urlSyntaxProvider .doesRequestPathReferToSpecificAndDifferentContentVsCanonicalPath( "/uPortal/f/welcome/p/uportal-links.u32l1n12/max/render.uP", "/uPortal/f/welcome/p/uportal-links.u32l1n12/max/render.uP")); } @Test public void testDoesRequestPathReferToSpecificAndDifferentContentVsCanonicalPathSamePrimaryUrl() { assertFalse( "functionally identical paths should be equal", this.urlSyntaxProvider .doesRequestPathReferToSpecificAndDifferentContentVsCanonicalPath( "/uPortal/f/welcome/p/uportal-links/max", "/uPortal/f/welcome/p/uportal-links.u32l1n12/max/render.uP")); } @Test public void testDoesRequestPathReferToSpecificAndDifferentContentVsCanonicalPathSamePortletNoFolder() { assertFalse( "path without folder specified should be equal", this.urlSyntaxProvider .doesRequestPathReferToSpecificAndDifferentContentVsCanonicalPath( "/uPortal/p/uportal-links/max", "/uPortal/f/welcome/p/uportal-links.u32l1n12/max/render.uP")); } @Test public void testDoesRequestPathReferToSpecificAndDifferentContentVsCanonicalPathDifferentFolder() { assertTrue( "path with different folder should not be equal", this.urlSyntaxProvider .doesRequestPathReferToSpecificAndDifferentContentVsCanonicalPath( "/uPortal/f/other/p/uportal-links/max", "/uPortal/f/welcome/p/uportal-links.u32l1n12/max/render.uP")); } // Verifies ignores the state and url type. Assumption is canonical path would have been properly derived // from 1st path string so don't need to concern ourselves with the defaulting mechanism being correct in // this test method. @Test public void testDoesRequestPathReferToSpecificAndDifferentContentVsCanonicalPathNoStateOrType() { assertFalse( "functionally identical paths no state (matching defaults) should be equal", this.urlSyntaxProvider .doesRequestPathReferToSpecificAndDifferentContentVsCanonicalPath( "/uPortal/f/welcome/p/uportal-links", "/uPortal/f/welcome/p/uportal-links.u32l1n12/max/render.uP")); } @Test public void testDoesRequestPathReferToSpecificAndDifferentContentVsCanonicalPathDifferentFolderAndPortlet() { assertTrue( "path with different folder and portlet should not be equal", this.urlSyntaxProvider .doesRequestPathReferToSpecificAndDifferentContentVsCanonicalPath( "/uPortal/f/other/p/other/max", "/uPortal/f/welcome/p/uportal-links.u32l1n12/max/render.uP")); } @Test public void testDoesRequestPathReferToSpecificAndDifferentContentVsCanonicalPathDifferentPortlet() { assertTrue( "path with different portlet should not be equal", this.urlSyntaxProvider .doesRequestPathReferToSpecificAndDifferentContentVsCanonicalPath( "/uPortal/f/welcome/p/other/max", "/uPortal/f/welcome/p/uportal-links.u32l1n12/max/render.uP")); } }