[ARIES-1524] Allow the EntityManagerFactoryBuilder to override the persistence unit's transaction type

git-svn-id: https://svn.apache.org/repos/asf/aries/trunk/jpa@1738185 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java b/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java
index 440913f..ba2b622 100644
--- a/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java
+++ b/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java
@@ -15,6 +15,8 @@
  */
 package org.apache.aries.jpa.container.itest;
 
+import static javax.persistence.spi.PersistenceUnitTransactionType.JTA;
+import static javax.persistence.spi.PersistenceUnitTransactionType.RESOURCE_LOCAL;
 import static org.junit.Assert.assertEquals;
 import static org.osgi.service.jdbc.DataSourceFactory.OSGI_JDBC_DRIVER_CLASS;
 
@@ -28,6 +30,7 @@
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
+import javax.sql.DataSource;
 
 import org.apache.aries.jpa.container.itest.entities.Car;
 import org.apache.aries.jpa.itest.AbstractCarJPAITest;
@@ -156,8 +159,34 @@
     	
     	Map<String, Object> props = new HashMap<String, Object>();
     	props.put("javax.persistence.nonJtaDataSource", dsf.createDataSource(jdbcProps));
+    	props.put("javax.persistence.transactionType", RESOURCE_LOCAL.name());
     	
     	EntityManagerFactory emf = emfBuilder.createEntityManagerFactory(props);
     	carLifecycleRL(emf.createEntityManager());
     }
+
+    @Test
+    public void testCarEMFBuilderExternalDSXA() throws Exception {
+    	DataSource ds = getService(DataSource.class, 
+    			"(" + OSGI_JDBC_DRIVER_CLASS + "=org.apache.derby.jdbc.EmbeddedDriver-pool-xa)");
+    	
+    	EntityManagerFactoryBuilder emfBuilder = getService(EntityManagerFactoryBuilder.class,
+    			"(osgi.unit.name=" + EXTERNAL_TEST_UNIT + ")");
+    	
+    	
+    	Map<String, Object> props = new HashMap<String, Object>();
+    	props.put("javax.persistence.jtaDataSource", ds);
+    	props.put("javax.persistence.transactionType", JTA.name());
+    	
+    	//EclipseLink also needs a non-jta-datasource
+    	DataSourceFactory dsf = getService(DataSourceFactory.class, 
+    			"(" + OSGI_JDBC_DRIVER_CLASS + "=org.apache.derby.jdbc.EmbeddedDriver)");
+    	Properties jdbcProps = new Properties();
+    	jdbcProps.setProperty("url", "jdbc:derby:memory:TEST1;create=true");
+    	props.put("javax.persistence.nonJtaDataSource", dsf.createDataSource(jdbcProps));
+
+    	
+    	EntityManagerFactory emf = emfBuilder.createEntityManagerFactory(props);
+    	carLifecycleXA(ut, emf.createEntityManager());
+    }
 }
diff --git a/itests/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml b/itests/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml
index 839750d..dd96ff2 100644
--- a/itests/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml
+++ b/itests/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml
@@ -87,7 +87,7 @@
     </properties>

   </persistence-unit>

   

-  <persistence-unit name="external-test-unit" transaction-type="RESOURCE_LOCAL">

+  <persistence-unit name="external-test-unit">

     <description>Test persistence unit for the JPA Container External DataSource iTests</description>

     <properties>

         <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>

diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/AriesEntityManagerFactoryBuilder.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/AriesEntityManagerFactoryBuilder.java
index 71b4dd4..e224acd 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/AriesEntityManagerFactoryBuilder.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/AriesEntityManagerFactoryBuilder.java
@@ -23,6 +23,7 @@
 
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.spi.PersistenceProvider;
+import javax.persistence.spi.PersistenceUnitTransactionType;
 import javax.sql.DataSource;
 
 import org.apache.aries.jpa.container.parser.impl.PersistenceUnit;
@@ -37,6 +38,7 @@
     private static final String JAVAX_PERSISTENCE_JDBC_DRIVER = "javax.persistence.jdbc.driver";
     private static final String JAVAX_PERSISTENCE_JTA_DATASOURCE = "javax.persistence.jtaDataSource";
     private static final String JAVAX_PERSISTENCE_NON_JTA_DATASOURCE = "javax.persistence.nonJtaDataSource";
+    private static final String JAVAX_PERSISTENCE_TX_TYPE = "javax.persistence.transactionType";
 
     private PersistenceProvider provider;
     private PersistenceUnit persistenceUnit;
@@ -75,6 +77,14 @@
         	props.remove(JAVAX_PERSISTENCE_NON_JTA_DATASOURCE);
         }
         
+        o = props.get(JAVAX_PERSISTENCE_TX_TYPE);
+        if(o instanceof PersistenceUnitTransactionType) {
+        	persistenceUnit.setTransactionType((PersistenceUnitTransactionType) o);
+        } else if (o instanceof String) {
+        	persistenceUnit.setTransactionType(
+        			PersistenceUnitTransactionType.valueOf((String) o));
+        }
+        
         return provider.createContainerEntityManagerFactory(persistenceUnit, props);
     }
 
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java
index f5f767a..34e7911 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java
@@ -221,4 +221,8 @@
             }
         }
     }
+
+	public void setTransactionType(PersistenceUnitTransactionType transactionType) {
+		this.transactionType = transactionType;
+	}
 }