Author: awhite
Date: Wed Feb 14 09:53:13 2007
New Revision: 507643

URL: http://svn.apache.org/viewvc?view=rev&rev=507643
Log:
Compare Configuration instances on their full properties, including defaults.
Also serialize the full properties because product derivations aren't re-run
on deserialize, so we need to know the complete defaults, etc.  We still track
the user-given properties separately so they can be used in factory pooling.


Modified:
    
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java
    
incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ConfigurationImpl.java

Modified: 
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java?view=diff&rev=507643&r1=507642&r2=507643
==============================================================================
--- 
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java
 (original)
+++ 
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java
 Wed Feb 14 09:53:13 2007
@@ -58,8 +58,7 @@
         (AbstractBrokerFactory.class);
 
     // static mapping of configurations to pooled broker factories
-    private static final Map _pool = Collections.synchronizedMap
-        (new HashMap());
+    private static final Map _pool = Collections.synchronizedMap(new 
HashMap());
 
     // configuration
     private final OpenJPAConfiguration _conf;
@@ -95,6 +94,11 @@
         return (AbstractBrokerFactory) _pool.get(toPoolKey(conf));
     }
 
+    /**
+     * Return an internal factory pool key for the given configuration.
+     * We use the conf properties as given by the user because that is what's
+     * passed to [EMAIL PROTECTED] #getPooledFactory} when looking for an 
existing factory.
+     */
     private static Map toPoolKey(OpenJPAConfiguration conf) {
         return conf.toProperties(false);
     }

Modified: 
incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ConfigurationImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ConfigurationImpl.java?view=diff&rev=507643&r1=507642&r2=507643
==============================================================================
--- 
incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ConfigurationImpl.java
 (original)
+++ 
incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ConfigurationImpl.java
 Wed Feb 14 09:53:13 2007
@@ -107,6 +107,7 @@
     private String _product = null;
     private boolean _readOnly = false;
     private Map _props = null;
+    private Map _fullProps = null;
     private boolean _globals = false;
     private String _auto = null;
     private final List _vals = new ArrayList();
@@ -310,7 +311,7 @@
     }
 
     public void valueChanged(Value val) {
-        if (_changeSupport == null && _props == null)
+        if (_changeSupport == null && _props == null && _fullProps == null)
             return;
 
         String newString = val.getString();
@@ -319,12 +320,15 @@
                 newString);
 
         // keep cached props up to date
