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