Author: rmannibucau
Date: Fri Aug 26 11:43:19 2011
New Revision: 1162070

URL: http://svn.apache.org/viewvc?rev=1162070&view=rev
Log:
starting work about DatasourceDefinition - still a lot to do

Added:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CommonInfoObject.java
      - copied, changed from r1161530, 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfoObject.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinition.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinitionHelper.java
    
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java
Removed:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfoObject.java
Modified:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/dynamic/PassthroughFactory.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 Fri Aug 26 11:43:19 2011
@@ -61,6 +61,7 @@ import javax.resource.spi.ResourceAdapte
 import javax.resource.spi.ResourceAdapterInternalException;
 import javax.resource.spi.XATerminator;
 import javax.resource.spi.work.WorkManager;
+import javax.sql.DataSource;
 import javax.transaction.TransactionManager;
 import javax.transaction.TransactionSynchronizationRegistry;
 import javax.validation.ValidationException;
@@ -84,7 +85,9 @@ import org.apache.openejb.NoSuchApplicat
 import org.apache.openejb.OpenEJB;
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.UndeployException;
+import org.apache.openejb.assembler.dynamic.PassthroughFactory;
 import org.apache.openejb.cdi.CdiBuilder;
+import org.apache.openejb.config.DatasourceDefinitionHelper;
 import org.apache.openejb.core.ConnectorReference;
 import org.apache.openejb.core.CoreContainerSystem;
 import org.apache.openejb.core.CoreUserTransaction;
@@ -128,55 +131,6 @@ import org.apache.xbean.recipe.ObjectRec
 import org.apache.xbean.recipe.Option;
 import org.apache.xbean.recipe.UnsetPropertiesRecipe;
 
-import javax.management.InstanceNotFoundException;
-import javax.management.MBeanRegistrationException;
-import javax.management.MBeanServer;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-import javax.naming.Binding;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NameAlreadyBoundException;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.persistence.EntityManagerFactory;
-import javax.resource.spi.BootstrapContext;
-import javax.resource.spi.ConnectionManager;
-import javax.resource.spi.ManagedConnectionFactory;
-import javax.resource.spi.ResourceAdapter;
-import javax.resource.spi.ResourceAdapterInternalException;
-import javax.resource.spi.XATerminator;
-import javax.resource.spi.work.WorkManager;
-import javax.transaction.TransactionManager;
-import javax.transaction.TransactionSynchronizationRegistry;
-import javax.validation.ValidationException;
-import javax.validation.ValidatorFactory;
-import java.io.File;
-import java.io.IOException;
-import java.lang.instrument.ClassFileTransformer;
-import java.lang.instrument.Instrumentation;
-import java.lang.management.ManagementFactory;
-import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicInteger;
-
 public class Assembler extends AssemblerTool implements 
org.apache.openejb.spi.Assembler {
 
     static {
@@ -654,6 +608,7 @@ public class Assembler extends Assembler
                     for (ResourceInfo adminObject : connector.adminObject) {
                         createResource(adminObject);
                     }
+                    createDatasources(connector.datasourceDefinitions, 
classLoader);
                 } finally {
                     
Thread.currentThread().setContextClassLoader(oldClassLoader);
                 }
@@ -751,6 +706,8 @@ public class Assembler extends Assembler
                     }
                 }
 
+                createDatasources(ejbJar.datasourceDefinitions, classLoader);
+
                 allDeployments.addAll(deployments.values());
             }
 
@@ -830,6 +787,8 @@ public class Assembler extends Assembler
                     containerSystemContext.bind("openejb/client/" + 
clientClassName, clientInfo.moduleId);
                     
logger.getChildLogger("client").info("createApplication.createLocalClient", 
clientClassName, clientInfo.moduleId);
                 }
+
+                createDatasources(clientInfo.datasourceDefinitions, 
classLoader);
             }
 
             SystemInstance systemInstance = SystemInstance.get();
@@ -866,6 +825,18 @@ public class Assembler extends Assembler
         }
     }
 
