Author: markt Date: Mon Nov 25 23:55:31 2013 New Revision: 1545462 URL: http://svn.apache.org/r1545462 Log: Backport automatic deployment changes part 19 Add support for a per Context copyXML attribute
Added: tomcat/tc7.0.x/trunk/test/deployment/contextCopyXMLFalse.war - copied unchanged from r1489812, tomcat/trunk/test/deployment/contextCopyXMLFalse.war tomcat/tc7.0.x/trunk/test/deployment/contextCopyXMLTrue.war - copied unchanged from r1489812, tomcat/trunk/test/deployment/contextCopyXMLTrue.war Modified: tomcat/tc7.0.x/trunk/ (props changed) tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/TestHostConfigAutomaticDeployment.java Propchange: tomcat/tc7.0.x/trunk/ ------------------------------------------------------------------------------ Merged /tomcat/trunk:r1489633,1489648,1489812,1505929 Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1545462&r1=1545461&r2=1545462&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java Mon Nov 25 23:55:31 2013 @@ -524,6 +524,12 @@ public class StandardContext extends Con /** + * Context level override for default {@link StandardHost#isCopyXML()}. + */ + private boolean copyXML = false; + + + /** * The default context override flag for this web application. */ private boolean override = false; @@ -2467,6 +2473,17 @@ public class StandardContext extends Con } + + public boolean getCopyXML() { + return copyXML; + } + + + public void setCopyXML(boolean copyXML) { + this.copyXML = copyXML; + } + + /** * Return the Java class name of the Wrapper implementation used * for servlets registered in this Context. Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java?rev=1545462&r1=1545461&r2=1545462&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java Mon Nov 25 23:55:31 2013 @@ -56,6 +56,7 @@ import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleEvent; import org.apache.catalina.LifecycleListener; import org.apache.catalina.Manager; +import org.apache.catalina.core.StandardContext; import org.apache.catalina.core.StandardHost; import org.apache.catalina.util.ContextName; import org.apache.catalina.util.IOTools; @@ -864,68 +865,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(configBase(), cn.getBaseName() + ".xml"); - } else { - xml = new File(appBase(), - cn.getBaseName() + "/META-INF/context.xml"); - } - boolean xmlInWar = false; - if (deployXML && !xml.exists()) { + File xml = new File(appBase(), + 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 { @@ -938,17 +896,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 (digesterLock) { try { context = (Context) digester.parse(xml); @@ -964,6 +914,7 @@ public class HostConfig context.setConfigFile(xml.toURI().toURL()); } else if (deployXML && xmlInWar) { synchronized (digesterLock) { + JarEntry entry = null; try { jar = new JarFile(war); entry = @@ -1004,7 +955,96 @@ 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(); + } + + // If Host is using default value Context can override it. + if (!copyThisXml && context instanceof StandardContext) { + copyThisXml = ((StandardContext) context).getCopyXML(); + } + if (xmlInWar && copyThisXml) { + // Change location of XML file to config base + xml = new File(configBase(), 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())); @@ -1114,8 +1154,7 @@ public class HostConfig File xml = new File(dir, Constants.ApplicationContextXml); File xmlCopy = new File(configBase(), cn.getBaseName() + ".xml"); - DeployedApplication deployedApp = new DeployedApplication(cn.getName(), - xml.exists() && deployXML && copyXML); + DeployedApplication deployedApp; try { if (deployXML && xml.exists()) { @@ -1131,7 +1170,14 @@ public class HostConfig digester.reset(); } } - if (copyXML) { + + boolean copyThisXml = copyXML; + if (copyThisXml == false && context instanceof StandardContext) { + // Host is using default value. Context may override it. + copyThisXml = ((StandardContext) context).getCopyXML(); + } + + if (copyThisXml) { InputStream is = null; OutputStream os = null; try { @@ -1174,6 +1220,9 @@ public class HostConfig log.error(sm.getString("hostConfig.deployDir.error", dir.getAbsolutePath()), t); } finally { + deployedApp = new DeployedApplication(cn.getName(), + xml.exists() && deployXML && copyXML); + // Fake re-deploy resource to detect if a WAR is added at a later // point deployedApp.redeployResources.put(dir.getAbsolutePath() + ".war", Modified: tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/TestHostConfigAutomaticDeployment.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/TestHostConfigAutomaticDeployment.java?rev=1545462&r1=1545461&r2=1545462&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/TestHostConfigAutomaticDeployment.java (original) +++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/TestHostConfigAutomaticDeployment.java Mon Nov 25 23:55:31 2013 @@ -50,6 +50,10 @@ public class TestHostConfigAutomaticDepl new File("test/deployment/context.xml"); private static final File WAR_XML_SOURCE = new File("test/deployment/context.war"); + private static final File WAR_XML_COPYXML_FALSE_SOURCE = + new File("test/deployment/contextCopyXMLFalse.war"); + private static final File WAR_XML_COPYXML_TRUE_SOURCE = + new File("test/deployment/contextCopyXMLTrue.war"); private static final File WAR_XML_UNPACKWAR_FALSE_SOURCE = new File("test/deployment/contextUnpackWARFalse.war"); private static final File WAR_XML_UNPACKWAR_TRUE_SOURCE = @@ -1751,6 +1755,89 @@ public class TestHostConfigAutomaticDepl } } + + /* + * Test context copyXML setting. + * If context.copyXML != Host.copyXML the Host wins. + * For external WARs, a context.xml must always already exist + */ + @Test + public void testCopyXMLFFF() throws Exception { + doTestCopyXML(false, false, false, false); + } + + @Test + public void testCopyXMLFFT() throws Exception { + doTestCopyXML(false, false, true, true); + } + + @Test + public void testCopyXMLFTF() throws Exception { + doTestCopyXML(false, true, false, true); + } + + @Test + public void testCopyXMLFTT() throws Exception { + doTestCopyXML(false, true, true, true); + } + + @Test + public void testCopyXMLTFF() throws Exception { + doTestCopyXML(true, false, false, true); + } + + @Test + public void testCopyXMLTFT() throws Exception { + doTestCopyXML(true, false, true, true); + } + + @Test + public void testCopyXMLTTF() throws Exception { + doTestCopyXML(true, true, false, true); + } + + @Test + public void testCopyXMLTTT() throws Exception { + doTestCopyXML(true, true, true, true); + } + + private void doTestCopyXML(boolean copyXmlHost, boolean copyXmlWar, + boolean external, boolean resultXml) throws Exception { + + Tomcat tomcat = getTomcatInstance(); + StandardHost host = (StandardHost) tomcat.getHost(); + + host.setCopyXML(copyXmlHost); + + tomcat.start(); + + File war; + if (copyXmlWar) { + war = createWar(WAR_XML_COPYXML_TRUE_SOURCE, !external); + } else { + war = createWar(WAR_XML_COPYXML_FALSE_SOURCE, !external); + } + if (external) { + createXmlInConfigBaseForExternal(war); + } + + host.backgroundProcess(); + + File xml = new File(getConfigBaseFile(host), + APP_NAME.getBaseName() + ".xml"); + Assert.assertEquals( + Boolean.valueOf(resultXml), Boolean.valueOf(xml.isFile())); + + Context context = (Context) host.findChild(APP_NAME.getName()); + if (external) { + Assert.assertEquals(XML_COOKIE_NAME, + context.getSessionCookieName()); + } else { + Assert.assertEquals(WAR_COOKIE_NAME, + context.getSessionCookieName()); + } + } + // Static methods to compensate for methods that are present in 8.0.x but // not in 7.0.x --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org