Author: markt Date: Thu Jan 21 11:33:12 2016 New Revision: 1725907 URL: http://svn.apache.org/viewvc?rev=1725907&view=rev Log: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=58900 Delete WARs symlinked into the appBase and context.xml files symlinked into the configBase during undeploy
Modified: tomcat/trunk/java/org/apache/catalina/startup/HostConfig.java tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties Modified: tomcat/trunk/java/org/apache/catalina/startup/HostConfig.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/HostConfig.java?rev=1725907&r1=1725906&r2=1725907&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/HostConfig.java (original) +++ tomcat/trunk/java/org/apache/catalina/startup/HostConfig.java Thu Jan 21 11:33:12 2016 @@ -1406,70 +1406,105 @@ public class HostConfig implements Lifec } - private void deleteRedeployResources(DeployedApplication app, - String[] resources, int i, boolean deleteReloadResources) { + private void deleteRedeployResources(DeployedApplication app, String[] resources, int i, + boolean deleteReloadResources) { // Delete other redeploy resources for (int j = i + 1; j < resources.length; j++) { - try { - File current = new File(resources[j]); - current = current.getCanonicalFile(); - // Never delete per host context.xml defaults - if (Constants.HostContextXml.equals( - current.getName())) { - continue; - } - // Only delete resources in the appBase or the - // host's configBase - if (isDeletableResource(current)) { - if (log.isDebugEnabled()) - log.debug("Delete " + current); - ExpandWar.delete(current); + File current = new File(resources[j]); + // Never delete per host context.xml defaults + if (Constants.HostContextXml.equals(current.getName())) { + continue; + } + // Only delete resources in the appBase or the + // host's configBase + if (isDeletableResource(app, current)) { + if (log.isDebugEnabled()) { + log.debug("Delete " + current); } - } catch (IOException e) { - log.warn(sm.getString - ("hostConfig.canonicalizing", app.name), e); + ExpandWar.delete(current); } } // Delete reload resources (to remove any remaining .xml descriptor) if (deleteReloadResources) { - String[] resources2 = - app.reloadResources.keySet().toArray(new String[0]); + String[] resources2 = app.reloadResources.keySet().toArray(new String[0]); for (int j = 0; j < resources2.length; j++) { - try { - File current = new File(resources2[j]); - current = current.getCanonicalFile(); - // Never delete per host context.xml defaults - if (Constants.HostContextXml.equals( - current.getName())) { - continue; - } - // Only delete resources in the appBase or the host's - // configBase - if (isDeletableResource(current)) { - if (log.isDebugEnabled()) - log.debug("Delete " + current); - ExpandWar.delete(current); + File current = new File(resources2[j]); + // Never delete per host context.xml defaults + if (Constants.HostContextXml.equals(current.getName())) { + continue; + } + // Only delete resources in the appBase or the host's + // configBase + if (isDeletableResource(app, current)) { + if (log.isDebugEnabled()) { + log.debug("Delete " + current); } - } catch (IOException e) { - log.warn(sm.getString - ("hostConfig.canonicalizing", app.name), e); + ExpandWar.delete(current); } } - } } - private boolean isDeletableResource(File resource) { - if ((resource.getAbsolutePath().startsWith( - host.getAppBaseFile().getAbsolutePath() + File.separator)) - || ((resource.getAbsolutePath().startsWith( - host.getConfigBaseFile().getAbsolutePath()) - && (resource.getAbsolutePath().endsWith(".xml"))))) { + /* + * Delete any resource that would trigger the automatic deployment code to + * re-deploy the application. This means deleting: + * - any resource located in the appBase + * - any deployment descriptor located under the configBase + * - symlinks in the appBase or configBase for either of the above + */ + private boolean isDeletableResource(DeployedApplication app, File resource) { + // The resource may be a file, a directory or a symlink to a file or + // directory. + + // Check that the resource is absolute. This should always be the case. + if (!resource.isAbsolute()) { + log.warn(sm.getString("hostConfig.resourceNotAbsolute", app.name, resource)); + return false; + } + + // Determine where the resource is located + String canonicalLocation; + try { + canonicalLocation = resource.getParentFile().getCanonicalPath(); + } catch (IOException e) { + log.warn(sm.getString( + "hostConfig.canonicalizing", resource.getParentFile(), app.name), e); + return false; + } + + String canonicalAppBase; + try { + canonicalAppBase = host.getAppBaseFile().getCanonicalPath(); + } catch (IOException e) { + log.warn(sm.getString( + "hostConfig.canonicalizing", host.getAppBaseFile(), app.name), e); + return false; + } + + if (canonicalLocation.equals(canonicalAppBase)) { + // Resource is located in the appBase so it may be deleted return true; } + + String canonicalConfigBase; + try { + canonicalConfigBase = host.getConfigBaseFile().getCanonicalPath(); + } catch (IOException e) { + log.warn(sm.getString( + "hostConfig.canonicalizing", host.getConfigBaseFile(), app.name), e); + return false; + } + + if (canonicalLocation.equals(canonicalConfigBase) && + resource.getName().endsWith(".xml")) { + // Resource is an xml file in the configBase so it may be deleted + return true; + } + + // All other resources should not be deleted return false; } Modified: tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties?rev=1725907&r1=1725906&r2=1725907&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties Thu Jan 21 11:33:12 2016 @@ -86,7 +86,7 @@ expandWar.illegalPath=The archive [{0}] expandWar.missingJarEntry=Cannot get input stream for JarEntry "{0}" - broken WAR file? failedContext.start=Failed to process either the global, per-host or context-specific context.xml file therefore the [{0}] Context cannot be started. hostConfig.appBase=Application base [{1}] for host [{0}] does not exist or is not a directory. deployOnStartUp and autoDeploy have been set to false to prevent deployment errors. Other errors may still occur. -hostConfig.canonicalizing=Error delete redeploy resources from context [{0}] +hostConfig.canonicalizing=Unable to determine canonical path for [{0}] while attempting to undeploy [{1}] hostConfig.cce=Lifecycle event data object {0} is not a Host hostConfig.context.remove=Error while removing context [{0}] hostConfig.context.restart=Error during context [{0}] restart @@ -119,6 +119,7 @@ hostConfig.reload=Reloading context [{0} hostConfig.start=HostConfig: Processing START hostConfig.stop=HostConfig: Processing STOP hostConfig.undeploy=Undeploying context [{0}] +hostConfig.resourceNotAbsolute=Unable to remove resource from context [{0}] since [{1}] is not absolute hostConfig.undeployVersion=Undeploying old version of context [{0}] which has no active session userConfig.database=Exception loading user database userConfig.deploy=Deploying web application for user {0} --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org