You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by da...@apache.org on 2007/10/08 04:15:01 UTC

svn commit: r582703 - in /openejb/trunk/openejb3: assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/ container/openejb-core/src/main/java/org/apache/openejb/config/ container/openejb-core/src/main/java/org/apache/openejb/core/ container/o...

Author: dain
Date: Sun Oct  7 19:14:59 2007
New Revision: 582703

URL: http://svn.apache.org/viewvc?rev=582703&view=rev
Log:
Added openejb.servicemanager.enabled flag to enable ServiceManager in tomcat embedded mode
Fixed HSQL server service

Modified:
    openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatLoader.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/BaseContext.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java
    openejb/trunk/openejb3/server/openejb-hsql/src/main/java/org/apache/openejb/server/hsql/HsqlService.java

Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatLoader.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatLoader.java?rev=582703&r1=582702&r2=582703&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatLoader.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatLoader.java Sun Oct  7 19:14:59 2007
@@ -26,6 +26,7 @@
 import org.apache.openejb.loader.Loader;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.server.ServiceException;
+import org.apache.openejb.server.ServiceManager;
 import org.apache.openejb.server.ejbd.EjbServer;
 import org.apache.catalina.core.StandardServer;
 import org.apache.catalina.core.StandardContext;
@@ -34,6 +35,9 @@
 import org.apache.catalina.Container;
 import org.apache.catalina.Host;
 import org.apache.catalina.ServerFactory;
+import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.LifecycleEvent;
+import org.apache.catalina.Lifecycle;
 
 import javax.servlet.ServletException;
 import javax.servlet.ServletInputStream;
@@ -48,6 +52,7 @@
  */
 public class TomcatLoader implements Loader {
     private EjbServer ejbServer;
+    protected ServiceManager manager;
 
     public void init(Properties props) throws Exception {
         installConfigFiles();
@@ -93,6 +98,45 @@
         // Process all applications already started.  This deploys EJBs, PersistenceUnits
         // and modifies JNDI ENC references to OpenEJB managed objects such as EJBs.
         processRunningApplications(tomcatWebAppBuilder, standardServer);
+
+        if (Boolean.getBoolean("openejb.servicemanager.enabled")) {
+            manager = ServiceManager.getManager();
+            manager.init();
+            manager.start(false);
+        }
+
+        standardServer.addLifecycleListener(new LifecycleListener() {
+            public void lifecycleEvent(LifecycleEvent event) {
+                String type = event.getType();
+                if (Lifecycle.AFTER_STOP_EVENT.equals(type)) {
+                    TomcatLoader.this.destroy();
+                }
+            }
+        });
+
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+            public void run() {
+                TomcatLoader.this.destroy();
+            }
+        });
+    }
+
+    public void destroy() {
+        if (manager != null) {
+            try {
+                manager.stop();
+            } catch (ServiceException e) {
+            }
+            manager = null;
+        }
+        if (ejbServer != null) {
+            try {
+                ejbServer.stop();
+            } catch (ServiceException e) {
+            }
+            ejbServer = null;
+        }
+        OpenEJB.destroy();
     }
 
     private void installConfigFiles() {
@@ -142,6 +186,7 @@
             }
         }
     }
