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 2011/09/15 13:31:08 UTC

svn commit: r1171061 - in /openejb/trunk/openejb3: assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/META-INF/org.apache.openejb.tomcat/ assembly/openejb-tomcat/tomee-embedded/src/main/resources/META-INF/org.apache.openejb.tomcat/ contai...

Author: dblevins
Date: Thu Sep 15 11:31:07 2011
New Revision: 1171061

URL: http://svn.apache.org/viewvc?rev=1171061&view=rev
Log:
OPENEJB-1665: @DataSourceDefinition support

 - Support for deployment descriptor declared <data-source> elements
 - @DataSourceDefinition annotations are translated into the equivalent JAXB object (not directly into a Resource object)
 - JAXB DataSource definitions are translated into Resource objects prior to AutoConfig
 - DataSources created from definitions are prefixed with the appName prior to binding into the private openejb/Resource/ namespace
 - A single JNDI reference hardcoded to point to the DataSource definition will automatically created and added to all the consumers.
 - Raw version of the DataSource definition properties are passed straight through to the DataSourceFactory so that it may use them to internally construct the DataSource via xbean-reflect
 - Respect xml overriding -- ignore the annotation data if the DataSource is defined in xml


Added:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertDataSourceDefinitions.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DescriptorDataSourceDefinitionTest.java
      - copied, changed from r1170434, openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java
Modified:
    openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/META-INF/org.apache.openejb.tomcat/service-jar.xml
    openejb/trunk/openejb3/assembly/openejb-tomcat/tomee-embedded/src/main/resources/META-INF/org.apache.openejb.tomcat/service-jar.xml
    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/AppModule.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/ConfigurationFactory.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resource.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
    openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.embedded/service-jar.xml
    openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java
    openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/DataSource.java
    openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ResourceRef.java

Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/META-INF/org.apache.openejb.tomcat/service-jar.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/META-INF/org.apache.openejb.tomcat/service-jar.xml?rev=1171061&r1=1171060&r2=1171061&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/META-INF/org.apache.openejb.tomcat/service-jar.xml (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/META-INF/org.apache.openejb.tomcat/service-jar.xml Thu Sep 15 11:31:07 2011
@@ -529,9 +529,11 @@
           service="Resource"
           types="javax.sql.DataSource, DataSource"
           factory-name="create"
-          constructor="JtaManaged, JdbcDriver"
+          constructor="JtaManaged, JdbcDriver, Definition"
           class-name="org.apache.openejb.resource.jdbc.DataSourceFactory">
 
+    Definition
+
     # Determines wether or not this data source should be JTA managed
     # or user managed.  If set to 'true' it will automatically be enrolled
     # in any ongoing transactions.  Calling begin/commit/rollback or setAutoCommit
@@ -725,9 +727,11 @@
           service="Resource"
           types="javax.sql.DataSource, DataSource"
           factory-name="create"
-          constructor="JtaManaged, JdbcDriver"
+          constructor="JtaManaged, JdbcDriver, Definition"
           class-name="org.apache.openejb.resource.jdbc.DataSourceFactory">
 
+    Definition
+
     JtaManaged = false
 
     # Driver class name

Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/tomee-embedded/src/main/resources/META-INF/org.apache.openejb.tomcat/service-jar.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/tomee-embedded/src/main/resources/META-INF/org.apache.openejb.tomcat/service-jar.xml?rev=1171061&r1=1171060&r2=1171061&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/tomee-embedded/src/main/resources/META-INF/org.apache.openejb.tomcat/service-jar.xml (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/tomee-embedded/src/main/resources/META-INF/org.apache.openejb.tomcat/service-jar.xml Thu Sep 15 11:31:07 2011
@@ -529,9 +529,11 @@
           service="Resource"
           types="javax.sql.DataSource, DataSource"
           factory-name="create"
-          constructor="JtaManaged"
+          constructor="JtaManaged, JdbcDriver, Definition"
           class-name="org.apache.openejb.resource.jdbc.DataSourceFactory">
 
+    Definition
+
     # Determines wether or not this data source should be JTA managed
     # or user managed.  If set to 'true' it will automatically be enrolled
     # in any ongoing transactions.  Calling begin/commit/rollback or setAutoCommit
@@ -725,9 +727,11 @@
           service="Resource"
           types="javax.sql.DataSource, DataSource"
           factory-name="create"
-          constructor="JtaManaged"
+          constructor="JtaManaged, JdbcDriver, Definition"
           class-name="org.apache.openejb.resource.jdbc.DataSourceFactory">
 
+    Definition
+
     JtaManaged = false
 
     # Driver class name

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=1171061&r1=1171060&r2=1171061&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 Thu Sep 15 11:31:07 2011
@@ -38,6 +38,7 @@ import org.apache.openejb.jee.Concurrent
 import org.apache.openejb.jee.ConfigProperty;
 import org.apache.openejb.jee.ContainerConcurrency;
 import org.apache.openejb.jee.ContainerTransaction;
+import org.apache.openejb.jee.DataSource;
 import org.apache.openejb.jee.EjbJar;
 import org.apache.openejb.jee.EjbLocalRef;
 import org.apache.openejb.jee.EjbRef;
@@ -59,6 +60,7 @@ import org.apache.openejb.jee.InjectionT
 import org.apache.openejb.jee.Interceptor;
 import org.apache.openejb.jee.InterceptorBinding;
 import org.apache.openejb.jee.Invokable;
+import org.apache.openejb.jee.IsolationLevel;
 import org.apache.openejb.jee.JndiConsumer;
 import org.apache.openejb.jee.JndiReference;
 import org.apache.openejb.jee.License;
@@ -187,7 +189,6 @@ import javax.resource.spi.ConnectionDefi
 import javax.resource.spi.Connector;
 import javax.resource.spi.SecurityPermission;
 import javax.resource.spi.work.WorkContext;
-import javax.sql.DataSource;
 import javax.ws.rs.Path;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.Context;
@@ -423,8 +424,6 @@ public class AnnotationDeployer implemen
                 }
             }
 
