/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.osgi.web.servlet.context.helper.definition; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.osgi.web.servlet.context.helper.internal.definition.WebXMLDefinitionLoader; import com.liferay.portal.osgi.web.servlet.context.helper.internal.order.OrderImpl; import com.liferay.portal.osgi.web.servlet.context.helper.internal.order.OrderUtil; import com.liferay.portal.osgi.web.servlet.context.helper.order.Order; import com.liferay.portal.osgi.web.servlet.context.helper.order.OrderBeforeAndAfterException; import com.liferay.portal.osgi.web.servlet.context.helper.order.OrderCircularDependencyException; import java.net.URL; import java.util.ArrayList; import java.util.EnumMap; import java.util.EventListener; import java.util.List; import java.util.Map; import javax.servlet.Servlet; import javax.servlet.ServletContextListener; import javax.xml.parsers.SAXParserFactory; import org.apache.felix.utils.log.Logger; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.osgi.framework.Bundle; import org.powermock.modules.junit4.PowerMockRunner; /** * @author Miguel Pastor */ @RunWith(PowerMockRunner.class) public class WebXMLDefinitionLoaderTest { @Test public void testLoadCustomWebAbsoluteOrdering1XML() throws Exception { WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web-absolute-ordering-1.xml"); List<String> absoluteOrderingNames = new ArrayList<>(); absoluteOrderingNames.add("fragment2"); absoluteOrderingNames.add("fragment1"); absoluteOrderingNames.add(Order.OTHERS); testWebXMLDefinition( webXMLDefinition, 1, 1, 1, null, null, absoluteOrderingNames); } @Test public void testLoadCustomWebAbsoluteOrdering1XMLMetadataIncomplete() throws Exception { WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web-absolute-ordering-1.xml"); Assert.assertFalse(webXMLDefinition.isMetadataComplete()); } @Test public void testLoadCustomWebFragment1XML() throws Exception { WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web-fragment-1.xml"); testWebXMLDefinition( webXMLDefinition, 1, 1, 0, "fragment1", null, null); } @Test public void testLoadCustomWebFragment2XML() throws Exception { WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web-fragment-2.xml"); Order order = new OrderImpl(); EnumMap<Order.Path, String[]> routes = order.getRoutes(); routes.put(Order.Path.AFTER, new String[] {"fragment1"}); testWebXMLDefinition( webXMLDefinition, 0, 0, 0, "fragment2", order, null); } @Test public void testLoadCustomWebFragment4XML() throws Exception { WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web-fragment-4.xml"); Order order = new OrderImpl(); EnumMap<Order.Path, String[]> routes = order.getRoutes(); routes.put(Order.Path.BEFORE, new String[] {Order.OTHERS}); testWebXMLDefinition( webXMLDefinition, 0, 0, 0, "fragment4", order, null); } @Test public void testLoadCustomWebXML() throws Exception { WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web.xml"); testWebXMLDefinition(webXMLDefinition, 1, 1, 1); } @Test public void testLoadCustomWebXMLMetadataComplete() throws Exception { WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web.xml"); Assert.assertTrue(webXMLDefinition.isMetadataComplete()); } @Test public void testLoadWebXML() throws Exception { Bundle bundle = new MockBundle(); WebXMLDefinitionLoader webXMLDefinitionLoader = new WebXMLDefinitionLoader( bundle, SAXParserFactory.newInstance(), new Logger(null)); WebXMLDefinition webXMLDefinition = webXMLDefinitionLoader.loadWebXMLDefinition( bundle.getEntry("WEB-INF/web.xml")); testWebXMLDefinition(webXMLDefinition, 0, 0, 0); } @Test public void testOrderBeforeAndAfterException() throws Exception { List<WebXMLDefinition> webXMLDefinitions = new ArrayList<>(); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-5.xml")); WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web.xml"); boolean threwOrderBeforeAndAfterException = false; try { OrderUtil.getOrderedWebXMLDefinitions( webXMLDefinitions, webXMLDefinition.getAbsoluteOrderingNames()); } catch (Exception e) { if (e instanceof OrderBeforeAndAfterException) { threwOrderBeforeAndAfterException = true; } } Assert.assertTrue(threwOrderBeforeAndAfterException); } @Test public void testOrderCircularDependencyException() throws Exception { List<WebXMLDefinition> webXMLDefinitions = new ArrayList<>(); webXMLDefinitions.add( loadWebXMLDefinition( "dependencies/custom-web-fragment-circular-1.xml")); webXMLDefinitions.add( loadWebXMLDefinition( "dependencies/custom-web-fragment-circular-2.xml")); WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web.xml"); boolean threwOrderCircularDependencyException = false; try { OrderUtil.getOrderedWebXMLDefinitions( webXMLDefinitions, webXMLDefinition.getAbsoluteOrderingNames()); } catch (Exception e) { if (e instanceof OrderCircularDependencyException) { threwOrderCircularDependencyException = true; } } Assert.assertTrue(threwOrderCircularDependencyException); } @Test public void testOrderCustomWebFragments1() throws Exception { List<WebXMLDefinition> webXMLDefinitions = new ArrayList<>(); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-3.xml")); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-1.xml")); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-2.xml")); WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web-absolute-ordering-1.xml"); List<WebXMLDefinition> orderedWebXMLDefinitions = OrderUtil.getOrderedWebXMLDefinitions( webXMLDefinitions, webXMLDefinition.getAbsoluteOrderingNames()); Assert.assertEquals( orderedWebXMLDefinitions.toString(), 3, orderedWebXMLDefinitions.size()); WebXMLDefinition firstWebXMLDefinition = orderedWebXMLDefinitions.get( 0); Assert.assertEquals( "fragment2", firstWebXMLDefinition.getFragmentName()); WebXMLDefinition secondWebXMLDefinition = orderedWebXMLDefinitions.get( 1); Assert.assertEquals( "fragment1", secondWebXMLDefinition.getFragmentName()); WebXMLDefinition thirdWebXMLDefinition = orderedWebXMLDefinitions.get( 2); Assert.assertEquals( "fragment3", thirdWebXMLDefinition.getFragmentName()); } @Test public void testOrderCustomWebFragments2() throws Exception { List<WebXMLDefinition> webXMLDefinitions = new ArrayList<>(); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-3.xml")); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-2.xml")); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-1.xml")); WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web-absolute-ordering-2.xml"); List<WebXMLDefinition> orderedWebXMLDefinitions = OrderUtil.getOrderedWebXMLDefinitions( webXMLDefinitions, webXMLDefinition.getAbsoluteOrderingNames()); Assert.assertEquals( orderedWebXMLDefinitions.toString(), 2, orderedWebXMLDefinitions.size()); WebXMLDefinition firstWebXMLDefinition = orderedWebXMLDefinitions.get( 0); Assert.assertEquals( "fragment1", firstWebXMLDefinition.getFragmentName()); WebXMLDefinition secondWebXMLDefinition = orderedWebXMLDefinitions.get( 1); Assert.assertEquals( "fragment2", secondWebXMLDefinition.getFragmentName()); } @Test public void testOrderCustomWebFragments3() throws Exception { List<WebXMLDefinition> webXMLDefinitions = new ArrayList<>(); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-3.xml")); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-2.xml")); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-1.xml")); WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web.xml"); List<WebXMLDefinition> orderedWebXMLDefinitions = OrderUtil.getOrderedWebXMLDefinitions( webXMLDefinitions, webXMLDefinition.getAbsoluteOrderingNames()); Assert.assertEquals( orderedWebXMLDefinitions.toString(), 3, orderedWebXMLDefinitions.size()); WebXMLDefinition firstWebXMLDefinition = orderedWebXMLDefinitions.get( 0); Assert.assertEquals( "fragment1", firstWebXMLDefinition.getFragmentName()); WebXMLDefinition secondWebXMLDefinition = orderedWebXMLDefinitions.get( 1); Assert.assertEquals( "fragment3", secondWebXMLDefinition.getFragmentName()); WebXMLDefinition thirdWebXMLDefinition = orderedWebXMLDefinitions.get( 2); Assert.assertEquals( "fragment2", thirdWebXMLDefinition.getFragmentName()); } @Test public void testOrderCustomWebFragments4() throws Exception { List<WebXMLDefinition> webXMLDefinitions = new ArrayList<>(); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-2.xml")); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-1.xml")); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-4.xml")); WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web.xml"); List<WebXMLDefinition> orderedWebXMLDefinitions = OrderUtil.getOrderedWebXMLDefinitions( webXMLDefinitions, webXMLDefinition.getAbsoluteOrderingNames()); Assert.assertEquals( orderedWebXMLDefinitions.toString(), 3, orderedWebXMLDefinitions.size()); WebXMLDefinition firstWebXMLDefinition = orderedWebXMLDefinitions.get( 0); Assert.assertEquals( "fragment4", firstWebXMLDefinition.getFragmentName()); WebXMLDefinition secondWebXMLDefinition = orderedWebXMLDefinitions.get( 1); Assert.assertEquals( "fragment1", secondWebXMLDefinition.getFragmentName()); WebXMLDefinition thirdWebXMLDefinition = orderedWebXMLDefinitions.get( 2); Assert.assertEquals( "fragment2", thirdWebXMLDefinition.getFragmentName()); } @Test public void testUnorderedWebFragments() throws Exception { List<WebXMLDefinition> webXMLDefinitions = new ArrayList<>(); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-1.xml")); webXMLDefinitions.add( loadWebXMLDefinition("dependencies/custom-web-fragment-3.xml")); WebXMLDefinition webXMLDefinition = loadWebXMLDefinition( "dependencies/custom-web.xml"); List<WebXMLDefinition> orderedWebXMLDefinitions = OrderUtil.getOrderedWebXMLDefinitions( webXMLDefinitions, webXMLDefinition.getAbsoluteOrderingNames()); Assert.assertEquals( orderedWebXMLDefinitions.toString(), 2, orderedWebXMLDefinitions.size()); WebXMLDefinition firstWebXMLDefinition = orderedWebXMLDefinitions.get( 0); Assert.assertEquals( "fragment1", firstWebXMLDefinition.getFragmentName()); WebXMLDefinition secondWebXMLDefinition = orderedWebXMLDefinitions.get( 1); Assert.assertEquals( "fragment3", secondWebXMLDefinition.getFragmentName()); } protected WebXMLDefinition loadWebXMLDefinition(String path) throws Exception { TestBundle testBundle = new TestBundle(path); WebXMLDefinitionLoader webXMLDefinitionLoader = new WebXMLDefinitionLoader( testBundle, SAXParserFactory.newInstance(), new Logger(null)); return webXMLDefinitionLoader.loadWebXMLDefinition(testBundle.getURL()); } protected void testWebXMLDefinition( WebXMLDefinition webXMLDefinition, int listenerDefinitionsCount, int filterDefinitionsCount, int servletDefinitionsCount) throws Exception { testWebXMLDefinition( webXMLDefinition, listenerDefinitionsCount, filterDefinitionsCount, servletDefinitionsCount, null, null, null); } protected void testWebXMLDefinition( WebXMLDefinition webXMLDefinition, int listenerDefinitionsCount, int filterDefinitionsCount, int servletDefinitionsCount, String fragmentName, Order order, List<String> absoluteOrderingNames) throws Exception { if (Validator.isNotNull(fragmentName)) { Assert.assertEquals( fragmentName, webXMLDefinition.getFragmentName()); } if (order != null) { EnumMap<Order.Path, String[]> expectedRoutes = order.getRoutes(); Order webXMLDefinitionOrder = webXMLDefinition.getOrder(); EnumMap<Order.Path, String[]> actualRoutes = webXMLDefinitionOrder.getRoutes(); Assert.assertArrayEquals( expectedRoutes.get(Order.Path.AFTER), actualRoutes.get(Order.Path.AFTER)); Assert.assertArrayEquals( expectedRoutes.get(Order.Path.BEFORE), actualRoutes.get(Order.Path.BEFORE)); } if (ListUtil.isNotEmpty(absoluteOrderingNames)) { List<String> webXMLDefinitionAbsoluteOrderingNames = webXMLDefinition.getAbsoluteOrderingNames(); Assert.assertArrayEquals( absoluteOrderingNames.toArray(new String[0]), webXMLDefinitionAbsoluteOrderingNames.toArray(new String[0])); } List<ListenerDefinition> listenerDefinitions = webXMLDefinition.getListenerDefinitions(); Assert.assertEquals( listenerDefinitions.toString(), listenerDefinitionsCount, listenerDefinitions.size()); for (ListenerDefinition listenerDefinition : listenerDefinitions) { EventListener eventListener = listenerDefinition.getEventListener(); Assert.assertTrue(eventListener instanceof ServletContextListener); } Map<String, ServletDefinition> servletDefinitions = webXMLDefinition.getServletDefinitions(); Assert.assertEquals( servletDefinitions.toString(), servletDefinitionsCount, servletDefinitions.size()); Map<String, FilterDefinition> filterDefinitions = webXMLDefinition.getFilterDefinitions(); Assert.assertEquals( filterDefinitions.toString(), filterDefinitionsCount, filterDefinitions.size()); } @Mock private Servlet _servlet; @Mock private ServletContextListener _servletContextListener; private static class TestBundle extends MockBundle { public TestBundle(String path) { _path = path; } public URL getURL() { Class<?> clazz = getClass(); return clazz.getResource(_path); } private final String _path; } }