Added: jakarta/cactus/trunk/integration/ant/src/test/java/org/apache/cactus/integration/ant/deployment/webapp/TestWebXmlMerger.java URL: http://svn.apache.org/viewvc/jakarta/cactus/trunk/integration/ant/src/test/java/org/apache/cactus/integration/ant/deployment/webapp/TestWebXmlMerger.java?rev=631917&view=auto ============================================================================== --- jakarta/cactus/trunk/integration/ant/src/test/java/org/apache/cactus/integration/ant/deployment/webapp/TestWebXmlMerger.java (added) +++ jakarta/cactus/trunk/integration/ant/src/test/java/org/apache/cactus/integration/ant/deployment/webapp/TestWebXmlMerger.java Thu Feb 28 02:26:25 2008 @@ -0,0 +1,868 @@ +/* + * ======================================================================== + * + * Copyright 2003-2004 The Apache Software Foundation. + * + * Licensed 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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.apache.cactus.integration.ant.deployment.webapp; + +import java.io.ByteArrayInputStream; +import java.util.Iterator; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import junit.framework.TestCase; + +import org.codehaus.cargo.module.webapp.WebXml; +import org.codehaus.cargo.module.webapp.WebXmlIo; +import org.codehaus.cargo.module.webapp.WebXmlMerger; +import org.codehaus.cargo.module.webapp.WebXmlTag; +import org.codehaus.cargo.module.webapp.WebXmlVersion; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * Unit tests for [EMAIL PROTECTED] WebXmlMerger}. + * + * TODO: we need more tests for the security sections and the various references + * + * @version $Id: TestWebXmlMerger.java 239003 2004-05-31 20:05:27Z vmassol $ + */ +public final class TestWebXmlMerger extends TestCase +{ + /** + * The document builder factory. + */ + private DocumentBuilderFactory factory; + + /** + * The JAXP document builder. + */ + private DocumentBuilder builder; + + /** + * [EMAIL PROTECTED] + * @see TestCase#setUp + */ + public void setUp() throws ParserConfigurationException + { + factory = DocumentBuilderFactory.newInstance(); + factory.setValidating(false); + factory.setNamespaceAware(false); + + builder = factory.newDocumentBuilder(); + } + + /** + * Tests whether a single filter is correctly merged into an empty + * descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneFilterIntoEmptyDocument() throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app></web-app>"; + WebXml srcWebXml = WebXmlIo.parseWebXml(new ByteArrayInputStream(srcXml.getBytes()), null); + String mergeXml = "<web-app>" + + " <filter>" + + " <filter-name>f1</filter-name>" + + " <filter-class>fclass1</filter-class>" + + " </filter>" + + "</web-app>"; + WebXml mergeWebXml = WebXmlIo.parseWebXml(new ByteArrayInputStream(mergeXml.getBytes()), null); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasFilter("f1")); + } + + /** + * Tests whether a single context param is correctly merged into an empty + * descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneContextParamIntoEmptyDocument() throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app></web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <context-param>" + + " <param-name>param</param-name>" + + " <param-value>value</param-value>" + + " </context-param>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasContextParam("param")); + } + + /** + * Tests whether a single filter is correctly merged into a descriptor that + * already contains another filter. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneFilterIntoDocumentWithAnotherFilter() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>" + + " <filter>" + + " <filter-name>f1</filter-name>" + + " <filter-class>fclass1</filter-class>" + + " </filter>" + + "</web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <filter>" + + " <filter-name>f2</filter-name>" + + " <filter-class>fclass2</filter-class>" + + " </filter>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasFilter("f1")); + assertTrue(srcWebXml.hasFilter("f2")); + } + + /** + * Tests whether a single context param is correctly merged into a + * descriptor that already contains another context param. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneContextParamIntoDocumentWithAnotherContextParam() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>" + + " <context-param>" + + " <param-name>param1</param-name>" + + " <param-value>value1</param-value>" + + " </context-param>" + + "</web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <context-param>" + + " <param-name>param2</param-name>" + + " <param-value>value2</param-value>" + + " </context-param>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasContextParam("param1")); + assertTrue(srcWebXml.hasContextParam("param2")); + } + + /** + * Tests whether a single filter in the merge descriptor is ignored because + * a filter with the same name already exists in the source descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneFilterIntoDocumentWithSameFilter() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>" + + " <filter>" + + " <filter-name>f1</filter-name>" + + " <filter-class>fclass1</filter-class>" + + " </filter>" + + "</web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = srcXml; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasFilter("f1")); + } + + /** + * Tests whether a single context param in the merge descriptor is ignored + * because a context param with the same name already exists in the source + * descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneContextParamIntoDocumentWithSameContextParam() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>" + + " <context-param>" + + " <param-name>param</param-name>" + + " <param-value>value</param-value>" + + " </context-param>" + + "</web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = srcXml; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasContextParam("param")); + } + + /** + * Tests whether a filter initialization parameter is merged into the + * descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneFilterIntoDocumentWithSameFilterAndParam() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>" + + " <filter>" + + " <filter-name>f1</filter-name>" + + " <filter-class>fclass1</filter-class>" + + " </filter>" + + "</web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>" + + " <filter>" + + " <filter-name>f1</filter-name>" + + " <filter-class>fclass1</filter-class>" + + " <init-param>" + + " <param-name>f1param1</param-name>" + + " <param-value>f1param1value</param-value>" + + " </init-param>" + + " </filter>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasFilter("f1")); + Iterator initParams = srcWebXml.getFilterInitParamNames("f1"); + assertEquals("f1param1", initParams.next()); + assertTrue(!initParams.hasNext()); + + + } + + /** + * Tests whether a single filter is correctly merged into a descriptor that + * already contains multiple other filter definitions. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneFilterIntoDocumentWithMultipleFilters() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>" + + " <filter>" + + " <filter-name>f1</filter-name>" + + " <filter-class>fclass1</filter-class>" + + " </filter>" + + " <filter>" + + " <filter-name>f2</filter-name>" + + " <filter-class>fclass2</filter-class>" + + " </filter>" + + " <filter>" + + " <filter-name>f3</filter-name>" + + " <filter-class>fclass3</filter-class>" + + " </filter>" + + "</web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <filter>" + + " <filter-name>f4</filter-name>" + + " <filter-class>fclass4</filter-class>" + + " </filter>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + Iterator filterNames = srcWebXml.getFilterNames(); + assertEquals("f1", filterNames.next()); + assertEquals("f2", filterNames.next()); + assertEquals("f3", filterNames.next()); + assertEquals("f4", filterNames.next()); + assertTrue(!filterNames.hasNext()); + } + + /** + * Tests whether multiple filters are correctly merged into an empty + * descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeMultipleFiltersIntoEmptyDocument() throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app></web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <filter>" + + " <filter-name>f1</filter-name>" + + " <filter-class>fclass1</filter-class>" + + " </filter>" + + " <filter>" + + " <filter-name>f2</filter-name>" + + " <filter-class>fclass2</filter-class>" + + " </filter>" + + " <filter>" + + " <filter-name>f3</filter-name>" + + " <filter-class>fclass3</filter-class>" + + " </filter>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + Iterator filterNames = srcWebXml.getFilterNames(); + assertEquals("f1", filterNames.next()); + assertEquals("f2", filterNames.next()); + assertEquals("f3", filterNames.next()); + assertTrue(!filterNames.hasNext()); + } + + /** + * Tests whether a filter with one mapping is correctly merged into an empty + * descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneFilterWithOneMappingIntoEmptyDocument() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app></web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <filter>" + + " <filter-name>f1</filter-name>" + + " <filter-class>fclass1</filter-class>" + + " </filter>" + + " <filter-mapping>" + + " <filter-name>f1</filter-name>" + + " <url-pattern>/f1mapping1</url-pattern>" + + " </filter-mapping>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasFilter("f1")); + Iterator filterMappings = srcWebXml.getFilterMappings("f1"); + assertEquals("/f1mapping1", filterMappings.next()); + assertTrue(!filterMappings.hasNext()); + } + + /** + * Tests wether a single filter with multiple mappings is correctly merged + * into an empty descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneFilterWithMultipleMappingsIntoEmptyDocument() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app></web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <filter>" + + " <filter-name>f1</filter-name>" + + " <filter-class>fclass1</filter-class>" + + " </filter>" + + " <filter-mapping>" + + " <filter-name>f1</filter-name>" + + " <url-pattern>/f1mapping1</url-pattern>" + + " </filter-mapping>" + + " <filter-mapping>" + + " <filter-name>f1</filter-name>" + + " <url-pattern>/f1mapping2</url-pattern>" + + " </filter-mapping>" + + " <filter-mapping>" + + " <filter-name>f1</filter-name>" + + " <url-pattern>/f1mapping3</url-pattern>" + + " </filter-mapping>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasFilter("f1")); + Iterator filterMappings = srcWebXml.getFilterMappings("f1"); + assertEquals("/f1mapping1", filterMappings.next()); + assertEquals("/f1mapping2", filterMappings.next()); + assertEquals("/f1mapping3", filterMappings.next()); + assertTrue(!filterMappings.hasNext()); + } + + /** + * Tests whether a single servlet is correctly merged into an empty + * descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneServletIntoEmptyDocument() throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app></web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <servlet>" + + " <servlet-name>s1</servlet-name>" + + " <servlet-class>sclass1</servlet-class>" + + " </servlet>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasServlet("s1")); + } + + /** + * Tests whether a single servlet is correctly merged into a descriptor that + * already contains the definition of an other servlet. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneServletIntoDocumentWithAnotherServlet() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>" + + " <servlet>" + + " <servlet-name>s1</servlet-name>" + + " <servlet-class>sclass1</servlet-class>" + + " </servlet>" + + "</web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <servlet>" + + " <servlet-name>s2</servlet-name>" + + " <servlet-class>sclass2</servlet-class>" + + " </servlet>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasServlet("s1")); + assertTrue(srcWebXml.hasServlet("s2")); + } + + /** + * Tests whether a single servlet is correctly merged into a descriptor that + * already contains the definition of a servlet with the same name. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneServletIntoDocumentWithSameServlet() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>" + + " <servlet>" + + " <servlet-name>s1</servlet-name>" + + " <servlet-class>sclass1</servlet-class>" + + " </servlet>" + + "</web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <servlet>" + + " <servlet-name>s1</servlet-name>" + + " <servlet-class>sclass1</servlet-class>" + + " </servlet>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasServlet("s1")); + } + + /** + * Tets whether a servlet with an initialization parameter is correctly + * merged into a descriptor that contains the definition of a servlet with + * the same name. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneServletIntoDocumentWithSameServletAndParam() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>" + + " <servlet>" + + " <servlet-name>s1</servlet-name>" + + " <servlet-class>sclass1</servlet-class>" + + " </servlet>" + + "</web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <servlet>" + + " <servlet-name>s1</servlet-name>" + + " <servlet-class>sclass1</servlet-class>" + + " <init-param>" + + " <param-name>s1param1</param-name>" + + " <param-value>s1param1value</param-value>" + + " </init-param>" + + " </servlet>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasServlet("s1")); + Iterator initParams = srcWebXml.getServletInitParamNames("s1"); + assertEquals("s1param1", initParams.next()); + assertTrue(!initParams.hasNext()); + assertEquals("s1param1value", + srcWebXml.getServletInitParam("s1", "s1param1")); + } + + /** + * Tests whether a single servlet is correctly merged into a descriptor with + * multiple servlets. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneServletIntoDocumentWithMultipleServlets() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>" + + " <servlet>" + + " <servlet-name>s1</servlet-name>" + + " <servlet-class>sclass1</servlet-class>" + + " </servlet>" + + " <servlet>" + + " <servlet-name>s2</servlet-name>" + + " <servlet-class>sclass2</servlet-class>" + + " </servlet>" + + " <servlet>" + + " <servlet-name>s3</servlet-name>" + + " <servlet-class>sclass3</servlet-class>" + + " </servlet>" + + "</web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <servlet>" + + " <servlet-name>s4</servlet-name>" + + " <servlet-class>sclass4</servlet-class>" + + " </servlet>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + Iterator servletNames = srcWebXml.getServletNames(); + assertEquals("s1", servletNames.next()); + assertEquals("s2", servletNames.next()); + assertEquals("s3", servletNames.next()); + assertEquals("s4", servletNames.next()); + assertTrue(!servletNames.hasNext()); + } + + /** + * Verifies that servlet init parameters are added after the load-on-startup + * element of an already existing servlet definition. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergingServletWithInitParamsThatIsAlreadyDefined() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>".trim() + + " <servlet>".trim() + + " <servlet-name>s1</servlet-name>".trim() + + " <servlet-class>sclass1</servlet-class>".trim() + + " <load-on-startup>1</load-on-startup>".trim() + + " </servlet>".trim() + + "</web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <servlet>".trim() + + " <servlet-name>s1</servlet-name>".trim() + + " <servlet-class>sclass1</servlet-class>".trim() + + " <init-param>".trim() + + " <param-name>s1param1</param-name>".trim() + + " <param-value>s1param1value</param-value>".trim() + + " </init-param>".trim() + + " </servlet>".trim() + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + Element servletElement = srcWebXml.getServlet("s1"); + assertEquals("load-on-startup", + ((Element) servletElement.getLastChild()).getTagName()); + } + + /** + * Tests whether multiple servlet in the merge file are correctly inserted + * into an empty descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeMultipleServletsIntoEmptyDocument() throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app></web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <servlet>" + + " <servlet-name>s1</servlet-name>" + + " <servlet-class>sclass1</servlet-class>" + + " </servlet>" + + " <servlet>" + + " <servlet-name>s2</servlet-name>" + + " <servlet-class>sclass2</servlet-class>" + + " </servlet>" + + " <servlet>" + + " <servlet-name>s3</servlet-name>" + + " <servlet-class>sclass3</servlet-class>" + + " </servlet>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + Iterator servletNames = srcWebXml.getServletNames(); + assertEquals("s1", servletNames.next()); + assertEquals("s2", servletNames.next()); + assertEquals("s3", servletNames.next()); + assertTrue(!servletNames.hasNext()); + } + + /** + * Tests whether a single servlet with one mapping is correctly inserted + * into an empty descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneServletWithOneMappingIntoEmptyDocument() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app></web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <servlet>" + + " <servlet-name>s1</servlet-name>" + + " <servlet-class>sclass1</servlet-class>" + + " </servlet>" + + " <servlet-mapping>" + + " <servlet-name>s1</servlet-name>" + + " <url-pattern>/s1mapping1</url-pattern>" + + " </servlet-mapping>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasServlet("s1")); + Iterator servletMappings = srcWebXml.getServletMappings("s1"); + assertEquals("/s1mapping1", servletMappings.next()); + assertTrue(!servletMappings.hasNext()); + } + + /** + * Tests whether a single servlet with multiple mappings is correctly + * inserted into an empty descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneServletWithMultipleMappingsIntoEmptyDocument() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app></web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <servlet>" + + " <servlet-name>s1</servlet-name>" + + " <servlet-class>sclass1</servlet-class>" + + " </servlet>" + + " <servlet-mapping>" + + " <servlet-name>s1</servlet-name>" + + " <url-pattern>/s1mapping1</url-pattern>" + + " </servlet-mapping>" + + " <servlet-mapping>" + + " <servlet-name>s1</servlet-name>" + + " <url-pattern>/s1mapping2</url-pattern>" + + " </servlet-mapping>" + + " <servlet-mapping>" + + " <servlet-name>s1</servlet-name>" + + " <url-pattern>/s1mapping3</url-pattern>" + + " </servlet-mapping>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + assertTrue(srcWebXml.hasServlet("s1")); + Iterator servletMappings = srcWebXml.getServletMappings("s1"); + assertEquals("/s1mapping1", servletMappings.next()); + assertEquals("/s1mapping2", servletMappings.next()); + assertEquals("/s1mapping3", servletMappings.next()); + assertTrue(!servletMappings.hasNext()); + } + + /** + * Tests whether a single security role is correctly inserted into an empty + * descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeSecurityRoleIntoEmptyDocument() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app></web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <security-role>" + + " <role-name>role1</role-name>" + + " </security-role>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + Iterator securityRoleNames = srcWebXml.getSecurityRoleNames(); + assertTrue(securityRoleNames.hasNext()); + assertEquals("role1", securityRoleNames.next()); + assertTrue(!securityRoleNames.hasNext()); + } + + /** + * Tests whether a single security role is ignored when the source + * descriptor already contains a role with the same name. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeSecurityRoleIntoDocumentWithSameRole() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app>" + + " <security-role>" + + " <description>A role</description>" + + " <role-name>role1</role-name>" + + " </security-role>" + + "</web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <security-role>" + + " <role-name>role1</role-name>" + + " </security-role>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + Iterator securityRoleNames = srcWebXml.getSecurityRoleNames(); + assertTrue(securityRoleNames.hasNext()); + assertEquals("role1", securityRoleNames.next()); + assertTrue(!securityRoleNames.hasNext()); + } + + /** + * Tests whether a single EJB reference is correctly inserted into an empty + * descriptor. + * + * @throws Exception If an unexpected error occurs + */ + public void testMergeOneEjbRefIntoEmptyDocument() + throws Exception + { + String srcXml = "<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'><web-app></web-app>"; + Document srcDoc = + builder.parse(new ByteArrayInputStream(srcXml.getBytes())); + WebXml srcWebXml = new WebXml(srcDoc); + String mergeXml = "<web-app>" + + " <ejb-ref>" + + " <ejb-ref-name>ejbref1</ejb-ref-name>" + + " <ejb-ref-type>ejbref1.type</ejb-ref-type>" + + " <home>ejbref1.homeInterface</home>" + + " <remote>ejbref1.remoteInterface</remote>" + + " </ejb-ref>" + + "</web-app>"; + Document mergeDoc = + builder.parse(new ByteArrayInputStream(mergeXml.getBytes())); + WebXml mergeWebXml = new WebXml(mergeDoc); + WebXmlMerger merger = new WebXmlMerger(srcWebXml); + merger.merge(mergeWebXml); + Iterator ejbRefs = srcWebXml.getElements(WebXmlTag.EJB_REF); + assertTrue(ejbRefs.hasNext()); + } + +}
Added: jakarta/cactus/trunk/integration/ant/src/test/java/org/apache/cactus/integration/ant/deployment/webapp/TestWebXmlVersion.java URL: http://svn.apache.org/viewvc/jakarta/cactus/trunk/integration/ant/src/test/java/org/apache/cactus/integration/ant/deployment/webapp/TestWebXmlVersion.java?rev=631917&view=auto ============================================================================== --- jakarta/cactus/trunk/integration/ant/src/test/java/org/apache/cactus/integration/ant/deployment/webapp/TestWebXmlVersion.java (added) +++ jakarta/cactus/trunk/integration/ant/src/test/java/org/apache/cactus/integration/ant/deployment/webapp/TestWebXmlVersion.java Thu Feb 28 02:26:25 2008 @@ -0,0 +1,157 @@ +/* + * ======================================================================== + * + * Copyright 2003 The Apache Software Foundation. + * + * Licensed 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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.apache.cactus.integration.ant.deployment.webapp; + + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import junit.framework.TestCase; + +import org.codehaus.cargo.module.webapp.WebXmlVersion; +import org.w3c.dom.DOMImplementation; +import org.w3c.dom.DocumentType; + +/** + * Unit tests for [EMAIL PROTECTED] WebXmlVersion}. + * + * @version $Id: TestWebXmlVersion.java 239003 2004-05-31 20:05:27Z vmassol $ + */ +public final class TestWebXmlVersion extends TestCase +{ + /** + * The DOM implementation. + */ + private DOMImplementation domImpl; + + /** + * [EMAIL PROTECTED] + * @see TestCase#setUp + */ + public void setUp() throws ParserConfigurationException + { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setValidating(false); + factory.setNamespaceAware(false); + + this.domImpl = factory.newDocumentBuilder().getDOMImplementation(); + } + + /** + * Verifies that comparing version 2.2 to version 2.2 yields zero. + * + * @throws Exception If an unexpected error occurs + */ + public void testCompare22To22() throws Exception + { + assertTrue(WebXmlVersion.V2_2.compareTo(WebXmlVersion.V2_2) == 0); + } + + /** + * Verifies that comparing version 2.2 to version 2.3 yields a negative + * value. + * + * @throws Exception If an unexpected error occurs + */ + public void testCompare22To23() throws Exception + { + assertTrue(WebXmlVersion.V2_2.compareTo(WebXmlVersion.V2_3) < 0); + } + + /** + * Verifies that comparing version 2.3 to version 2.3 yields zero. + * + * @throws Exception If an unexpected error occurs + */ + public void testCompare23To23() throws Exception + { + assertTrue(WebXmlVersion.V2_3.compareTo(WebXmlVersion.V2_3) == 0); + } + + /** + * Verifies that comparing version 2.2 to version 2.3 yields a negative + * value. + * + * @throws Exception If an unexpected error occurs + */ + public void testCompare23To22() throws Exception + { + assertTrue(WebXmlVersion.V2_3.compareTo(WebXmlVersion.V2_2) > 0); + } + + /** + * Verifies that calling WebXmlVersion.valueOf(null) throws a + * NullPointerException. + * + * @throws Exception If an unexpected error occurs + */ + public void testValueOfNull() throws Exception + { + try + { + WebXmlVersion.valueOf((DocumentType) null); + fail("Expected NullPointerException"); + } + catch (NullPointerException expected) + { + // expected + } + } + + /** + * Verifies that calling WebXmlVersion.valueOf() with a unknown document + * type returns null. + * + * @throws Exception If an unexpected error occurs + */ + public void testValueOfUnknownDocType() throws Exception + { + DocumentType docType = domImpl.createDocumentType("web-app", + "foo", "bar"); + assertNull(WebXmlVersion.valueOf(docType)); + } + + /** + * Verifies that calling WebXmlVersion.valueOf() with a web-app 2.2 document + * type returns the correct instance. + * + * @throws Exception If an unexpected error occurs + */ + public void testValueOfDocType22() throws Exception + { + DocumentType docType = domImpl.createDocumentType("web-app", + WebXmlVersion.V2_2.getPublicId(), WebXmlVersion.V2_2.getSystemId()); + assertEquals(WebXmlVersion.V2_2, WebXmlVersion.valueOf(docType)); + } + + /** + * Verifies that calling WebXmlVersion.valueOf() with a web-app 2.3 document + * type returns the correct instance. + * + * @throws Exception If an unexpected error occurs + */ + public void testValueOfDocType23() throws Exception + { + DocumentType docType = domImpl.createDocumentType("web-app", + WebXmlVersion.V2_3.getPublicId(), WebXmlVersion.V2_3.getSystemId()); + assertEquals(WebXmlVersion.V2_3, WebXmlVersion.valueOf(docType)); + } + +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]