Author: violetagg Date: Tue Aug 27 19:22:47 2013 New Revision: 1517941 URL: http://svn.apache.org/r1517941 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51526 o.a.catalina.startup.Tomcat.addWebapp(...) will process web application's context.xml when it is presented in the provided baseDir.
Modified: tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java tomcat/trunk/test/org/apache/catalina/startup/TestTomcat.java Modified: tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java?rev=1517941&r1=1517940&r2=1517941&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java (original) +++ tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java Tue Aug 27 19:22:47 2013 @@ -18,12 +18,16 @@ package org.apache.catalina.startup; import java.io.File; import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; import java.security.Principal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Stack; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; import java.util.logging.Level; import java.util.logging.Logger; @@ -181,8 +185,8 @@ public class Tomcat { /** * This is equivalent to adding a web application to Tomcat's webapps * directory. The equivalent of the default web.xml will be applied to the - * web application and any WEB-INF/web.xml packaged with the application - * will be processed normally. Normal web fragment and + * web application and any WEB-INF/web.xml and META-INF/context.xml packaged + * with the application will be processed normally. Normal web fragment and * {@link javax.servlet.ServletContainerInitializer} processing will be * applied. * @@ -525,6 +529,7 @@ public class Tomcat { ctx.setPath(url); ctx.setDocBase(path); ctx.addLifecycleListener(new DefaultWebXmlListener()); + ctx.setConfigFile(getWebappConfigFile(path, url)); ContextConfig ctxCfg = new ContextConfig(); ctx.addLifecycleListener(ctxCfg); @@ -668,16 +673,20 @@ public class Tomcat { } private void silence(Host host, String ctx) { - String base = "org.apache.catalina.core.ContainerBase.[default].["; + Logger.getLogger(getLoggerName(host, ctx)).setLevel(Level.WARNING); + } + + private String getLoggerName(Host host, String ctx) { + String loggerName = "org.apache.catalina.core.ContainerBase.[default].["; if (host == null) { - base += getHost().getName(); + loggerName += getHost().getName(); } else { - base += host.getName(); + loggerName += host.getName(); } - base += "].["; - base += ctx; - base += "]"; - Logger.getLogger(base).setLevel(Level.WARNING); + loggerName += "].["; + loggerName += ctx; + loggerName += "]"; + return loggerName; } /** @@ -1059,4 +1068,52 @@ public class Tomcat { "z", "application/x-compress", "zip", "application/zip" }; + + protected URL getWebappConfigFile(String path, String url) { + File docBase = new File(path); + if (docBase.isDirectory()) { + return getWebappConfigFileFromDirectory(docBase, url); + } else { + return getWebappConfigFileFromJar(docBase, url); + } + } + + private URL getWebappConfigFileFromDirectory(File docBase, String url) { + URL result = null; + File webAppContextXml = new File(docBase, Constants.ApplicationContextXml); + if (webAppContextXml.exists()) { + try { + result = webAppContextXml.toURI().toURL(); + } catch (MalformedURLException e) { + Logger.getLogger(getLoggerName(getHost(), url)).log(Level.WARNING, + "Unable to determine web application context.xml " + docBase, e); + } + } + return result; + } + + private URL getWebappConfigFileFromJar(File docBase, String url) { + URL result = null; + JarFile jar = null; + try { + jar = new JarFile(docBase); + JarEntry entry = jar.getJarEntry(Constants.ApplicationContextXml); + if (entry != null) { + result = new URL("jar:" + docBase.toURI().toString() + "!/" + + Constants.ApplicationContextXml); + } + } catch (IOException e) { + Logger.getLogger(getLoggerName(getHost(), url)).log(Level.WARNING, + "Unable to determine web application context.xml " + docBase, e); + } finally { + if (jar != null) { + try { + jar.close(); + } catch (IOException e) { + // ignore + } + } + } + return result; + } } Modified: tomcat/trunk/test/org/apache/catalina/startup/TestTomcat.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/TestTomcat.java?rev=1517941&r1=1517940&r2=1517941&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/catalina/startup/TestTomcat.java (original) +++ tomcat/trunk/test/org/apache/catalina/startup/TestTomcat.java Tue Aug 27 19:22:47 2013 @@ -35,11 +35,13 @@ import javax.servlet.http.HttpServletRes import javax.servlet.http.HttpSession; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.junit.Test; +import org.apache.catalina.core.StandardContext; import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.util.descriptor.web.ApplicationListener; import org.apache.tomcat.util.descriptor.web.ContextEnvironment; @@ -409,4 +411,41 @@ public class TestTomcat extends TomcatBa assertEquals(1, initCount.getCallCount()); } + + @Test + public void testGetWebappConfigFileFromDirectory() { + Tomcat tomcat = new Tomcat(); + assertNotNull(tomcat.getWebappConfigFile("test/deployment/dirContext", "")); + } + + @Test + public void testGetWebappConfigFileFromDirectoryNegative() { + Tomcat tomcat = new Tomcat(); + assertNull(tomcat.getWebappConfigFile("test/deployment/dirNoContext", "")); + } + + @Test + public void testGetWebappConfigFileFromJar() { + Tomcat tomcat = new Tomcat(); + assertNotNull(tomcat.getWebappConfigFile("test/deployment/context.war", "")); + } + + @Test + public void testGetWebappConfigFileFromJarNegative() { + Tomcat tomcat = new Tomcat(); + assertNull(tomcat.getWebappConfigFile("test/deployment/noContext.war", "")); + } + + @Test + public void testBug51526() throws Exception { + Tomcat tomcat = getTomcatInstance(); + + File appFile = new File("test/deployment/context.war"); + StandardContext context = (StandardContext) tomcat.addWebapp(null, "/test", + appFile.getAbsolutePath()); + + tomcat.start(); + + assertEquals("WAR_CONTEXT", context.getSessionCookieName()); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org