craigmcc    02/05/04 11:37:50

  Modified:    catalina/src/share/org/apache/catalina/servlets
                        ManagerServlet.java
  Log:
  Make the "/deploy" command recognize a "META-INF/context.xml" file embedded
  inside the WAR, and process it as a context configuration file.  This allows
  deployment tool clients to customize the configuration of a webapp with
  exactly the same degree of freedom as those that use the "/install" command,
  with the added benefit of being able to deploy onto a Tomcat instance
  running on a different server.
  
  Revision  Changes    Path
  1.20      +193 -34   
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.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- ManagerServlet.java       8 Apr 2002 17:46:08 -0000       1.19
  +++ ManagerServlet.java       4 May 2002 18:37:49 -0000       1.20
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java,v
 1.19 2002/04/08 17:46:08 craigmcc Exp $
  - * $Revision: 1.19 $
  - * $Date: 2002/04/08 17:46:08 $
  + * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/ManagerServlet.java,v
 1.20 2002/05/04 18:37:49 craigmcc Exp $
  + * $Revision: 1.20 $
  + * $Date: 2002/05/04 18:37:49 $
    *
    * ====================================================================
    *
  @@ -74,6 +74,8 @@
   import java.net.URL;
   import java.util.Enumeration;
   import java.util.Iterator;
  +import java.util.jar.JarEntry;
  +import java.util.jar.JarFile;
   import javax.naming.InitialContext;
   import javax.naming.NameClassPair;
   import javax.naming.NamingEnumeration;
  @@ -196,7 +198,7 @@
    * </ul>
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.19 $ $Date: 2002/04/08 17:46:08 $
  + * @version $Revision: 1.20 $ $Date: 2002/05/04 18:37:49 $
    */
   
   public class ManagerServlet
  @@ -219,6 +221,14 @@
   
   
       /**
  +     * File object representing the directory into which the deploy() command
  +     * will store the WAR and context configuration files that have been
  +     * uploaded.
  +     */
  +    protected File deployed = null;
  +
  +
  +    /**
        * The Deployer container that contains our own web application's Context,
        * along with the associated Contexts for web applications that we
        * are managing.
  @@ -435,6 +445,10 @@
               global = ((StandardServer) server).getGlobalNamingContext();
           }
   
  +        // Calculate the directory into which we will be deploying applications
  +        deployed = (File) getServletContext().getAttribute
  +            ("javax.servlet.context.tempdir");
  +
           // Log debugging messages as necessary
           if (debug >= 1) {
               log("init: Associated with Deployer '" +
  @@ -488,46 +502,52 @@
           }
   
           // Upload the web application archive to a local WAR file
  -        File tempDir = (File) getServletContext().getAttribute
  -            ("javax.servlet.context.tempdir");
  -        File localWar = new File(tempDir, basename + ".war");
  -        localWar.delete();
  +        File localWar = new File(deployed, basename + ".war");
  +        if (debug >= 2) {
  +            log("Uploading WAR file to " + localWar);
  +        }
           try {
  -            if (debug >= 2) {
  -                log("Uploading WAR file to " + localWar);
  -            }
  -            ServletInputStream istream = request.getInputStream();
  -            BufferedOutputStream ostream =
  -                new BufferedOutputStream(new FileOutputStream(localWar), 1024);
  -            byte buffer[] = new byte[1024];
  -            while (true) {
  -                int n = istream.read(buffer);
  -                if (n < 0) {
  -                    break;
  -                }
  -                ostream.write(buffer, 0, n);
  -            }
  -            ostream.flush();
  -            ostream.close();
  -            istream.close();
  +            uploadWar(request, localWar);
           } catch (IOException e) {
               log("managerServlet.upload[" + displayPath + "]", e);
               writer.println(sm.getString("managerServlet.exception",
                                           e.toString()));
  -            localWar.delete();
               return;
           }
   
  -        // Deploy the local WAR file
  +        // Extract the nested context deployment file (if any)
  +        File localXml = new File(deployed, basename + ".xml");
  +        if (debug >= 2) {
  +            log("Extracting XML file to " + localXml);
  +        }
           try {
  -            deployer.install(path,
  -                             new URL("jar:file:" +
  -                                     localWar.getAbsolutePath() + "!/"));
  +            extractXml(localWar, localXml);
  +        } catch (IOException e) {
  +            log("managerServlet.extract[" + displayPath + "]", e);
  +            writer.println(sm.getString("managerServlet.exception",
  +                                        e.toString()));
  +            return;
  +        }
  +
  +        // Deploy this web application
  +        try {
  +            URL warURL =
  +                new URL("jar:file:" + localWar.getAbsolutePath() + "!/");
  +            URL xmlURL = null;
  +            if (localXml.exists()) {
  +                xmlURL = new URL("file:" + localXml.getAbsolutePath());
  +            }
  +            if (xmlURL != null) {
  +                deployer.install(xmlURL, warURL);
  +            } else {
  +                deployer.install(path, warURL);
  +            }
           } catch (Throwable t) {
               log("ManagerServlet.deploy[" + displayPath + "]", t);
               writer.println(sm.getString("managerServlet.exception",
                                           t.toString()));
               localWar.delete();
  +            localXml.delete();
               return;
           }
   
  @@ -1034,16 +1054,14 @@
               }
   
               // Validate the docBase path of this application
  -            File tempDir = (File) getServletContext().getAttribute
  -                ("javax.servlet.context.tempdir");
  -            String tempDirPath = tempDir.getCanonicalPath();
  +            String deployedPath = deployed.getCanonicalPath();
               String docBase = context.getDocBase();
               File docBaseDir = new File(docBase);
               if (!docBaseDir.isAbsolute()) {
                   docBaseDir = new File(appBaseDir, docBase);
               }
               String docBasePath = docBaseDir.getCanonicalPath();
  -            if (!docBasePath.startsWith(tempDirPath)) {
  +            if (!docBasePath.startsWith(deployedPath)) {
                   writer.println(sm.getString("managerServlet.noDocBase",
                                               displayPath));
                   return;
  @@ -1059,6 +1077,10 @@
               } else {
                   docBaseDir.delete();  // Delete the WAR file
               }
  +            String docBaseXmlPath =
  +                docBasePath.substring(0, docBasePath.length() - 4) + ".xml";
  +            File docBaseXml = new File(docBaseXmlPath);
  +            docBaseXml.delete();
               writer.println(sm.getString("managerServlet.undeployed",
                                           displayPath));
   
  @@ -1071,6 +1093,86 @@
       }
   
   
  +    // -------------------------------------------------------- Support Methods
  +
  +
  +    /**
  +     * Extract the context configuration file from the specified WAR,
  +     * if it is present.  If it is not present, ensure that the corresponding
  +     * file does not exist.
  +     *
  +     * @param war File object representing the WAR
  +     * @param xml File object representing where to store the extracted
  +     *  context configuration file (if it exists)
  +     *
  +     * @exception IOException if an i/o error occurs
  +     */
  +    protected void extractXml(File war, File xml) throws IOException {
  +
  +        xml.delete();
  +        JarFile jar = null;
  +        JarEntry entry = null;
  +        InputStream istream = null;
  +        BufferedOutputStream ostream = null;
  +        try {
  +            jar = new JarFile(war);
  +            entry = jar.getJarEntry("META-INF/context.xml");
  +            if (entry == null) {
  +                return;
  +            }
  +            istream = jar.getInputStream(entry);
  +            ostream =
  +                new BufferedOutputStream(new FileOutputStream(xml), 1024);
  +            byte buffer[] = new byte[1024];
  +            while (true) {
  +                int n = istream.read(buffer);
  +                if (n < 0) {
  +                    break;
  +                }
  +                ostream.write(buffer, 0, n);
  +            }
  +            ostream.flush();
  +            ostream.close();
  +            ostream = null;
  +            istream.close();
  +            istream = null;
  +            entry = null;
  +            jar.close();
  +            jar = null;
  +        } catch (IOException e) {
  +            xml.delete();
  +            throw e;
  +        } finally {
  +            if (ostream != null) {
  +                try {
  +                    ostream.close();
  +                } catch (Throwable t) {
  +                    ;
  +                }
  +                ostream = null;
  +            }
  +            if (istream != null) {
  +                try {
  +                    istream.close();
  +                } catch (Throwable t) {
  +                    ;
  +                }
  +                istream = null;
  +            }
  +            entry = null;
  +            if (jar != null) {
  +                try {
  +                    jar.close();
  +                } catch (Throwable t) {
  +                    ;
  +                }
  +                jar = null;
  +            }
  +        }
  +
  +    }
  +
  +
       /**
        * Delete the specified directory, including all of its contents and
        * subdirectories recursively.
  @@ -1092,6 +1194,63 @@
               }
           }
           dir.delete();
  +
  +    }
  +
  +
  +    /**
  +     * Upload the WAR file included in this request, and store it at the
  +     * specified file location.
  +     *
  +     * @param request The servlet request we are processing
  +     * @param file The file into which we should store the uploaded WAR
  +     *
  +     * @exception IOException if an I/O error occurs during processing
  +     */
  +    protected void uploadWar(HttpServletRequest request, File war)
  +        throws IOException {
  +
  +        war.delete();
  +        ServletInputStream istream = null;
  +        BufferedOutputStream ostream = null;
  +        try {
  +            istream = request.getInputStream();
  +            ostream =
  +                new BufferedOutputStream(new FileOutputStream(war), 1024);
  +            byte buffer[] = new byte[1024];
  +            while (true) {
  +                int n = istream.read(buffer);
  +                if (n < 0) {
  +                    break;
  +                }
  +                ostream.write(buffer, 0, n);
  +            }
  +            ostream.flush();
  +            ostream.close();
  +            ostream = null;
  +            istream.close();
  +            istream = null;
  +        } catch (IOException e) {
  +            war.delete();
  +            throw e;
  +        } finally {
  +            if (ostream != null) {
  +                try {
  +                    ostream.close();
  +                } catch (Throwable t) {
  +                    ;
  +                }
  +                ostream = null;
  +            }
  +            if (istream != null) {
  +                try {
  +                    istream.close();
  +                } catch (Throwable t) {
  +                    ;
  +                }
  +                istream = null;
  +            }
  +        }
   
       }
   
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to