Author: markt Date: Tue May 21 16:34:27 2013 New Revision: 1484862 URL: http://svn.apache.org/r1484862 Log: Make deletion of the copied WARs used for anti-resource locking more robust if the context fails to start (there were some circumstances where the original WAR could get deleted). Add some test cases to check this.
Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java tomcat/trunk/test/org/apache/catalina/startup/TestHostConfigAutomaticDeployment.java Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=1484862&r1=1484861&r2=1484862&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original) +++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Tue May 21 16:34:27 2013 @@ -213,6 +213,12 @@ public class ContextConfig implements Li /** + * Anti-locking docBase + */ + private String antiLockingDocBase = null; + + + /** * Map of ServletContainerInitializer to classes they expressed interest in. */ protected final Map<ServletContainerInitializer, Set<Class<?>>> initializerClassMap = @@ -325,16 +331,9 @@ public class ContextConfig implements Li } else if (event.getType().equals(Lifecycle.AFTER_START_EVENT)) { // Restore docBase for management tools if (originalDocBase != null) { - String docBase = context.getDocBase(); context.setDocBase(originalDocBase); - originalDocBase = docBase; } } else if (event.getType().equals(Lifecycle.CONFIGURE_STOP_EVENT)) { - if (originalDocBase != null) { - String docBase = context.getDocBase(); - context.setDocBase(originalDocBase); - originalDocBase = docBase; - } configureStop(); } else if (event.getType().equals(Lifecycle.AFTER_INIT_EVENT)) { init(); @@ -714,11 +713,8 @@ public class ContextConfig implements Li if (docBase == null) { return; } - if (originalDocBase == null) { - originalDocBase = docBase; - } else { - docBase = originalDocBase; - } + originalDocBase = docBase; + File docBaseFile = new File(docBase); if (!docBaseFile.isAbsolute()) { docBaseFile = new File(host.getAppBaseFile(), docBase); @@ -745,12 +741,12 @@ public class ContextConfig implements Li + "] setting docBase to " + file); } + antiLockingDocBase = file.getAbsolutePath(); // Cleanup just in case an old deployment is lying around ExpandWar.delete(file); if (ExpandWar.copy(docBaseFile, file)) { - context.setDocBase(file.getAbsolutePath()); + context.setDocBase(antiLockingDocBase); } - } } @@ -999,8 +995,8 @@ public class ContextConfig implements Li // Remove (partially) folders and files created by antiLocking Host host = (Host) context.getParent(); String docBase = context.getDocBase(); - if ((docBase != null) && (originalDocBase != null)) { - File docBaseFile = new File(docBase); + if (antiLockingDocBase != null) { + File docBaseFile = new File(antiLockingDocBase); if (!docBaseFile.isAbsolute()) { docBaseFile = new File(host.getAppBaseFile(), docBase); } Modified: tomcat/trunk/test/org/apache/catalina/startup/TestHostConfigAutomaticDeployment.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/TestHostConfigAutomaticDeployment.java?rev=1484862&r1=1484861&r2=1484862&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/catalina/startup/TestHostConfigAutomaticDeployment.java (original) +++ tomcat/trunk/test/org/apache/catalina/startup/TestHostConfigAutomaticDeployment.java Tue May 21 16:34:27 2013 @@ -55,6 +55,8 @@ public class TestHostConfigAutomaticDepl new File("test/deployment/contextUnpackWARTrue.war"); private static final File WAR_SOURCE = new File("test/deployment/noContext.war"); + private static final File WAR_BROKEN_SOURCE = + new File("test/deployment/broken.war"); private static final File DIR_XML_SOURCE = new File("test/deployment/dirContext"); private static final File DIR_SOURCE = @@ -1563,6 +1565,40 @@ public class TestHostConfigAutomaticDepl } + @Test + public void testBrokenAppWithAntiLockingF() throws Exception { + testBrokenAppWithAntiLocking(false); + } + + @Test + public void testBrokenAppWithAntiLockingT() throws Exception { + testBrokenAppWithAntiLocking(true); + } + + private void testBrokenAppWithAntiLocking(boolean unpackWARs) + throws Exception { + + Tomcat tomcat = getTomcatInstance(); + StandardHost host = (StandardHost) tomcat.getHost(); + + host.setUnpackWARs(unpackWARs); + + File war = createWar(WAR_BROKEN_SOURCE, false); + createXmlInConfigBaseForExternal(war, true); + + File dir = new File(host.getAppBaseFile(), APP_NAME.getBaseName()); + + tomcat.start(); + + // Simulate deploy on start-up + tomcat.getHost().backgroundProcess(); + + Assert.assertTrue(war.isFile()); + if (unpackWARs) { + Assert.assertTrue(dir.isDirectory()); + } + } + private File createDirInAppbase(boolean withXml) throws IOException { File dir = new File(getTomcatInstance().getHost().getAppBaseFile(), APP_NAME.getBaseName()); @@ -1608,6 +1644,11 @@ public class TestHostConfigAutomaticDepl } private File createXmlInConfigBaseForExternal(File ext) throws IOException { + return createXmlInConfigBaseForExternal(ext, false); + } + + private File createXmlInConfigBaseForExternal(File ext, boolean antiLocking) + throws IOException { File xml = new File(getTomcatInstance().getHost().getConfigBaseFile(), APP_NAME + ".xml"); File parent = xml.getParentFile(); @@ -1616,9 +1657,16 @@ public class TestHostConfigAutomaticDepl } try (FileOutputStream fos = new FileOutputStream(xml)) { - fos.write(("<Context sessionCookieName=\"" + XML_COOKIE_NAME + - "\" docBase=\"" + ext.getAbsolutePath() + - "\" />").getBytes(B2CConverter.ISO_8859_1)); + StringBuilder context = new StringBuilder(); + context.append("<Context sessionCookieName=\""); + context.append(XML_COOKIE_NAME); + context.append("\" docBase=\""); + context.append(ext.getAbsolutePath()); + if (antiLocking) { + context.append("\" antiResourceLocking=\"true"); + } + context.append("\" />"); + fos.write(context.toString().getBytes(B2CConverter.ISO_8859_1)); } return xml; } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org