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);