Tx Control spec compliance - avoid NPEs when null Maps are passed, throw thw correct exception from joinTransaction
diff --git a/tx-control-providers/jpa/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/JPADataSourceHelper.java b/tx-control-providers/jpa/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/JPADataSourceHelper.java
index d5e335b..779e4ab 100644
--- a/tx-control-providers/jpa/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/JPADataSourceHelper.java
+++ b/tx-control-providers/jpa/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/JPADataSourceHelper.java
@@ -38,7 +38,10 @@
hcfg.setIdleTimeout(toLong(resourceProviderProperties, IDLE_TIMEOUT, TimeUnit.MINUTES.toMillis(3)));
hcfg.setMaxLifetime(toLong(resourceProviderProperties, CONNECTION_LIFETIME, HOURS.toMillis(3)));
- hcfg.setConnectionTestQuery((String)resourceProviderProperties.get(CONNECTION_TEST_QUERY));
+ ofNullable(resourceProviderProperties)
+ .map(m -> m.get(CONNECTION_TEST_QUERY))
+ .map(String::valueOf)
+ .ifPresent(q -> hcfg.setConnectionTestQuery(q));
toUse = new HikariDataSource(hcfg);
diff --git a/tx-control-providers/jpa/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/ScopedEntityManagerWrapper.java b/tx-control-providers/jpa/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/ScopedEntityManagerWrapper.java
index d654bf2..c89fa64 100644
--- a/tx-control-providers/jpa/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/ScopedEntityManagerWrapper.java
+++ b/tx-control-providers/jpa/tx-control-provider-jpa-common/src/main/java/org/apache/aries/tx/control/jpa/common/impl/ScopedEntityManagerWrapper.java
@@ -19,7 +19,8 @@
package org.apache.aries.tx.control.jpa.common.impl;
import javax.persistence.EntityManager;
-import javax.persistence.TransactionRequiredException;
+
+import org.osgi.service.transaction.control.TransactionException;
public class ScopedEntityManagerWrapper extends EntityManagerWrapper {
@@ -41,7 +42,7 @@
@Override
public void joinTransaction() {
- throw new TransactionRequiredException("This EntityManager is being used in the No Transaction scope. There is no transaction to join.");
+ throw new TransactionException("This EntityManager is being used in the No Transaction scope. There is no transaction to join.");
}
@Override
diff --git a/tx-control-providers/jpa/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java b/tx-control-providers/jpa/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java
index c4ce8f9..fec6bb8 100644
--- a/tx-control-providers/jpa/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java
+++ b/tx-control-providers/jpa/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java
@@ -84,11 +84,12 @@
public AbstractJPAEntityManagerProvider getProviderFor(EntityManagerFactoryBuilder emfb, Map<String, Object> jpaProperties,
Map<String, Object> resourceProviderProperties) {
- Map<String, Object> jpaPropsToUse = new HashMap<>(jpaProperties);
+ Map<String, Object> jpaPropsToUse = jpaProperties == null ? new HashMap<>() :
+ new HashMap<>(jpaProperties);
jpaPropsToUse.put(TRANSACTION_TYPE, JTA.name());
Function<ThreadLocal<TransactionControl>, AbstractJPAEntityManagerProvider> create;
- if(jpaProperties.containsKey("osgi.jdbc.provider")) {
+ if(jpaPropsToUse.containsKey("osgi.jdbc.provider")) {
create = handleJDBCResourceProvider(emfb, resourceProviderProperties, jpaPropsToUse);
} else if(toBoolean(jpaPropsToUse, PRE_ENLISTED_DB_CONNECTION, false)) {
create = handlePreEnlistedConnection(emfb, resourceProviderProperties, jpaPropsToUse);