From d3c68ad3bb9aa0e4e9abbfdec691abb06df642a5 Mon Sep 17 00:00:00 2001 From: Jeremy Bauer Date: Thu, 28 Mar 2013 19:33:00 +0000 Subject: [PATCH] Disable logging during brokerfactory de-serialization. Added type checking of plugin values. git-svn-id: https://svn.apache.org/repos/asf/openjpa/branches/2.1.x@1462268 13f79535-47bb-0310-9956-ffa450edef68 --- .../openjpa/kernel/AbstractBrokerFactory.java | 8 +++++- .../apache/openjpa/lib/conf/PluginValue.java | 26 ++++++++++++++++++- .../openjpa/lib/conf/localizer.properties | 4 +++ .../DistributedJDBCConfigurationImpl.java | 2 +- 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java index 84b2477c5..2c142feb6 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java @@ -473,8 +473,14 @@ public abstract class AbstractBrokerFactory // reset these transient fields to empty values _transactional = new ConcurrentHashMap>(); _brokers = newBrokerSet(); - + + // turn off logging while de-serializing BrokerFactory + String saveLogConfig = _conf.getLog(); + _conf.setLog("none"); makeReadOnly(); + // re-enable any logging which was in effect + _conf.setLog(saveLogConfig); + return this; } diff --git a/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/PluginValue.java b/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/PluginValue.java index 10d68d4f7..904ced7aa 100644 --- a/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/PluginValue.java +++ b/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/PluginValue.java @@ -19,7 +19,9 @@ package org.apache.openjpa.lib.conf; import org.apache.commons.lang.StringUtils; +import org.apache.openjpa.lib.log.Log; import org.apache.openjpa.lib.util.Localizer; +import org.apache.openjpa.lib.util.ParseException; /** * A plugin {@link Value} consisting of plugin name and properties. @@ -101,6 +103,20 @@ public class PluginValue extends ObjectValue { public Object instantiate(Class type, Configuration conf, boolean fatal) { Object obj = newInstance(_name, type, conf, fatal); + + // ensure plugin value is compatible with plugin type + if (obj != null && !type.isAssignableFrom(obj.getClass())) { + Log log = (conf == null) ? null : conf.getConfigurationLog(); + String msg = getIncompatiblePluginMessage(obj, type); + if (log != null && log.isErrorEnabled()) { + log.error(msg); + } + if (fatal) { + throw new ParseException(msg); + } + return null; + } + Configurations.configureInstance(obj, conf, _props, (fatal) ? getProperty() : null); if (_singleton) @@ -108,7 +124,15 @@ public class PluginValue extends ObjectValue { return obj; } - /** + private String getIncompatiblePluginMessage(Object obj, Class type) { + return _loc.get("incompatible-plugin", + new Object[]{ _name, + obj == null ? null : obj.getClass().getName(), + type == null ? null : type.getName() + }).toString(); + } + + /** * Configure the given object. */ public Object configure(Object obj, Configuration conf, boolean fatal) { diff --git a/openjpa-lib/src/main/resources/org/apache/openjpa/lib/conf/localizer.properties b/openjpa-lib/src/main/resources/org/apache/openjpa/lib/conf/localizer.properties index 9549598fe..fbe7130f5 100644 --- a/openjpa-lib/src/main/resources/org/apache/openjpa/lib/conf/localizer.properties +++ b/openjpa-lib/src/main/resources/org/apache/openjpa/lib/conf/localizer.properties @@ -117,3 +117,7 @@ veto-change: Can not modify "{0}" because the property is not dynamic and the \ jndi-lookup-failed: JNDI lookup for "{0}" with key "{1}" returned null. multiple-load-key: Equivalent property keys "{0}" and "{1}" are specified in \ configuration. +incompatible-plugin: The plugin "{0}" of value type "{1}" is not compatible with \ + the expected plugin type "{2}". Update the configuration property with a value that \ + is compatible with the plugin. + \ No newline at end of file diff --git a/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedJDBCConfigurationImpl.java b/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedJDBCConfigurationImpl.java index ad9124a6c..a08b32de8 100644 --- a/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedJDBCConfigurationImpl.java +++ b/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedJDBCConfigurationImpl.java @@ -260,7 +260,7 @@ public class DistributedJDBCConfigurationImpl extends JDBCConfigurationImpl public QueryTargetPolicy getQueryTargetPolicyInstance() { if (queryTargetPolicyPlugin.get() == null) { - queryTargetPolicyPlugin.instantiate(ReplicationPolicy.class, + queryTargetPolicyPlugin.instantiate(QueryTargetPolicy.class, this, true); } return (QueryTargetPolicy) queryTargetPolicyPlugin.get();