Title: [2510] trunk/openejb1: This approach to starting/stopping tomcat should work
Revision
2510
Author
dblevins
Date
2006-02-25 21:47:25 -0500 (Sat, 25 Feb 2006)

Log Message

This approach to starting/stopping tomcat should work

Modified Paths


Diff

Modified: trunk/openejb1/maven.xml (2509 => 2510)

--- trunk/openejb1/maven.xml	2006-02-26 00:30:21 UTC (rev 2509)
+++ trunk/openejb1/maven.xml	2006-02-26 02:47:25 UTC (rev 2510)
@@ -714,27 +714,29 @@
     <goal name="test:tomcat">
       <attainGoal name="setup:tomcat"/>
       <attainGoal name="setup:loader-webapp"/>
-      <attainGoal name="start:tomcat"/>
+      <!--<attainGoal name="start:tomcat"/>-->
       <j:set var="openejb.jar" value="target/openejb-${pom.currentVersion}/lib/openejb-core-${pom.currentVersion}.jar"/>
       <java jar="${openejb.jar}" fork="yes">
         <arg value="test"/>
         <arg value="tomcat"/>
+        <sysproperty key="tomcat.home" value="${tomcat.home}"/>
         <sysproperty key="remote.servlet.url" value="http://127.0.0.1:8080/openejb/remote"/>
       </java>
-      <attainGoal name="stop:tomcat"/>
+      <!--<attainGoal name="stop:tomcat"/>-->
     </goal>
 
     <goal name="test:tomcat-webapp">
       <attainGoal name="setup:tomcat"/>
       <attainGoal name="setup:itests-webapp"/>
-      <attainGoal name="start:tomcat"/>
+      <!--<attainGoal name="start:tomcat"/>-->
       <j:set var="openejb.jar" value="target/openejb-${pom.currentVersion}/lib/openejb-core-${pom.currentVersion}.jar"/>
       <java jar="${openejb.jar}" fork="yes">
         <arg value="test"/>
         <arg value="tomcat"/>
+        <sysproperty key="tomcat.home" value="${tomcat.home}"/>
         <sysproperty key="remote.serlvet.url" value="http://127.0.0.1:8080/itests/remote"/>
       </java>
-      <attainGoal name="stop:tomcat"/>
+      <!--<attainGoal name="stop:tomcat"/>-->
     </goal>
 
     <goal name="test:tomcat-all">

Modified: trunk/openejb1/modules/itests/src/java/org/openejb/test/RemoteTestServer.java (2509 => 2510)

--- trunk/openejb1/modules/itests/src/java/org/openejb/test/RemoteTestServer.java	2006-02-26 00:30:21 UTC (rev 2509)
+++ trunk/openejb1/modules/itests/src/java/org/openejb/test/RemoteTestServer.java	2006-02-26 02:47:25 UTC (rev 2510)
@@ -244,46 +244,28 @@
     }
 
     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();
-
             }
-
         }
-
     }
 }

Modified: trunk/openejb1/modules/itests/src/java/org/openejb/test/TomcatRemoteTestServer.java (2509 => 2510)

--- trunk/openejb1/modules/itests/src/java/org/openejb/test/TomcatRemoteTestServer.java	2006-02-26 00:30:21 UTC (rev 2509)
+++ trunk/openejb1/modules/itests/src/java/org/openejb/test/TomcatRemoteTestServer.java	2006-02-26 02:47:25 UTC (rev 2510)
@@ -17,8 +17,17 @@
 package org.openejb.test;
 
 import org.openejb.client.RemoteInitialContextFactory;