-            addDatasourceDefinitions(clientModule, finder);
-
             return clientModule;
         }
 
@@ -690,8 +689,6 @@ public class AnnotationDeployer implemen
 				}
         	}
 
-            addDatasourceDefinitions(connectorModule, finder);
-        	
             return connectorModule;
         }
 
@@ -1001,8 +998,6 @@ public class AnnotationDeployer implemen
                 webModule.getRestApplications().add(app.getName());
             }
 
-            addDatasourceDefinitions(webModule, finder);
-
             return webModule;
         }
 
@@ -1268,67 +1263,9 @@ 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) {
-                org.apache.openejb.config.sys.Resource def = getDatasourceDefinitaion(dsDef);
-                module.addResource(def);
-            }
-        }
-
-        private org.apache.openejb.config.sys.Resource getDatasourceDefinitaion(DataSourceDefinition dsDef) {
-            String name = dsDef.name();
-            name = name.replaceFirst("java:comp/env/", "");
-            name = name.replaceFirst("java:", "");
-
-            org.apache.openejb.config.sys.Resource def = new org.apache.openejb.config.sys.Resource(name, DataSource.class.getName());
-            def.setJndi(dsDef.name().replaceFirst("java:", ""));
-            def.setType("javax.sql.DataSource");
-
-            Properties properties = def.getProperties();
-            properties.put("JtaManaged", dsDef.transactional());
-            properties.put("InitialSize", dsDef.initialPoolSize());
-            properties.put("DefaultIsolationLevel", dsDef.isolationLevel());
-            properties.put("LoginTimeout", Math.max(dsDef.loginTimeout(), 1));
-            properties.put("MinEvictableIdleTimeMillis", dsDef.maxIdleTime());
-            properties.put("MaxIdle", dsDef.maxPoolSize());
-            properties.put("MinIdle", dsDef.minPoolSize());
-            properties.put("MaxStatements", dsDef.maxStatements());
-            properties.put("Password", dsDef.password());
-            properties.put("JdbcUrl", dsDef.url());
-            properties.put("UserName", dsDef.user());
-            properties.put("JdbcDriver", dsDef.className());
-            properties.put("PortNumber", dsDef.portNumber());
-            properties.put("DatabaseName", dsDef.databaseName());
-            properties.put("Description", dsDef.description());
-            properties.put("ServerName", dsDef.serverName());
-            properties.put("Properties", dsDef.properties());
-
-            // to force it to be bound in JndiEncBuilder
-            properties.put("JndiName", def.getJndi());
-
-            return def;
-        }
-
         private List<String> getBeanClasses(IAnnotationFinder finder) {
 
             //  What we're hoping in this method is to get lucky and find
@@ -3311,6 +3248,22 @@ public class AnnotationDeployer implemen
                 Member member = new MethodMember(method.get());
                 buildPersistenceContext(consumer, pcFactory.create(pCtx, member), member);
             }
+
+            //
+            // @DataSourceDefinition
+            //
+
+            for (Annotated<Class<?>> annotated : annotationFinder.findMetaAnnotatedClasses(DataSourceDefinitions.class)) {
+                DataSourceDefinitions defs = annotated.getAnnotation(DataSourceDefinitions.class);
+                for (DataSourceDefinition definition : defs.value()) {
+                    buildDataSourceDefinition(consumer, definition);
+                }
+            }
+
+            for (Annotated<Class<?>> annotated : annotationFinder.findMetaAnnotatedClasses(DataSourceDefinition.class)) {
+                DataSourceDefinition definition = annotated.getAnnotation(DataSourceDefinition.class);
+                buildDataSourceDefinition(consumer, definition);
+            }
         }
 
         private void buildContext(JndiConsumer consumer, Member member) {
@@ -3930,6 +3883,42 @@ public class AnnotationDeployer implemen
             }
         }
 
