Author: markt
Date: Tue Jun  4 21:42:12 2013
New Revision: 1489633

URL: http://svn.apache.org/r1489633
Log:
Refactor WAR deployment to make a per Context copyXML attribute possible

Modified:
    tomcat/trunk/java/org/apache/catalina/startup/HostConfig.java

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=1489633&r1=1489632&r2=1489633&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/HostConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/HostConfig.java Tue Jun  4 
21:42:12 2013
@@ -784,68 +784,25 @@ public class HostConfig
 
         // Checking for a nested /META-INF/context.xml
         JarFile jar = null;
-        JarEntry entry = null;
         InputStream istream = null;
         FileOutputStream fos = null;
         BufferedOutputStream ostream = null;
-        File xml;
-        if (copyXML) {
-            xml = new File(host.getConfigBaseFile(), cn.getBaseName() + 
".xml");
-        } else {
-            xml = new File(host.getAppBaseFile(),
-                    cn.getBaseName() + "/META-INF/context.xml");
-        }
-        boolean xmlInWar = false;
 
-        if (deployXML && !xml.exists()) {
+        File xml = new File(host.getAppBaseFile(),
+                cn.getBaseName() + "/META-INF/context.xml");
+
+        boolean xmlInWar = false;
+        if (deployXML) {
+            JarEntry entry = null;
             try {
                 jar = new JarFile(war);
                 entry = jar.getJarEntry(Constants.ApplicationContextXml);
                 if (entry != null) {
                     xmlInWar = true;
                 }
-                if ((copyXML || unpackWARs) && xmlInWar) {
-                    istream = jar.getInputStream(entry);
-
-                    fos = new FileOutputStream(xml);
-                    ostream = new BufferedOutputStream(fos, 1024);
-                    byte buffer[] = new byte[1024];
-                    while (true) {
-                        int n = istream.read(buffer);
-                        if (n < 0) {
-                            break;
-                        }
-                        ostream.write(buffer, 0, n);
-                    }
-                    ostream.flush();
-                }
             } catch (IOException e) {
                 /* Ignore */
             } finally {
-                if (ostream != null) {
-                    try {
-                        ostream.close();
-                    } catch (IOException ioe) {
-                        // Ignore
-                    }
-                    ostream = null;
-                }
-                if (fos != null) {
-                    try {
-                        fos.close();
-                    } catch (IOException ioe) {
-                        // Ignore
-                    }
-                    fos = null;
-                }
-                if (istream != null) {
-                    try {
-                        istream.close();
-                    } catch (IOException ioe) {
-                        // Ignore
-                    }
-                    istream = null;
-                }
                 entry = null;
                 if (jar != null) {
                     try {
@@ -858,17 +815,9 @@ public class HostConfig
             }
         }
 
-        DeployedApplication deployedApp = new DeployedApplication(cn.getName(),
-                xml.exists() && deployXML && copyXML);
-
-        // Deploy the application in this WAR file
-        if(log.isInfoEnabled())
-            log.info(sm.getString("hostConfig.deployWar",
-                    war.getAbsolutePath()));
-
         Context context = null;
         try {
-            if (deployXML && xml.exists()) {
+            if (deployXML && xml.exists() && !copyXML) {
                 synchronized (digester) {
                     try {
                         context = (Context) digester.parse(xml);
@@ -886,6 +835,7 @@ public class HostConfig
                 context.setConfigFile(xml.toURI().toURL());
             } else if (deployXML && xmlInWar) {
                 synchronized (digester) {
+                    JarEntry entry = null;
                     try {
                         jar = new JarFile(war);
                         entry =
@@ -926,7 +876,101 @@ public class HostConfig
             } else {
                 context = (Context) Class.forName(contextClass).newInstance();
             }
+        } catch (Throwable t) {
+            ExceptionUtils.handleThrowable(t);
+            log.error(sm.getString("hostConfig.deployWar.error",
+                    war.getAbsolutePath()), t);
+        } finally {
+            if (context == null) {
+                context = new FailedContext();
+            }
+        }
+
+        boolean copyThisXml = false;
+        if (deployXML) {
+            if (host instanceof StandardHost) {
+                copyThisXml = ((StandardHost) host).isCopyXML();
+            }
+
+            /**
+             * TODO
+             *
+            // If Host is using default value Context can override it.
+            if (!copyXML && context instanceof StandardContext) {
+                copyXML = ((StandardContext) context).getCopyXML();
+            }
+            */
+
+            if (xmlInWar && copyThisXml) {
+                // Change location of XML file to config base
+                xml = new File(host.getConfigBaseFile(),
+                        cn.getBaseName() + ".xml");
+                JarEntry entry = null;
+                try {
+                    jar = new JarFile(war);
+                    entry =
+                        jar.getJarEntry(Constants.ApplicationContextXml);
+                    istream = jar.getInputStream(entry);
 
+                    fos = new FileOutputStream(xml);
+                    ostream = new BufferedOutputStream(fos, 1024);
+                    byte buffer[] = new byte[1024];
+                    while (true) {
+                        int n = istream.read(buffer);
+                        if (n < 0) {
+                            break;
+                        }
+                        ostream.write(buffer, 0, n);
+                    }
+                    ostream.flush();
+                } catch (IOException e) {
+                    /* Ignore */
+                } finally {
+                    if (ostream != null) {
+                        try {
+                            ostream.close();
+                        } catch (IOException ioe) {
+                            // Ignore
+                        }
+                        ostream = null;
+                    }
+                    if (fos != null) {
+                        try {
+                            fos.close();
+                        } catch (IOException ioe) {
+                            // Ignore
+                        }
+                        fos = null;
+                    }
+                    if (istream != null) {
+                        try {
+                            istream.close();
+                        } catch (IOException ioe) {
+                            // Ignore
+                        }
+                        istream = null;
+                    }
+                    if (jar != null) {
+                        try {
+                            jar.close();
+                        } catch (IOException ioe) {
+                            // Ignore;
+                        }
+                        jar = null;
+                    }
+                }
+            }
+        }
+
+        DeployedApplication deployedApp = new DeployedApplication(cn.getName(),
+                xml.exists() && deployXML && copyXML);
+
+        // Deploy the application in this WAR file
+        if(log.isInfoEnabled())
+            log.info(sm.getString("hostConfig.deployWar",
+                    war.getAbsolutePath()));
+
+        try {
             // Populate redeploy resources with the WAR file
             deployedApp.redeployResources.put
                 (war.getAbsolutePath(), Long.valueOf(war.lastModified()));



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to