You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2014/03/21 17:38:31 UTC
svn commit: r1579977 - in /tomee/tomee/trunk/container/openejb-core/src:
main/java/org/apache/openejb/assembler/classic/
main/java/org/apache/openejb/config/ main/java/org/apache/openejb/config/sys/
main/java/org/apache/openejb/resource/jdbc/ main/java...
Author: dblevins
Date: Fri Mar 21 16:38:30 2014
New Revision: 1579977
URL: http://svn.apache.org/r1579977
Log:
TOMEE-1146 - Support multiple JDBC Driver class versions
TOMEE-1145 - <Resource classpath=""> attribute
Added:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/driver/
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/driver/AlternativeDriver.java (with props)
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/config/ServiceClasspathTest.java (with props)
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/driver/
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/driver/AlternativeDriverTest.java (with props)
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceInfo.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/sys/StackHandler.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/config/AutoConfigPersistenceUnitsTest.java
tomee/tomee/trunk/container/openejb-core/src/test/resources/openejb.json
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1579977&r1=1579976&r2=1579977&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Fri Mar 21 16:38:30 2014
@@ -181,6 +181,7 @@ import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import java.net.URL;
+import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -2137,7 +2138,22 @@ public class Assembler extends Assembler
replaceResourceAdapterProperty(serviceRecipe);
- Object service = serviceRecipe.create();
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+
+ try {
+ if (serviceInfo.classpath != null && serviceInfo.classpath.length > 0) {
+ final URL[] urls = new URL[serviceInfo.classpath.length];
+ for (int i = 0; i < serviceInfo.classpath.length; i++) {
+ urls[i] = serviceInfo.classpath[i].toURL();
+ }
+ loader = new URLClassLoader(urls, loader);
+ System.out.println("Creating DriverClassLoader " + loader);
+ }
+ } catch (MalformedURLException e) {
+ throw new OpenEJBException("Unable to create a classloader for " + serviceInfo.id, e);
+ }
+
+ Object service = serviceRecipe.create(loader);
// Java Connector spec ResourceAdapters and ManagedConnectionFactories need special activation
if (service instanceof ResourceAdapter) {
@@ -2210,7 +2226,7 @@ public class Assembler extends Assembler
// standard properties
connectionManagerRecipe.setProperty("transactionManager", transactionManager);
- ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ ClassLoader classLoader = loader;
if (classLoader == null) {
classLoader = getClass().getClassLoader();
}
@@ -2262,7 +2278,7 @@ public class Assembler extends Assembler
logUnusedProperties(unset, serviceInfo);
} else if (service instanceof DataSource) {
- ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ ClassLoader classLoader = loader;
if (classLoader == null) {
classLoader = getClass().getClassLoader();
}
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceInfo.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceInfo.java?rev=1579977&r1=1579976&r2=1579977&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceInfo.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceInfo.java Fri Mar 21 16:38:30 2014
@@ -16,6 +16,7 @@
*/
package org.apache.openejb.assembler.classic;
+import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
@@ -29,10 +30,11 @@ public class ServiceInfo extends InfoObj
public String displayName;
public String className;
public String codebase;
+ public URI[] classpath;
public Properties properties;
public final List<String> constructorArgs = new ArrayList<String>();
/** Optional **/
public String factoryMethod;
-
+
}
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1579977&r1=1579976&r2=1579977&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java Fri Mar 21 16:38:30 2014
@@ -1797,6 +1797,10 @@ public class AutoConfig implements Dynam
b.types.addAll(a.types);
b.properties = new SuperProperties();
b.properties.putAll(a.properties);
+ if (a.classpath != null) {
+ b.classpath = new URI[a.classpath.length];
+ System.arraycopy(a.classpath, 0, b.classpath, 0, a.classpath.length);
+ }
//b.aliases.addAll(a.aliases);
return b;
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1579977&r1=1579976&r2=1579977&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java Fri Mar 21 16:38:30 2014
@@ -432,6 +432,14 @@ public class ConfigurationFactory implem
}
}
+ public OpenEjbConfiguration getOpenEjbConfiguration(final File configuartionFile) throws OpenEJBException {
+ if (configuartionFile != null) {
+ return getOpenEjbConfiguration(JaxbOpenejb.readConfig(configuartionFile.getAbsolutePath()));
+ } else {
+ return getOpenEjbConfiguration((Openejb) null);
+ }
+ }
+
public OpenEjbConfiguration getOpenEjbConfiguration(final Openejb providedConf) throws OpenEJBException {
if (sys != null) {
return sys;
@@ -573,7 +581,7 @@ public class ConfigurationFactory implem
*/
@Override
public OpenEjbConfiguration getOpenEjbConfiguration() throws OpenEJBException {
- return getOpenEjbConfiguration(null);
+ return getOpenEjbConfiguration((Openejb) null);
}
private List<File> getDeclaredApps() {
@@ -1148,6 +1156,19 @@ public class ConfigurationFactory implem
((ResourceInfo) info).aliases.addAll(((Resource) service).getAliases());
}
+ if (service.getClasspath() != null && service.getClasspath().length() > 0) {
+ final FileUtils base = SystemInstance.get().getBase();
+ final String[] strings = service.getClasspath().split(File.pathSeparator);
+ final URI[] classpath = new URI[strings.length];
+ for (int i = 0; i < strings.length; i++) {
+ final String string = strings[i];
+ final File file = base.getFile(string, false);
+ classpath[i] = file.toURI();
+ }
+
+ info.classpath = classpath;
+ }
+
specialProcessing(info);
return info;
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java?rev=1579977&r1=1579976&r2=1579977&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/Service.java Fri Mar 21 16:38:30 2014
@@ -60,4 +60,9 @@ public interface Service {
String getConstructor();
String getFactoryName();
+
+ void setClasspath(String classpath);
+
+ String getClasspath();
+
}
\ No newline at end of file
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java?rev=1579977&r1=1579976&r2=1579977&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java Fri Mar 21 16:38:30 2014
@@ -58,6 +58,8 @@ public abstract class AbstractService im
protected String provider;
@XmlAttribute
protected String type;
+ @XmlAttribute
+ protected String classpath;
/**
* Mutually exclusive with 'provider'
@@ -213,6 +215,14 @@ public abstract class AbstractService im
this.factoryName = factoryName;
}
+ public String getClasspath() {
+ return classpath;
+ }
+
+ public void setClasspath(final String classpath) {
+ this.classpath = classpath;
+ }
+
@Override
public boolean equals(final Object o) {
if (this == o) {
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/sys/StackHandler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/sys/StackHandler.java?rev=1579977&r1=1579976&r2=1579977&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/sys/StackHandler.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/sys/StackHandler.java Fri Mar 21 16:38:30 2014
@@ -151,6 +151,10 @@ public class StackHandler extends Defaul
if (attributes.getValue("factory-name") != null) {
service.setFactoryName(attributes.getValue("factory-name"));
}
+ if (attributes.getValue("classpath") != null) {
+ service.setClasspath(attributes.getValue("classpath"));
+ }
+
checkAttributes(attributes, getAttributes());
}
@@ -163,6 +167,7 @@ public class StackHandler extends Defaul
attributes.add("class-name");
attributes.add("constructor");
attributes.add("factory-name");
+ attributes.add("classpath");
return attributes;
}
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java?rev=1579977&r1=1579976&r2=1579977&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java Fri Mar 21 16:38:30 2014
@@ -20,7 +20,9 @@ import org.apache.openejb.loader.IO;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.resource.XAResourceWrapper;
import org.apache.openejb.resource.jdbc.dbcp.DbcpDataSourceCreator;
+import org.apache.openejb.resource.jdbc.driver.AlternativeDriver;
import org.apache.openejb.resource.jdbc.logging.LoggingSqlDataSource;
+import org.apache.openejb.resource.jdbc.plugin.DataSourcePlugin;
import org.apache.openejb.resource.jdbc.pool.DataSourceCreator;
import org.apache.openejb.resource.jdbc.pool.DefaultDataSourceCreator;
import org.apache.openejb.util.Duration;
@@ -35,6 +37,8 @@ import javax.sql.DataSource;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
+import java.sql.Driver;
+import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
@@ -84,6 +88,19 @@ public class DataSourceFactory {
managed = Boolean.parseBoolean((String) properties.remove("transactional")) || managed;
}
+ normalizeJdbcUrl(properties);
+
+ final String jdbcUrl = properties.getProperty("JdbcUrl");
+
+ if (Driver.class.isAssignableFrom(impl) && jdbcUrl != null) {
+ try {
+ final AlternativeDriver driver = new AlternativeDriver((Driver)impl.newInstance(), jdbcUrl);
+ driver.register();
+ } catch (SQLException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
final boolean logSql = SystemInstance.get().getOptions().get(GLOBAL_LOG_SQL_PROPERTY,
"true".equalsIgnoreCase((String) properties.remove(LOG_SQL_PROPERTY)));
final DataSourceCreator creator = creator(properties.remove(DATA_SOURCE_CREATOR_PROP), logSql);
@@ -152,6 +169,28 @@ public class DataSourceFactory {
}
}
+ private static void normalizeJdbcUrl(final Properties properties) {
+ final String key = "JdbcUrl";
+ final String jdbcUrl = properties.getProperty(key);
+
+ if (jdbcUrl == null) {
+ return;
+ }
+
+ try {
+ // get the plugin
+ final DataSourcePlugin helper = BasicDataSourceUtil.getDataSourcePlugin(jdbcUrl);
+
+ // configure this
+ if (helper != null) {
+ final String newUrl = helper.updatedUrl(jdbcUrl);
+ properties.setProperty(key, newUrl);
+ }
+ } catch (SQLException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
private static void convert(final Properties properties, final Duration duration, final String key, final String oldKey) {
properties.remove(key);
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java?rev=1579977&r1=1579976&r2=1579977&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/DbcpDataSourceCreator.java Fri Mar 21 16:38:30 2014
@@ -57,4 +57,27 @@ public class DbcpDataSourceCreator exten
protected void doDestroy(final CommonDataSource dataSource) throws Throwable {
((org.apache.commons.dbcp.BasicDataSource) dataSource).close();
}
+
+ @Override
+ protected <T> T build(final Class<T> clazz, final Properties properties) {
+ final T object = super.build(clazz, properties);
+ setDriverLoader(object);
+ return object;
+ }
+
+ @Override
+ protected <T> T build(final Class<T> clazz, final Object instance, final Properties properties) {
+ final T object = super.build(clazz, instance, properties);
+ setDriverLoader(object);
+ return object;
+ }
+
+ private <T> void setDriverLoader(final T object) {
+ if (object instanceof org.apache.commons.dbcp.BasicDataSource) {
+ final org.apache.commons.dbcp.BasicDataSource basicDataSource = (org.apache.commons.dbcp.BasicDataSource) object;
+ final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ System.out.println("Setting DriverClassLoader to " + contextClassLoader);
+ basicDataSource.setDriverClassLoader(contextClassLoader);
+ }
+ }
}
Added: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/driver/AlternativeDriver.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/driver/AlternativeDriver.java?rev=1579977&view=auto
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/driver/AlternativeDriver.java (added)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/driver/AlternativeDriver.java Fri Mar 21 16:38:30 2014
@@ -0,0 +1,173 @@
+/*
+ * 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.resource.jdbc.driver;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.sql.Connection;
+import java.sql.Driver;
+import java.sql.DriverManager;
+import java.sql.DriverPropertyInfo;
+import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.util.Enumeration;
+import java.util.LinkedHashSet;
+import java.util.Properties;
+import java.util.Set;
+import java.util.logging.Logger;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class AlternativeDriver implements Driver {
+
+ private final Driver delegate;
+ private final String url;
+ private final Method getParentLogger;
+
+ public AlternativeDriver(final Driver driver, final String url) {
+ this.delegate = driver;
+ this.url = url;
+
+ final Class<? extends Driver> clazz = delegate.getClass();
+
+
+ this.getParentLogger = getMethod(clazz);
+
+ }
+
+ private Method getMethod(final Class<? extends Driver> clazz) {
+ try {
+ return clazz.getMethod("getParentLogger");
+ } catch (NoSuchMethodException e) {
+ return null;
+ }
+ }
+
+ public Driver getDelegate() {
+ return delegate;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void register() throws SQLException {
+ if (!isRegistered()) {
+ DriverManager.registerDriver(this);
+ }
+
+ ensureFirst(new LinkedHashSet<Driver>());
+ }
+
+ public void deregister() throws SQLException {
+ if (isRegistered()) {
+ DriverManager.deregisterDriver(this);
+ }
+ }
+
+ private void ensureFirst(final Set<Driver> seen) throws SQLException {
+ final Driver driver = DriverManager.getDriver(this.url);
+
+ if (this == driver) {
+ return;
+ }
+
+ if (!seen.add(driver)) {
+ // Prevents infinite loop and detects situations
+ // where the DriverManager may not allow this trick to work
+ throw new SQLException(String.format("Competing driver found for URL '%s' '%s'", this.url, driver));
+ }
+
+ DriverManager.deregisterDriver(driver);
+ DriverManager.registerDriver(driver);
+ ensureFirst(seen);
+ }
+
+ private boolean isRegistered() {
+ final Enumeration<Driver> drivers = DriverManager.getDrivers();
+ while (drivers.hasMoreElements()) {
+
+ final Driver driver = drivers.nextElement();
+
+ if (driver == this) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ public Connection connect(final String url, final Properties info) throws SQLException {
+ return getDelegate().connect(url, info);
+ }
+
+ @Override
+ public boolean acceptsURL(final String url) throws SQLException {
+ final boolean equals = this.url.equals(url);
+ System.out.printf("JDBC DriverManager.acceptsURL %s %s %s%n", equals, url, this.url);
+ return equals;
+ }
+
+ @Override
+ public DriverPropertyInfo[] getPropertyInfo(final String url, final Properties info) throws SQLException {
+ return getDelegate().getPropertyInfo(url, info);
+ }
+
+ @Override
+ public int getMajorVersion() {
+ return getDelegate().getMajorVersion();
+ }
+
+ @Override
+ public int getMinorVersion() {
+ return getDelegate().getMinorVersion();
+ }
+
+ @Override
+ public boolean jdbcCompliant() {
+ return getDelegate().jdbcCompliant();
+ }
+
+ public Logger getParentLogger() throws SQLFeatureNotSupportedException {
+ if (getParentLogger != null) {
+ try {
+
+ return (Logger) getParentLogger.invoke(delegate);
+
+ } catch (IllegalAccessException e) {
+
+ throw new SQLFeatureNotSupportedException(e);
+
+ } catch (InvocationTargetException e) {
+
+ if (e.getCause() instanceof SQLFeatureNotSupportedException) {
+ throw (SQLFeatureNotSupportedException) e.getCause();
+ }
+
+ if (e.getCause() instanceof RuntimeException) {
+ throw (RuntimeException) e.getCause();
+ }
+
+ throw new SQLFeatureNotSupportedException(e.getCause());
+ }
+ }
+
+ throw new SQLFeatureNotSupportedException();
+ }
+}
Propchange: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/driver/AlternativeDriver.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/config/AutoConfigPersistenceUnitsTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/config/AutoConfigPersistenceUnitsTest.java?rev=1579977&r1=1579976&r2=1579977&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/config/AutoConfigPersistenceUnitsTest.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/config/AutoConfigPersistenceUnitsTest.java Fri Mar 21 16:38:30 2014
@@ -33,6 +33,7 @@ import org.apache.openejb.jee.jpa.unit.P
import org.apache.openejb.jee.jpa.unit.PersistenceUnit;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.monitoring.LocalMBeanServer;
+import org.apache.openejb.util.Join;
import javax.naming.NamingException;
import java.io.IOException;
@@ -222,6 +223,40 @@ public class AutoConfigPersistenceUnitsT
}
/**
+ * Existing data source "orange-unit", jta-managed
+ *
+ * Persistence xml like so:
+ *
+ * <persistence-unit name="orange-unit" />
+ *
+ * The orange-unit app should automatically use orange-unit data source and create a new non-JtaManaged datasource
+ *
+ * @throws Exception
+ */
+ public void testFromUnitNameJtaWithClasspath() throws Exception {
+ Resource resource = new Resource("orange-unit", "DataSource");
+ resource.setClasspath("foo/bar.jar");
+ ResourceInfo supplied = addDataSource(OrangeDriver.class, "jdbc:orange:some:stuff", true, resource);
+ assertSame(supplied, resources.get(0));
+
+ PersistenceUnitInfo unitInfo = addPersistenceUnit("orange-unit", null, null);
+ assertNotNull(unitInfo);
+
+ // Check results
+ ResourceInfo generated = resources.get(1);
+ assertEquals(supplied.id + "NonJta", generated.id);
+ assertEquals(supplied.service, generated.service);
+ assertEquals(supplied.className, generated.className);
+ assertEquals(supplied.properties.get("JdbcDriver"), generated.properties.get("JdbcDriver"));
+ assertEquals(supplied.properties.get("JdbcUrl"), generated.properties.get("JdbcUrl"));
+ assertEquals("false", generated.properties.get("JtaManaged"));
+
+ final String expected = Join.join("\n", supplied.classpath);
+ final String actual = Join.join("\n", generated.classpath);
+ assertEquals(expected, actual);
+ }
+
+ /**
* Existing data source "orange-unit", non-jta-managed
*
* Persistence xml like so:
@@ -1415,6 +1450,10 @@ public class AutoConfigPersistenceUnitsT
private ResourceInfo addDataSource(String id, Class driver, String url, Boolean managed) throws OpenEJBException {
Resource resource = new Resource(id, "DataSource");
+ return addDataSource(driver, url, managed, resource);
+ }
+
+ private ResourceInfo addDataSource(Class driver, String url, Boolean managed, Resource resource) throws OpenEJBException {
resource.getProperties().put("JdbcDriver", driver.getName());
resource.getProperties().put("JdbcUrl", url);
resource.getProperties().put("JtaManaged", managed + " "); // space should be trimmed later, this verifies that.
Added: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/config/ServiceClasspathTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/config/ServiceClasspathTest.java?rev=1579977&view=auto
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/config/ServiceClasspathTest.java (added)
+++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/config/ServiceClasspathTest.java Fri Mar 21 16:38:30 2014
@@ -0,0 +1,407 @@
+/*
+ * 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.config;
+
+import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.assembler.classic.ResourceInfo;
+import org.apache.openejb.assembler.classic.SecurityServiceInfo;
+import org.apache.openejb.assembler.classic.TransactionServiceInfo;
+import org.apache.openejb.config.sys.Openejb;
+import org.apache.openejb.config.sys.Resource;
+import org.apache.openejb.core.ivm.naming.InitContextFactory;
+import org.apache.openejb.loader.Files;
+import org.apache.openejb.loader.IO;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.util.Join;
+import org.apache.xbean.asm4.ClassWriter;
+import org.apache.xbean.asm4.MethodVisitor;
+import org.apache.xbean.asm4.Opcodes;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.naming.InitialContext;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import static org.apache.xbean.asm4.Opcodes.ACC_PUBLIC;
+import static org.apache.xbean.asm4.Opcodes.ACC_SUPER;
+import static org.apache.xbean.asm4.Opcodes.ALOAD;
+import static org.apache.xbean.asm4.Opcodes.INVOKESPECIAL;
+import static org.apache.xbean.asm4.Opcodes.RETURN;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ServiceClasspathTest extends Assert {
+
+
+ @Test
+ public void test() throws Exception {
+
+ final String className = "org.superbiz.foo.Orange";
+ final File jar = subclass(Color.class, className);
+
+ System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, InitContextFactory.class.getName());
+
+ final Openejb openejb = new Openejb();
+ final Resource resource = new Resource();
+ openejb.getResource().add(resource);
+
+ resource.setClassName(className);
+ resource.setType(className);
+ resource.setId("Orange");
+ resource.getProperties().put("red", "FF");
+ resource.getProperties().put("green", "99");
+ resource.getProperties().put("blue", "00");
+ resource.setClasspath(jar.getAbsolutePath());
+
+ final ConfigurationFactory config = new ConfigurationFactory();
+ final Assembler assembler = new Assembler();
+ assembler.createTransactionManager(config.configureService(TransactionServiceInfo.class));
+ assembler.createSecurityService(config.configureService(SecurityServiceInfo.class));
+
+ final ResourceInfo serviceInfo = config.configureService(resource, ResourceInfo.class);
+// serviceInfo.classpath = new URI[]{jar.toURI()};
+ assembler.createResource(serviceInfo);
+
+ final InitialContext initialContext = new InitialContext();
+ final Color color = (Color) initialContext.lookup("openejb:Resource/Orange");
+
+ assertNotNull(color);
+ assertEquals("Orange.FF", color.getRed());
+ assertEquals("Orange.99", color.getGreen());
+ assertEquals("Orange.00", color.getBlue());
+ }
+
+ @Test
+ public void testXml() throws Exception {
+
+ final String className = "org.superbiz.foo.Orange";
+ final File jar = subclass(Color.class, className);
+
+ final File xml = File.createTempFile("config-", ".xml");
+ xml.deleteOnExit();
+
+ final PrintStream out = new PrintStream(IO.write(xml));
+ out.println("<openejb>\n" +
+ " <Resource id=\"Orange\" type=\"org.superbiz.foo.Orange\" class-name=\"org.superbiz.foo.Orange\" classpath=\"" + jar.getAbsolutePath() + "\">\n" +
+ " red = FF\n" +
+ " green = 99\n" +
+ " blue = 00\n" +
+ " </Resource>\n" +
+ "</openejb>");
+ out.close();
+
+
+ System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, InitContextFactory.class.getName());
+
+
+ final ConfigurationFactory config = new ConfigurationFactory();
+ final Assembler assembler = new Assembler();
+
+ assembler.buildContainerSystem(config.getOpenEjbConfiguration(xml));
+
+ final InitialContext initialContext = new InitialContext();
+ final Color color = (Color) initialContext.lookup("openejb:Resource/Orange");
+
+ assertNotNull(color);
+ assertEquals("Orange.FF", color.getRed());
+ assertEquals("Orange.99", color.getGreen());
+ assertEquals("Orange.00", color.getBlue());
+ }
+
+ @Test
+ public void testRelativePath() throws Exception {
+
+ final String className = "org.superbiz.foo.Orange";
+ final File jar = subclass(Color.class, className);
+
+ final File xml = File.createTempFile("config-", ".xml");
+ xml.deleteOnExit();
+
+ final PrintStream out = new PrintStream(IO.write(xml));
+ out.println("<openejb>\n" +
+ " <Resource id=\"Orange\" type=\"org.superbiz.foo.Orange\" class-name=\"org.superbiz.foo.Orange\" classpath=\"" + jar.getName() + "\">\n" +
+ " red = FF\n" +
+ " green = 99\n" +
+ " blue = 00\n" +
+ " </Resource>\n" +
+ "</openejb>");
+ out.close();
+
+
+ System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, InitContextFactory.class.getName());
+
+ final Properties properties = new Properties();
+ properties.setProperty("openejb.home", jar.getParentFile().getAbsolutePath());
+ SystemInstance.init(properties);
+ final ConfigurationFactory config = new ConfigurationFactory();
+ final Assembler assembler = new Assembler();
+
+ assembler.buildContainerSystem(config.getOpenEjbConfiguration(xml));
+
+ final InitialContext initialContext = new InitialContext();
+ final Color color = (Color) initialContext.lookup("openejb:Resource/Orange");
+
+ assertNotNull(color);
+ assertEquals("Orange.FF", color.getRed());
+ assertEquals("Orange.99", color.getGreen());
+ assertEquals("Orange.00", color.getBlue());
+ }
+
+ @Test
+ public void testJson() throws Exception {
+
+ final String className = "org.superbiz.foo.Orange";
+ final File jar = subclass(Color.class, className);
+
+ final File json = File.createTempFile("config-", ".json");
+ json.deleteOnExit();
+
+ final PrintStream out = new PrintStream(IO.write(json));
+ out.println("{\n" +
+ " \"resources\":{\n" +
+ " \"Orange\":{\n" +
+ " \"type\":\"org.superbiz.foo.Orange\",\n" +
+ " \"class-name\":\"org.superbiz.foo.Orange\",\n" +
+ " \"classpath\":\"" + jar.getAbsolutePath() + "\",\n" +
+ " \"properties\":{\n" +
+ " \"red\":\"FF\",\n" +
+ " \"green\":\"99\",\n" +
+ " \"blue\":\"00\"\n" +
+ " }\n" +
+ " }\n" +
+ " }\n" +
+ "}\n");
+ out.close();
+
+
+ System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, InitContextFactory.class.getName());
+
+
+ final ConfigurationFactory config = new ConfigurationFactory();
+ final Assembler assembler = new Assembler();
+
+ assembler.buildContainerSystem(config.getOpenEjbConfiguration(json));
+
+ final InitialContext initialContext = new InitialContext();
+ final Color color = (Color) initialContext.lookup("openejb:Resource/Orange");
+
+ assertNotNull(color);
+ assertEquals("Orange.FF", color.getRed());
+ assertEquals("Orange.99", color.getGreen());
+ assertEquals("Orange.00", color.getBlue());
+ }
+
+ public static class Color {
+
+ private String red;
+ private String green;
+ private String blue;
+
+ public String getRed() {
+ return wrap(red);
+ }
+
+ public String getGreen() {
+ return wrap(green);
+ }
+
+ public String getBlue() {
+ return wrap(blue);
+ }
+
+ public void setRed(String red) {
+ this.red = red;
+ }
+
+ public void setGreen(String green) {
+ this.green = green;
+ }
+
+ public void setBlue(String blue) {
+ this.blue = blue;
+ }
+
+ private String wrap(final String value) {
+ return this.getClass().getSimpleName() + "." + value;
+ }
+ }
+
+ public static File subclass(Class<?> parent, String subclassName) throws Exception {
+ final String subclassNameInternal = subclassName.replace('.', '/');
+
+ final byte[] bytes;
+ {
+ final ClassWriter cw = new ClassWriter(0);
+ final String parentClassNameInternal = parent.getName().replace('.', '/');
+
+ cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC + ACC_SUPER, subclassNameInternal, null, parentClassNameInternal, null);
+
+ final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+ mv.visitCode();
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESPECIAL, parentClassNameInternal, "<init>", "()V");
+ mv.visitInsn(RETURN);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ cw.visitEnd();
+
+ bytes = cw.toByteArray();
+ }
+
+ return Archive.archive().add(subclassNameInternal + ".class", bytes).asJar();
+ }
+
+ /**
+ * @version $Revision$ $Date$
+ */
+ public static class Archive {
+
+ final Map<String, String> manifest = new HashMap<String, String>();
+ final Map<String, byte[]> entries = new HashMap<String, byte[]>();
+
+ public static Archive archive() {
+ return new Archive();
+ }
+
+ public Archive manifest(String key, Object value) {
+ manifest.put(key, value.toString());
+ return this;
+ }
+
+ public Archive manifest(String key, Class value) {
+ manifest.put(key, value.getName());
+ return this;
+ }
+
+ public Archive add(Class<?> clazz) {
+ try {
+ final String name = clazz.getName().replace('.', '/') + ".class";
+
+ final URL resource = this.getClass().getClassLoader().getResource(name);
+
+ final InputStream from = new BufferedInputStream(resource.openStream());
+ final ByteArrayOutputStream to = new ByteArrayOutputStream();
+
+ final byte[] buffer = new byte[1024];
+ int length;
+ while ((length = from.read(buffer)) != -1) {
+ to.write(buffer, 0, length);
+ }
+ to.flush();
+
+ final byte[] bytes = to.toByteArray();
+ return add(name, bytes);
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ public Archive add(String name, byte[] bytes) {
+ entries.put(name, bytes);
+ return this;
+ }
+
+ public File toJar() throws IOException {
+ final File file = File.createTempFile("archive-", ".jar");
+ file.deleteOnExit();
+
+ // Create the ZIP file
+ final ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
+
+ for (Map.Entry<String, byte[]> entry : entries().entrySet()) {
+ out.putNextEntry(new ZipEntry(entry.getKey()));
+ out.write(entry.getValue());
+ }
+
+ // Complete the ZIP file
+ out.close();
+ return file;
+ }
+
+ public File asJar() {
+ try {
+ return toJar();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public File toDir() throws IOException {
+
+ File classpath = Files.tmpdir();
+
+ for (Map.Entry<String, byte[]> entry : entries().entrySet()) {
+
+ final String key = entry.getKey().replace('/', File.separatorChar);
+
+ final File file = new File(classpath, key);
+
+ File d = file.getParentFile();
+
+ if (!d.exists()) assertTrue(d.getAbsolutePath(), d.mkdirs());
+
+ BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
+
+ out.write(entry.getValue());
+
+ out.close();
+ }
+
+ return classpath;
+ }
+
+ public File asDir() {
+ try {
+ return toDir();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private HashMap<String, byte[]> entries() {
+ final HashMap<String, byte[]> entries = new HashMap<String, byte[]>(this.entries);
+ entries.put("META-INF/MANIFEST.MF", buildManifest().getBytes());
+ return entries;
+ }
+
+ private String buildManifest() {
+ return Join.join("\r\n", new Join.NameCallback<Map.Entry<String, String>>() {
+ @Override
+ public String getName(Map.Entry<String, String> entry) {
+ return entry.getKey() + ": " + entry.getValue();
+ }
+ }, manifest.entrySet());
+ }
+
+ }
+
+}
Propchange: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/config/ServiceClasspathTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/driver/AlternativeDriverTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/driver/AlternativeDriverTest.java?rev=1579977&view=auto
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/driver/AlternativeDriverTest.java (added)
+++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/driver/AlternativeDriverTest.java Fri Mar 21 16:38:30 2014
@@ -0,0 +1,68 @@
+/*
+ * 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.resource.jdbc.driver;
+
+import org.hsqldb.jdbcDriver;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.sql.Driver;
+import java.sql.DriverManager;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class AlternativeDriverTest extends Assert {
+
+ @Test
+ public void testConnect() throws Exception {
+ final AlternativeDriver orange = new AlternativeDriver(new jdbcDriver(), "jdbc:hsqldb:mem:orange");
+
+ final Driver general = DriverManager.getDriver(orange.getUrl());
+
+ assertNotSame(general, orange);
+
+ orange.register();
+
+ assertSame(orange, DriverManager.getDriver(orange.getUrl()));
+ assertSame(general, DriverManager.getDriver(orange.getUrl() + "foo"));
+
+ final AlternativeDriver green = new AlternativeDriver(new jdbcDriver(), "jdbc:hsqldb:mem:green");
+ green.register();
+
+ assertSame(orange, DriverManager.getDriver(orange.getUrl()));
+ assertSame(green, DriverManager.getDriver(green.getUrl()));
+ assertSame(general, DriverManager.getDriver(orange.getUrl() + "foo"));
+ assertSame(general, DriverManager.getDriver(green.getUrl() + "bar"));
+
+ final AlternativeDriver green2 = new AlternativeDriver(new jdbcDriver(), "jdbc:hsqldb:mem:green");
+ green2.register();
+
+ assertSame(orange, DriverManager.getDriver(orange.getUrl()));
+ assertSame(green2, DriverManager.getDriver(green.getUrl()));
+ assertSame(general, DriverManager.getDriver(orange.getUrl() + "foo"));
+ assertSame(general, DriverManager.getDriver(green.getUrl() + "bar"));
+
+ green2.deregister();
+
+ assertSame(orange, DriverManager.getDriver(orange.getUrl()));
+ assertSame(green, DriverManager.getDriver(green.getUrl()));
+ assertSame(general, DriverManager.getDriver(orange.getUrl() + "foo"));
+ assertSame(general, DriverManager.getDriver(green.getUrl() + "bar"));
+ }
+
+}
Propchange: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/driver/AlternativeDriverTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomee/tomee/trunk/container/openejb-core/src/test/resources/openejb.json
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/resources/openejb.json?rev=1579977&r1=1579976&r2=1579977&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/resources/openejb.json (original)
+++ tomee/tomee/trunk/container/openejb-core/src/test/resources/openejb.json Fri Mar 21 16:38:30 2014
@@ -1,52 +1,13 @@
{
- "__": [
- "comments are supported through __ key",
- "so don't hesitate to explain what you are configuring"
- ],
- "resources": {
- "__": [
- "here is",
- "the resources configuration"
- ],
- "json-datasource": {
- "__": [
- "properties is the magic attribute",
- "to configure the resource"
- ],
- "properties": {
- "JdbcUrl": "jdbc:hsqldb:mem:json",
- "MaxActive": 123,
- "JtaManaged": false
- }
- }
- },
- "deployments": {
- "apps": {
- "dir": "apps"
- }
- },
- "containers": {
- "stateless": {
- "type": "STATELESS",
- "properties": {
- "AccessTimeout": "10 seconds"
- }
- }
- },
- "system-properties": {
- "a": "b",
- "c": "d",
- "e": {
- "f": "g",
- "h": {
- "i": "j"
- }
- },
- "placeholder": "${JSonConfigTest.foo}",
- "properties-key" = "properties-value",
- "object" = {
- "attribute" = {
- "#1" = "2"
+ "resources":{
+ "Orange":{
+ "type":"org.superbiz.foo.Orange",
+ "className":"org.superbiz.foo.Orange",
+ "classpath":"%s",
+ "properties":{
+ "red":"FF",
+ "green":"99",
+ "blue":"00"
}
}
}