This is an automated email from the ASF dual-hosted git repository.

rzo1 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomee-jakarta.git

commit 0a53de8d54f1aa810bb0aa6163493f74fd19995b
Author: Richard Zowalla <richard.zowa...@hs-heilbronn.de>
AuthorDate: Thu Jun 10 17:17:40 2021 +0200

    TOMEE-3753: Patches OpenJPA 3.2.0 classes
---
 .../openjpa/lib/meta/ClassMetaDataIterator.java    | 21 ++++-----
 .../openjpa/lib/util/TemporaryClassLoader.java     |  2 +-
 .../openjpa/meta/AbstractMetaDataDefaults.java     |  3 +-
 .../persistence/PersistenceProviderImpl.java       | 52 ++++++++++++++++++----
 4 files changed, 58 insertions(+), 20 deletions(-)

diff --git 
a/transform/src/patch/java/org/apache/openjpa/lib/meta/ClassMetaDataIterator.java
 
b/transform/src/patch/java/org/apache/openjpa/lib/meta/ClassMetaDataIterator.java
index 1d0bcb4..5f7b39a 100644
--- 
a/transform/src/patch/java/org/apache/openjpa/lib/meta/ClassMetaDataIterator.java
+++ 
b/transform/src/patch/java/org/apache/openjpa/lib/meta/ClassMetaDataIterator.java
@@ -63,11 +63,12 @@ public class ClassMetaDataIterator implements 
MetaDataIterator {
      * of metadata files, and whether to parse top-down or bottom-up.
      */
     public ClassMetaDataIterator(Class<?> cls, String suffix,
-                                 ClassLoader loader, boolean topDown) {
+            ClassLoader loader, boolean topDown) {
         // skip classes that can't have metadata
         if (cls != null && (cls.isPrimitive()
-                || cls.getName().startsWith("java.")
-                || cls.getName().startsWith("javax."))) {
+            || cls.getName().startsWith("java.")
+            || cls.getName().startsWith("javax.")
+            || cls.getName().startsWith("jakarta."))) {
             _loader = null;
             _locs = Collections.emptyList();
             return;
@@ -75,15 +76,15 @@ public class ClassMetaDataIterator implements 
MetaDataIterator {
 
         if (loader == null) {
             MultiClassLoader multi = AccessController
-                    .doPrivileged(J2DoPrivHelper.newMultiClassLoaderAction());
+                .doPrivileged(J2DoPrivHelper.newMultiClassLoaderAction());
             multi.addClassLoader(MultiClassLoader.SYSTEM_LOADER);
             multi.addClassLoader(MultiClassLoader.THREAD_LOADER);
             multi.addClassLoader(getClass().getClassLoader());
             if (cls != null)
             {
                 ClassLoader clsLoader = (ClassLoader)
-                        AccessController.doPrivileged(
-                                J2DoPrivHelper.getClassLoaderAction(cls));
+                    AccessController.doPrivileged(
+                        J2DoPrivHelper.getClassLoaderAction(cls));
                 if (clsLoader != null)
                     multi.addClassLoader(clsLoader);
             }
@@ -157,8 +158,8 @@ public class ClassMetaDataIterator implements 
MetaDataIterator {
             _urls.clear();
             try {
                 e = AccessController.doPrivileged(
-                        J2DoPrivHelper.getResourcesAction(
-                                _loader, _locs.get(_loc)));
+                    J2DoPrivHelper.getResourcesAction(
+                        _loader, _locs.get(_loc)));
             } catch (PrivilegedActionException pae) {
                 throw (IOException) pae.getException();
             }
@@ -181,7 +182,7 @@ public class ClassMetaDataIterator implements 
MetaDataIterator {
             throw new IllegalStateException();
         try {
             return AccessController.doPrivileged(
-                    J2DoPrivHelper.openStreamAction(_urls.get(_url)));
+                J2DoPrivHelper.openStreamAction(_urls.get(_url)));
         } catch (PrivilegedActionException pae) {
             throw (IOException) pae.getException();
         }
@@ -199,4 +200,4 @@ public class ClassMetaDataIterator implements 
MetaDataIterator {
     @Override
     public void close() {
     }
-}
\ No newline at end of file
+}
diff --git 
a/transform/src/patch/java/org/apache/openjpa/lib/util/TemporaryClassLoader.java
 
b/transform/src/patch/java/org/apache/openjpa/lib/util/TemporaryClassLoader.java
index f56f2fc..07802ba 100644
--- 
a/transform/src/patch/java/org/apache/openjpa/lib/util/TemporaryClassLoader.java
+++ 
b/transform/src/patch/java/org/apache/openjpa/lib/util/TemporaryClassLoader.java
@@ -54,7 +54,7 @@ public class TemporaryClassLoader extends ClassLoader {
         // bug #283. defer to system if the name is a protected name.
         // "sun." is required for JDK 1.4, which has an access check for
         // sun.reflect.GeneratedSerializationConstructorAccessor1
-        if (name.startsWith("java.") || name.startsWith("javax.")
+        if (name.startsWith("java.") || name.startsWith("javax.") || 
name.startsWith("jakarta.")
             || name.startsWith("sun.") || name.startsWith("jdk.")) {
             return Class.forName(name, resolve, getClass().getClassLoader());
         }
diff --git 
a/transform/src/patch/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java
 
b/transform/src/patch/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java
index 8c8f89c..473fbf8 100644
--- 
a/transform/src/patch/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java
+++ 
b/transform/src/patch/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java
@@ -351,7 +351,8 @@ public abstract class AbstractMetaDataDefaults
      */
     protected static boolean isUserDefined(Class<?> cls) {
         return cls != null && !cls.getName().startsWith("java.")
-            && !cls.getName().startsWith ("javax.");
+            && !cls.getName().startsWith ("javax.")
+            && !cls.getName().startsWith ("jakarta.");
        }
 
     /**
diff --git 
a/transform/src/patch/java/org/apache/openjpa/persistence/PersistenceProviderImpl.java
 
b/transform/src/patch/java/org/apache/openjpa/persistence/PersistenceProviderImpl.java
index bbe358d..98a9c78 100644
--- 
a/transform/src/patch/java/org/apache/openjpa/persistence/PersistenceProviderImpl.java
+++ 
b/transform/src/patch/java/org/apache/openjpa/persistence/PersistenceProviderImpl.java
@@ -26,12 +26,12 @@ import java.security.ProtectionDomain;
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.persistence.EntityManager;
-import javax.persistence.spi.ClassTransformer;
-import javax.persistence.spi.LoadState;
-import javax.persistence.spi.PersistenceProvider;
-import javax.persistence.spi.PersistenceUnitInfo;
-import javax.persistence.spi.ProviderUtil;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.spi.ClassTransformer;
+import jakarta.persistence.spi.LoadState;
+import jakarta.persistence.spi.PersistenceProvider;
+import jakarta.persistence.spi.PersistenceUnitInfo;
+import jakarta.persistence.spi.ProviderUtil;
 
 import org.apache.openjpa.conf.BrokerValue;
 import org.apache.openjpa.conf.OpenJPAConfiguration;
@@ -228,7 +228,12 @@ public class PersistenceProviderImpl
     @Override
     public void generateSchema(final PersistenceUnitInfo info, final Map map) {
         final Map runMap = map == null ? new HashMap<>() : new HashMap<>(map);
-        runMap.put("javax.persistence.schema-generation.database.action", 
"create");
+
+        if (!acceptProvider(runMap)) {
+            return;
+        }
+
+        runMap.put("jakarta.persistence.schema-generation.database.action", 
"create");
         final OpenJPAEntityManagerFactory factory = 
createContainerEntityManagerFactory(info, runMap);
         try {
             synchronizeMappings(factory);
@@ -240,7 +245,12 @@ public class PersistenceProviderImpl
     @Override
     public boolean generateSchema(final String persistenceUnitName, final Map 
map) {
         final Map runMap = map == null ? new HashMap<>() : new HashMap<>(map);
-        runMap.put("javax.persistence.schema-generation.database.action", 
"create");
+
+        if (!acceptProvider(runMap)) {
+            return false;
+        }
+
+        runMap.put("jakarta.persistence.schema-generation.database.action", 
"create");
         final OpenJPAEntityManagerFactory factory = 
createEntityManagerFactory(persistenceUnitName, runMap);
         try {
             final Object obj = synchronizeMappings(factory);
@@ -250,6 +260,32 @@ public class PersistenceProviderImpl
         }
     }
 
+    // if persistence provider is specific, don't do anything
+    // only allowed to process if persistence provider matches or if not 
provider is specified
+    public boolean acceptProvider(final Map properties){
+        Object provider = properties.get("jakarta.persistence.provider");
+
+        // provider is specified, so it has to match
+        if (provider != null){
+            if (provider instanceof Class){
+                provider = ((Class)provider).getName();
+            }
+            try{
+                if (! 
((String)provider).equals(org.apache.openjpa.persistence.PersistenceProviderImpl.class.getName())){
+                    return false;
+                }
+
+            }catch(ClassCastException e){
+                return false;
+                // not a recognized provider property value so must be another 
provider.
+            }
+        }
+
+        // no provider specified
+        return true;
+
+    }
+
     private Object synchronizeMappings(final OpenJPAEntityManagerFactory 
factory) {
         if (EntityManagerFactoryImpl.class.isInstance(factory)) {
             final EntityManagerFactoryImpl entityManagerFactory = 
EntityManagerFactoryImpl.class.cast(factory);

Reply via email to