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"
             }
         }
     }