+
 
     public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         ServletInputStream in = request.getInputStream();

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java?rev=582703&r1=582702&r2=582703&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/RemoteServer.java Sun Oct  7 19:14:59 2007
@@ -27,6 +27,11 @@
  */
 public class RemoteServer {
     private static final boolean DEBUG = System.getProperty("openejb.server.debug","false").equalsIgnoreCase("TRUE");
+    private static final boolean TOMCAT;
+    static {
+        File home = getHome();
+        TOMCAT = (home != null) && (new File(new File(home, "bin"), "catalina.sh").exists());
+    }
 
     /**
      * Has the remote server's instance been already running ?
@@ -70,9 +75,7 @@
             try {
                 System.out.println("[] START SERVER");
 
-                String openejbHome = System.getProperty("openejb.home");
-
-                File home = new File(openejbHome);
+                File home = getHome();
                 System.out.println("OPENEJB_HOME = "+home.getAbsolutePath());
                 String systemInfo = "Java " + System.getProperty("java.version") + "; " + System.getProperty("os.name") + "/" + System.getProperty("os.version");
                 System.out.println("SYSTEM_INFO  = "+systemInfo);
@@ -81,10 +84,15 @@
 
                 File openejbJar = null;
                 File javaagentJar = null;
-                File lib = new File(home, "lib");
-                File[] files = lib.listFiles();
-                for (int i = 0; i < files.length; i++) {
-                    File file = files[i];
+
+                File lib;
+                if (!TOMCAT) {
+                    lib = new File(home, "lib");
+                } else {
+                    lib = new File(new File(new File(home, "webapps"), "openejb"), "lib");
+                }
+                
+                for (File file : lib.listFiles()) {
                     if (file.getName().startsWith("openejb-core") && file.getName().endsWith("jar")){
                         openejbJar = file;
                     }
@@ -105,22 +113,79 @@
                 //DMB: If you don't use an array, you get problems with jar paths containing spaces
                 // the command won't parse correctly
                 String[] args;
-                if (DEBUG) {
-                    args = new String[]{"java",
-                            "-Xdebug",
-                            "-Xnoagent",
-                            "-Djava.compiler=NONE",
-                            "-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005",
-                            "-javaagent:" + javaagentJar.getAbsolutePath(),
-                            "-jar",
-                            openejbJar.getAbsolutePath(),
-                            "start"};
+                if (!TOMCAT) {
+                    if (DEBUG) {
+                        args = new String[]{"java",
+                                "-Xdebug",
+                                "-Xnoagent",
+                                "-Djava.compiler=NONE",
+                                "-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005",
+
+                                "-javaagent:" + javaagentJar.getAbsolutePath(),
+
+                                "-jar", openejbJar.getAbsolutePath(), "start"
+                        };
+                    } else {
+                        args = new String[]{"java",
+                                "-javaagent:" + javaagentJar.getAbsolutePath(),
+                                "-jar", openejbJar.getAbsolutePath(), "start"
+                        };
+                    }
                 } else {
-                    args = new String[]{"java",
-                            "-javaagent:" + javaagentJar.getAbsolutePath(),
-                            "-jar",
-                            openejbJar.getAbsolutePath(),
-                            "start"};
+                    File bin = new File(home, "bin");
+                    File bootstrapJar = new File(bin, "bootstrap.jar");
+                    File commonsLoggingJar = new File(bin, "commons-logging-api.jar");
+
+                    File conf = new File(home, "conf");
+                    File loggingProperties = new File(conf, "logging.properties");
+
+                    File endorsed = new File(home, "endorsed");
+                    File temp = new File(home, "temp");
+
+                    if (DEBUG) {
+                        args = new String[] { "java",
+                                "-Xdebug",
+                                "-Xnoagent",
+                                "-Djava.compiler=NONE",
+                                "-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005",
+
+                                "-javaagent:" + javaagentJar.getAbsolutePath(),
+
+                                "-Dcom.sun.management.jmxremote",
+
+                                "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager",
+                                "-Djava.util.logging.config.file=" + loggingProperties.getAbsolutePath(),
+
+                                "-Djava.io.tmpdir=" + temp.getAbsolutePath(),
+                                "-Djava.endorsed.dirs=" + endorsed.getAbsolutePath(),
+                                "-Dcatalina.base=" + home.getAbsolutePath(),
+                                "-Dcatalina.home=" + home.getAbsolutePath(),
+                                "-Dopenejb.servicemanager.enabled=" + Boolean.getBoolean("openejb.servicemanager.enabled"),
+
+                                "-classpath", bootstrapJar.getAbsolutePath() + ":" + commonsLoggingJar.getAbsolutePath(),
+
+                                "org.apache.catalina.startup.Bootstrap", "start"
+                        };
+                    } else {
+                        args = new String[] { "java",
+                                "-javaagent:" + javaagentJar.getAbsolutePath(),
+
+                                "-Dcom.sun.management.jmxremote",
+
+                                "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager",
+                                "-Djava.util.logging.config.file=" + loggingProperties.getAbsolutePath(),
+
+                                "-Djava.io.tmpdir=" + temp.getAbsolutePath(),
+                                "-Djava.endorsed.dirs=" + endorsed.getAbsolutePath(),
+                                "-Dcatalina.base=" + home.getAbsolutePath(),
+                                "-Dcatalina.home=" + home.getAbsolutePath(),
+                                "-Dopenejb.servicemanager.enabled=" + Boolean.getBoolean("openejb.servicemanager.enabled"),
+
+                                "-classpath", bootstrapJar.getAbsolutePath() + ":" + commonsLoggingJar.getAbsolutePath(),
+
+                                "org.apache.catalina.startup.Bootstrap", "start"
+                        };
+                    }
                 }
                 server = Runtime.getRuntime().exec(args);
 
@@ -150,15 +215,34 @@
         }
     }
 
+    private static File getHome() {
+        String openejbHome = System.getProperty("openejb.home");
+
+        if (openejbHome != null) {
+            return new File(openejbHome);
+        } else {
+            return null;
+        }
+    }
+
     public void stop() {
         if (!serverHasAlreadyBeenStarted) {
             try {
                 System.out.println("[] STOP SERVER");
 
-                Socket socket = new Socket("localhost", 4200);
-                OutputStream out = socket.getOutputStream();
+                int port;
+                String command;
+                if (!TOMCAT) {
+                    port = 4200;
+                    command = "Stop";
+                } else {
+                    port = 8005;
+                    command = "SHUTDOWN";
+                }
 
-                out.write("Stop".getBytes());
+                Socket socket = new Socket("localhost", port);
+                OutputStream out = socket.getOutputStream();
+                out.write(command.getBytes());
 
                 if (server != null) {
                     server.waitFor();
@@ -177,8 +261,16 @@
     private boolean connect(int tries) {
         //System.out.println("CONNECT "+ tries);
         try {
-            Socket socket = new Socket("localhost", 4200);
+            int port;
+            if (!TOMCAT) {
+                port = 4200;
+            } else {
+                port = 8005;
+            }
+
+            Socket socket = new Socket("localhost", port);
             OutputStream out = socket.getOutputStream();
+            out.close();
         } catch (Exception e) {
             //System.out.println(e.getMessage());
             if (tries < 2) {

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/BaseContext.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/BaseContext.java?rev=582703&r1=582702&r2=582703&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/BaseContext.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/BaseContext.java Sun Oct  7 19:14:59 2007
@@ -31,6 +31,10 @@
 import javax.transaction.SystemException;
 import javax.transaction.TransactionManager;
 import javax.transaction.UserTransaction;
+import javax.transaction.NotSupportedException;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.RollbackException;
 
 import org.apache.openejb.DeploymentInfo;
 import org.apache.openejb.core.timer.EjbTimerService;
@@ -51,13 +55,13 @@
     public BaseContext(TransactionManager transactionManager, SecurityService securityService) {
         this.transactionManager = transactionManager;
         this.securityService = securityService;
-        this.userTransaction = new CoreUserTransaction(transactionManager);
+        this.userTransaction = new UserTransactionWrapper(new CoreUserTransaction(transactionManager));
     }
 
     protected BaseContext(TransactionManager transactionManager, SecurityService securityService, UserTransaction userTransaction) {
         this.transactionManager = transactionManager;
         this.securityService = securityService;
-        this.userTransaction = userTransaction;
+        this.userTransaction = new UserTransactionWrapper(userTransaction);
     }
 
     protected static State[] states;
@@ -167,6 +171,56 @@
         State currentState = currentStates[ThreadContext.getThreadContext().getCurrentOperation().ordinal()];
         
         return currentState.isTimerMethodAllowed();
+    }
+
+    public class UserTransactionWrapper implements UserTransaction {
+        private UserTransaction userTransaction;
+
+        public UserTransactionWrapper(UserTransaction userTransaction) {
+            this.userTransaction = userTransaction;
+        }
+
+        public void begin() throws NotSupportedException, SystemException {
+            if (!isUserTransactionAccessAllowed()) {
+                throw new IllegalStateException();
+            }
+            userTransaction.begin();
+        }
+
+        public void commit() throws HeuristicMixedException, HeuristicRollbackException, IllegalStateException, RollbackException, SecurityException, SystemException {
+            if (!isUserTransactionAccessAllowed()) {
+                throw new IllegalStateException();
+            }
+            userTransaction.commit();
+        }
+
+        public int getStatus() throws SystemException {
+            if (!isUserTransactionAccessAllowed()) {
+                throw new IllegalStateException();
+            }
+            return userTransaction.getStatus();
+        }
+
+        public void rollback() throws IllegalStateException, SecurityException, SystemException {
+            if (!isUserTransactionAccessAllowed()) {
+                throw new IllegalStateException();
+            }
+            userTransaction.rollback();
+        }
+
+        public void setRollbackOnly() throws IllegalStateException, SystemException {
+            if (!isUserTransactionAccessAllowed()) {
+                throw new IllegalStateException();
+            }
+            userTransaction.setRollbackOnly();
+        }
+
+        public void setTransactionTimeout(int i) throws SystemException {
+            if (!isUserTransactionAccessAllowed()) {
+                throw new IllegalStateException();
+            }
+            userTransaction.setTransactionTimeout(i);
+        }
     }
     
     public static class State {

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java?rev=582703&r1=582702&r2=582703&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java Sun Oct  7 19:14:59 2007
@@ -25,6 +25,14 @@
 import java.io.File;
 
 public class BasicDataSource extends org.apache.commons.dbcp.BasicDataSource {
+    public synchronized String getUserName() {
+        return super.getUsername();
+    }
+
+    public synchronized void setUserName(String string) {
+        super.setUsername(string);
+    }
+
     public synchronized String getJdbcDriver() {
         return super.getDriverClassName();
     }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java?rev=582703&r1=582702&r2=582703&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java Sun Oct  7 19:14:59 2007
@@ -25,6 +25,14 @@
 import java.util.Properties;
 
 public class BasicManagedDataSource extends org.apache.commons.dbcp.managed.BasicManagedDataSource {
+    public synchronized String getUserName() {
+        return super.getUsername();
+    }
+
+    public synchronized void setUserName(String string) {
+        super.setUsername(string);
+    }
+
     public synchronized String getJdbcDriver() {
         return super.getDriverClassName();
     }

Modified: openejb/trunk/openejb3/server/openejb-hsql/src/main/java/org/apache/openejb/server/hsql/HsqlService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-hsql/src/main/java/org/apache/openejb/server/hsql/HsqlService.java?rev=582703&r1=582702&r2=582703&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-hsql/src/main/java/org/apache/openejb/server/hsql/HsqlService.java (original)
+++ openejb/trunk/openejb3/server/openejb-hsql/src/main/java/org/apache/openejb/server/hsql/HsqlService.java Sun Oct  7 19:14:59 2007
@@ -17,29 +17,33 @@
  */
 package org.apache.openejb.server.hsql;
 
-import org.apache.openejb.core.ConnectorReference;
+import org.apache.commons.dbcp.BasicDataSource;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.resource.jdbc.HsqldbDataSourcePlugin;
+import org.apache.openejb.server.SelfManaging;
 import org.apache.openejb.server.ServerService;
 import org.apache.openejb.server.ServiceException;
-import org.apache.openejb.server.SelfManaging;
-import org.apache.commons.dbcp.BasicDataSource;
+import org.apache.openejb.spi.ContainerSystem;
+import org.hsqldb.Database;
+import org.hsqldb.DatabaseManager;
 import org.hsqldb.Server;
 import org.hsqldb.ServerConfiguration;
 import org.hsqldb.ServerConstants;
 import org.hsqldb.jdbcDriver;
-import org.hsqldb.DatabaseManager;
-import org.hsqldb.Database;
 import org.hsqldb.persist.HsqlProperties;
 
 import javax.naming.Binding;
-import javax.naming.InitialContext;
-import javax.naming.NamingEnumeration;
 import javax.naming.NameNotFoundException;
+import javax.naming.NamingEnumeration;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.Socket;
 import java.util.Collections;
+import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
 
 /**
  * @version $Rev: 480809 $ $Date: 2006-11-29 18:27:38 -0800 (Wed, 29 Nov 2006) $
@@ -64,11 +68,13 @@
 
     public void init(Properties p) throws Exception {
         Properties properties = new Properties();
-        for (Object key : Collections.list(properties.propertyNames())) {
-            if (!(key instanceof String)) continue;
+        for (Map.Entry<Object, Object> entry : p.entrySet()) {
+            // Somtimes the properties object has non string values
+            if (!(entry.getKey() instanceof String)) continue;
+            if (!(entry.getValue() instanceof String)) continue;
 
-            String property = (String) key;
-            String value = (String) p.get(property);
+            String property = (String) entry.getKey();
+            String value = (String) entry.getValue();
 
             if (property.startsWith(ServerConstants.SC_KEY_DBNAME + ".") ||
                     property.startsWith(ServerConstants.SC_KEY_DATABASE + ".")) {
@@ -88,26 +94,27 @@
         properties.setProperty(ServerConstants.SC_KEY_NO_SYSTEM_EXIT, "true");
 
         boolean disabled = Boolean.parseBoolean(properties.getProperty("disabled"));
-        if (!disabled) {
+        ContainerSystem containerSystem = SystemInstance.get().getComponent(ContainerSystem.class);
+        if (!disabled && containerSystem != null) {
             NamingEnumeration<Binding> bindings = null;
             try {
-                bindings = new InitialContext().listBindings("java:openejb/Resource/");
-                int dbIndex = 0;
+                bindings = containerSystem.getJNDIContext().listBindings("java:openejb/Resource/");
+                Set<String> dbnames = new TreeSet<String>();
                 for (Binding binding : Collections.list(bindings)) {
                     Object value = binding.getObject();
-                    if (value instanceof ConnectorReference) {
-                        Object connectionFactory = ((ConnectorReference)value).getObject();
-                        if (connectionFactory instanceof BasicDataSource) {
-                            BasicDataSource jdbc = (BasicDataSource) connectionFactory;
-                            String path = getPath(jdbc);
-                            if (path != null) {
-                                if (dbIndex > 9) {
-                                    throw new ServiceException("Hsql Server can only host 10 database connections");
-                                }
-                                String dbname = path.substring(path.lastIndexOf('/') + 1);
-                                properties.put(ServerConstants.SC_KEY_DBNAME + "." + dbIndex, dbname);
-                                properties.put(ServerConstants.SC_KEY_DATABASE + "." + dbIndex, path);
-                                dbIndex++;
+                    if (value instanceof BasicDataSource) {
+                        BasicDataSource jdbc = (BasicDataSource) value;
+                        String path = getPath(jdbc);
+                        if (path != null) {
+                            if (dbnames.size() > 9) {
+                                throw new ServiceException("Hsql Server can only host 10 database instances");
+                            }
+                            String dbname = path.substring(path.lastIndexOf(':') + 1);
+                            dbname = dbname.substring(dbname.lastIndexOf('/') + 1);
+                            if (!dbnames.contains(dbname)) {
+                                properties.put(ServerConstants.SC_KEY_DBNAME + "." + dbnames.size(), dbname);
+                                properties.put(ServerConstants.SC_KEY_DATABASE + "." + dbnames.size(), path);
+                                dbnames.add(dbname);
                             }
                         }
                     }
@@ -148,6 +155,10 @@
             return null;
         }
 
+        // resolve the relative path
+        url = HsqldbDataSourcePlugin.toAbsolutePath(url);
+
+        // hack off the jdbc:hsqldb stuff
         String path = url.substring("jdbc:hsqldb:".length());
 
         // is this a connection to a local file, mem, or res database?