+import org.openejb.util.JarUtils;
+import org.openejb.util.FileUtils;
+import org.openejb.loader.SystemInstance;
 
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.net.URL;
+import java.net.Socket;
 import java.util.Properties;
 
 /**
@@ -27,21 +36,47 @@
 public class TomcatRemoteTestServer implements TestServer {
     private Properties properties;
     private String servletUrl;
+    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");
         props.put("test.server.class", TomcatRemoteTestServer.class.getName());
         props.put("java.naming.factory.initial", RemoteInitialContextFactory.class.getName());
         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.");
+        }
+
+        tomcatHome = new File(homeProperty);
+
+        if (!tomcatHome.exists()) {
+            throw new IllegalStateException("The tomcat.home directory does not exist: "+tomcatHome.getAbsolutePath());
+        }
     }
 
     public void start() {
-        System.out.println("Note: Tomcat should be started before running these tests");
-        if (!connect()) {
-            throw new IllegalStateException("Unable to connect to Tomcat at localhost port 8080");
+        if (connect()){
+            return;
         }
 
+        try{
+            System.out.println("[] START TOMCAT SERVER");
+            serverHasAlreadyBeenStarted = false;
+
+            FilePathBuilder tomcat = new FilePathBuilder(tomcatHome);
+            OutputStream catalinaOut = new FileOutputStream(tomcat.l("logs").f("catalina.out"));
+
+            execBootstrap("start", catalinaOut);
+        } 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 {
             Thread.sleep(5000);
@@ -51,16 +86,42 @@
 
     }
 
-    public void stop() {
+    public void stop(){
+        if ( !serverHasAlreadyBeenStarted ) {
+            try{
+                System.out.println("[] STOP TOMCAT SERVER");
+                execBootstrap("stop", System.out);
+            } catch (Exception e){
+                e.printStackTrace();
+            }
+        }
     }
 
+    private void execBootstrap(String command, OutputStream catalinaOut) throws IOException {
+        String[] bootstrapCommand = getBootstrapCommand(tomcatHome, command);
+        Process server = Runtime.getRuntime().exec(bootstrapCommand);
 
+        // 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, System.err));
+
+        serverErr.setDaemon(true);
+        serverErr.start();
+    }
+
     public Properties getContextEnvironment() {
         return (Properties) properties.clone();
     }
 
     private boolean connect() {
-        return connect(10);
+        return connect(1);
     }
 
     private boolean connect(int tries) {
@@ -70,8 +131,9 @@
             url.openStream();
         } catch (Exception e) {
             System.out.println("Attempting to connect to " + servletUrl);
+            tries--;
             //System.out.println(e.getMessage());
-            if (tries < 2) {
+            if (tries < 1) {
                 return false;
             } else {
                 try {
@@ -79,10 +141,126 @@
                 } catch (Exception e2) {
                     e.printStackTrace();
                 }
-                return connect(--tries);
+                return connect(tries);
             }
         }
 
         return true;
     }
+
+    private String[] getBootstrapCommand(File tomcatHome, String command) {
+        FilePathBuilder tomcat = new FilePathBuilder(tomcatHome);
+        FilePathBuilder tomcatBin = tomcat.l("bin");
+
+        String path = tomcatHome.getAbsolutePath();
+
+        if (path.indexOf("tomcat-5.5") != -1) {
+            return new String[]{ "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") +":" + 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[]{ "java",
+                    "-Djava.endorsed.dirs=" + tomcat.l("common").l("endorsed"),
+                    "-classpath", tomcatBin.l("bootstrap.jar") +":" + 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-4.1") != -1) {
+            return new String[]{ "java",
+                    "-Djava.endorsed.dirs=" + tomcat.l("common").l("endorsed"),
+                    "-classpath", tomcatBin.l("bootstrap.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 l(String name){
+            return new FilePathBuilder(f(name));
+        }
+
+        public File f(String name){
+            return new File(file, name);
+        }
+
+        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();
+            }
+        }
+    }
+
+
+/**
+
+ 5.5.x startup
+
+
+
+ 5.0.x
+
+ -Djava.endorsed.dirs=/Users/dblevins/work/openejb1/target/jakarta-tomcat-5.0.30/common/endorsed
+ -classpath
+ /System/Library/Frameworks/JavaVM.framework/Versions/1.4/Home/lib/tools.jar:/Users/dblevins/work/openejb1/target/jakarta-tomcat-5.0.30/bin/bootstrap.jar:/Users/dblevins/work/openejb1/target/jakarta-tomcat-5.0.30/bin/commons-logging-api.jar
+ -Dcatalina.base=/Users/dblevins/work/openejb1/target/jakarta-tomcat-5.0.30
+ -Dcatalina.home=/Users/dblevins/work/openejb1/target/jakarta-tomcat-5.0.30
+ -Djava.io.tmpdir=/Users/dblevins/work/openejb1/target/jakarta-tomcat-5.0.30/temp
+ org.apache.catalina.startup.Bootstrap
+ start
+
+ 4.1.x
+
+ -Djava.endorsed.dirs=/Users/dblevins/work/openejb1/target/jakarta-tomcat-4.1.31/common/endorsed
+ -classpath
+ /System/Library/Frameworks/JavaVM.framework/Versions/1.4/Home/lib/tools.jar:/Users/dblevins/work/openejb1/target/jakarta-tomcat-4.1.31/bin/bootstrap.jar
+ -Dcatalina.base=/Users/dblevins/work/openejb1/target/jakarta-tomcat-4.1.31
+ -Dcatalina.home=/Users/dblevins/work/openejb1/target/jakarta-tomcat-4.1.31
+ -Djava.io.tmpdir=/Users/dblevins/work/openejb1/target/jakarta-tomcat-4.1.31/temp
+ org.apache.catalina.startup.Bootstrap
+ start
+
+ */
+
+
 }

Reply via email to