Author: dain
Date: Fri Sep  7 16:19:41 2007
New Revision: 573752

URL: http://svn.apache.org/viewvc?rev=573752&view=rev
Log:
First pass at an automated tomcat installer

Added:
    
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/ServerServlet.java
    
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/installer/
    
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/installer/InstallerServlet.java
    openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/resources/index.html
Modified:
    openejb/trunk/openejb3/assembly/openejb-tomcat/maven.xml
    openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/assembly/bin.xml
    
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/resources/WEB-INF/web.xml
    
openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/OpenEJBListener.java
    
openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/TomcatRemoteTestServer.java

Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/maven.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/maven.xml?rev=573752&r1=573751&r2=573752&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/maven.xml (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/maven.xml Fri Sep  7 
16:19:41 2007
@@ -97,9 +97,9 @@
       </j:if>
 
       <!-- Add OpenEJBListener -->
-      <replace file="${tomcat.home}/conf/server.xml" 
token='shutdown="SHUTDOWN">' value='shutdown="SHUTDOWN"  > &lt;Listener 
className="org.apache.openejb.loader.OpenEJBListener" />'/>
+      <!--<replace file="${tomcat.home}/conf/server.xml" 
token='shutdown="SHUTDOWN">' value='shutdown="SHUTDOWN"  > &lt;Listener 
className="org.apache.openejb.loader.OpenEJBListener" />'/>-->
       <!-- Add openejb loader jar -->
-      <copy 
file="${user.home}/.m2/repository/org/apache/openejb/openejb-loader/${openejb.version}/openejb-loader-${openejb.version}.jar"
 todir="${tomcat.lib}" />
+      <!--<copy 
file="${user.home}/.m2/repository/org/apache/openejb/openejb-loader/${openejb.version}/openejb-loader-${openejb.version}.jar"
 todir="${tomcat.lib}" />-->
     </goal>
 
     <goal name="setup:tomcat-src">
@@ -130,13 +130,15 @@
       <j:choose>
         <j:when test="${systemScope['os.name'].startsWith('Windows')}">
           <exec executable="${tomcat.home}/bin/startup.bat" os="Windows 
NT,Windows 2000,Windows XP">
-            <env key="JAVA_OPTS" 
value="-javaagent:${tomcat.webapps}\openejb\lib\openejb-javaagent-${openejb.version}.jar"/>
+            <!--<env key="JAVA_OPTS" 
value="-javaagent:${tomcat.webapps}\openejb\lib\openejb-javaagent-${openejb.version}.jar
 -Dcom.sun.management.jmxremote"/>-->
+            <env key="JAVA_OPTS" value="-Dcom.sun.management.jmxremote"/>
             <env key="CATALINA_HOME" value="${tomcat.home}"/>
           </exec>
         </j:when>
         <j:otherwise>
           <exec executable="${tomcat.home}/bin/startup.sh">
-            <env key="JAVA_OPTS" 
value="-javaagent:${tomcat.webapps}/openejb/lib/openejb-javaagent-${openejb.version}.jar"/>
+            <!--<env key="JAVA_OPTS" 
value="-javaagent:${tomcat.webapps}/openejb/lib/openejb-javaagent-${openejb.version}.jar
 -Dcom.sun.management.jmxremote"/>-->
+            <env key="JAVA_OPTS" value="-Dcom.sun.management.jmxremote"/>
           </exec>
         </j:otherwise>
       </j:choose>
@@ -146,13 +148,15 @@
       <j:choose>
         <j:when test="${systemScope['os.name'].startsWith('Windows')}">
           <exec executable="${tomcat.home}/bin/startup.bat" os="Windows 
NT,Windows 2000,Windows XP">
-            <env key="JAVA_OPTS" value="-Dopenejb.home=${openejb.home} -Xdebug 
-Xnoagent -Djava.compiler=NONE 
-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 
-javaagent:${tomcat.webapps}\openejb\lib\openejb-javaagent-${openejb.version}.jar"/>
+            <!--<env key="JAVA_OPTS" value="-Dopenejb.home=${openejb.home} 
-Xdebug -Xnoagent -Djava.compiler=NONE 
-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 
-javaagent:${tomcat.webapps}\openejb\lib\openejb-javaagent-${openejb.version}.jar
 -Dcom.sun.management.jmxremote"/>-->
+            <env key="JAVA_OPTS" value="-Dopenejb.home=${openejb.home} -Xdebug 
-Xnoagent -Djava.compiler=NONE 
-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 
-Dcom.sun.management.jmxremote"/>
             <env key="CATALINA_HOME" value="${tomcat.home}"/>
           </exec>
         </j:when>
         <j:otherwise>
           <exec executable="${tomcat.home}/bin/startup.sh">
-            <env key="JAVA_OPTS" value="-Dopenejb.home=${openejb.home} -Xdebug 
-Xnoagent -Djava.compiler=NONE 
-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 
-javaagent:${tomcat.webapps}/openejb/lib/openejb-javaagent-${openejb.version}.jar"/>
+            <!--<env key="JAVA_OPTS" value="-Dopenejb.home=${openejb.home} 
-Xdebug -Xnoagent -Djava.compiler=NONE 
-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 
-javaagent:${tomcat.webapps}/openejb/lib/openejb-javaagent-${openejb.version}.jar
 -Dcom.sun.management.jmxremote"/>-->
+            <env key="JAVA_OPTS" value="-Dopenejb.home=${openejb.home} -Xdebug 
-Xnoagent -Djava.compiler=NONE 
-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 
-Dcom.sun.management.jmxremote"/>
           </exec>
         </j:otherwise>
       </j:choose>
@@ -180,7 +184,7 @@
     <goal name="setup:loader-webapp">
       <!-- Unzip webapp and set openejb.home -->
       <unjar src="${basedir}/target/openejb-tomcat-${openejb.version}-bin.zip" 
dest="${tomcat.webapps}"/>
-      <delete file="${tomcat.home}/lib/annotations-api.jar"/>
+      <!--<delete file="${tomcat.home}/lib/annotations-api.jar"/>-->
       
       <!--<u:file var="fileAsFile" 
name="${tomcat.dist}/conf/Catalina/localhost"/>-->
       <!--<j:if test="${!(fileAsFile.exists())}">-->

Modified: 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/assembly/bin.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/assembly/bin.xml?rev=573752&r1=573751&r2=573752&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/assembly/bin.xml 
(original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/assembly/bin.xml 
Fri Sep  7 16:19:41 2007
@@ -39,6 +39,13 @@
       </excludes>
     </fileSet>
     <fileSet>
+      <directory>target/classes</directory>
+      <outputDirectory>openejb/WEB-INF/classes</outputDirectory>
+      <includes>
+          <include>org/apache/openejb/tomcat/installer/**</include>
+      </includes>
+    </fileSet>
+    <fileSet>
       <directory>target</directory>
       <outputDirectory>openejb/lib</outputDirectory>
       <includes>
@@ -63,6 +70,7 @@
       <scope>runtime</scope>
       <includes>
           <include>org.apache.openejb:openejb-loader</include>
+          <include>org.codehaus.swizzle:swizzle-stream</include>
       </includes>
     </dependencySet>
   </dependencySets>

Added: 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/ServerServlet.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/ServerServlet.java?rev=573752&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/ServerServlet.java
 (added)
+++ 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/ServerServlet.java
 Fri Sep  7 16:19:41 2007
@@ -0,0 +1,51 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.tomcat;
+
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.ServiceException;
+import org.apache.openejb.server.ejbd.EjbServer;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+public class ServerServlet extends HttpServlet {
+    private EjbServer ejbServer;
+
+    public void init(ServletConfig config) {
+        ejbServer = SystemInstance.get().getComponent(EjbServer.class);
+    }
+
+    protected void service(HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException {
+        System.out.println(request.getContextPath() + " | " + 
request.getServletPath() + " | " + request.getPathInfo());
+        ServletInputStream in = request.getInputStream();
+        ServletOutputStream out = response.getOutputStream();
+        try {
+            ejbServer.service(in, out);
+        } catch (ServiceException e) {
+            e.printStackTrace();
+            throw new ServletException("ServerService error: " + 
ejbServer.getClass().getName() + " -- " + e.getMessage(), e);
+        }
+    }
+}

Added: 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/installer/InstallerServlet.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/installer/InstallerServlet.java?rev=573752&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/installer/InstallerServlet.java
 (added)
+++ 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/installer/InstallerServlet.java
 Fri Sep  7 16:19:41 2007
@@ -0,0 +1,491 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.tomcat.installer;
+
+import org.codehaus.swizzle.stream.DelimitedTokenReplacementInputStream;
+import org.codehaus.swizzle.stream.StringTokenHandler;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayInputStream;
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.lang.reflect.Method;
+import java.util.LinkedList;
+import java.util.Properties;
+
+/**
+ * Installs OpenEJB into Tomcat.
+ * <p/>
+ * NOTE: This servlet can not use any classes from OpenEJB since it is 
installing OpenEJB itself.
+ */
+public class InstallerServlet extends HttpServlet {
+    private ServletContext servletContext;
+
+    public void init(ServletConfig servletConfig) throws ServletException {
+        servletContext = servletConfig.getServletContext();
+    }
+
+    protected void doGet(HttpServletRequest req, HttpServletResponse res) 
throws ServletException, IOException {
+        res.setContentType("text/plain");
+        ServletOutputStream out = res.getOutputStream();
+        out.println("Running Verifier...");
+
+        try {
+            boolean agentInstalled = 
invokeStaticNoArgMethod("org.apache.openejb.javaagent.Agent", 
"getInstrumentation") != null;
+
+            Boolean listenerInstalled = (Boolean) 
invokeStaticNoArgMethod("org.apache.openejb.loader.OpenEJBListener", 
"isInstalled");
+            if (listenerInstalled == null) listenerInstalled = false;
+
+            boolean annotationJarRemoved;
+            try {
+                // Tomcat persistence context class is missing the properties 
method
+                Class<?> persistenceContextClass = 
Class.forName("javax.persistence.PersistenceContext");
+                persistenceContextClass.getMethod("properties", (Class[]) 
null);
+                annotationJarRemoved = true;
+            } catch (Exception e) {
+                annotationJarRemoved = false;
+            }
+
+            out.println("Agent " + (agentInstalled ? "" : "NOT ") + 
"Installed");
+            out.println("Listener " + (listenerInstalled ? "" : "NOT ") + 
"Installed");
+            out.println("Annotation Jar " + (annotationJarRemoved ? "" : "NOT 
") + "Removed");
+
+            String tomcatVersion = getTomcatVersion();
+            out.println("TomcatVersion = " + tomcatVersion);
+
+            // find catalina home directory
+            String catalinaHome = System.getProperty("catalina.home");
+            out.println("catalina.home=" + catalinaHome);
+            File catalinaHomeDir = new File(catalinaHome);
+            if (!catalinaHomeDir.exists()) {
+                out.println("Catalina home does not exist");
+                return;
+            }
+            if (!catalinaHomeDir.isDirectory()) {
+                out.println("Catalina home does not a directory");
+                return;
+            }
+
+            // find catalina base directory
+            String catalinaBase = System.getProperty("catalina.base");
+            out.println("catalina.base=" + catalinaBase);
+            File catalinaBaseDir = new File(catalinaBase);
+            if (!catalinaBaseDir.exists()) {
+                out.println("Catalina base does not exist");
+                return;
+            }
+            if (!catalinaBaseDir.isDirectory()) {
+                out.println("Catalina base does not a directory");
+                return;
+            }
+
+            // find tomcat lib directory
+            File libDir = new File(catalinaHomeDir, "lib");
+            out.println("lib=" + libDir.getAbsolutePath());
+            if (!libDir.exists()) {
+                out.println("lib dir does not exist");
+                return;
+            }
+            if (!libDir.isDirectory()) {
+                out.println("lib dir is not a directory");
+                return;
+            }
+
+            // find tomcat conf directory
+            File confDir = new File(catalinaBaseDir, "conf");
+            out.println("conf=" + confDir.getAbsolutePath());
+            if (!confDir.exists()) {
+                out.println("conf dir does not exist");
+                return;
+            }
+            if (!confDir.isDirectory()) {
+                out.println("conf dir is not a directory");
+                return;
+            }
+
+            // find tomcat server.xml file
+            File serverXml = new File(confDir, "server.xml");
+            out.println("serverXml=" + serverXml.getAbsolutePath());
+            if (!serverXml.exists()) {
+                out.println("server.xml file does not exist");
+                return;
+            }
+            if (!serverXml.canWrite()) {
+                out.println("server.xml file is not writable");
+                return;
+            }
+            if (!serverXml.isFile()) {
+                out.println("server.xml file is not a file");
+                return;
+            }
+
+            // find the tomcat bin directory
+            File binDir = new File(catalinaHomeDir, "bin");
+            out.println("bin=" + binDir.getAbsolutePath());
+            if (!binDir.exists()) {
+                out.println("bin dir does not exist");
+                return;
+            }
+            if (!binDir.isDirectory()) {
+                out.println("bin dir is not a directory");
+                return;
+            }
+
+            // find tomcat catalina.sh file
+            File catalinaSh = new File(binDir, "catalina.sh");
+            out.println("catalinaSh=" + catalinaSh.getAbsolutePath());
+            if (!catalinaSh.exists()) {
+                out.println("catalina.sh file does not exist");
+                return;
+            }
+            if (!catalinaSh.canWrite()) {
+                out.println("catalina.sh file is not writable");
+                return;
+            }
+            if (!catalinaSh.isFile()) {
+                out.println("catalina.sh file is not a file");
+                return;
+            }
+
+            // find openejb lib dir
+            String openejbLib = servletContext.getRealPath("lib");
+            if (openejbLib == null) {
+                out.println("Can not find OpenEJB lib directory");
+                return;
+            }
+            File openejbLibDir = new File(openejbLib);
+            out.println("OpenEJB lib=" + openejbLibDir.getAbsolutePath());
+            if (!openejbLibDir.exists()) {
+                out.println("OpenEJB lib dir does not exist");
+                return;
+            }
+            if (!openejbLibDir.isDirectory()) {
+                out.println("OpenEJB lib dir is not a directory");
+                return;
+            }
+
+            // find openejb-loader jar
+            File openejbLoaderJar = null;
+            for (File file : openejbLibDir.listFiles()) {
+                if (file.getName().startsWith("openejb-loader-") && 
file.getName().endsWith(".jar")) {
+                    openejbLoaderJar = file;
+                }
+            }
+            if (openejbLoaderJar == null) {
+                out.println("Can not find OpenEJB loader jar");
+                return;
+            }
+            out.println("openejbLoaderJar=" + 
openejbLoaderJar.getAbsolutePath());
+
+
+            // find openejb-javaagent jar
+            File openejbJavaagentJar = null;
+            for (File file : openejbLibDir.listFiles()) {
+                if (file.getName().startsWith("openejb-javaagent-") && 
file.getName().endsWith(".jar")) {
+                    openejbJavaagentJar = file;
+                }
+            }
+            if (openejbJavaagentJar == null) {
+                out.println("Can not find OpenEJB javaagent jar");
+                return;
+            }
+            out.println("openejbJavaagentJar=" + 
openejbJavaagentJar.getAbsolutePath());
+
+            String openejbJavaagentPath = 
catalinaBaseDir.toURI().relativize(openejbJavaagentJar.toURI()).getPath();
+            out.println("openejbJavaagentPath=" + openejbJavaagentPath);
+
+
+            out.println();
+            if (annotationJarRemoved) {
+                out.println("Annotation Jar already removed");
+            } else {
+                // copy loader jar to lib
+                File destination = new File(libDir, "annotations-api.jar");
+                if (destination.exists()) {
+                    out.flush();
+
+                    if (destination.delete()) {
+                        out.println("Deleted non-compliant (invalid) Tomcat 
annotation jar.");
+                    } else {
+                        out.println("Can not delete non-compliant (invalid) 
Tomcat annotation jar.  Jar havs been marked to be deleted on a normal VM 
exit.");
+                    }
+                }
+            }
+
+//            out.println();
+            if (listenerInstalled) {
+                out.println("OpenEJB Listener already installed");
+            } else {
+
+                boolean copyOpenEJBLoader = true;
+
+                // copy loader jar to lib
+                File destination = new File(libDir, 
openejbLoaderJar.getName());
+                if (destination.exists()) {
+                    out.flush();
+
+                    if (openejbLoaderJar.length() != destination.length()) {
+                        // md5 diff the files
+                    } else {
+                        out.println("OpenEJB loader jar already installed in 
Tomcat lib directory.");
+                        copyOpenEJBLoader = false;
+                    }
+                }
+
+                if (copyOpenEJBLoader) {
+                    copyFile(openejbLoaderJar, destination);
+                    out.println("Coppied " + openejbLoaderJar.getName() + " to 
the Tomcat lib directory.");
+                }
+
+                // add listener to server.xml
+                String serverXmlOriginal = readAll(serverXml);
+
+                // write backup
+                {
+                    File backupFile = new File(confDir, "server.xml.original");
+                    if (!backupFile.exists()) {
+                        FileOutputStream fileOutputStream = new 
FileOutputStream(backupFile);
+                        try {
+                            writeAll(new 
ByteArrayInputStream(serverXmlOriginal.getBytes()), fileOutputStream);
+                        } finally {
+                            close(fileOutputStream);
+                        }
+                    }
+                }
+
+//                out.println();
+//                out.println("====== ORIGINAL SERVER XML =====");
+//                out.println(serverXmlOriginal);
+
+                if 
(serverXmlOriginal.contains("org.apache.openejb.loader.OpenEJBListener")) {
+                    out.println("OpenEJB Listener already declared in Tomcat 
server.xml file.");
+                } else {
+                    String newServerXml = replace(serverXmlOriginal,
+                            "<Server",
+                            "<Server",
+                            ">",
+                            ">\r\n" +
+                                    "  <!-- OpenEJB plugin for Tomcat -->\r\n" 
+
+                                    "  <Listener 
className=\"org.apache.openejb.loader.OpenEJBListener\" />");
+
+//                out.println();
+//                out.println("====== NEW SERVER XML =====");
+//                out.println(newServerXml);
+
+                    // overwrite server.xml
+                    FileOutputStream fileOutputStream = new 
FileOutputStream(serverXml);
+                    try {
+                        writeAll(new 
ByteArrayInputStream(newServerXml.getBytes()), fileOutputStream);
+                    } finally {
+                        close(fileOutputStream);
+                    }
+
+                    out.println("Added OpenEJB listener to Tomcat server.xml 
file.");
+                }
+            }
+
+//            out.println();
+            if (agentInstalled) {
+                out.println("OpenEJB Agent already installed");
+            } else {
+
+                // add agent to catalina.sh
+                String catalinaShOriginal = readAll(catalinaSh);
+
+                // write backup
+                {
+                    File backupFile = new File(binDir, "catalina.sh.original");
+                    if (!backupFile.exists()) {
+                        FileOutputStream fileOutputStream = new 
FileOutputStream(backupFile);
+                        try {
+                            writeAll(new 
ByteArrayInputStream(catalinaShOriginal.getBytes()), fileOutputStream);
+                        } finally {
+                            close(fileOutputStream);
+                        }
+                    }
+                }
+
+//                out.println();
+//                out.println("====== ORIGINAL CATALINA SH =====");
+//                out.println(catalinaShOriginal);
+
+                if (catalinaShOriginal.contains("Add OpenEJB javaagent")) {
+                    out.println("OpenEJB javaagent already declared in Tomcat 
catalina.sh file.");
+                } else {
+                    String newCatalinaSh = catalinaShOriginal.replace("# ----- 
Execute The Requested Command",
+                            "# Add OpenEJB javaagent\n" +
+                            "if [ -r \"$CATALINA_BASE\"/" + 
openejbJavaagentPath + " ]; then\n" +
+                            "  JAVA_OPTS=\"\"-javaagent:$CATALINA_BASE/" + 
openejbJavaagentPath + "\" $JAVA_OPTS\"\n" +
+                            "fi\n" +
+                            "\n" +
+                            "# ----- Execute The Requested Command");
+//                    out.println();
+//                    out.println("====== NEW CATALINA SH =====");
+//                    out.println(newServerXml);
+
+                    // overwrite server.xml
+                    FileOutputStream fileOutputStream = new 
FileOutputStream(catalinaSh);
+                    try {
+                        writeAll(new 
ByteArrayInputStream(newCatalinaSh.getBytes()), fileOutputStream);
+                    } finally {
+                        close(fileOutputStream);
+                    }
+
+                    out.println("Added OpenEJB javaagent to Tomcat catalina.sh 
file.");
+                }
+            }
+
+        } catch (Throwable e) {
+            PrintStream printStream = new PrintStream(out, true);
+            e.printStackTrace(printStream);
+            printStream.flush();
+        }
+    }
+
+    private String replace(String inputText, String begin, String newBegin, 
String end, String newEnd) throws IOException {
+        BeginEndTokenHandler tokenHandler = new BeginEndTokenHandler(newBegin, 
newEnd);
+
+        ByteArrayInputStream in = new 
ByteArrayInputStream(inputText.getBytes());
+
+        InputStream replacementStream = new 
DelimitedTokenReplacementInputStream(in, begin, end, tokenHandler, true);
+        String newServerXml = readAll(replacementStream);
+        close(replacementStream);
+        return newServerXml;
+    }
+
+    private void copyFile(File source, File destination) throws IOException {
+        File destinationDir = destination.getParentFile();
+        if (!destinationDir.exists() && !destinationDir.mkdirs()) {
+            throw new java.io.IOException("Cannot create directory : " + 
destinationDir);
+        }
+
+        InputStream in = null;
+        OutputStream out = null;
+        try {
+            in = new FileInputStream(source);
+            out = new FileOutputStream(destination);
+            writeAll(in, out);
+        } finally {
+            close(in);
+            close(out);
+        }
+    }
+
+    private void writeAll(InputStream in, OutputStream out) throws IOException 
{
+        byte[] buffer = new byte[4096];
+        int count;
+        while ((count = in.read(buffer)) > 0) {
+            out.write(buffer, 0, count);
+        }
+        out.flush();
+    }
+
+    private String readAll(File file) throws IOException {
+        FileInputStream in = new FileInputStream(file);
+        try {
+            String text = readAll(in);
+            return text;
+        } finally {
+            close(in);
+        }
+    }
+
+    private String readAll(InputStream in) throws IOException {
+        // SwizzleStream block read methods are broken so read byte at a time
+        StringBuilder sb = new StringBuilder();
+        int i = in.read();
+        while (i != -1) {
+            sb.append((char) i);
+            i = in.read();
+        }
+        return sb.toString();
+    }
+
+    private String getTomcatVersion() {
+        String tomcatVersion = null;
+        try {
+            Properties properties = new Properties();
+            
properties.load(getClass().getClassLoader().getResourceAsStream("org/apache/catalina/util/ServerInfo.properties"));
+            tomcatVersion = properties.getProperty("server.number");
+        } catch (IOException e) {
+        }
+        return tomcatVersion;
+    }
+
+    private Object invokeStaticNoArgMethod(String className, String 
propertyName) {
+        try {
+            Class<?> clazz = loadClass(className, getClass().getClassLoader());
+            Method method = clazz.getMethod(propertyName);
+            Object result = method.invoke(null, (Object[]) null);
+            return result;
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    private Class<?> loadClass(String className, ClassLoader classLoader) 
throws ClassNotFoundException {
+        LinkedList<ClassLoader> loaders = new LinkedList<ClassLoader>();
+        for (ClassLoader loader = classLoader; loader != null; loader = 
loader.getParent()) {
+            loaders.addFirst(loader);
+        }
+        for (ClassLoader loader : loaders) {
+            try {
+                Class<?> clazz = Class.forName(className, true, loader);
+                return clazz;
+            } catch (ClassNotFoundException e) {
+            }
+        }
+        return null;
+    }
+
+    private void close(Closeable thing) {
+        if (thing != null) {
+            try {
+                thing.close();
+            } catch (Exception ignored) {
+            }
+        }
+    }
+
+    private static class BeginEndTokenHandler extends StringTokenHandler {
+        private final String begin;
+        private final String end;
+
+        public BeginEndTokenHandler(String begin, String end) {
+            this.begin = begin;
+            this.end = end;
+        }
+
+        public String handleToken(String token) throws IOException {
+            String result = begin + token + end;
+            return result;
+        }
+    }
+}

Modified: 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/resources/WEB-INF/web.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/resources/WEB-INF/web.xml?rev=573752&r1=573751&r2=573752&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/resources/WEB-INF/web.xml
 (original)
+++ 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/resources/WEB-INF/web.xml
 Fri Sep  7 16:19:41 2007
@@ -25,21 +25,23 @@
   <display-name>OpenEJB Loader Application</display-name>
 
   <servlet>
-    <servlet-name>loader</servlet-name>
-    <servlet-class>org.apache.openejb.loader.LoaderServlet</servlet-class>
-
-    <init-param>
-        <param-name>openejb.loader</param-name>
-        <param-value>tomcat-system</param-value>
-    </init-param>
-
-    <load-on-startup>0</load-on-startup>
+    <servlet-name>ServerServlet</servlet-name>
+    <servlet-class>org.apache.openejb.tomcat.ServerServlet</servlet-class>
+  </servlet>
 
+  <servlet>
+    <servlet-name>InstallerServlet</servlet-name>
+    
<servlet-class>org.apache.openejb.tomcat.installer.InstallerServlet</servlet-class>
   </servlet>
 
   <servlet-mapping>
-    <servlet-name>loader</servlet-name>
-    <url-pattern>/*</url-pattern>
+    <servlet-name>ServerServlet</servlet-name>
+    <url-pattern>/ejb/*</url-pattern>
+  </servlet-mapping>
+
+  <servlet-mapping>
+    <servlet-name>InstallerServlet</servlet-name>
+    <url-pattern>/installer</url-pattern>
   </servlet-mapping>
 
 </web-app>

Added: 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/resources/index.html
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/resources/index.html?rev=573752&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/resources/index.html 
(added)
+++ 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/resources/index.html 
Fri Sep  7 16:19:41 2007
@@ -0,0 +1,5 @@
+<html>
+<body>
+<h1>Welcome to OpenEJB</h1>
+</body>
+</html>
\ No newline at end of file

Modified: 
openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/OpenEJBListener.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/OpenEJBListener.java?rev=573752&r1=573751&r2=573752&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/OpenEJBListener.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/OpenEJBListener.java
 Fri Sep  7 16:19:41 2007
@@ -29,6 +29,12 @@
 import java.util.Properties;
 
 public class OpenEJBListener implements LifecycleListener {
+    static private boolean installed;
+
+
+    public static boolean isInstalled() {
+        return installed;
+    }
 
     public OpenEJBListener() {
     }
@@ -36,6 +42,7 @@
     public void lifecycleEvent(LifecycleEvent event) {
         Object source = event.getSource();
         if (source instanceof StandardServer) {
+            installed = true;
             StandardServer standardServer = (StandardServer) source;
             init(standardServer);
         }

Modified: 
openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/TomcatRemoteTestServer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/TomcatRemoteTestServer.java?rev=573752&r1=573751&r2=573752&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/TomcatRemoteTestServer.java
 (original)
+++ 
openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/TomcatRemoteTestServer.java
 Fri Sep  7 16:19:41 2007
@@ -16,11 +16,6 @@
  */
 package org.apache.openejb.test;
 
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
 import java.net.URL;
 import java.util.Properties;
 
@@ -29,28 +24,31 @@
  */
 public class TomcatRemoteTestServer implements TestServer {
     private Properties properties;
-    private String servletUrl;
-    private File tomcatHome;
-
-    private boolean serverHasAlreadyBeenStarted = true;
+    private String serverUri;
+//    private File tomcatHome;
+//
+//    private boolean serverHasAlreadyBeenStarted = true;
 
     public void init(Properties props) {
         properties = props;
-        servletUrl = System.getProperty("remote.serlvet.url", 
"http://127.0.0.1:8080/openejb/remote";);
+        serverUri = System.getProperty("openejb.server.uri", 
"http://127.0.0.1:8080/openejb/ejb";);
+        if (!serverUri.startsWith("http:")) {
+            throw new IllegalStateException("TomcatRemoteTestServer requires 
that openejb.server.uri property starts with http:");
+        }
 //        props.put("test.server.class", 
TomcatRemoteTestServer.class.getName());
         props.put("java.naming.factory.initial", 
"org.apache.openejb.client.RemoteInitialContextFactory");
-        props.put("java.naming.provider.url", servletUrl);
-
-        String homeProperty = System.getProperty("tomcat.home");
-        if (homeProperty == null) {
-            throw new IllegalStateException("The system property tomcat.home 
must be defined.");
-        }
+        props.put("java.naming.provider.url", serverUri);
 
-        tomcatHome = new File(homeProperty);
-
-        if (!tomcatHome.exists()) {
-            throw new IllegalStateException("The tomcat.home directory does 
not exist: " + tomcatHome.getAbsolutePath());
-        }
+//        String homeProperty = System.getProperty("tomcat.home");
+//        if (homeProperty == null) {
+//            throw new IllegalStateException("The system property tomcat.home 
must be defined.");
+//        }
+
+//        tomcatHome = new File(homeProperty);
+//
+//        if (!tomcatHome.exists()) {
+//            throw new IllegalStateException("The tomcat.home directory does 
not exist: " + tomcatHome.getAbsolutePath());
+//        }
     }
 
     public void start() {
@@ -58,21 +56,21 @@
             return;
         }
 
-        try {
-            System.out.println("[] START TOMCAT SERVER");
-            System.out.println("CATALINA_HOME = " + 
tomcatHome.getAbsolutePath());
-
-            String systemInfo = "Java " + System.getProperty("java.version") + 
"; " + System.getProperty("os.name") + "/" + System.getProperty("os.version");
-            System.out.println("SYSTEM_INFO   = " + systemInfo);
-
-            serverHasAlreadyBeenStarted = false;
-
-
-            execBootstrap("start");
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new RuntimeException("Cannot start the server: " + 
e.getClass().getName() + ": " + e.getMessage(), e);
-        }
+//        try {
+//            System.out.println("[] START TOMCAT SERVER");
+//            System.out.println("CATALINA_HOME = " + 
tomcatHome.getAbsolutePath());
+//
+//            String systemInfo = "Java " + System.getProperty("java.version") 
+ "; " + System.getProperty("os.name") + "/" + System.getProperty("os.version");
+//            System.out.println("SYSTEM_INFO   = " + systemInfo);
+//
+//            serverHasAlreadyBeenStarted = false;
+//
+//
+//            execBootstrap("start");
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            throw new RuntimeException("Cannot start the server: " + 
e.getClass().getName() + ": " + e.getMessage(), e);
+//        }
         connect(10);
         // Wait a wee bit longer for good measure
         try {
@@ -83,60 +81,60 @@
     }
 
     public void stop() {
-        if (!serverHasAlreadyBeenStarted) {
-            try {
-                System.out.println("[] STOP TOMCAT SERVER");
-                execBootstrap("stop");
-
-                disconnect(10);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    private void execBootstrap(String command) throws IOException {
-        String[] bootstrapCommand = getBootstrapCommand(tomcatHome, command);
-        Process server = Runtime.getRuntime().exec(bootstrapCommand);
-
-        FilePathBuilder tomcat = new FilePathBuilder(tomcatHome);
-        OutputStream catalinaOut = new 
FileOutputStream(tomcat.l("logs").f("catalina.out"));
-
-        // Pipe the processes STDOUT to ours
-        InputStream out = server.getInputStream();
-        Thread serverOut = new Thread(new Pipe(out, catalinaOut));
-
-        serverOut.setDaemon(true);
-        serverOut.start();
-
-        // Pipe the processes STDERR to ours
-        InputStream err = server.getErrorStream();
-        Thread serverErr = new Thread(new Pipe(err, catalinaOut));
-
-        serverErr.setDaemon(true);
-        serverErr.start();
-    }
+//        if (!serverHasAlreadyBeenStarted) {
+//            try {
+//                System.out.println("[] STOP TOMCAT SERVER");
+//                execBootstrap("stop");
+//
+//                disconnect(10);
+//            } catch (Exception e) {
+//                e.printStackTrace();
+//            }
+//        }
+    }
+
+//    private void execBootstrap(String command) throws IOException {
+//        String[] bootstrapCommand = getBootstrapCommand(tomcatHome, command);
+//        Process server = Runtime.getRuntime().exec(bootstrapCommand);
+//
+//        FilePathBuilder tomcat = new FilePathBuilder(tomcatHome);
+//        OutputStream catalinaOut = new 
FileOutputStream(tomcat.l("logs").f("catalina.out"));
+//
+//        // Pipe the processes STDOUT to ours
+//        InputStream out = server.getInputStream();
+//        Thread serverOut = new Thread(new Pipe(out, catalinaOut));
+//
+//        serverOut.setDaemon(true);
+//        serverOut.start();
+//
+//        // Pipe the processes STDERR to ours
+//        InputStream err = server.getErrorStream();
+//        Thread serverErr = new Thread(new Pipe(err, catalinaOut));
+//
+//        serverErr.setDaemon(true);
+//        serverErr.start();
+//    }
 
     public Properties getContextEnvironment() {
         return (Properties) properties.clone();
     }
 
-    private boolean disconnect(int tries) {
-        if (connect()) {
-            tries--;
-            if (tries < 1) {
-                return false;
-            } else {
-                try {
-                    Thread.sleep(5000);
-                } catch (InterruptedException e) {
-                }
-                disconnect(tries);
-            }
-        }
-
-        return true;
-    }
+//    private boolean disconnect(int tries) {
+//        if (connect()) {
+//            tries--;
+//            if (tries < 1) {
+//                return false;
+//            } else {
+//                try {
+//                    Thread.sleep(5000);
+//                } catch (InterruptedException e) {
+//                }
+//                disconnect(tries);
+//            }
+//        }
+//
+//        return true;
+//    }
 
     private boolean connect() {
         return connect(1);
@@ -145,7 +143,7 @@
     private boolean connect(int tries) {
         //System.out.println("CONNECT "+ tries);
         try {
-            URL url = new URL(servletUrl);
+            URL url = new URL(serverUri);
             url.openStream();
         } catch (Exception e) {
             tries--;
@@ -165,109 +163,109 @@
         return true;
     }
 
-    private String[] getBootstrapCommand(File tomcatHome, String command) {
-        FilePathBuilder tomcat = new FilePathBuilder(tomcatHome);
-        FilePathBuilder tomcatBin = tomcat.l("bin");
-
-        FilePathBuilder javaHome = new 
FilePathBuilder(System.getProperty("java.home"));
-        String path = tomcatHome.getAbsolutePath();
-
-        String s = File.pathSeparator;
-
-        if (path.indexOf("tomcat-6") != -1) {
-            return new String[]{javaHome.l("bin").s("java"),
-                    
"-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager",
-                    "-Djava.util.logging.config.file=" + 
tomcat.l("conf").l("logging.properties"),
-                    "-Djava.endorsed.dirs=" + tomcat.l("common").l("endorsed"),
-                    "-classpath", tomcatBin.l("bootstrap.jar") + s + 
tomcatBin.l("commons-logging-api.jar"),
-                    "-Dcatalina.base=" + tomcat,
-                    "-Dcatalina.home=" + tomcat,
-                    "-Djava.io.tmpdir=" + tomcat.l("temp"),
-                    "org.apache.catalina.startup.Bootstrap", command};
-        } else if (path.indexOf("tomcat-5.5") != -1) {
-            return new String[]{javaHome.l("bin").s("java"),
-                    
"-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager",
-                    "-Djava.util.logging.config.file=" + 
tomcat.l("conf").l("logging.properties"),
-                    "-Djava.endorsed.dirs=" + tomcat.l("common").l("endorsed"),
-                    "-classpath", tomcatBin.l("bootstrap.jar") + s + 
tomcatBin.l("commons-logging-api.jar"),
-                    "-Dcatalina.base=" + tomcat,
-                    "-Dcatalina.home=" + tomcat,
-                    "-Djava.io.tmpdir=" + tomcat.l("temp"),
-                    "org.apache.catalina.startup.Bootstrap", command};
-        } else if (path.indexOf("tomcat-5.0") != -1) {
-            return new String[]{javaHome.l("bin").s("java"),
-                    "-Djava.endorsed.dirs=" + tomcat.l("common").l("endorsed"),
-                    "-classpath", tomcatBin.l("bootstrap.jar") + s + 
tomcatBin.l("commons-logging-api.jar") + s + javaHome.l("lib").s("tools.jar"),
-                    "-Dcatalina.base=" + tomcat,
-                    "-Dcatalina.home=" + tomcat,
-                    "-Djava.io.tmpdir=" + tomcat.l("temp"),
-                    "org.apache.catalina.startup.Bootstrap", command};
-        } else if (path.indexOf("tomcat-4.1") != -1) {
-            return new String[]{javaHome.l("bin").s("java"),
-                    "-Djava.endorsed.dirs=" + tomcat.l("common").l("endorsed"),
-                    "-classpath", tomcatBin.s("bootstrap.jar") + s + 
javaHome.l("lib").s("tools.jar"),
-                    "-Dcatalina.base=" + tomcat,
-                    "-Dcatalina.home=" + tomcat,
-                    "-Djava.io.tmpdir=" + tomcat.l("temp"),
-                    "org.apache.catalina.startup.Bootstrap", command};
-        } else {
-            throw new IllegalArgumentException("Unsupported Tomcat version: " 
+ tomcatHome.getName());
-        }
-    }
-
-    public static class FilePathBuilder {
-        private final File file;
-
-        public FilePathBuilder(File file) {
-            this.file = file;
-        }
-
-        public FilePathBuilder(String filePath) {
-            this.file = new File(filePath);
-        }
-
-        public FilePathBuilder l(String name) {
-            return new FilePathBuilder(f(name));
-        }
-
-        public File f(String name) {
-            return new File(file, name);
-        }
-
-        public String s(String name) {
-            return new File(file, name).getAbsolutePath();
-        }
-
-        public String toString() {
-            return file.getAbsolutePath();
-        }
-    }
-
-    private static final class Pipe implements Runnable {
-        private final InputStream is;
-        private final OutputStream out;
-
-        private Pipe(InputStream is, OutputStream out) {
-            super();
-            this.is = is;
-            this.out = out;
-        }
-
-        public void run() {
-            try {
-                int i = is.read();
-                out.write(i);
-
-                while (i != -1) {
-                    i = is.read();
-                    out.write(i);
-                }
-
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-    }
+//    private String[] getBootstrapCommand(File tomcatHome, String command) {
+//        FilePathBuilder tomcat = new FilePathBuilder(tomcatHome);
+//        FilePathBuilder tomcatBin = tomcat.l("bin");
+//
+//        FilePathBuilder javaHome = new 
FilePathBuilder(System.getProperty("java.home"));
+//        String path = tomcatHome.getAbsolutePath();
+//
+//        String s = File.pathSeparator;
+//
+//        if (path.indexOf("tomcat-6") != -1) {
+//            return new String[]{javaHome.l("bin").s("java"),
+//                    
"-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager",
+//                    "-Djava.util.logging.config.file=" + 
tomcat.l("conf").l("logging.properties"),
+//                    "-Djava.endorsed.dirs=" + 
tomcat.l("common").l("endorsed"),
+//                    "-classpath", tomcatBin.l("bootstrap.jar") + s + 
tomcatBin.l("commons-logging-api.jar"),
+//                    "-Dcatalina.base=" + tomcat,
+//                    "-Dcatalina.home=" + tomcat,
+//                    "-Djava.io.tmpdir=" + tomcat.l("temp"),
+//                    "org.apache.catalina.startup.Bootstrap", command};
+//        } else if (path.indexOf("tomcat-5.5") != -1) {
+//            return new String[]{javaHome.l("bin").s("java"),
+//                    
"-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager",
+//                    "-Djava.util.logging.config.file=" + 
tomcat.l("conf").l("logging.properties"),
+//                    "-Djava.endorsed.dirs=" + 
tomcat.l("common").l("endorsed"),
+//                    "-classpath", tomcatBin.l("bootstrap.jar") + s + 
tomcatBin.l("commons-logging-api.jar"),
+//                    "-Dcatalina.base=" + tomcat,
+//                    "-Dcatalina.home=" + tomcat,
+//                    "-Djava.io.tmpdir=" + tomcat.l("temp"),
+//                    "org.apache.catalina.startup.Bootstrap", command};
+//        } else if (path.indexOf("tomcat-5.0") != -1) {
+//            return new String[]{javaHome.l("bin").s("java"),
+//                    "-Djava.endorsed.dirs=" + 
tomcat.l("common").l("endorsed"),
+//                    "-classpath", tomcatBin.l("bootstrap.jar") + s + 
tomcatBin.l("commons-logging-api.jar") + s + javaHome.l("lib").s("tools.jar"),
+//                    "-Dcatalina.base=" + tomcat,
+//                    "-Dcatalina.home=" + tomcat,
+//                    "-Djava.io.tmpdir=" + tomcat.l("temp"),
+//                    "org.apache.catalina.startup.Bootstrap", command};
+//        } else if (path.indexOf("tomcat-4.1") != -1) {
+//            return new String[]{javaHome.l("bin").s("java"),
+//                    "-Djava.endorsed.dirs=" + 
tomcat.l("common").l("endorsed"),
+//                    "-classpath", tomcatBin.s("bootstrap.jar") + s + 
javaHome.l("lib").s("tools.jar"),
+//                    "-Dcatalina.base=" + tomcat,
+//                    "-Dcatalina.home=" + tomcat,
+//                    "-Djava.io.tmpdir=" + tomcat.l("temp"),
+//                    "org.apache.catalina.startup.Bootstrap", command};
+//        } else {
+//            throw new IllegalArgumentException("Unsupported Tomcat version: 
" + tomcatHome.getName());
+//        }
+//    }
+//
+//    public static class FilePathBuilder {
+//        private final File file;
+//
+//        public FilePathBuilder(File file) {
+//            this.file = file;
+//        }
+//
+//        public FilePathBuilder(String filePath) {
+//            this.file = new File(filePath);
+//        }
+//
+//        public FilePathBuilder l(String name) {
+//            return new FilePathBuilder(f(name));
+//        }
+//
+//        public File f(String name) {
+//            return new File(file, name);
+//        }
+//
+//        public String s(String name) {
+//            return new File(file, name).getAbsolutePath();
+//        }
+//
+//        public String toString() {
+//            return file.getAbsolutePath();
+//        }
+//    }
+//
+//    private static final class Pipe implements Runnable {
+//        private final InputStream is;
+//        private final OutputStream out;
+//
+//        private Pipe(InputStream is, OutputStream out) {
+//            super();
+//            this.is = is;
+//            this.out = out;
+//        }
+//
+//        public void run() {
+//            try {
+//                int i = is.read();
+//                out.write(i);
+//
+//                while (i != -1) {
+//                    i = is.read();
+//                    out.write(i);
+//                }
+//
+//            } catch (Exception e) {
+//                e.printStackTrace();
+//            }
+//        }
+//    }
 
 /**
 


Reply via email to