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: [email protected]
For additional commands, e-mail: [email protected]