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
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 7659a9b..78a6f31 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 @@
         _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 e9dd08f..4b22020 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 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 @@
         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 abb9327..531e01b 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 @@
 
 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.