From: markt Date: Mon, 19 May 2008 21:47:19 +0000 (+0000) Subject: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=42747. X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=46d82366f1b9ceebed94b86090bf6550d5b051bd;p=tomcat7.0 Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=42747. Actually fixes a number of related bugs: - For a new WAR, use META-INF/context.xml for first initiation rather than copying it then using it on next start - For a new dir, use META-INF/context.xml for first initiation - For a new dir, copy any META-INF/context.xml to $CATALINA_BASE/[engine]/[host]/contextPath.xml git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@657995 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/startup/HostConfig.java b/java/org/apache/catalina/startup/HostConfig.java index a526de43f..a7c55493d 100644 --- a/java/org/apache/catalina/startup/HostConfig.java +++ b/java/org/apache/catalina/startup/HostConfig.java @@ -21,6 +21,7 @@ package org.apache.catalina.startup; import java.io.BufferedOutputStream; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -814,7 +815,26 @@ public class HostConfig (dir.getAbsolutePath(), new Long(dir.lastModified())); try { - Context context = (Context) Class.forName(contextClass).newInstance(); + Context context = null; + if (deployXML && xml.exists()) { + synchronized (digester) { + try { + context = (Context) digester.parse(xml); + if (context == null) { + log.error(sm.getString("hostConfig.deployDescriptor.error", + file)); + return; + } + } finally { + digester.reset(); + } + } + context.setConfigFile(xml.getAbsolutePath()); + deployedApp.redeployResources.put + (xml.getAbsolutePath(), new Long(xml.lastModified())); + } else { + context = (Context) Class.forName(contextClass).newInstance(); + } if (context instanceof Lifecycle) { Class clazz = Class.forName(host.getConfigClass()); LifecycleListener listener = @@ -823,11 +843,6 @@ public class HostConfig } context.setPath(contextPath); context.setDocBase(file); - if (xml.exists()) { - context.setConfigFile(xml.getAbsolutePath()); - deployedApp.redeployResources.put - (xml.getAbsolutePath(), new Long(xml.lastModified())); - } host.addChild(context); // If we're unpacking WARs, the docBase will be mutated after // starting the context @@ -911,7 +926,78 @@ public class HostConfig if( log.isDebugEnabled() ) log.debug(sm.getString("hostConfig.deployDir", file)); try { - Context context = (Context) Class.forName(contextClass).newInstance(); + // Checking for a /META-INF/context.xml + InputStream istream = null; + BufferedOutputStream ostream = null; + File xml = new File + (configBase, file + ".xml"); + if (deployXML && !xml.exists()) { + try { + File applicationContextXml = + new File(dir, Constants.ApplicationContextXml); + if (applicationContextXml.exists()) { + istream = new FileInputStream(applicationContextXml); + + configBase.mkdirs(); + + ostream = + new BufferedOutputStream + (new FileOutputStream(xml), 1024); + byte buffer[] = new byte[1024]; + while (true) { + int n = istream.read(buffer); + if (n < 0) { + break; + } + ostream.write(buffer, 0, n); + } + ostream.flush(); + ostream.close(); + ostream = null; + istream.close(); + istream = null; + } + } catch (Exception e) { + // Ignore and continue + if (ostream != null) { + try { + ostream.close(); + } catch (Throwable t) { + // Ignore + } + ostream = null; + } + if (istream != null) { + try { + istream.close(); + } catch (Throwable t) { + // Ignore + } + istream = null; + } + } + } + + Context context = null; + if (deployXML && xml.exists()) { + synchronized (digester) { + try { + context = (Context) digester.parse(xml); + if (context == null) { + log.error(sm.getString("hostConfig.deployDescriptor.error", + file)); + return; + } + } finally { + digester.reset(); + } + } + context.setConfigFile(xml.getAbsolutePath()); + deployedApp.redeployResources.put + (xml.getAbsolutePath(), new Long(xml.lastModified())); + } else { + context = (Context) Class.forName(contextClass).newInstance(); + } if (context instanceof Lifecycle) { Class clazz = Class.forName(host.getConfigClass()); LifecycleListener listener = @@ -920,17 +1006,9 @@ public class HostConfig } context.setPath(contextPath); context.setDocBase(file); - File configFile = new File(dir, Constants.ApplicationContextXml); - if (deployXML) { - context.setConfigFile(configFile.getAbsolutePath()); - } host.addChild(context); deployedApp.redeployResources.put(dir.getAbsolutePath(), new Long(dir.lastModified())); - if (deployXML) { - deployedApp.redeployResources.put(configFile.getAbsolutePath(), - new Long(configFile.lastModified())); - } addWatchedResources(deployedApp, dir.getAbsolutePath(), context); } catch (Throwable t) { log.error(sm.getString("hostConfig.deployDir.error", file), t);