Ensure that "No configuration" callbacks don't delete an existing EntityManagerFactoryBuilder configured EMF
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/ManagedEMF.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/ManagedEMF.java
index 825cc8d..62b29cd 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/ManagedEMF.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/ManagedEMF.java
@@ -22,6 +22,7 @@
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.osgi.service.cm.ConfigurationException;
import org.osgi.service.cm.ManagedService;
@@ -40,6 +41,8 @@
private final AriesEntityManagerFactoryBuilder builder;
private final String pUnitName;
+
+ private final AtomicBoolean configured = new AtomicBoolean(false);
public ManagedEMF(AriesEntityManagerFactoryBuilder builder, String name) {
this.builder = builder;
@@ -48,6 +51,21 @@
@Override
public void updated(Dictionary<String, ?> properties) throws ConfigurationException {
+
+ if(properties == null) {
+ if(configured.getAndSet(false)) {
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("The configuration has been deleted for persistence unit {}. Destroying the EMF", pUnitName);
+ }
+ builder.closeEMF();
+ } else {
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("Ignoring the unset configuration for persistence unit {}", pUnitName);
+ }
+ return;
+ }
+ }
+
Map<String, Object> overrides = (properties != null) ? asMap(properties) : null;
LOGGER.info("Configuration received for persistence unit {}", pUnitName);
if (LOGGER.isDebugEnabled()) {
@@ -55,6 +73,7 @@
}
builder.createEntityManagerFactory(overrides);
+ configured.set(true);
}
private Map<String, Object> asMap(Dictionary<String, ?> dict) {
diff --git a/jpa-container/src/test/java/org/apache/aries/jpa/container/impl/ManagedEMFTest.java b/jpa-container/src/test/java/org/apache/aries/jpa/container/impl/ManagedEMFTest.java
index 2d6d375..3ace0e9 100644
--- a/jpa-container/src/test/java/org/apache/aries/jpa/container/impl/ManagedEMFTest.java
+++ b/jpa-container/src/test/java/org/apache/aries/jpa/container/impl/ManagedEMFTest.java
@@ -27,6 +27,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
+import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.service.cm.ConfigurationException;
@@ -41,7 +42,15 @@
public void testEmfWithoutProps() throws InvalidSyntaxException, ConfigurationException {
ManagedEMF emf = new ManagedEMF(builder, "test");
emf.updated(null);
- verify(builder).createEntityManagerFactory(null);
+ Mockito.verifyZeroInteractions(builder);
+
+ Hashtable<String, Object> props = new Hashtable<String, Object>();
+ emf.updated(props);
+ verify(builder).createEntityManagerFactory(props);
+
+ emf.updated(null);
+ verify(builder).closeEMF();
+
}
@Test