+        private void buildDataSourceDefinition(JndiConsumer consumer, DataSourceDefinition d) {
+            final org.apache.openejb.jee.DataSource dataSource = new org.apache.openejb.jee.DataSource();
+
+            dataSource.setName(d.name());
+            dataSource.setClassName(d.className());
+            dataSource.setTransactional(d.transactional());
+
+            final DataSource existing = consumer.getDataSourceMap().get(dataSource.getKey());
+
+            if (existing != null) return;
+
+            // Optional properties
+            if (d.databaseName() != "") dataSource.setDatabaseName(d.databaseName());
+            if (d.initialPoolSize() != -1) dataSource.setInitialPoolSize(d.initialPoolSize());
+            if (d.isolationLevel() != -1) dataSource.setIsolationLevel(IsolationLevel.fromFlag(d.isolationLevel()));
+            if (d.loginTimeout() != 0) dataSource.setLoginTimeout(d.loginTimeout());
+            if (d.maxIdleTime() != -1) dataSource.setMaxIdleTime(d.maxIdleTime());
+            if (d.maxPoolSize() != -1) dataSource.setMaxPoolSize(d.maxPoolSize());
+            if (d.maxStatements() != -1) dataSource.setMaxStatements(d.maxStatements());
+            if (d.minPoolSize() != -1) dataSource.setMinPoolSize(d.minPoolSize());
+            if (d.password() != "") dataSource.setPassword(d.password());
+            if (d.portNumber() != -1) dataSource.setPortNumber(d.portNumber());
+            if (d.serverName() != "localhost") dataSource.setServerName(d.serverName());
+            if (d.url() != "") dataSource.setUrl(d.url());
+            if (d.user() != "") dataSource.setUrl(d.user());
+
+            for (String s : d.properties()) {
+                final String key = s.substring(0, s.indexOf('='));
+                final String value = s.substring(s.indexOf('='));
+
+                dataSource.property(key, value);
+            }
+
+            consumer.getDataSource().add(dataSource);
+        }
+
 
         /**
          * Process @WebServiceRef and @HandlerChain for the given member (field or method)

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java?rev=1171061&r1=1171060&r2=1171061&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java Thu Sep 15 11:31:07 2011
@@ -48,7 +48,7 @@ public class AppModule implements Deploy
     private final List<ClientModule> clientModules = new ArrayList<ClientModule>();
     private final List<EjbModule> ejbModules = new ArrayList<EjbModule>();
     private final List<PersistenceModule> persistenceModules = new ArrayList<PersistenceModule>();
-    private final Collection<Resource> resources = new ArrayList<Resource>();
+    private final Collection<Resource> resources = new HashSet<Resource>();
     private final ClassLoader classLoader;
     private EntityMappings cmpMappings;
     private final Map<String,Object> altDDs = new HashMap<String,Object>();

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=1171061&r1=1171060&r2=1171061&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 Thu Sep 15 11:31:07 2011
@@ -830,6 +830,18 @@ public class AutoConfig implements Dynam
     private void processDataSourceDefinitions(AppModule module) throws OpenEJBException {
         Collection<Resource> datasources = module.getResources();
 
+        if (datasources.size() == 0) return;
+
+        List<JndiConsumer> jndiConsumers = new ArrayList<JndiConsumer>();
+        for (WebModule webModule : module.getWebModules()) {
+            final JndiConsumer consumer = webModule.getWebApp();
+            jndiConsumers.add(consumer);
+        }
+
+        for (EjbModule ejbModule : module.getEjbModules()) {
+            Collections.addAll(jndiConsumers, ejbModule.getEjbJar().getEnterpriseBeans());
+        }
+
         for (Resource datasource : datasources) {
             if (!DataSource.class.getName().equals(datasource.getType())) {
                 continue;
@@ -844,12 +856,38 @@ public class AutoConfig implements Dynam
             properties.remove("LoginTimeout");
 
             ResourceInfo resourceInfo = configFactory.configureService(datasource, ResourceInfo.class);
+            resourceInfo.id = module.getModuleId() + "/" + resourceInfo.id;
+
+            final ResourceRef dataSourceRef = new ResourceRef(dataSourceLookupName(datasource), DataSource.class.getName());
+            dataSourceRef.setMappedName(resourceInfo.id);
+
+            for (JndiConsumer consumer : jndiConsumers) {
+
+                final ResourceRef existing = consumer.getResourceRefMap().get(dataSourceRef.getKey());
+                if (existing != null) {
+                    existing.setMappedName(dataSourceRef.getMappedName());
+                } else {
+                    consumer.getResourceRef().add(dataSourceRef);
+                }
+            }
+
+
             installResource(module.getModuleId(), resourceInfo);
         }
 
         datasources.clear();
     }
 
+    private String dataSourceLookupName(Resource datasource) {
+        final String jndi = datasource.getJndi();
+        if (jndi.startsWith("java:")) return jndi;
+        if (jndi.startsWith("comp/env/")) return "java:" + jndi;
+        if (jndi.startsWith("module/")) return "java:" + jndi;
+        if (jndi.startsWith("global/")) return "java:" + jndi;
+        if (jndi.startsWith("app/")) return "java:" + jndi;
+        return "java:comp/env/" + jndi;
+    }
+
     private static String getVendorUrl(Properties properties) {
 
         final String driver = properties.getProperty("JdbcDriver");

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1171061&r1=1171060&r2=1171061&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java Thu Sep 15 11:31:07 2011
@@ -186,6 +186,8 @@ public class ConfigurationFactory implem
             chain.add(preAutoConfigDeployer);
         }
 
+        chain.add(new ConvertDataSourceDefinitions());
+
         if (offline) {
             AutoConfig autoConfig = new AutoConfig(this);
             autoConfig.autoCreateResources(false);

Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertDataSourceDefinitions.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertDataSourceDefinitions.java?rev=1171061&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertDataSourceDefinitions.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertDataSourceDefinitions.java Thu Sep 15 11:31:07 2011
@@ -0,0 +1,168 @@
+/**
+ * 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.OpenEJBException;
+import org.apache.openejb.config.sys.Resource;
+import org.apache.openejb.jee.ApplicationClient;
+import org.apache.openejb.jee.DataSource;
+import org.apache.openejb.jee.JndiConsumer;
+import org.apache.openejb.jee.KeyedCollection;
+import org.apache.openejb.jee.Property;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ConvertDataSourceDefinitions implements DynamicDeployer {
+
+    @Override
+    public AppModule deploy(AppModule appModule) throws OpenEJBException {
+
+        List<JndiConsumer> jndiConsumers = collectConsumers(appModule);
+
+        final KeyedCollection<String, DataSource> dataSources = new KeyedCollection<String, DataSource>();
+
+        for (JndiConsumer consumer : jndiConsumers) {
+            if (consumer == null) continue;
+
+            dataSources.addAll(consumer.getDataSource());
+        }
+
+        for (DataSource dataSource : dataSources) {
+            appModule.getResources().add(toResource(dataSource));
+        }
+        return appModule;
+    }
+
+
+    private Resource toResource(DataSource datasource) {
+        String name = datasource.getName();
+        name = name.replaceFirst("java:comp/env/", "");
+        name = name.replaceFirst("java:", "");
+
+        Resource def = new Resource(name, javax.sql.DataSource.class.getName());
+
+        def.setJndi(datasource.getName().replaceFirst("java:", ""));
+        def.setType("javax.sql.DataSource");
+
+        Properties p = def.getProperties();
+        put(p, "JtaManaged", datasource.getTransactional());
+        put(p, "InitialSize", datasource.getInitialPoolSize());
+        put(p, "DefaultIsolationLevel", datasource.getIsolationLevel());
+        put(p, "LoginTimeout", datasource.getLoginTimeout());
+        put(p, "MinEvictableIdleTimeMillis", datasource.getMaxIdleTime());
+        put(p, "MaxIdle", datasource.getMaxPoolSize());
+        put(p, "MinIdle", datasource.getMinPoolSize());
+        put(p, "MaxStatements", datasource.getMaxStatements());
+        put(p, "Password", datasource.getPassword());
+        put(p, "JdbcUrl", datasource.getUrl());
+        put(p, "UserName", datasource.getUser());
+        put(p, "JdbcDriver", datasource.getClassName());
+        put(p, "PortNumber", datasource.getPortNumber());
+        put(p, "DatabaseName", datasource.getDatabaseName());
+        put(p, "Description", datasource.getDescription());
+        put(p, "ServerName", datasource.getServerName());
+        put(p, "Definition", rawDefinition(datasource));
+        setProperties(datasource, p);
+
+        // to force it to be bound in JndiEncBuilder
+        put(p, "JndiName", def.getJndi());
+
+        return def;
+    }
+
+    private String rawDefinition(DataSource d) {
+        try {
+            final Properties p = new Properties();
+
+            put(p, "transactional", d.getTransactional());
+            put(p, "initialPoolSize", d.getInitialPoolSize());
+            put(p, "isolationLevel", d.getIsolationLevel());
+            put(p, "loginTimeout", d.getLoginTimeout());
+            put(p, "maxIdleTime", d.getMaxIdleTime());
+            put(p, "maxPoolSize", d.getMaxPoolSize());
+            put(p, "maxStatements", d.getMaxStatements());
+            put(p, "minPoolSize", d.getMinPoolSize());
+            put(p, "portNumber", d.getPortNumber());
+            put(p, "databaseName", d.getDatabaseName());
+            put(p, "password", d.getPassword());
+            put(p, "serverName", d.getServerName());
+            put(p, "url", d.getUrl());
+            put(p, "user", d.getUser());
+
+            setProperties(d, p);
+
+            final ByteArrayOutputStream out = new ByteArrayOutputStream();
+            p.store(out, "");
+            return new String(out.toByteArray());
+        } catch (IOException e) {
+            throw new RuntimeException(String.format("Cannot canonicalize the @DataSourceDefinition %s as a properties string", d.getName()));
+        }
+    }
+
+    private void setProperties(DataSource d, Properties p) {
+        for (Property property : d.getProperty()) {
+
+            final String key = property.getName();
+            final String value = property.getValue();
+
+            put(p, key, value);
+        }
+    }
+
+    private static void put(Properties properties, String key, Object value) {
+        if (key == null) return;
+        if (value == null) return;
+
+        properties.put(key, value + "");
+    }
+
+    private List<JndiConsumer> collectConsumers(AppModule appModule) {
+
+        final List<JndiConsumer> jndiConsumers = new ArrayList<JndiConsumer>();
+
+        for (ClientModule module : appModule.getClientModules()) {
+            final JndiConsumer consumer = module.getApplicationClient();
+            if (consumer == null) continue;
+            jndiConsumers.add(consumer);
+        }
+
+        for (WebModule webModule : appModule.getWebModules()) {
+            final JndiConsumer consumer = webModule.getWebApp();
+            if (consumer == null) continue;
+            jndiConsumers.add(consumer);
+        }
+
+        for (EjbModule ejbModule : appModule.getEjbModules()) {
+            Collections.addAll(jndiConsumers, ejbModule.getEjbJar().getEnterpriseBeans());
+        }
+
+        if (appModule.getApplication() != null) {
+            jndiConsumers.add(appModule.getApplication());
+        }
+
+        return jndiConsumers;
+    }
+
+}

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java?rev=1171061&r1=1171060&r2=1171061&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java Thu Sep 15 11:31:07 2011
@@ -169,4 +169,30 @@ public abstract class AbstractService im
     public void setType(String type) {
         this.type = type;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof AbstractService)) return false;
+
+        AbstractService that = (AbstractService) o;
+
+        if (id != null ? !id.equals(that.id) : that.id != null) return false;
+        if (jar != null ? !jar.equals(that.jar) : that.jar != null) return false;
+        if (type != null ? !type.equals(that.type) : that.type != null) return false;
+        if (provider != null ? !provider.equals(that.provider) : that.provider != null) return false;
+        if (properties != null ? !properties.equals(that.properties) : that.properties != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = properties != null ? properties.hashCode() : 0;
+        result = 31 * result + (id != null ? id.hashCode() : 0);
+        result = 31 * result + (jar != null ? jar.hashCode() : 0);
+        result = 31 * result + (provider != null ? provider.hashCode() : 0);
+        result = 31 * result + (type != null ? type.hashCode() : 0);
+        return result;
+    }
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resource.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resource.java?rev=1171061&r1=1171060&r2=1171061&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resource.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resource.java Thu Sep 15 11:31:07 2011
@@ -82,4 +82,25 @@ public class Resource extends AbstractSe
     public void setJndi(String value) {
         this.jndi = value;
     }
+
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof Resource)) return false;
+        if (!super.equals(o)) return false;
+
+        Resource resource = (Resource) o;
+
+        if (jndi != null ? !jndi.equals(resource.jndi) : resource.jndi != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (jndi != null ? jndi.hashCode() : 0);
+        return result;
+    }
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java?rev=1171061&r1=1171060&r2=1171061&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java Thu Sep 15 11:31:07 2011
@@ -24,14 +24,20 @@ import org.apache.commons.dbcp.managed.T
 import org.apache.commons.dbcp.managed.XAConnectionFactory;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.resource.XAResourceWrapper;
+import org.apache.xbean.recipe.ObjectRecipe;
+import org.apache.xbean.recipe.Option;
 
 import javax.sql.DataSource;
 import javax.sql.XADataSource;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
+import java.util.Map;
+import java.util.Properties;
 import java.util.logging.Logger;
 
 /**
@@ -39,10 +45,20 @@ import java.util.logging.Logger;
  */
 public class DataSourceFactory {
 
-    public static DataSource create(boolean managed, Class impl) throws IllegalAccessException, InstantiationException {
+    public static DataSource create(boolean managed, Class impl, String definition) throws IllegalAccessException, InstantiationException, IOException {
+
+
         org.apache.commons.dbcp.BasicDataSource ds;
         if (DataSource.class.isAssignableFrom(impl)) {
-            DataSource dataSource = (DataSource) impl.newInstance();
+
+            final ObjectRecipe recipe = new ObjectRecipe(impl);
+            recipe.allow(Option.CASE_INSENSITIVE_PROPERTIES);
+            recipe.allow(Option.IGNORE_MISSING_PROPERTIES);
+            recipe.allow(Option.NAMED_PARAMETERS);
+            recipe.setAllProperties(asProperties(definition));
+
+            DataSource dataSource = (DataSource) recipe.create();
+
             if (managed) {
                 ds = new DbcpManagedDataSource(dataSource);
             } else {
@@ -58,6 +74,13 @@ public class DataSourceFactory {
         return ds;
     }
 
+    private static Map<?, ?> asProperties(String definition) throws IOException {
+        final ByteArrayInputStream in = new ByteArrayInputStream(definition.getBytes());
+        final Properties properties = new Properties();
+        properties.load(in);
+        return properties;
+    }
+
     public static DataSource create(boolean managed) {
         org.apache.commons.dbcp.BasicDataSource ds;
         if (managed) {

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.embedded/service-jar.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.embedded/service-jar.xml?rev=1171061&r1=1171060&r2=1171061&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.embedded/service-jar.xml (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.embedded/service-jar.xml Thu Sep 15 11:31:07 2011
@@ -517,9 +517,11 @@
           service="Resource"
           types="javax.sql.DataSource, DataSource"
           factory-name="create"
-          constructor="JtaManaged, JdbcDriver"
+          constructor="JtaManaged, JdbcDriver, Definition"
           class-name="org.apache.openejb.resource.jdbc.DataSourceFactory">
 
+    Definition
+
     # Determines wether or not this data source should be JTA managed
     # or user managed.  If set to 'true' it will automatically be enrolled
     # in any ongoing transactions.  Calling begin/commit/rollback or setAutoCommit
@@ -713,9 +715,11 @@
           service="Resource"
           types="javax.sql.DataSource, DataSource"
           factory-name="create"
-          constructor="JtaManaged, JdbcDriver"
+          constructor="JtaManaged, JdbcDriver, Definition"
           class-name="org.apache.openejb.resource.jdbc.DataSourceFactory">
 
+    Definition
+
     JtaManaged = false
 
     # Driver class name

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml?rev=1171061&r1=1171060&r2=1171061&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml Thu Sep 15 11:31:07 2011
@@ -526,9 +526,11 @@
           service="Resource"
           types="javax.sql.DataSource, DataSource"
           factory-name="create"
-          constructor="JtaManaged, JdbcDriver"
+          constructor="JtaManaged, JdbcDriver, Definition"
           class-name="org.apache.openejb.resource.jdbc.DataSourceFactory">
 
+    Definition
+
     # Determines wether or not this data source should be JTA managed
     # or user managed.  If set to 'true' it will automatically be enrolled
     # in any ongoing transactions.  Calling begin/commit/rollback or setAutoCommit
@@ -723,9 +725,11 @@
           service="Resource"
           types="javax.sql.DataSource, DataSource"
           factory-name="create"
-          constructor="JtaManaged, JdbcDriver"
+          constructor="JtaManaged, JdbcDriver, Definition"
           class-name="org.apache.openejb.resource.jdbc.DataSourceFactory">
 
+    Definition
+
     JtaManaged = false
 
     # Driver class name

Modified: 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=1171061&r1=1171060&r2=1171061&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java Thu Sep 15 11:31:07 2011
@@ -32,6 +32,7 @@ import static junit.framework.Assert.ass
  */
 @RunWith(ApplicationComposer.class)
 public class DataSourceDefinitionTest {
+
     @EJB private DatasourceDefinitionBean uniqueDataSource;
     @EJB private DatasourceDefinitionsBean multipleDatasources;
 
@@ -48,7 +49,7 @@ public class DataSourceDefinitionTest {
     )
     @Singleton
     public static class DatasourceDefinitionBean {
-        @Resource(lookup = "java:comp/env/superDS") private DataSource ds;
+        @Resource(name = "java:comp/env/superDS") private DataSource ds;
 
         public DataSource getDs() {
             return ds;

Copied: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DescriptorDataSourceDefinitionTest.java (from r1170434, 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/DescriptorDataSourceDefinitionTest.java?p2=openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DescriptorDataSourceDefinitionTest.java&p1=openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java&r1=1170434&r2=1171061&rev=1171061&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DescriptorDataSourceDefinitionTest.java Thu Sep 15 11:31:07 2011
@@ -1,19 +1,16 @@
 package org.apache.openejb.assembler.classic;
 
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.ResourceRef;
+import org.apache.openejb.jee.SingletonBean;
+import org.apache.openejb.jee.StatelessBean;
 import org.apache.openejb.junit.ApplicationComposer;
 import org.apache.openejb.junit.Module;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import javax.annotation.Resource;
-import javax.annotation.sql.DataSourceDefinition;
-import javax.annotation.sql.DataSourceDefinitions;
 import javax.ejb.EJB;
-import javax.ejb.Singleton;
-import javax.ejb.Stateless;
 import javax.sql.DataSource;
-import javax.transaction.UserTransaction;
-import java.lang.reflect.Field;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -24,57 +21,80 @@ import java.util.List;
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertNotNull;
 
-/**
- * Note: to make this test work under JavaSE 6 you should add geronimo-annotation_1.1_spec in your endorsed dir.
- * It is automatically done with maven.
- *
- * @author rmannibucau
- */
 @RunWith(ApplicationComposer.class)
-public class DataSourceDefinitionTest {
-    @EJB private DatasourceDefinitionBean uniqueDataSource;
-    @EJB private DatasourceDefinitionsBean multipleDatasources;
-
-    @Module public Class<?>[] app() throws Exception {
-        return new Class<?>[]{ DatasourceDefinitionBean.class, DatasourceDefinitionsBean.class };
-    }
-
-    @DataSourceDefinition(
-        name = "java:comp/env/superDS",
-        className = "org.hsqldb.jdbc.jdbcDataSource",
-        user = "sa",
-        password = "",
-        url = "jdbc:hsqldb:mem:superDS"
-    )
-    @Singleton
-    public static class DatasourceDefinitionBean {
-        @Resource(lookup = "java:comp/env/superDS") private DataSource ds;
+public class DescriptorDataSourceDefinitionTest {
+
+    @EJB
+    private OrangeBean orange;
+
+    @EJB
+    private YellowBean yellow;
+
+    @Module
+    public EjbJar application() throws Exception {
+        final EjbJar ejbJar = new EjbJar();
+        final SingletonBean orange = ejbJar.addEnterpriseBean(new SingletonBean(OrangeBean.class));
+
+        orange.getDataSource().add(new org.apache.openejb.jee.DataSource()
+                .name("java:comp/env/superDS")
+                .className("org.hsqldb.jdbc.jdbcDataSource")
+                .user("sa")
+                .password("")
+                .url("jdbc:hsqldb:mem:superDS")
+        );
+
+        orange.getResourceRef().add(new ResourceRef()
+                .lookup("java:comp/env/superDS")
+                .injectionTarget(OrangeBean.class, "ds")
+        );
+
+        final StatelessBean yellow = ejbJar.addEnterpriseBean(new StatelessBean(YellowBean.class));
+
+        yellow.getDataSource().add(new org.apache.openejb.jee.DataSource()
+                .name("java:comp/env/superMegaDS")
+                .className("org.hsqldb.jdbc.jdbcDataSource")
+                .user("sa")
+                .password("")
+                .url("jdbc:hsqldb:mem:superDS")
+        );
+
+        yellow.getResourceRef().add(new ResourceRef()
+                .lookup("java:comp/env/superMegaDS")
+                .injectionTarget(YellowBean.class, "mega")
+        );
+
+
+        yellow.getDataSource().add(new org.apache.openejb.jee.DataSource()
+                .name("java:comp/env/superGigaDS")
+                .className("org.hsqldb.jdbc.jdbcDataSource")
+                .user("sa")
+                .password("")
+                .url("jdbc:hsqldb:mem:superDS")
+        );
+
+        yellow.getResourceRef().add(new ResourceRef()
+                .lookup("java:comp/env/superGigaDS")
+                .injectionTarget(YellowBean.class, "giga")
+        );
+
+
+        return ejbJar;
+    }
+
+    public static class OrangeBean {
+
+        private DataSource ds;
 
         public DataSource getDs() {
             return ds;
         }
     }
 
-    @DataSourceDefinitions({
-        @DataSourceDefinition(
-            name = "java:comp/env/superMegaDS",
-            className = "org.hsqldb.jdbc.jdbcDataSource",
-            user = "sa",
-            password = "",
-            url = "jdbc:hsqldb:mem:superDS"
-        ),
-        @DataSourceDefinition(
-            name = "java:comp/env/superGigaDS",
-            className = "org.hsqldb.jdbc.jdbcDataSource",
-            user = "sa",
-            password = "",
-            url = "jdbc:hsqldb:mem:superDS"
-        )
-    })
-    @Stateless
-    public static class DatasourceDefinitionsBean {
-        @Resource(name = "java:comp/env/superMegaDS") private DataSource mega;
-        @Resource(name = "java:comp/env/superGigaDS") private DataSource giga;
+    public static class YellowBean {
+
+        private DataSource mega;
+
+        private DataSource giga;
 
         public DataSource getMega() {
             return mega;
@@ -85,13 +105,15 @@ public class DataSourceDefinitionTest {
         }
     }
 
-    @Test public void assertDataSourceDefinition() throws Exception {
-        assertDataSourceDefinitionValues(uniqueDataSource.getDs(), "org.hsqldb.jdbc.jdbcDataSource", "sa", "");
+    @Test
+    public void assertDataSourceDefinition() throws Exception {
+        assertDataSourceDefinitionValues(orange.getDs(), "org.hsqldb.jdbc.jdbcDataSource", "sa", "");
     }
 
-    @Test public void assertDatasourceDefinitions() throws Exception {
-        assertDataSourceDefinitionValues(multipleDatasources.getMega(), "org.hsqldb.jdbc.jdbcDataSource", "foo1", "bar1");
-        assertDataSourceDefinitionValues(multipleDatasources.getGiga(), "org.hsqldb.jdbc.jdbcDataSource", "foo2", "bar2");
+    @Test
+    public void assertDatasourceDefinitions() throws Exception {
+        assertDataSourceDefinitionValues(yellow.getMega(), "org.hsqldb.jdbc.jdbcDataSource", "foo1", "bar1");
+        assertDataSourceDefinitionValues(yellow.getGiga(), "org.hsqldb.jdbc.jdbcDataSource", "foo2", "bar2");
     }
 
     private void assertDataSourceDefinitionValues(DataSource dataSource, String clazz, String user, String password) throws Exception {
@@ -114,25 +136,6 @@ public class DataSourceDefinitionTest {
 
         Connection connection = dataSource.getConnection();
         connection.prepareStatement("DROP TABLE movie").execute();
-//        assertEquals("configuration should be ok - class", "org.hsqldb.jdbc.jdbcDataSource", dataSource.getClass().getName());
-//        assertEqualsByReflection("configuration should be ok - user", dataSource, "user", user);
-//        assertEqualsByReflection("configuration should be ok - password", dataSource, "password", password);
-    }
-
-    private void assertEqualsByReflection(String message, Object value, String name, Object expected) throws Exception {
-        Class<?> clazz = value.getClass();
-        Field field = clazz.getDeclaredField(name);
-        boolean acc = field.isAccessible();
-        if (!acc) {
-            field.setAccessible(true);
-        }
-        try {
-            Object fieldValue = field.get(value);
-            assertEquals(message, expected, fieldValue);
-        } finally {
-            field.setAccessible(acc);
-        }
-
     }
 
     public static class Movies {

Modified: openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/DataSource.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/DataSource.java?rev=1171061&r1=1171060&r2=1171061&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/DataSource.java (original)
+++ openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/DataSource.java Thu Sep 15 11:31:07 2011
@@ -135,6 +135,101 @@ public class DataSource implements Keyab
         return description.toArray();
     }
 
+    public DataSource() {
+    }
+
+    public DataSource(String name, String className) {
+        this.name = name;
+        this.className = className;
+    }
+
+//    pbpaste | grep protected | perl -pe 's/.*protected ([^ ]+) ([^ ]+);/public DataSource $2($1 $2) { this.$2 = $2; return this; }/'
+
+    public DataSource name(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public DataSource className(String className) {
+        this.className = className;
+        return this;
+    }
+
+    public DataSource serverName(String serverName) {
+        this.serverName = serverName;
+        return this;
+    }
+
+    public DataSource portNumber(Integer portNumber) {
+        this.portNumber = portNumber;
+        return this;
+    }
+
+    public DataSource databaseName(String databaseName) {
+        this.databaseName = databaseName;
+        return this;
+    }
+
+    public DataSource url(String url) {
+        this.url = url;
+        return this;
+    }
+
+    public DataSource user(String user) {
+        this.user = user;
+        return this;
+    }
+
+    public DataSource password(String password) {
+        this.password = password;
+        return this;
+    }
+
+    public DataSource property(String name, String value) {
+        getProperty().add(new Property(name, value));
+        return this;
+    }
+
+    public DataSource loginTimeout(Integer loginTimeout) {
+        this.loginTimeout = loginTimeout;
+        return this;
+    }
+
+    public DataSource transactional(Boolean transactional) {
+        this.transactional = transactional;
+        return this;
+    }
+
+    public DataSource isolationLevel(IsolationLevel isolationLevel) {
+        this.isolationLevel = isolationLevel;
+        return this;
+    }
+
+    public DataSource initialPoolSize(Integer initialPoolSize) {
+        this.initialPoolSize = initialPoolSize;
+        return this;
+    }
+
+    public DataSource maxPoolSize(Integer maxPoolSize) {
+        this.maxPoolSize = maxPoolSize;
+        return this;
+    }
+
+    public DataSource minPoolSize(Integer minPoolSize) {
+        this.minPoolSize = minPoolSize;
+        return this;
+    }
+
+    public DataSource maxIdleTime(Integer maxIdleTime) {
+        this.maxIdleTime = maxIdleTime;
+        return this;
+    }
+
+    public DataSource maxStatements(Integer maxStatements) {
+        this.maxStatements = maxStatements;
+        return this;
+    }
+
     public void setDescriptions(Text[] text) {
         description.set(text);
     }
@@ -188,6 +283,7 @@ public class DataSource implements Keyab
         return url;
     }
 
+
     public void setUrl(String value) {
         this.url = value;
     }

Modified: openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ResourceRef.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ResourceRef.java?rev=1171061&r1=1171060&r2=1171061&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ResourceRef.java (original)
+++ openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/ResourceRef.java Thu Sep 15 11:31:07 2011
@@ -109,6 +109,47 @@ public class ResourceRef implements Jndi
         this.resSharingScope = resSharingScope;
     }
 
+//  pbpaste | grep protected | perl -pe 's/.*protected ([^ ]+) ([^ ]+);/public ResourceRef $2($1 $2) { this.$2 = $2; return this; }/'
+
+    public ResourceRef name(String resRefName) {
+        this.resRefName = resRefName;
+        return this;
+    }
+
+    public ResourceRef type(String resType) {
+        this.resType = resType;
+        return this;
+    }
+
+    public ResourceRef auth(ResAuth resAuth) {
+        this.resAuth = resAuth;
+        return this;
+    }
+
+    public ResourceRef mappedName(String mappedName) {
+        this.mappedName = mappedName;
+        return this;
+    }
+
+    public ResourceRef lookup(String lookupName) {
+        this.lookupName = lookupName;
+        return this;
+    }
+
+    public ResourceRef injectionTarget(String className, String property) {
+        getInjectionTarget().add(new InjectionTarget(className, property));
+
+        if (this.resRefName == null) {
+            this.resRefName = "java:comp/env/" + className + "/" + property;
+        }
+
+        return this;
+    }
+
+    public ResourceRef injectionTarget(Class clazz, String property) {
+        return injectionTarget(clazz.getName(), property);
+    }
+
     @XmlTransient
     public String getName() {
         return getResRefName();