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?