[OPENJPA-2834] ensure getProperties does not fail with xmlstore
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 @@
@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 @@
private final ClassLoader _tmpLoader;
private final Log _log;
private final Set _names;
- private boolean _transforming = false;
/**
* Constructor.
@@ -104,6 +103,13 @@
_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 @@
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 @@
* 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 @@
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 @@
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 @@
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 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 @@
MetaDataRepository repos = conf.getMetaDataRepositoryInstance();
repos.setResolve(MetaDataModes.MODE_MAPPING, false);
- _trans = new PCClassFileTransformer(repos,
+ _trans = PCClassFileTransformer.newInstance(repos,
Configurations.parseProperties(props), tmpLoader);
}