Return-Path: Delivered-To: apmail-jakarta-tomcat-dev-archive@apache.org Received: (qmail 99355 invoked from network); 28 Feb 2002 06:11:12 -0000 Received: from unknown (HELO nagoya.betaversion.org) (192.18.49.131) by daedalus.apache.org with SMTP; 28 Feb 2002 06:11:12 -0000 Received: (qmail 27000 invoked by uid 97); 28 Feb 2002 06:11:09 -0000 Delivered-To: qmlist-jakarta-archive-tomcat-dev@jakarta.apache.org Received: (qmail 26966 invoked by uid 97); 28 Feb 2002 06:11:08 -0000 Mailing-List: contact tomcat-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Tomcat Developers List" Reply-To: "Tomcat Developers List" Delivered-To: mailing list tomcat-dev@jakarta.apache.org Received: (qmail 26955 invoked by uid 97); 28 Feb 2002 06:11:07 -0000 Date: 28 Feb 2002 06:10:55 -0000 Message-ID: <20020228061055.14249.qmail@icarus.apache.org> From: craigmcc@apache.org To: jakarta-tomcat-4.0-cvs@apache.org Subject: cvs commit: jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets ManagerServlet.java X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N craigmcc 02/02/27 22:10:55 Modified: catalina/src/share/org/apache/catalina/servlets ManagerServlet.java Log: Refine the mechanism used for the /deploy command so that undeploy/redeploy works reliably. Revision Changes Path 1.15 +61 -114 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java Index: ManagerServlet.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- ManagerServlet.java 27 Feb 2002 22:43:56 -0000 1.14 +++ ManagerServlet.java 28 Feb 2002 06:10:55 -0000 1.15 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java,v 1.14 2002/02/27 22:43:56 craigmcc Exp $ - * $Revision: 1.14 $ - * $Date: 2002/02/27 22:43:56 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java,v 1.15 2002/02/28 06:10:55 craigmcc Exp $ + * $Revision: 1.15 $ + * $Date: 2002/02/28 06:10:55 $ * * ==================================================================== * @@ -182,7 +182,7 @@ * * * @author Craig R. McClanahan - * @version $Revision: 1.14 $ $Date: 2002/02/27 22:43:56 $ + * @version $Revision: 1.15 $ $Date: 2002/02/28 06:10:55 $ */ public class ManagerServlet @@ -432,6 +432,7 @@ log("deploy: Deploying web application at '" + path + "'"); } + // Validate the requested context path if ((path == null) || (!path.startsWith("/") && path.equals(""))) { writer.println(sm.getString("managerServlet.invalidPath", path)); return; @@ -440,19 +441,30 @@ if (displayPath.equals("")) { displayPath = "/"; } + String basename = null; + if (path.equals("")) { + basename = "_"; + } else { + basename = path.substring(1); + } + if (deployer.findDeployedApp(path) != null) { + writer.println + (sm.getString("managerServlet.alreadyContext", displayPath)); + return; + } // Upload the web application archive to a temporary JAR file File tempDir = (File) getServletContext().getAttribute ("javax.servlet.context.tempdir"); - File tempJar = new File(tempDir, "webapp.war"); - tempJar.delete(); + File localWar = new File(tempDir, basename + ".war"); + localWar.delete(); try { if (debug >= 2) { - log("Uploading WAR file to " + tempJar); + log("Uploading WAR file to " + localWar); } ServletInputStream istream = request.getInputStream(); BufferedOutputStream ostream = - new BufferedOutputStream(new FileOutputStream(tempJar), 1024); + new BufferedOutputStream(new FileOutputStream(localWar), 1024); byte buffer[] = new byte[1024]; while (true) { int n = istream.read(buffer); @@ -468,99 +480,24 @@ log("managerServlet.upload[" + displayPath + "]", e); writer.println(sm.getString("managerServlet.exception", e.toString())); - tempJar.delete(); + localWar.delete(); return; } - // Validate that the context path and directory name are available - if (deployer.findDeployedApp(path) != null) { - writer.println - (sm.getString("managerServlet.alreadyContext", displayPath)); - tempJar.delete(); - return; - } - if (!(context.getParent() instanceof Host)) { - writer.println(sm.getString("managerServlet.noAppBase", - displayPath)); - tempJar.delete(); - return; - } - String appBase = ((Host) context.getParent()).getAppBase(); - File appBaseDir = new File(appBase); - if (!appBaseDir.isAbsolute()) { - appBaseDir = new File(System.getProperty("catalina.base"), - appBase); - } - String docBase = displayPath.substring(1); - if (docBase.length() < 1) { - docBase = "_"; - } - File docBaseDir = new File(appBaseDir, docBase); - if (docBaseDir.exists()) { - writer.println(sm.getString("managerServlet.alreadyDocBase", - docBaseDir)); - tempJar.delete(); - return; - } - File tempBaseDir = new File(tempDir, docBase); - - // Unpack the web application into a temporary directory + // Deploy the local WAR file try { - - // Open the uploaded WAR file - if (debug >= 2) { - log("Opening WAR file " + tempJar.getPath()); - } - JarFile jarFile = new JarFile(tempJar); - - // Create a temporary directory - if (debug >= 2) { - log("deploy: Creating WAR directory " + tempBaseDir); - } - tempBaseDir.mkdir(); - - // Unpack the contents of the uploaded WAR file - Enumeration jarEntries = jarFile.entries(); - while (jarEntries.hasMoreElements()) { - JarEntry jarEntry = (JarEntry) jarEntries.nextElement(); - String name = jarEntry.getName(); - int last = name.lastIndexOf('/'); - if (last >= 0) { - File parent = new File(tempBaseDir, - name.substring(0, last)); - parent.mkdirs(); - } - if (name.endsWith("/")) { - continue; - } - InputStream istream = jarFile.getInputStream(jarEntry); - deployExpand(istream, tempBaseDir, name); - istream.close(); - } - jarFile.close(); - - // Rename the temporary directory to a corresponding name - // in appBase (which will cause the app to be auto-deployed) - if (!tempBaseDir.renameTo(docBaseDir)) { - log("Cannot rename " + tempBaseDir + " to " + docBaseDir); - writer.println(sm.getString("managerServlet.noRename", - displayPath)); - undeployDir(tempBaseDir); - tempJar.delete(); - return; - } - - } catch (IOException e) { - log("managerServlet.unpack[" + displayPath + "]", e); + deployer.install(path, + new URL("jar:file:" + + localWar.getAbsolutePath() + "!/")); + } catch (Throwable t) { + log("ManagerServlet.deploy[" + displayPath + "]", t); writer.println(sm.getString("managerServlet.exception", - e.toString())); - undeployDir(docBaseDir); - tempJar.delete(); + t.toString())); + localWar.delete(); return; } // Acknowledge successful completion of this deploy command - tempJar.delete(); writer.println(sm.getString("managerServlet.installed", displayPath)); @@ -976,43 +913,53 @@ return; } - // Validate the owning Host of this Context - if (!(context.getParent() instanceof Host)) { - writer.println(sm.getString("managerServlet.noAppBase", - displayPath)); - return; - } - String appBase = ((Host) context.getParent()).getAppBase(); - File appBaseDir = new File(appBase); - if (!appBaseDir.isAbsolute()) { - appBaseDir = new File(System.getProperty("catalina.base"), - appBase); + // Identify the appBase of the owning Host of this Context (if any) + String appBase = null; + File appBaseDir = null; + String appBasePath = null; + if (context.getParent() instanceof Host) { + appBase = ((Host) context.getParent()).getAppBase(); + appBaseDir = new File(appBase); + if (!appBaseDir.isAbsolute()) { + appBaseDir = new File(System.getProperty("catalina.base"), + appBase); + } + appBasePath = appBaseDir.getCanonicalPath(); } - // Validate the docBase directory of this application + // Validate the docBase path of this application + File tempDir = (File) getServletContext().getAttribute + ("javax.servlet.context.tempdir"); + String tempDirPath = tempDir.getCanonicalPath(); String docBase = context.getDocBase(); File docBaseDir = new File(docBase); if (!docBaseDir.isAbsolute()) { docBaseDir = new File(appBaseDir, docBase); } - if (!docBaseDir.getCanonicalPath(). - startsWith(appBaseDir.getCanonicalPath())) { - writer.println(sm.getString("managerServlet.noDocBase", - displayPath)); - return; + String docBasePath = docBaseDir.getCanonicalPath(); + boolean ok = false; + if (docBasePath.startsWith(tempDirPath)) { + ok = true; + } else if ((appBasePath != null) && + docBasePath.startsWith(appBasePath)) { + ok = true; } - if (!docBaseDir.isDirectory()) { - writer.println(sm.getString("managerServlet.noDirectory", + if (!ok) { + writer.println(sm.getString("managerServlet.noDocBase", displayPath)); return; } - // Remove this web application and its associated docBase directory + // Remove this web application and its associated docBase if (debug >= 2) { - log("Undeploying document base " + docBaseDir); + log("Undeploying document base " + docBasePath); } deployer.remove(path); - undeployDir(docBaseDir); + if (docBaseDir.isDirectory()) { + undeployDir(docBaseDir); + } else { + docBaseDir.delete(); // WAR file + } writer.println(sm.getString("managerServlet.undeployed", displayPath)); -- To unsubscribe, e-mail: For additional commands, e-mail: