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