You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by rm...@apache.org on 2020/09/30 13:34:49 UTC

[openjpa] branch master updated: [OPENJPA-2834] ensure getProperties does not fail with xmlstore

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

rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openjpa.git


The following commit(s) were added to refs/heads/master by this push:
     new 9fa619f  [OPENJPA-2834] ensure getProperties does not fail with xmlstore
9fa619f is described below

commit 9fa619f94ecec2510d2ec560bb719eecd8f222c1
Author: Romain Manni-Bucau <rm...@gmail.com>
AuthorDate: Wed Sep 30 15:34:44 2020 +0200

    [OPENJPA-2834] ensure getProperties does not fail with xmlstore
---
 .../openjpa/conf/OpenJPAConfigurationImpl.java     |  3 ++
 .../openjpa/enhance/PCClassFileTransformer.java    | 45 ++++++++++++++++------
 .../apache/openjpa/enhance/PCEnhancerAgent.java    |  2 +-
 .../java/org/apache/openjpa/kernel/BrokerImpl.java |  5 ++-
 .../persistence/PersistenceProviderImpl.java       |  2 +-
 5 files changed, 43 insertions(+), 14 deletions(-)

diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java b/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java
index 6727e14..4660b8d 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java
@@ -2023,6 +2023,9 @@ public class OpenJPAConfigurationImpl
 
     @Override
     public FinderCache getFinderCacheInstance() {
+        if (finderCachePlugin == null) { // xmlstore case
+            return null;
+        }
         if (finderCachePlugin.get() == null) {
             finderCachePlugin.instantiate(FinderCache.class, this);
         }
diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java
index d5f35ae..8376c6e 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java
@@ -54,7 +54,6 @@ public class PCClassFileTransformer
     private final ClassLoader _tmpLoader;
     private final Log _log;
     private final Set _names;
-    private boolean _transforming = false;
 
     /**
      * Constructor.
@@ -104,6 +103,13 @@ public class PCClassFileTransformer
             _log.info(_loc.get("runtime-enhance-pcclasses"));
     }
 
+    public static PCClassFileTransformer newInstance(final MetaDataRepository repos, final Options parseProperties,
+                                                     final ClassLoader tmpLoader) {
+        return parseProperties != null && parseProperties.getBooleanProperty("Reentrant") ?
+                new PCClassFileTransformer.Reentrant(repos, parseProperties, tmpLoader) :
+                new PCClassFileTransformer(repos, parseProperties, tmpLoader);
+    }
+
     @Override
     public byte[] transform(ClassLoader loader, String className, Class redef, ProtectionDomain domain, byte[] bytes)
         throws IllegalClassFormatException {
@@ -115,14 +121,6 @@ public class PCClassFileTransformer
         if (className == null) {
             return null;
         }
-        // prevent re-entrant calls, which can occur if the enhancing
-        // loader is used to also load OpenJPA libraries; this is to prevent
-        // recursive enhancement attempts for internal openjpa libraries
-        if (_transforming)
-            return null;
-
-        _transforming = true;
-
         return transform0(className, redef, bytes);
     }
 
@@ -131,7 +129,7 @@ public class PCClassFileTransformer
      * ClassCircularityError when executing method using pure-JIT JVMs
      * such as JRockit.
      */
-    private byte[] transform0(String className, Class redef, byte[] bytes)
+    protected byte[] transform0(String className, Class redef, byte[] bytes)
         throws IllegalClassFormatException {
 
         byte[] returnBytes = null;
@@ -169,7 +167,6 @@ public class PCClassFileTransformer
                 throw (IllegalClassFormatException) t;
             throw new GeneralException(t);
         } finally {
-            _transforming = false;
             if (returnBytes != null && _log.isTraceEnabled())
                 _log.trace(_loc.get("runtime-enhance-complete", className,
                     bytes.length, returnBytes.length));
@@ -228,4 +225,30 @@ public class PCClassFileTransformer
     private static boolean isEnhanced(byte[] b) {
         return AsmAdaptor.isEnhanced(b);
     }
+
+    public static class Reentrant extends PCClassFileTransformer {
+        private final ThreadLocal<Boolean> transforming = new ThreadLocal<>();
+
+        public Reentrant(final MetaDataRepository repos, final Options opts, final ClassLoader loader) {
+            super(repos, opts, loader);
+        }
+
+        public Reentrant(final MetaDataRepository repos, final PCEnhancer.Flags flags,
+                         final ClassLoader tmpLoader, final boolean devscan) {
+            super(repos, flags, tmpLoader, devscan);
+        }
+
+        @Override
+        protected byte[] transform0(String className, Class redef, byte[] bytes) throws IllegalClassFormatException {
+            if (transforming.get() != null) {
+                return bytes;
+            }
+            transforming.set(true);
+            try {
+                return super.transform0(className, redef, bytes);
+            } finally {
+                transforming.remove();
+            }
+        }
+    }
 }
diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancerAgent.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancerAgent.java
index b3c7c93..83f6848 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancerAgent.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancerAgent.java
@@ -182,7 +182,7 @@ public class PCEnhancerAgent {
     		conf.setReadOnly(Configuration.INIT_STATE_FREEZING);
     		conf.instantiateAll(); // avoid threading issues
 
-    		PCClassFileTransformer transformer = new PCClassFileTransformer
+    		PCClassFileTransformer transformer = PCClassFileTransformer.newInstance
     		    (conf.newMetaDataRepositoryInstance(), clonedOptions,
     		    tmpLoader);
     		inst.addTransformer(transformer);
diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
index 81ecf25..6642966 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
@@ -791,7 +791,10 @@ public class BrokerImpl implements Broker, FindCallbacks, Cloneable, Serializabl
     public Map<String, Object> getProperties() {
         Map<String, Object> props = _conf.toProperties(true);
         for (String s : _supportedPropertyNames) {
-            props.put("openjpa." + s, Reflection.getValue(this, s, true));
+            final Object value = Reflection.getValue(this, s, !"CacheFinderQuery".equals(s));
+            if (value != null) {
+                props.put("openjpa." + s, value);
+            }
         }
         return props;
     }
diff --git a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProviderImpl.java b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProviderImpl.java
index 9d24553..9cfd520 100644
--- a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProviderImpl.java
+++ b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProviderImpl.java
@@ -342,7 +342,7 @@ public class PersistenceProviderImpl
 
             MetaDataRepository repos = conf.getMetaDataRepositoryInstance();
             repos.setResolve(MetaDataModes.MODE_MAPPING, false);
-            _trans = new PCClassFileTransformer(repos,
+            _trans = PCClassFileTransformer.newInstance(repos,
                 Configurations.parseProperties(props), tmpLoader);
         }