You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jl...@apache.org on 2009/12/17 16:28:05 UTC

svn commit: r891762 - in /openejb/trunk/openejb3/container/openejb-core/src: main/java/org/apache/openejb/config/AutoConfig.java test/java/org/apache/openejb/config/AutoConfigPersistenceUnitsTest.java

Author: jlmonteiro
Date: Thu Dec 17 15:28:04 2009
New Revision: 891762

URL: http://svn.apache.org/viewvc?rev=891762&view=rev
Log:
OPENEJB-1027: Enhancements submitted by Luis as discussed in a post of the user@list.
http://old.nabble.com/Resolve-datasource-from-the-application-name-ts25684131.html
Great job.
Thanks, Luis! 

Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/AutoConfigPersistenceUnitsTest.java

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=891762&r1=891761&r2=891762&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 Dec 17 15:28:04 2009
@@ -1049,26 +1049,46 @@
                 }
             }
 
-            // No data sources were specified: If the app is running a web module, use it's context name as default
+            // No data sources were specified: 
+            // Look for defaults, see https://issues.apache.org/jira/browse/OPENEJB-1027
             if (jtaDataSourceId == null && nonJtaDataSourceId == null) {
-                String webContextRoot = null;
-                if (!app.getWebModules().isEmpty()) {
-                    webContextRoot = app.getWebModules().iterator().next().getContextRoot();
+                // We check for data sources matching the following names:
+                // 1. The persistence unit id
+                // 2. The web module id
+                // 3. The web module context root
+                // 4. The application module id
+                List<String> ids = new ArrayList<String>();
+                ids.add(unit.getName());
+                for (WebModule webModule : app.getWebModules()) {
+                    ids.add(webModule.getModuleId());
+                    ids.add(webModule.getContextRoot());
                 }
-
-                required.clear();
-                required.put("JtaManaged", "true");
-                jtaDataSourceId = findResourceId(webContextRoot, "DataSource", required, null);
-
-                required.clear();
-                required.put("JtaManaged", "false");
-                nonJtaDataSourceId = findResourceId(webContextRoot, "DataSource", required, null);
+                ids.add(app.getModuleId());
                 
-                // When no datasource was found with the context name with explicit JtaManaged set, try to find one with it unset
-                if (jtaDataSourceId == null && nonJtaDataSourceId == null) {
-                    required.clear();
-                    required.put("JtaManaged", NONE);
-                    jtaDataSourceId = findResourceId(webContextRoot, "DataSource", required, null);
+                // Search for a matching data source
+                for (String id : ids) {
+                    //Try finding a jta managed data source
+                    required.put("JtaManaged", "true");
+                    jtaDataSourceId = findResourceId(id, "DataSource", required, null);
+
+                    if (jtaDataSourceId == null) {
+                        //No jta managed data source found. Try finding a non-jta managed
+                        required.clear();
+                        required.put("JtaManaged", "false");
+                        nonJtaDataSourceId = findResourceId(id, "DataSource", required, null);
+                    }
+                    
+                    if (jtaDataSourceId == null && nonJtaDataSourceId == null) {
+                        // Neither jta nor non-jta managed data sources were found. try to find one with it unset
+                        required.clear();
+                        required.put("JtaManaged", NONE);
+                        jtaDataSourceId = findResourceId(id, "DataSource", required, null);
+                    }
+                    
+                    if (jtaDataSourceId != null || nonJtaDataSourceId != null) {
+                        //We have found a default. Exit the loop
+                        break;
+                    }
                 }
             }
             

Modified: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/AutoConfigPersistenceUnitsTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/AutoConfigPersistenceUnitsTest.java?rev=891762&r1=891761&r2=891762&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/AutoConfigPersistenceUnitsTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/AutoConfigPersistenceUnitsTest.java Thu Dec 17 15:28:04 2009
@@ -157,6 +157,204 @@
     }
 
     /**
+     * Existing data source "orange-unit", not controlled by us
+     * 
+     * Persistence xml like so:
+     *
+     * <persistence-unit name="orange-unit" />
+     *
+     * The orange-unit app should automatically use orange-unit data source and the non-jta-datasource should be null
+     *
+     * @throws Exception
+     */
+    public void testFromUnitNameThirdParty() throws Exception {
+        ResourceInfo supplied = addDataSource("orange-unit", OrangeDriver.class, "jdbc:orange:some:stuff", null);
+        assertSame(supplied, resources.get(0));
+
+        PersistenceUnitInfo unitInfo = addPersistenceUnit("orange-unit", null, null);
+        assertNotNull(unitInfo);
+
+        //Check results
+        assertEquals(supplied.id, unitInfo.jtaDataSource);
+        assertNull(unitInfo.nonJtaDataSource);
+    }
+    
+    /**
+     * Existing data source "orange-unit", jta-managed
+     * 
+     * Persistence xml like so:
+     *
+     * <persistence-unit name="orange-unit" />
+     *
+     * The orange-unit app should automatically use orange-unit data source and create a new non-JtaManaged datasource
+     *
+     * @throws Exception
+     */
+    public void testFromUnitNameJta() throws Exception {
+        ResourceInfo supplied = addDataSource("orange-unit", OrangeDriver.class, "jdbc:orange:some:stuff", true);
+        assertSame(supplied, resources.get(0));
+
+        PersistenceUnitInfo unitInfo = addPersistenceUnit("orange-unit", null, null);
+        assertNotNull(unitInfo);
+
+        // Check results
+        ResourceInfo generated = resources.get(1);
+        assertEquals(supplied.id + "NonJta", generated.id);
+        assertEquals(supplied.service, generated.service);
+        assertEquals(supplied.className, generated.className);
+        assertEquals(supplied.properties.get("JdbcDriver"), generated.properties.get("JdbcDriver"));
+        assertEquals(supplied.properties.get("JdbcUrl"), generated.properties.get("JdbcUrl"));
+        assertEquals("false", generated.properties.get("JtaManaged"));
+    }
+    
+    /**
+     * Existing data source "orange-unit", non-jta-managed
+     * 
+     * Persistence xml like so:
+     *
+     * <persistence-unit name="orange-unit" />
+     *
+     * The orange-unit app should automatically use orange-unit data source and create a new JtaManaged datasource
+     *
+     * @throws Exception
+     */
+    public void testFromUnitNameNonJta() throws Exception {
+        ResourceInfo supplied = addDataSource("orange-unit", OrangeDriver.class, "jdbc:orange:some:stuff", false);
+        assertSame(supplied, resources.get(0));
+
+        PersistenceUnitInfo unitInfo = addPersistenceUnit("orange-unit", null, null);
+        assertNotNull(unitInfo);
+
+        // Check results
+        ResourceInfo generated = resources.get(1);
+        assertEquals(supplied.id + "Jta", generated.id);
+        assertEquals(supplied.service, generated.service);
+        assertEquals(supplied.className, generated.className);
+        assertEquals(supplied.properties.get("JdbcDriver"), generated.properties.get("JdbcDriver"));
+        assertEquals(supplied.properties.get("JdbcUrl"), generated.properties.get("JdbcUrl"));
+        assertEquals("true", generated.properties.get("JtaManaged"));
+    }
+    
+    /**
+     * Existing data source "orange-id", not controlled by us
+     * 
+     * Application contains a web module with id "orange-id" 
+     *
+     * Persistence xml like so:
+     *
+     * <persistence-unit name="orange-unit" />
+     *
+     * The orange-unit app should automatically use orange-id data source and the non-jta-datasource should be null
+     *
+     * @throws Exception
+     */
+    public void testFromWebAppIdThirdParty() throws Exception {
+        
+        ResourceInfo supplied = addDataSource("orange-id", OrangeDriver.class, "jdbc:orange-web:some:stuff", null);
+        assertSame(supplied, resources.get(0));
+        
+        PersistenceUnit persistenceUnit = new PersistenceUnit("orange-unit");
+
+        ClassLoader cl = this.getClass().getClassLoader();
+        AppModule app = new AppModule(cl, "orange-app");
+        app.getPersistenceModules().add(new PersistenceModule("root", new Persistence(persistenceUnit)));
+        WebApp webApp = new WebApp();
+        webApp.setMetadataComplete(true);
+        app.getWebModules().add(new WebModule(webApp, "orange-web", cl, "war", "orange-id"));
+
+        // Create app
+        AppInfo appInfo = config.configureApplication(app);
+        assembler.createApplication(appInfo);
+        PersistenceUnitInfo unitInfo = appInfo.persistenceUnits.get(0);
+
+        //Check results
+        assertEquals(supplied.id, unitInfo.jtaDataSource);
+        assertNull(unitInfo.nonJtaDataSource);
+    }
+    
+    /**
+     * Existing data source "orange-web", jta managed
+     * 
+     * Application contains a web module with id "orange-id" 
+     *
+     * Persistence xml like so:
+     *
+     * <persistence-unit name="orange-unit" />
+     *
+     * The orange-unit app should automatically use orange-id data source and create a new non-JtaManaged datasource
+     *
+     * @throws Exception
+     */
+    public void testFromWebAppIdJta() throws Exception {
+        
+        ResourceInfo supplied = addDataSource("orange-id", OrangeDriver.class, "jdbc:orange-web:some:stuff", true);
+        assertSame(supplied, resources.get(0));
+        
+        PersistenceUnit persistenceUnit = new PersistenceUnit("orange-unit");
+
+        ClassLoader cl = this.getClass().getClassLoader();
+        AppModule app = new AppModule(cl, "orange-app");
+        app.getPersistenceModules().add(new PersistenceModule("root", new Persistence(persistenceUnit)));
+        WebApp webApp = new WebApp();
+        webApp.setMetadataComplete(true);
+        app.getWebModules().add(new WebModule(webApp, "orange-web", cl, "war", "orange-id"));
+
+        // Create app
+        AppInfo appInfo = config.configureApplication(app);
+        assembler.createApplication(appInfo);
+
+        // Check results
+        ResourceInfo generated = resources.get(1);
+        assertEquals(supplied.id + "NonJta", generated.id);
+        assertEquals(supplied.service, generated.service);
+        assertEquals(supplied.className, generated.className);
+        assertEquals(supplied.properties.get("JdbcDriver"), generated.properties.get("JdbcDriver"));
+        assertEquals(supplied.properties.get("JdbcUrl"), generated.properties.get("JdbcUrl"));
+        assertEquals("false", generated.properties.get("JtaManaged"));
+    }
+    
+    /**
+     * Existing data source "orange-id", non-jta managed
+     * 
+     * Application contains a web module with id "orange-id" 
+     *
+     * Persistence xml like so:
+     *
+     * <persistence-unit name="orange-unit" />
+     *
+     * The orange-unit app should automatically use orange-id data source and create a new non-JtaManaged datasource
+     *
+     * @throws Exception
+     */
+    public void testFromWebAppIdNonJta() throws Exception {
+        
+        ResourceInfo supplied = addDataSource("orange-id", OrangeDriver.class, "jdbc:orange-web:some:stuff", false);
+        assertSame(supplied, resources.get(0));
+        
+        PersistenceUnit persistenceUnit = new PersistenceUnit("orange-unit");
+
+        ClassLoader cl = this.getClass().getClassLoader();
+        AppModule app = new AppModule(cl, "orange-app");
+        app.getPersistenceModules().add(new PersistenceModule("root", new Persistence(persistenceUnit)));
+        WebApp webApp = new WebApp();
+        webApp.setMetadataComplete(true);
+        app.getWebModules().add(new WebModule(webApp, "orange-web", cl, "war", "orange-id"));
+
+        // Create app
+        AppInfo appInfo = config.configureApplication(app);
+        assembler.createApplication(appInfo);
+
+        // Check results
+        ResourceInfo generated = resources.get(1);
+        assertEquals(supplied.id + "Jta", generated.id);
+        assertEquals(supplied.service, generated.service);
+        assertEquals(supplied.className, generated.className);
+        assertEquals(supplied.properties.get("JdbcDriver"), generated.properties.get("JdbcDriver"));
+        assertEquals(supplied.properties.get("JdbcUrl"), generated.properties.get("JdbcUrl"));
+        assertEquals("true", generated.properties.get("JtaManaged"));
+    }
+    
+    /**
      * Existing data source "orange-web", not controlled by us
      * 
      * Application contains a web module with root context path as "orange-web" 
@@ -165,11 +363,11 @@
      *
      * <persistence-unit name="orange-unit" />
      *
-     * The orange-unit app should automatically use orange-web data source and create a new non-JtaManaged datasource
+     * The orange-unit app should automatically use orange-web data source and the non-jta-datasource should be null
      *
      * @throws Exception
      */
-    public void testFromWebAppThirdParty() throws Exception {
+    public void testFromWebAppContextThirdParty() throws Exception {
         
         ResourceInfo supplied = addDataSource("orange-web", OrangeDriver.class, "jdbc:orange-web:some:stuff", null);
         assertSame(supplied, resources.get(0));
@@ -192,6 +390,7 @@
         assertEquals(supplied.id, unitInfo.jtaDataSource);
         assertNull(unitInfo.nonJtaDataSource);
     }
+    
     /**
      * Existing data source "orange-web", jta managed
      * 
@@ -205,7 +404,7 @@
      *
      * @throws Exception
      */
-    public void testFromWebAppJta() throws Exception {
+    public void testFromWebAppContextJta() throws Exception {
         
         ResourceInfo supplied = addDataSource("orange-web", OrangeDriver.class, "jdbc:orange-web:some:stuff", true);
         assertSame(supplied, resources.get(0));
@@ -246,7 +445,7 @@
      *
      * @throws Exception
      */
-    public void testFromWebAppNonJta() throws Exception {
+    public void testFromWebAppContextNonJta() throws Exception {
         
         ResourceInfo supplied = addDataSource("orange-web", OrangeDriver.class, "jdbc:orange-web:some:stuff", false);
         assertSame(supplied, resources.get(0));
@@ -274,6 +473,86 @@
         assertEquals("true", generated.properties.get("JtaManaged"));
     }
 
+
+    /**
+     * Existing data source "orange-unit-app", not controlled by us
+     * 
+     * Persistence xml like so:
+     *
+     * <persistence-unit name="orange-unit" />
+     *
+     * The app module id is orange-unit-app. The jta data source should be orange-unit-app and the non-jta-data-source should be null
+     *
+     * @throws Exception
+     */
+    public void testFromAppIdThirdParty() throws Exception {
+        ResourceInfo supplied = addDataSource("orange-unit-app", OrangeDriver.class, "jdbc:orange:some:stuff", null);
+        assertSame(supplied, resources.get(0));
+
+        PersistenceUnitInfo unitInfo = addPersistenceUnit("orange-unit", null, null);
+        assertNotNull(unitInfo);
+
+        //Check results
+        assertEquals(supplied.id, unitInfo.jtaDataSource);
+        assertNull(unitInfo.nonJtaDataSource);
+    }
+    
+    /**
+     * Existing data source "orange-unit-app", jta-managed
+     * 
+     * Persistence xml like so:
+     *
+     * <persistence-unit name="orange-unit" />
+     *
+     * The app module id is orange-unit-app. Use orange-unit-app data source and create a new non-JtaManaged datasource
+     *
+     * @throws Exception
+     */
+    public void testFromAppIdJta() throws Exception {
+        ResourceInfo supplied = addDataSource("orange-unit-app", OrangeDriver.class, "jdbc:orange:some:stuff", true);
+        assertSame(supplied, resources.get(0));
+
+        PersistenceUnitInfo unitInfo = addPersistenceUnit("orange-unit", null, null);
+        assertNotNull(unitInfo);
+
+        // Check results
+        ResourceInfo generated = resources.get(1);
+        assertEquals(supplied.id + "NonJta", generated.id);
+        assertEquals(supplied.service, generated.service);
+        assertEquals(supplied.className, generated.className);
+        assertEquals(supplied.properties.get("JdbcDriver"), generated.properties.get("JdbcDriver"));
+        assertEquals(supplied.properties.get("JdbcUrl"), generated.properties.get("JdbcUrl"));
+        assertEquals("false", generated.properties.get("JtaManaged"));
+    }
+    
+    /**
+     * Existing data source "orange-unit-app", non-jta-managed
+     * 
+     * Persistence xml like so:
+     *
+     * <persistence-unit name="orange-unit" />
+     *
+     * The app module id is orange-unit-app. Use orange-unit-app data source and create a new JtaManaged datasource
+     *
+     * @throws Exception
+     */
+    public void testFromAppIdNonJta() throws Exception {
+        ResourceInfo supplied = addDataSource("orange-unit-app", OrangeDriver.class, "jdbc:orange:some:stuff", false);
+        assertSame(supplied, resources.get(0));
+
+        PersistenceUnitInfo unitInfo = addPersistenceUnit("orange-unit", null, null);
+        assertNotNull(unitInfo);
+
+        // Check results
+        ResourceInfo generated = resources.get(1);
+        assertEquals(supplied.id + "Jta", generated.id);
+        assertEquals(supplied.service, generated.service);
+        assertEquals(supplied.className, generated.className);
+        assertEquals(supplied.properties.get("JdbcDriver"), generated.properties.get("JdbcDriver"));
+        assertEquals(supplied.properties.get("JdbcUrl"), generated.properties.get("JdbcUrl"));
+        assertEquals("true", generated.properties.get("JtaManaged"));
+    }    
+    
     /**
      * Existing data source "Orange", not controlled by us
      * Existing data source "OrangeUnmanaged", also not controlled by us