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 <rmannibu...@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); }