-        if (_props != null) {
-            if (newString == null)
-                Configurations.removeProperty(val.getProperty(), _props);
-            else if (Configurations.containsProperty(val.getProperty(), _props)
-                || val.getDefault() == null
+        if (newString == null) {
+            Configurations.removeProperty(val.getProperty(), _props);
+            Configurations.removeProperty(val.getProperty(), _fullProps);
+        } else { 
+            put(_fullProps, val, newString); 
+            if (_props != null && _props != _fullProps 
+                && (val.getDefault() == null 
                 || !val.getDefault().equals(newString))
+                || Configurations.containsProperty(val.getProperty(), _props))
                 put(_props, val, newString);
         }
     }
@@ -566,33 +570,30 @@
         // clone properties before making any modifications; we need to keep
         // the internal properties instance consistent to maintain equals and
         // hashcode contracts
+        Map map = (storeDefaults) ? _fullProps : _props;
         Map clone;
-        if (_props == null)
+        if (map == null)
             clone = new HashMap();
-        else if (_props instanceof Properties)
-            clone = (Map) ((Properties) _props).clone();
+        else if (map instanceof Properties)
+            clone = (Map) ((Properties) map).clone();
         else
-            clone = new HashMap(_props);
+            clone = new HashMap(map);
 
-        // if no existing properties or the properties should contain entries
-        // with default values, add values to properties
-        if (_props == null || storeDefaults) {
+        if (map == null) {
             Value val;
             String str;
             for (int i = 0; i < _vals.size(); i++) {
-                // if key in existing properties, we already know value is up
-                // to date
                 val = (Value) _vals.get(i);
-                if (_props != null && Configurations.containsProperty
-                    (val.getProperty(), _props))
-                    continue;
-
                 str = val.getString();
                 if (str != null && (storeDefaults
                     || !str.equals(val.getDefault())))
                     put(clone, val, str);
             }
-            if (_props == null)
+            if (storeDefaults) {
+                _fullProps = new HashMap(clone);
+                if (_props == null)
+                    _props = _fullProps;
+            } else
                 _props = new HashMap(clone);
         }
         return clone;
@@ -605,15 +606,13 @@
 
         // if the only previous call was to load defaults, forget them.
         // this way we preserve the original formatting of the user's props
-        // instead of the defaults.  this is important for caching on
-        // configuration objects
+        // instead of the defaults.
         if (_globals) {
             _props = null;
             _globals = false;
         }
 
         Map remaining = new HashMap(map);
-        boolean ser = true;
         Value val;
         Object o;
         for (int i = 0; i < _vals.size(); i++) {
@@ -625,10 +624,8 @@
             if (o instanceof String) {
                 if (!StringUtils.equals((String) o, val.getString()))
                     val.setString((String) o);
-            } else {
-                ser &= o instanceof Serializable;
+            } else
                 val.setObject(o);
-            }
             Configurations.removeProperty(val.getProperty(), remaining);
         }
         
@@ -639,16 +636,15 @@
         
         // now warn if there are any remaining properties that there
         // is an unhandled prop
-        Map.Entry entry;
-        for (Iterator itr = remaining.entrySet().iterator(); itr.hasNext();) {
-            entry = (Map.Entry) itr.next();
-            if (entry.getKey() != null)
-                warnInvalidProperty((String) entry.getKey());
-            ser &= entry.getValue() instanceof Serializable;
+        String key;
+        for (Iterator itr = remaining.keySet().iterator(); itr.hasNext();) {
+            key = (String) itr.next();
+            if (key != null)
+                warnInvalidProperty(key);
         }
 
-        // cache properties
-        if (_props == null && ser)
+        // cache user-formatted properties
+        if (_props == null || _props == _fullProps)
             _props = map;
     }
 
@@ -658,6 +654,8 @@
      * this will account for the property prefix.
      */
     private void put(Map map, Value val, Object o) {
+        if (map == null)
+            return;
         Object key = val.getLoadKey();
         if (key == null)
             key = "openjpa." + val.getProperty();
@@ -668,6 +666,8 @@
      * Look up the given value, testing all available prefixes.
      */
     private Object get(Map map, Value val, boolean setLoadKey) {
+        if (map == null)
+            return null;
         String key = ProductDerivations.getConfigurationKey(
             val.getProperty(), map);
         if (map.containsKey(key) && setLoadKey)
@@ -791,8 +791,9 @@
 
         // compare properties
         ConfigurationImpl conf = (ConfigurationImpl) other;
-        Map p1 = (_props == null) ? toProperties(false) : _props;
-        Map p2 = (conf._props == null) ? conf.toProperties(false) : 
conf._props;
+        Map p1 = (_fullProps == null) ? toProperties(true) : _fullProps;
+        Map p2 = (conf._fullProps == null) ? conf.toProperties(true) 
+            : conf._fullProps;
         return p1.equals(p2);
     }
 
@@ -801,9 +802,9 @@
      * [EMAIL PROTECTED] #toProperties}.
      */
     public int hashCode() {
-        if (_props != null)
-            return _props.hashCode();
-        return toProperties(false).hashCode();
+        if (_fullProps != null)
+            return _fullProps.hashCode();
+        return toProperties(true).hashCode();
     }
 
     /**
@@ -849,7 +850,11 @@
      */
     public void readExternal(ObjectInput in)
         throws IOException, ClassNotFoundException {
-        fromProperties((Map) in.readObject());
+        Map fullProps = (Map) in.readObject();
+        Map props = (Map) in.readObject();
+        fromProperties(fullProps);
+        _fullProps = fullProps;
+        _props = props;
         _globals = in.readBoolean();
     }
 
@@ -858,10 +863,11 @@
      * the properties returned by [EMAIL PROTECTED] #toProperties}.
      */
     public void writeExternal(ObjectOutput out) throws IOException {
-        if (_props != null)
-            out.writeObject(_props);
+        if (_fullProps != null)
+            out.writeObject(_fullProps);
         else
-            out.writeObject(toProperties(false));
+            out.writeObject(toProperties(true));
+        out.writeObject(_props);
         out.writeBoolean(_globals);
     }
 
@@ -876,7 +882,9 @@
             ConfigurationImpl clone = (ConfigurationImpl) cons.newInstance
                 (new Object[]{ Boolean.FALSE });
             clone._globals = _globals;
-            clone.fromProperties(toProperties(true));
+            Map map = new HashMap(toProperties(true));
+            clone.fromProperties(map);
+            clone._fullProps = map;
             return clone;
         } catch (RuntimeException re) {
             throw re;


Reply via email to