Fixes #1069: let JpaEntityManager(Factory) extend AutoCloseable (#1077)

Signed-off-by: Lukas Jungmann <lukas.jungmann@oracle.com>
diff --git a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/basic/TestSessionCustomizer.java b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/basic/TestSessionCustomizer.java
index f1ed695..9831f42 100644
--- a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/basic/TestSessionCustomizer.java
+++ b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/basic/TestSessionCustomizer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2015 IBM Corporation. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -19,12 +19,12 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import jakarta.persistence.EntityManagerFactory;
 import jakarta.persistence.Persistence;
 import jakarta.persistence.PersistenceException;
 
 import org.eclipse.persistence.config.PersistenceUnitProperties;
 import org.eclipse.persistence.config.SessionCustomizer;
+import org.eclipse.persistence.jpa.JpaEntityManagerFactory;
 import org.eclipse.persistence.jpa.test.framework.EmfRunner;
 import org.eclipse.persistence.sessions.Session;
 import org.junit.Assert;
@@ -46,12 +46,9 @@
     @Test
     public void stringCustomizerInvoked() {
         props.put(PersistenceUnitProperties.SESSION_CUSTOMIZER, Customizer.class.getName());
-        EntityManagerFactory emf = Persistence.createEntityManagerFactory(PU_NAME, props);
-        try {
+        try (JpaEntityManagerFactory emf = (JpaEntityManagerFactory) Persistence.createEntityManagerFactory(PU_NAME, props)) {
             emf.createEntityManager();
             Assert.assertTrue(Customizer.staticCustomized);
-        } finally {
-            emf.close();
         }
     }
 
@@ -59,12 +56,9 @@
     public void customizerInvoked() {
         Customizer customizerInstance = new Customizer();
         props.put(PersistenceUnitProperties.SESSION_CUSTOMIZER, customizerInstance);
-        EntityManagerFactory emf = Persistence.createEntityManagerFactory(PU_NAME, props);
-        try {
+        try (JpaEntityManagerFactory emf = (JpaEntityManagerFactory) Persistence.createEntityManagerFactory(PU_NAME, props)) {
             emf.createEntityManager();
             Assert.assertTrue(customizerInstance.customized);
-        } finally {
-            emf.close();
         }
     }
 
@@ -72,16 +66,11 @@
     public void invalidInstance() {
         props.put(PersistenceUnitProperties.SESSION_CUSTOMIZER, new Object());
 
-        EntityManagerFactory emf = Persistence.createEntityManagerFactory(PU_NAME, props);
-        try {
+        try (JpaEntityManagerFactory emf = (JpaEntityManagerFactory) Persistence.createEntityManagerFactory(PU_NAME, props)) {
             emf.createEntityManager();
             Assert.fail();
         } catch (PersistenceException e) {
             Assert.assertTrue(e.toString(), e.getCause() instanceof ClassCastException);
-        } finally {
-            if (emf != null) {
-                emf.close();
-            }
         }
     }
 
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EntityManagerJUnitTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EntityManagerJUnitTestSuite.java
index 530ca30..7f3bf16 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EntityManagerJUnitTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EntityManagerJUnitTestSuite.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 1998, 2019 IBM Corporation. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -528,6 +528,7 @@
             tests.add("testInheritanceFetchJoinSecondCall");
         }
         tests.add("testDetachChildObjects");
+        tests.add("testAutoCloseable");
 
 
         Collections.sort(tests);
@@ -4955,11 +4956,8 @@
         if (isOnServer()) {
             return;
         }
-        EntityManagerFactory factory = null;
-        try {
-            factory = Persistence.createEntityManagerFactory("broken-PU", JUnitTestCaseHelper.getDatabaseProperties());
-            EntityManager em = factory.createEntityManager();
-            em.close();
+        try (JpaEntityManagerFactory factory = (JpaEntityManagerFactory) Persistence.createEntityManagerFactory("broken-PU", JUnitTestCaseHelper.getDatabaseProperties());
+             JpaEntityManager em = (JpaEntityManager) factory.createEntityManager()) {
         } catch (jakarta.persistence.PersistenceException e)  {
             ArrayList expectedExceptions = new ArrayList();
             expectedExceptions.add(48);
@@ -4972,8 +4970,6 @@
             if (expectedExceptions.size() > 0){
                 fail("Not all expected exceptions were caught");
             }
-        } finally {
-            factory.close();
         }
     }
 
@@ -13174,8 +13170,25 @@
 		}
 		rollbackTransaction(em);
 		closeEntityManager(em);
-    
     }