+    private void createDatasources(Set<ResourceInfo> datasourceDefinitions, 
ClassLoader classLoader) throws OpenEJBException {
+        for (ResourceInfo dataSource : datasourceDefinitions) {
+            DataSource ds = DatasourceDefinitionHelper.newInstance(dataSource, 
classLoader);
+            if (ds == null) {
+                logger.error("can't instantiate " + dataSource.id);
+                continue;
+            }
+            PassthroughFactory.add(dataSource, ds);
+            createResource(dataSource);
+        }
+    }
+
     private void ensureWebBeansContext(AppContext appContext) {
         WebBeansContext webBeansContext = 
appContext.get(WebBeansContext.class);
         if (webBeansContext == null) webBeansContext = 
appContext.getWebBeansContext();

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
 Fri Aug 26 11:43:19 2011
@@ -21,7 +21,7 @@ import java.util.ArrayList;
 import java.util.Set;
 import java.util.TreeSet;
 
-public class ClientInfo extends ValidationInfoObject {
+public class ClientInfo extends CommonInfoObject {
 
     public String path;
     public String description;

Copied: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CommonInfoObject.java
 (from r1161530, 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfoObject.java)
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CommonInfoObject.java?p2=openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CommonInfoObject.java&p1=openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfoObject.java&r1=1161530&r2=1162070&rev=1162070&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfoObject.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CommonInfoObject.java
 Fri Aug 26 11:43:19 2011
@@ -16,10 +16,14 @@
  */
 package org.apache.openejb.assembler.classic;
 
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * @author Romain Manni-Bucau
  */
-public class ValidationInfoObject extends InfoObject {
+public class CommonInfoObject extends InfoObject {
     public ValidationInfo validationInfo;
     public String uniqueId;
+    public Set<ResourceInfo> datasourceDefinitions = new 
HashSet<ResourceInfo>();
 }

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
 Fri Aug 26 11:43:19 2011
@@ -21,7 +21,7 @@ import java.util.ArrayList;
 import java.util.Set;
 import java.util.TreeSet;
 
-public class ConnectorInfo extends ValidationInfoObject {
+public class ConnectorInfo extends CommonInfoObject {
 
     public String path;
     public String description;

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
 Fri Aug 26 11:43:19 2011
@@ -23,7 +23,7 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.TreeSet;
 
-public class EjbJarInfo extends ValidationInfoObject {
+public class EjbJarInfo extends CommonInfoObject {
     public final Properties properties = new Properties();
 
     public String moduleName;

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
 Fri Aug 26 11:43:19 2011
@@ -21,7 +21,7 @@ import java.util.TreeSet;
 import java.util.List;
 import java.util.ArrayList;
 
-public class WebAppInfo extends ValidationInfoObject {
+public class WebAppInfo extends CommonInfoObject {
     public String path;
     public String description;
     public String displayName;

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/dynamic/PassthroughFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/dynamic/PassthroughFactory.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/dynamic/PassthroughFactory.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/dynamic/PassthroughFactory.java
 Fri Aug 26 11:43:19 2011
@@ -16,10 +16,7 @@
  */
 package org.apache.openejb.assembler.dynamic;
 
-import java.util.Map;
 import java.util.Properties;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.openejb.assembler.classic.ServiceInfo;
 

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 Fri Aug 26 11:43:19 2011
@@ -130,6 +130,8 @@ import javax.annotation.security.DenyAll
 import javax.annotation.security.PermitAll;
 import javax.annotation.security.RolesAllowed;
 import javax.annotation.security.RunAs;
+import javax.annotation.sql.DataSourceDefinition;
+import javax.annotation.sql.DataSourceDefinitions;
 import javax.ejb.AccessTimeout;
 import javax.ejb.AfterBegin;
 import javax.ejb.AfterCompletion;
@@ -260,8 +262,14 @@ public class AnnotationDeployer implemen
     private final ProcessAnnotatedBeans processAnnotatedBeans;
     private final EnvEntriesPropertiesDeployer envEntriesPropertiesDeployer;
     private final MBeanDeployer mBeanDeployer;
+    private final AutoConfig autoConfig;
 
     public AnnotationDeployer() {
+        this(null);
+    }
+
+    public AnnotationDeployer(AutoConfig autoConfig) {
+        this.autoConfig = autoConfig;
         discoverAnnotatedBeans = new DiscoverAnnotatedBeans();
         processAnnotatedBeans = new ProcessAnnotatedBeans();
         envEntriesPropertiesDeployer = new EnvEntriesPropertiesDeployer();
@@ -333,7 +341,6 @@ public class AnnotationDeployer implemen
         return jndiName.startsWith("java:global/") || 
jndiName.startsWith("java:app/") || jndiName.startsWith("java:module/");
     }
     public static class DiscoverAnnotatedBeans implements DynamicDeployer {
-
         public AppModule deploy(AppModule appModule) throws OpenEJBException {
             for (EjbModule ejbModule : appModule.getEjbModules()) {
                 setModule(ejbModule);
@@ -417,6 +424,8 @@ public class AnnotationDeployer implemen
                 }
             }
 
+            addDatasourceDefinitions(clientModule, finder);
+
             return clientModule;
         }
 
@@ -681,6 +690,8 @@ public class AnnotationDeployer implemen
                                        
process(connectorModule.getClassLoader(), 
activationSpec.getActivationSpecClass(), activationSpec);
                                }
                }
+
+            addDatasourceDefinitions(connectorModule, finder);
                
             return connectorModule;
         }
@@ -981,7 +992,7 @@ public class AnnotationDeployer implemen
             }
 
             /*
-             *REST
+             * REST
              */
             // get by annotations
             webModule.getRestClasses().addAll(findRestClasses(webModule, 
finder));
@@ -991,6 +1002,8 @@ public class AnnotationDeployer implemen
                 webModule.getRestApplications().add(app.getName());
             }
 
+            addDatasourceDefinitions(webModule, finder);
+
             return webModule;
         }
 
@@ -1256,9 +1269,55 @@ public class AnnotationDeployer implemen
                 }
             }
 
+            addDatasourceDefinitions(ejbModule, finder);
+
             return ejbModule;
         }
 
+        private void addDatasourceDefinitions(Module module, IAnnotationFinder 
finder) {
+            List<DataSourceDefinition> datasources = new 
ArrayList<DataSourceDefinition>();
+
+            List<Annotated<Class<?>>> dataSourceDefinitionsClasses = 
finder.findMetaAnnotatedClasses(DataSourceDefinitions.class);
+            for (Annotated<Class<?>> dsDefsClass : 
dataSourceDefinitionsClasses) {
+                DataSourceDefinitions defs = 
dsDefsClass.getAnnotation(DataSourceDefinitions.class);
+                for (DataSourceDefinition dsDef : defs.value()) {
+                    datasources.add(dsDef);
+                }
+            }
+
+            List<Annotated<Class<?>>> dataSourceDefinitionClasses = 
finder.findMetaAnnotatedClasses(DataSourceDefinition.class);
+            for (Annotated<Class<?>> dsDefsClass : 
dataSourceDefinitionClasses) {
+                
datasources.add(dsDefsClass.getAnnotation(DataSourceDefinition.class));
+            }
+
+            for (DataSourceDefinition dsDef : datasources) {
+                DatasourceDefinition def = getDatasourceDefinitaion(dsDef);
+                module.getDatasources().add(def);
+            }
+        }
+
+        private DatasourceDefinition 
getDatasourceDefinitaion(DataSourceDefinition dsDef) {
+            DatasourceDefinition def = new DatasourceDefinition();
+            def.setTransactional(dsDef.transactional());
+            def.setInitialPoolSize(dsDef.initialPoolSize());
+            def.setIsolationLevel(dsDef.isolationLevel());
+            def.setMaxIdleTime(dsDef.maxIdleTime());
+            def.setMaxPoolSize(dsDef.maxPoolSize());
+            def.setMaxStatements(dsDef.maxStatements());
+            def.setMinPoolSize(dsDef.minPoolSize());
+            def.setPortNumber(dsDef.portNumber());
+            def.setDatabaseName(dsDef.databaseName());
+            def.setDescription(dsDef.description());
+            def.setPassword(dsDef.password());
+            def.setServerName(dsDef.serverName());
+            def.setUrl(dsDef.url());
+            def.setUser(dsDef.user());
+            def.setProperties(dsDef.properties());
+            def.setClassName(dsDef.className());
+            def.setName(dsDef.name());
+            return def;
+        }
+
         private List<String> getBeanClasses(IAnnotationFinder finder) {
 
             //  What we're hoping in this method is to get lucky and find

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
 Fri Aug 26 11:43:19 2011
@@ -19,6 +19,7 @@ package org.apache.openejb.config;
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.ClientInfo;
+import org.apache.openejb.assembler.classic.CommonInfoObject;
 import org.apache.openejb.assembler.classic.ConnectorInfo;
 import org.apache.openejb.assembler.classic.EjbJarInfo;
 import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
@@ -168,6 +169,7 @@ class AppInfoBuilder {
                 
ejbJarInfo.portInfos.addAll(configureWebservices(ejbModule.getWebservices()));
                 ejbJarInfo.uniqueId = ejbModule.getUniqueId();
                 ejbJarInfo.repositories = ejbModule.getRepositories();
+                copyDatasources(ejbModule, ejbJarInfo);
                 configureWebserviceSecurity(ejbJarInfo, ejbModule);
 
                 ejbJarInfos.put(ejbModule, ejbJarInfo);
@@ -268,6 +270,45 @@ class AppInfoBuilder {
 
     }
 
+    private void copyDatasources(Module module, CommonInfoObject info) {
+        for (DatasourceDefinition def : module.getDatasources()) {
+            ResourceInfo resourceInfo = new ResourceInfo();
+            resourceInfo.id = def.getName();
+
+            int idx;
+            if (resourceInfo.id != null) {
+                idx = resourceInfo.id.indexOf(':');
+                if (idx > -1) {
+                    resourceInfo.id = resourceInfo.id.substring(idx + 1);
+                }
+            }
+
+            resourceInfo.service = "Resource";
+            resourceInfo.types.add("javax.sql.DataSource");
+
+            resourceInfo.properties = new Properties();
+            resourceInfo.properties.put("transactional", 
def.isTransactional());
+            resourceInfo.properties.put("initialPoolSize", 
def.getInitialPoolSize());
+            resourceInfo.properties.put("isolationLevel", 
def.getIsolationLevel());
+            resourceInfo.properties.put("maxIdleTime", def.getMaxIdleTime());
+            resourceInfo.properties.put("maxPoolSize", def.getMaxPoolSize());
+            resourceInfo.properties.put("maxStatements", 
def.getMaxStatements());
+            resourceInfo.properties.put("minPoolSize", def.getMinPoolSize());
+            resourceInfo.properties.put("portNumber", def.getPortNumber());
+            resourceInfo.properties.put("databaseName", def.getDatabaseName());
+            resourceInfo.properties.put("description", def.getDescription());
+            resourceInfo.properties.put("password", def.getPassword());
+            resourceInfo.properties.put("serverName", def.getServerName());
+            resourceInfo.properties.put("url", def.getUrl());
+            resourceInfo.properties.put("user", def.getUser());
+            resourceInfo.properties.put("properties", def.getProperties());
+            resourceInfo.properties.put("className", def.getClassName());
+            resourceInfo.properties.put("name", def.getName());
+
+            info.datasourceDefinitions.add(resourceInfo);
+        }
+    }
+
     private void buildClientModules(AppModule appModule, AppInfo appInfo, 
JndiEncInfoBuilder jndiEncInfoBuilder) throws OpenEJBException {
         for (ClientModule clientModule : appModule.getClientModules()) {
             ApplicationClient applicationClient = 
clientModule.getApplicationClient();

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
 Fri Aug 26 11:43:19 2011
@@ -72,6 +72,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;

Added: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinition.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinition.java?rev=1162070&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinition.java
 (added)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinition.java
 Fri Aug 26 11:43:19 2011
@@ -0,0 +1,169 @@
+package org.apache.openejb.config;
+
+/**
+ * @author rmannibucau
+ */
+public class DatasourceDefinition {
+    private boolean transactional;
+    private int initialPoolSize;
+    private int isolationLevel;
+    private int loginTimeout;
+    private int maxIdleTime;
+    private int maxPoolSize;
+    private int maxStatements;
+    private int minPoolSize;
+    private int portNumber;
+    private String databaseName;
+    private String description;
+    private String password;
+    private String serverName;
+    private String url;
+    private String user;
+    private String[] properties;
+    private String className;
+    private String name;
+
+    public boolean isTransactional() {
+        return transactional;
+    }
+
+    public void setTransactional(boolean transactional) {
+        this.transactional = transactional;
+    }
+
+    public int getInitialPoolSize() {
+        return initialPoolSize;
+    }
+
+    public void setInitialPoolSize(int initialPoolSize) {
+        this.initialPoolSize = initialPoolSize;
+    }
+
+    public int getIsolationLevel() {
+        return isolationLevel;
+    }
+
+    public void setIsolationLevel(int isolationLevel) {
+        this.isolationLevel = isolationLevel;
+    }
+
+    public int getLoginTimeout() {
+        return loginTimeout;
+    }
+
+    public void setLoginTimeout(int loginTimeout) {
+        this.loginTimeout = loginTimeout;
+    }
+
+    public int getMaxIdleTime() {
+        return maxIdleTime;
+    }
+
+    public void setMaxIdleTime(int maxIdleTime) {
+        this.maxIdleTime = maxIdleTime;
+    }
+
+    public int getMaxPoolSize() {
+        return maxPoolSize;
+    }
+
+    public void setMaxPoolSize(int maxPoolSize) {
+        this.maxPoolSize = maxPoolSize;
+    }
+
+    public int getMaxStatements() {
+        return maxStatements;
+    }
+
+    public void setMaxStatements(int maxStatements) {
+        this.maxStatements = maxStatements;
+    }
+
+    public int getMinPoolSize() {
+        return minPoolSize;
+    }
+
+    public void setMinPoolSize(int minPoolSize) {
+        this.minPoolSize = minPoolSize;
+    }
+
+    public int getPortNumber() {
+        return portNumber;
+    }
+
+    public void setPortNumber(int portNumber) {
+        this.portNumber = portNumber;
+    }
+
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
+    public void setDatabaseName(String databaseName) {
+        this.databaseName = databaseName;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getServerName() {
+        return serverName;
+    }
+
+    public void setServerName(String serverName) {
+        this.serverName = serverName;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public String[] getProperties() {
+        return properties;
+    }
+
+    public void setProperties(String[] properties) {
+        this.properties = properties;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

Added: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinitionHelper.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinitionHelper.java?rev=1162070&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinitionHelper.java
 (added)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DatasourceDefinitionHelper.java
 Fri Aug 26 11:43:19 2011
@@ -0,0 +1,124 @@
+package org.apache.openejb.config;
+
+import org.apache.commons.dbcp.BasicDataSource;
+import org.apache.openejb.assembler.classic.ResourceInfo;
+import org.apache.openejb.resource.jdbc.DataSourceFactory;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
+import org.apache.xbean.recipe.ObjectRecipe;
+import org.apache.xbean.recipe.Option;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * @author rmannibucau
+ */
+public final class DatasourceDefinitionHelper {
+    public static final Logger logger = 
Logger.getInstance(LogCategory.OPENEJB_STARTUP, 
DatasourceDefinitionHelper.class.getPackage().getName());
+
+    private static final Collection<String> MANUALLY_SET_PROPERTIES = 
Arrays.asList("serName", "portNumber", "url");
+
+    private DatasourceDefinitionHelper() {
+        // no-op
+    }
+
+    /**
+     * datasource has to be created here since resources deployment was 
already done at start up time.
+     *
+     *
+     * @param resourceInfo the datasource definition
+     * @param classLoader the classloader to use
+     * @return the datasource defined by dsDef
+     */
+    public static DataSource newInstance(ResourceInfo resourceInfo, 
ClassLoader classLoader) {
+        String className = resourceInfo.properties.getProperty("className");
+        String url = resourceInfo.properties.getProperty("url");
+        String server = resourceInfo.properties.getProperty("serverName");
+        int port = (Integer) resourceInfo.properties.get("portNumber");
+
+        DataSource ds;
+
+        Class<?> clazz;
+        try {
+            clazz = classLoader.loadClass(className);
+        } catch (ClassNotFoundException e) {
+            return null;
+        }
+
+        if (!BasicDataSource.class.isAssignableFrom(clazz)) {
+            ObjectRecipe objectRecipe = new ObjectRecipe(className);
+            objectRecipe.allow(Option.FIELD_INJECTION);
+            objectRecipe.allow(Option.PRIVATE_PROPERTIES);
+            objectRecipe.allow(Option.IGNORE_MISSING_PROPERTIES);
+            objectRecipe.allow(Option.NAMED_PARAMETERS);
+
+            if (port <= 0) {
+                objectRecipe.setProperty("url", url);
+            } else {
+                objectRecipe.setProperty("serverName", server);
+                objectRecipe.setProperty("portNumber", port);
+            }
+
+            for (Map.Entry<Object, Object> prop : 
resourceInfo.properties.entrySet()) {
+                String name = (String) prop.getKey();
+                if (!MANUALLY_SET_PROPERTIES.contains(name)) {
+                    Object value = prop.getValue();
+                    if (value != null
+                            && ((value instanceof Number && ((Number) 
value).intValue() > 0)
+                                || !(value instanceof Number))) {
+                        objectRecipe.setProperty(name, value);
+                    }
+                    if (name.endsWith("Name")) {
+                        // depending of implementations...
+                        objectRecipe.setProperty(name.substring(0, 
name.length() - 4), value);
+                    }
+                }
+            }
+
+            ds = (DataSource) objectRecipe.create(classLoader);
+        } else {
+            ds = DataSourceFactory.create(true);
+            BasicDataSource bd = (BasicDataSource) ds;
+            if (server != null && port > 0) {
+                if (url != null) { // try to use the pattern provided
+                    int startHost = url.indexOf("//");
+                    int endHost = url.indexOf("/", startHost + 2);
+                    url = url.replace(url.substring(startHost + 2, endHost), 
server + ":" + port);
+                } else {
+                    url = "jdbc:derby://" + server + ":" + port
+                            + "/" + 
resourceInfo.properties.getProperty("databaseName");
+                }
+            }
+            bd.setUrl(url);
+
+            bd.setInitialSize((Integer) 
resourceInfo.properties.get("initialPoolSize"));
+            try {
+                if ((Integer) resourceInfo.properties.get("loginTimeout") > 0) 
{
+                    bd.setLoginTimeout((Integer) 
resourceInfo.properties.get("loginTimeout"));
+                }
+            } catch (SQLException e) {
+                // ignored
+            }
+            if ((Integer) resourceInfo.properties.get("maxIdleTime") > 0) {
+                bd.setMaxIdle((Integer) 
resourceInfo.properties.get("maxIdleTime"));
+            }
+            if ((Integer) resourceInfo.properties.get("maxStatements") > 0) {
+                bd.setMaxOpenPreparedStatements((Integer) 
resourceInfo.properties.get("maxStatements"));
+            }
+            if ((Integer) resourceInfo.properties.get("minPoolSize") > 0) {
+                bd.setMinIdle((Integer) 
resourceInfo.properties.get("minPoolSize"));
+            }
+            if ((Integer) resourceInfo.properties.get("maxPoolSize") > 0) {
+                bd.setMaxIdle((Integer) 
resourceInfo.properties.get("maxPoolSize"));
+            }
+            bd.setPassword(resourceInfo.properties.getProperty("password"));
+            bd.setUsername(resourceInfo.properties.getProperty("user"));
+        }
+
+        return ds;
+    }
+}

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java?rev=1162070&r1=1162069&r2=1162070&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Module.java
 Fri Aug 26 11:43:19 2011
@@ -19,7 +19,9 @@ package org.apache.openejb.config;
 import org.apache.openejb.jee.bval.ValidationConfigType;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 public class Module {
     private static int currentId = 1; // unique id to be able to bind 
something for each module in the jndi tree
@@ -31,6 +33,7 @@ public class Module {
     private ValidationConfigType validationConfig;
     private final Map<String, Object> altDDs = new HashMap<String, Object>();
     private String uniqueId;
+    private Set<DatasourceDefinition> datasources = new 
HashSet<DatasourceDefinition>();
 
     public Module() {
         uniqueId = Integer.toString(currentId++);
@@ -67,5 +70,8 @@ public class Module {
     public void setClassLoader(ClassLoader classLoader) {
         this.classLoader = classLoader;
     }
-       
+
+    public Set<DatasourceDefinition> getDatasources() {
+        return datasources;
+    }
 }

Added: 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java?rev=1162070&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java
 (added)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java
 Fri Aug 26 11:43:19 2011
@@ -0,0 +1,50 @@
+package org.apache.openejb.assembler.classic;
+
+import org.apache.openejb.jee.Empty;
+import org.apache.openejb.jee.StatelessBean;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.junit.Module;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.annotation.Resource;
+import javax.annotation.sql.DataSourceDefinition;
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.sql.DataSource;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+
+/**
+ * @author rmannibucau
+ */
+@RunWith(ApplicationComposer.class)
+public class DataSourceDefinitionTest {
+    @EJB private DatasourceDefinitionBean bean;
+
+    @Module public Class<?>[] app() throws Exception {
+        return new Class<?>[]{ DatasourceDefinitionBean.class };
+    }
+
+    @DataSourceDefinition(
+        name = "superDS",
+        className = "org.hsqldb.jdbc.jdbcDataSource",
+        url = "jdbc:hsqldb:mem:superDS"
+    )
+    @Stateless
+    public static class DatasourceDefinitionBean {
+//         @Resource(lookup = "java:openjeb/Resource/superDS") private 
DataSource ds;
+        @Resource private DataSource ds;
+
+        public DataSource getDs() {
+            return ds;
+        }
+    }
+
+    @Test @Ignore("Resource annotation needs lookup to make it work") public 
void assertDs() {
+        assertNotNull(bean.getDs());
+        assertEquals("org.hsqldb.jdbc.jdbcDataSource", 
bean.getDs().getClass().getName());
+    }
+}


Reply via email to