From 521fecd2d9b91c27e9f90d97e5f5479d17239eb8 Mon Sep 17 00:00:00 2001 From: Jeremy Bauer Date: Fri, 29 Mar 2013 15:57:37 +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/1.1.x@1462512 13f79535-47bb-0310-9956-ffa450edef68 --- .../openjpa/kernel/AbstractBrokerFactory.java | 6 +++++ .../apache/openjpa/lib/conf/PluginValue.java | 24 +++++++++++++++++++ .../openjpa/lib/conf/localizer.properties | 3 +++ 3 files changed, 33 insertions(+) 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 7659a9bc5..78a6f3119 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 @@ -467,7 +467,13 @@ public abstract class AbstractBrokerFactory _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 e9dd08fda..4b220204b 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. @@ -100,6 +102,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) @@ -107,6 +123,14 @@ 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(); + } + public void set(Object obj, boolean derived) { if (!_singleton) throw new IllegalStateException(_loc.get("not-singleton", 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 abb9327fb..531e01b95 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 @@ -114,3 +114,6 @@ Id-expert: true veto-change: Can not modify "{0}" because the property is not dynamic and the \ current configuration is read-only. +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.