+
+    public void testAutoCloseable() {
+        EntityManagerFactory emfOuter = null;
+        EntityManager emOuter = null;
+        try (JpaEntityManagerFactory emf = (JpaEntityManagerFactory) Persistence.createEntityManagerFactory(getPersistenceUnitName(), JUnitTestCaseHelper.getDatabaseProperties());
+                JpaEntityManager em = (JpaEntityManager) emf.createEntityManager()) {
+            emfOuter = emf;
+            emOuter = em;
+            assertNotNull(emf);
+            assertNotNull(em);
+            assertTrue(emOuter.isOpen());
+            assertTrue(emfOuter.isOpen());
+        } finally {
+            assertFalse(emOuter.isOpen());
+            assertFalse(emfOuter.isOpen());
+        }
+    }
+
     private void InitTestDetachChildObjects(EntityManager em) {
         // test data - manual creation
         try {
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/composite/advanced/EntityManagerJUnitTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/composite/advanced/EntityManagerJUnitTestSuite.java
index c006805..f4a54f2 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/composite/advanced/EntityManagerJUnitTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/composite/advanced/EntityManagerJUnitTestSuite.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 1998, 2019 IBM Corporation. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -4640,11 +4640,8 @@
         if (isOnServer()) {
             return;
         }
-        EntityManagerFactory factory = null;
-        try {
-            factory = Persistence.createEntityManagerFactory("broken-PU", JUnitTestCaseHelper.getDatabaseProperties());
-            EntityManager em = factory.createEntityManager();
-            em.close();
+        try (JpaEntityManagerFactory factory = (JpaEntityManagerFactory) Persistence.createEntityManagerFactory("broken-PU", JUnitTestCaseHelper.getDatabaseProperties());
+             JpaEntityManager em = (JpaEntityManager) factory.createEntityManager()) {
         } catch (jakarta.persistence.PersistenceException e)  {
             ArrayList expectedExceptions = new ArrayList();
             expectedExceptions.add(48);
@@ -4657,8 +4654,6 @@
             if (expectedExceptions.size() > 0){
                 fail("Not all expected exceptions were caught");
             }
-        } finally {
-            factory.close();
         }
     }
 
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManager.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManager.java
index 7887e32..37ab3ab 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManager.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -36,7 +36,7 @@
  * @author Gordon Yorke
  */
 
-public interface JpaEntityManager extends jakarta.persistence.EntityManager {
+public interface JpaEntityManager extends jakarta.persistence.EntityManager, AutoCloseable {
 
     /**
      * This method returns the current session to the requester.  The current session
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManagerFactory.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManagerFactory.java
index a20f782..67a73c7 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManagerFactory.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManagerFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -16,6 +16,7 @@
 //       - 494610: Session Properties map should be Map<String, Object>
 package org.eclipse.persistence.jpa;
 
+import jakarta.persistence.EntityManagerFactory;
 import java.util.Map;
 
 import org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate;
@@ -29,7 +30,7 @@
  * </p>
  * @see jakarta.persistence.EntityManagerFactory
  */
-public interface JpaEntityManagerFactory {
+public interface JpaEntityManagerFactory extends EntityManagerFactory, AutoCloseable {
 
     /**
      * Returns the DatabaseSession that the Factory will be using and