You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by le...@apache.org on 2007/07/12 10:17:25 UTC

svn commit: r555527 - in /harmony/enhanced/classlib/trunk/modules/beans/src: main/java/java/beans/ main/java/org/apache/harmony/beans/ test/java/org/apache/harmony/beans/tests/java/beans/

Author: leoli
Date: Thu Jul 12 01:17:23 2007
New Revision: 555527

URL: http://svn.apache.org/viewvc?view=rev&rev=555527
Log:
Apply patch for HARMONY-4321([classlib][beans] Current java6 bean implementation does not persist some class properly).

Modified:
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/DefaultPersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Encoder.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLEncoder.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/DefaultPersistenceDelegatesFactory.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/ObjectNode.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_BooleanPersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_BytePersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_CharacterPersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ClassPersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_DoublePersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_FloatPersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_IntegerPersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_LongPersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ShortPersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_reflect_FieldPersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_reflect_ProxyPersistenceDelegate.java
    harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/EncoderTest.java
    harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/PersistenceDelegateTest.java

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/DefaultPersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/DefaultPersistenceDelegate.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/DefaultPersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/DefaultPersistenceDelegate.java Thu Jul 12 01:17:23 2007
@@ -17,7 +17,6 @@
 
 package java.beans;
 
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 import org.apache.harmony.beans.internal.nls.Messages;
@@ -57,8 +56,7 @@
 
         // added for compatibility with RI
         if (out == null) {
-            throw new NullPointerException(
-                    Messages.getString("beans.4C")); //$NON-NLS-1$
+            throw new NullPointerException(Messages.getString("beans.4C")); //$NON-NLS-1$
         }
 
         // added for compatibility with RI
@@ -67,46 +65,83 @@
                     new NullPointerException(Messages.getString("beans.4A"))); //$NON-NLS-1$
             return;
         }
-      
-        try {
-            PropertyDescriptor[] pds = Introspector.getBeanInfo(type)
-                    .getPropertyDescriptors();
 
-            for (PropertyDescriptor pd : pds) {
-                if (!isTransient(pd)) {
-                    Method getter = pd.getReadMethod();
-
-                    if (getter != null) {
-                        Method setter = pd.getWriteMethod();
-
-                        if (setter != null) {
-                            Object oldValue = getter.invoke(oldInstance,
-                                    (Object[]) null);
-                            Object newValue = getter.invoke(newInstance,
-                                    (Object[]) null);
-
-                            if (oldValue != null && !oldValue.equals(newValue)
-                                    || oldValue == null && newValue != null) {
-                                String setterName = setter.getName();
-                                Statement s = new Statement(oldInstance,
-                                        setterName, new Object[] { oldValue });
+        // added for compatibility with RI
+        if (oldInstance == null) {
+            throw new NullPointerException(Messages.getString("beans.4C")); //$NON-NLS-1$
+        }
 
-                                out.writeStatement(s);
+        BeanInfo info = null;
+        try {
+            info = Introspector.getBeanInfo(type);
+        } catch (IntrospectionException e) {
+            out.getExceptionListener().exceptionThrown(e);
+            return;
+        }
+        PropertyDescriptor[] pds = info.getPropertyDescriptors();
+
+        for (PropertyDescriptor pd : pds) {
+            if (!isTransient(pd)) {
+                Method getter = pd.getReadMethod();
+
+                if (getter != null) {
+                    Method setter = pd.getWriteMethod();
+
+                    if (setter != null) {
+                        Expression getterExp = new Expression(oldInstance, pd
+                                .getReadMethod().getName(), null);
+                        try {
+                            // Calculate the old value of the property
+                            Object oldValue = getterExp.getValue();
+
+                            // Write the getter expression to the encoder
+                            out.writeExpression(getterExp);
+
+                            // Get the target value that exists in the new
+                            // environment
+                            Object targetVal = out.get(oldValue);
+
+                            Object newValue = new Expression(newInstance, pd
+                                    .getReadMethod().getName(), null)
+                                    .getValue();
+
+                            /*
+                             * Make the target value and current property value
+                             * equivalent in the new environment
+                             */
+                            if (null == targetVal) {
+                                if (null != newValue) {
+                                    // Set to null
+                                    Statement setterStm = new Statement(
+                                            oldInstance, pd.getWriteMethod()
+                                                    .getName(),
+                                            new Object[] { null });
+                                    out.writeStatement(setterStm);
+                                }
+                            } else {
+                                PersistenceDelegate delegate = out
+                                        .getPersistenceDelegate(targetVal
+                                                .getClass());
+                                if (!delegate.mutatesTo(targetVal, newValue)) {
+                                    Statement setterStm = new Statement(
+                                            oldInstance, pd.getWriteMethod()
+                                                    .getName(),
+                                            new Object[] { oldValue });
+                                    out.writeStatement(setterStm);
+                                }
                             }
-                        } else {
-                            // commented since the process should be
-                            // continued even if no setter is found
-                            // throw new Exception("no setter for " +
-                            // pd.getName() + " property.");
-                            continue;
+                        } catch (Exception ex) {
+                            out.getExceptionListener().exceptionThrown(ex);
                         }
+                    } else {
+                        // commented since the process should be
+                        // continued even if no setter is found
+                        // throw new Exception("no setter for " +
+                        // pd.getName() + " property.");
+                        continue;
                     }
                 }
             }
-        } catch (RuntimeException e) {
-            throw e;
-        } catch (Exception e) {
-            out.getExceptionListener().exceptionThrown(e);
         }
     }
 
@@ -169,7 +204,7 @@
         if (oldInstance != null && constructorPropertyNames != null
                 && constructorPropertyNames.length > 0) {
 
-            //Get explicitly declared equals method.
+            // Get explicitly declared equals method.
             Method equalsMethod = null;
             try {
                 equalsMethod = oldInstance.getClass().getDeclaredMethod(
@@ -180,15 +215,15 @@
             }
 
             if (equalsMethod != null) {
-                    Object result;
-                    try {
-                        result = equalsMethod.invoke(oldInstance,
-                                new Object[] { newInstance });
-                    } catch (Exception e) {
-                        //should not happen here.
-                        throw new Error(e);
-                    }
-                    return ((Boolean) result).booleanValue();
+                Object result;
+                try {
+                    result = equalsMethod.invoke(oldInstance,
+                            new Object[] { newInstance });
+                } catch (Exception e) {
+                    // should not happen here.
+                    throw new Error(e);
+                }
+                return ((Boolean) result).booleanValue();
             }
         }
         return super.mutatesTo(oldInstance, newInstance);

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Encoder.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Encoder.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Encoder.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Encoder.java Thu Jul 12 01:17:23 2007
@@ -18,33 +18,47 @@
 package java.beans;
 
 import java.util.HashMap;
+import java.util.IdentityHashMap;
 import java.util.Vector;
 
 import org.apache.harmony.beans.DefaultPersistenceDelegatesFactory;
 import org.apache.harmony.beans.NullPersistenceDelegate;
 import org.apache.harmony.beans.ObjectNode;
-import org.apache.harmony.beans.internal.nls.Messages;
 
 public class Encoder {
 
-    private ExceptionListener exceptionListener = null;
+    private ExceptionListener exceptionListener = defaultExListener;
 
-    private final HashMap<Class<?>, PersistenceDelegate> persistenceDelegates = new HashMap<Class<?>, PersistenceDelegate>();
+    private static final ExceptionListener defaultExListener = new DefaultExceptionListener();
+
+    private static class DefaultExceptionListener implements ExceptionListener {
+
+        public void exceptionThrown(Exception exception) {
+            System.err.println("Exception during encoding:" + exception); //$NON-NLS-1$
+            System.err.println("Continue...");
+        }
+
+    }
+
+    private static final HashMap<Class<?>, PersistenceDelegate> persistenceDelegates = new HashMap<Class<?>, PersistenceDelegate>();
 
     Vector<Object> roots = new Vector<Object>();
 
-    HashMap<Object, ObjectNode> nodes = new HashMap<Object, ObjectNode>();
+    IdentityHashMap<Object, ObjectNode> nodes = new IdentityHashMap<Object, ObjectNode>();
+
+    private IdentityHashMap oldNewMap = new IdentityHashMap();
 
     public Encoder() {
         super();
     }
 
     public Object get(Object oldInstance) {
-        if (oldInstance == null) {
-            return null;
+        if (oldInstance == null || oldInstance instanceof String
+                || oldInstance == String.class) {
+            return oldInstance;
         }
 
-        return getValue(nodes.get(oldInstance));
+        return oldNewMap.get(oldInstance);
     }
 
     public Object remove(Object oldInstance) {
@@ -53,7 +67,8 @@
             return null;
         }
 
-        return getValue(nodes.remove(oldInstance));
+        getValue(nodes.remove(oldInstance));
+        return oldNewMap.remove(oldInstance);
     }
 
     public PersistenceDelegate getPersistenceDelegate(Class<?> type) {
@@ -77,6 +92,9 @@
 
     protected void writeObject(Object object) {
         roots.add(object);
+        if (object == null) {
+            return;
+        }
         doWriteObject(object);
     }
 
@@ -90,100 +108,98 @@
         }
 
         pd.writeObject(object, this);
+        if (isString(object.getClass())) {
+            nodes.put(object, new ObjectNode(pd.instantiate(object, this)));
+        }
     }
 
-    public void writeStatement(Statement oldStm) {
-        ObjectNode node = nodes.get(oldStm.getTarget());
+    private Object forceNew(Object old) {
+        if (old == null) {
+            return null;
+        }
+        Object nu = get(old);
+        if (nu != null) {
+            return nu;
+        }
+        writeObject(old);
+        return get(old);
+    }
 
-        if (node != null) {
-            try {
-                Statement statement;
-                Object[] oldArgs = oldStm.getArguments();
+    private Object[] forceNewArray(Object oldArray[]) {
+        if (oldArray == null) {
+            return null;
+        }
+        Object newArray[] = new Object[oldArray.length];
+        for (int i = 0; i < oldArray.length; i++) {
+            newArray[i] = forceNew(oldArray[i]);
+        }
+        return newArray;
+    }
 
-                // FIXME add target processing here
-                write(oldArgs);
-                statement = new Statement(node.getObjectValue(), oldStm
-                        .getMethodName(), oldArgs);
-                statement.execute();
-                node.addStatement(statement);
-            } catch (Exception e) {
-                getExceptionListener().exceptionThrown(e);
-            }
-        } else {
-            // FIXME incompatible with RI, default constructor should be
-            // called instead
-            System.out.println(Messages.getString(
-                    "beans.10", oldStm.getTarget())); //$NON-NLS-1$
+    public void writeStatement(Statement oldStm) {
+        if (oldStm == null) {
+            throw new NullPointerException();
         }
+        try {
+            // FIXME add target processing here
+            Object newTarget = forceNew(oldStm.getTarget());
+            Object newArgs[] = forceNewArray(oldStm.getArguments());
+            Statement statement = new Statement(newTarget, oldStm
+                    .getMethodName(), newArgs);
+            statement.execute();
+        } catch (Exception e) {
+            getExceptionListener().exceptionThrown(e);
+        }
+    }
+
+    private void put(Object old, Object nu) {
+        oldNewMap.put(old, nu);
     }
 
     public void writeExpression(Expression oldExp) {
+        if (oldExp == null) {
+            throw new NullPointerException();
+        }
         try {
             Object oldValue = oldExp.getValue();
-            Object oldTarget = oldExp.getTarget();
-
-            ObjectNode valueNode = null;
-            Class<?> valueType = null;
-
-            // write target
-            if (!Statement.isPDConstructor(oldExp)
-                    && !Statement.isStaticMethodCall(oldExp)) {
-                ObjectNode parent;
-
-                // XXX investigate
-                // write(oldTarget);
-                parent = nodes.get(oldTarget);
-                if (parent != null) {
-                    parent.addExpression(oldExp);
-                }
+            if (oldValue == null || get(oldValue) != null) {
+                return;
             }
 
-            // write value
+            // copy to newExp
+            Object newTarget = forceNew(oldExp.getTarget());
+            Object newArgs[] = forceNewArray(oldExp.getArguments());
+            Expression newExp = new Expression(newTarget, oldExp
+                    .getMethodName(), newArgs);
 
-            if (oldValue != null) {
-                valueType = oldValue.getClass();
-                valueNode = nodes.get(oldValue);
+            // execute newExp
+            Object newValue = null;
+            try {
+                newValue = newExp.getValue();
+            } catch (IndexOutOfBoundsException ex) {
+                // Current Container does not have any component, newVal set
+                // to null
             }
 
-            if (valueNode == null) {
+            // relate oldValue to newValue
+            put(oldValue, newValue);
 
-                if (isNull(valueType) || isPrimitive(valueType)
-                        || isString(valueType)) {
-                    valueNode = new ObjectNode(oldExp);
-                } else {
-                    write(oldExp.getArguments());
-                    valueNode = new ObjectNode(oldExp, nodes);
-                }
-
-                nodes.put(oldValue, valueNode);
-            } else if (oldExp.getMethodName().equals("new")) { //$NON-NLS-1$
-                valueNode.addReference();
-            } else {
-                // XXX the information about referencedExpressions is not
-                // being used by anyone
-                // node.addReferencedExpression(oldExp);
-            }
+            // force same state
+            writeObject(oldValue);
         } catch (Exception e) {
             // TODO - remove written args
-            e.printStackTrace();
             getExceptionListener().exceptionThrown(e);
         }
     }
 
     public void setExceptionListener(ExceptionListener exceptionListener) {
+        if (exceptionListener == null) {
+            exceptionListener = defaultExListener;
+        }
         this.exceptionListener = exceptionListener;
     }
 
     public ExceptionListener getExceptionListener() {
-        if (exceptionListener == null) {
-            exceptionListener = new ExceptionListener() {
-
-                public void exceptionThrown(Exception e) {
-                    System.out.println(e.getClass() + ": " + e.getMessage()); //$NON-NLS-1$
-                }
-            };
-        }
-
         return exceptionListener;
     }
 
@@ -204,7 +220,7 @@
         return node.getObjectValue();
     }
 
-    private Object[] write(Object[] oldInstances) throws Exception {
+    Object[] write(Object[] oldInstances) throws Exception {
         if (oldInstances != null) {
             Object[] newInstances = new Object[oldInstances.length];
 

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PersistenceDelegate.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/PersistenceDelegate.java Thu Jul 12 01:17:23 2007
@@ -68,9 +68,7 @@
         if (mutatesTo(oldInstance, newInstance)) {
             initialize(oldInstance.getClass(), oldInstance, newInstance, out);
         } else {
-            if (newInstance != null) {
-                out.remove(newInstance);
-            }
+        	out.remove(oldInstance);
 
             out.writeExpression(instantiate(oldInstance, out));
             newInstance = out.get(oldInstance);

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLEncoder.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLEncoder.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLEncoder.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLEncoder.java Thu Jul 12 01:17:23 2007
@@ -53,6 +53,71 @@
     public Object getOwner() {
         return owner;
     }
+    
+    @Override
+    public void writeExpression(Expression oldExp) {
+
+		Object oldValue = null;
+		try {
+			oldValue = oldExp.getValue();
+		} catch (Exception e) {
+			getExceptionListener()
+					.exceptionThrown(
+							new Exception("failed to execute expression: "
+									+ oldExp, e));
+			return;
+		}
+		
+		if (get(oldValue) != null) {
+			return;
+		}
+		
+		Object oldTarget = oldExp.getTarget();
+
+		ObjectNode valueNode = null;
+		Class<?> valueType = null;
+
+		// write target
+		if (!Statement.isPDConstructor(oldExp)
+				&& !Statement.isStaticMethodCall(oldExp)) {
+			ObjectNode parent;
+
+			// XXX investigate
+			// write(oldTarget);
+			parent = nodes.get(oldTarget);
+			if (parent != null) {
+				parent.addExpression(oldExp);
+			}
+		}
+
+		// write value
+		valueType = oldValue.getClass();
+		valueNode = nodes.get(oldValue);
+
+		if (valueNode == null) {
+
+			if (isNull(valueType) || isPrimitive(valueType)
+					|| isString(valueType)) {
+				valueNode = new ObjectNode(oldExp);
+			} else {
+				try {
+					write((Object[])oldExp.getArguments());
+				} catch (Exception e) {
+					getExceptionListener().exceptionThrown(e);
+				}
+				valueNode = new ObjectNode(oldExp, nodes);
+			}
+
+			nodes.put(oldValue, valueNode);
+		} else if (oldExp.getMethodName().equals("new")) { //$NON-NLS-1$
+			valueNode.addReference();
+		} else {
+			// XXX the information about referencedExpressions is not
+			// being used by anyone
+			// node.addReferencedExpression(oldExp);
+		}
+		super.writeExpression(oldExp);
+	}
 
     @Override
     public void writeStatement(Statement oldStm) {
@@ -97,9 +162,9 @@
             if (object != null) {
                 ObjectNode node = nodes.get(object);
 
-                printObjectTag(0, object, node);
+                printObjectTag(1, object, node);
             } else {
-                printNullTag(0);
+                printNullTag(1);
             }
         }
 
@@ -174,7 +239,8 @@
                         tag.addAttr("length", ((Integer) arguments[1]) //$NON-NLS-1$
                                 .toString());
                     } else {
-                        tag.addAttr("class", node.getObjectType().getName()); //$NON-NLS-1$
+                        tag.addAttr("class", ((Class)node.getInitializer().getTarget()).getName()); //$NON-NLS-1$
+                        tag.addAttr("method", node.getInitializer().getMethodName());
                     }
                 } catch (Exception e) {
                     getExceptionListener().exceptionThrown(e);
@@ -389,7 +455,7 @@
             String result = ""; //$NON-NLS-1$
 
             for (int i = 0; i < tabCount; ++i) {
-                result += '\t';
+                result += ' ';
             }
             result = result + s + "\n"; //$NON-NLS-1$
             out.write(result.getBytes("UTF-8")); //$NON-NLS-1$

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/DefaultPersistenceDelegatesFactory.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/DefaultPersistenceDelegatesFactory.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/DefaultPersistenceDelegatesFactory.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/DefaultPersistenceDelegatesFactory.java Thu Jul 12 01:17:23 2007
@@ -25,7 +25,8 @@
 
 public final class DefaultPersistenceDelegatesFactory {
 
-    private static Map<String, PersistenceDelegate> persistenceDelegates = new HashMap<String, PersistenceDelegate>();
+    private static final DefaultPersistenceDelegate DEFAULT_PERSISTENCE_DELEGATE = new DefaultPersistenceDelegate();
+	private static Map<String, PersistenceDelegate> persistenceDelegates = new HashMap<String, PersistenceDelegate>();
 
     private static PersistenceDelegate createPersistenceDelegate(Class<?> type) {
         if (type == null) {
@@ -53,7 +54,7 @@
             }
 
             if (pd == null) {
-                pd = new DefaultPersistenceDelegate();
+                pd = DEFAULT_PERSISTENCE_DELEGATE;
             }
         }
         return pd;

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/ObjectNode.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/ObjectNode.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/ObjectNode.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/ObjectNode.java Thu Jul 12 01:17:23 2007
@@ -19,7 +19,7 @@
 
 import java.beans.Expression;
 import java.beans.Statement;
-import java.util.HashMap;
+import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.Map;
@@ -51,7 +51,7 @@
         this.nodes = null;
     }
 
-    public ObjectNode(Expression initializer, HashMap<Object, ObjectNode> nodes) {
+    public ObjectNode(Expression initializer, IdentityHashMap<Object, ObjectNode> nodes) {
         this.initializer = initializer;
         this.nodes = nodes;
     }

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_BooleanPersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_BooleanPersistenceDelegate.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_BooleanPersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_BooleanPersistenceDelegate.java Thu Jul 12 01:17:23 2007
@@ -27,7 +27,7 @@
     protected Expression instantiate(Object oldInstance, Encoder out) {
         boolean value = ((Boolean) oldInstance).booleanValue();
         return new Expression(oldInstance, Boolean.class, "new", //$NON-NLS-1$
-                new Object[] { Boolean.valueOf(value) });
+                new Object[] { Boolean.valueOf(value).toString() });
     }
 
     @Override

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_BytePersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_BytePersistenceDelegate.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_BytePersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_BytePersistenceDelegate.java Thu Jul 12 01:17:23 2007
@@ -26,7 +26,7 @@
     protected Expression instantiate(Object oldInstance, Encoder out) {
         Byte value = (Byte) oldInstance;
         return new Expression(oldInstance, Byte.class, "new", //$NON-NLS-1$
-                new Object[] { value });
+                new Object[] { value.toString() });
     }
 
     @Override

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_CharacterPersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_CharacterPersistenceDelegate.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_CharacterPersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_CharacterPersistenceDelegate.java Thu Jul 12 01:17:23 2007
@@ -25,9 +25,8 @@
 
     @Override
     protected Expression instantiate(Object oldInstance, Encoder out) {
-        Character value = (Character) oldInstance;
-        return new Expression(oldInstance, Character.class, "new", //$NON-NLS-1$
-                new Object[] { value });
+        return new Expression(oldInstance, oldInstance.toString(),
+                "charAt", new Object[] { new Integer(0) });
     }
 
     @Override

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ClassPersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ClassPersistenceDelegate.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ClassPersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ClassPersistenceDelegate.java Thu Jul 12 01:17:23 2007
@@ -29,6 +29,13 @@
         Field fld = null;
         final String TYPE = "TYPE"; //$NON-NLS-1$
         Expression result;
+        /*
+         * Special treatment to String.class to prevent endless loop of
+         * instantiation.
+         */
+        if (value == String.class) {
+            return new Expression(value, "", "getClass", null);  //$NON-NLS-1$//$NON-NLS-2$
+        }
         try {
             if (value.equals(Integer.TYPE)) {
                 fld = Integer.class.getField(TYPE);
@@ -56,7 +63,7 @@
             // we have primitive type
             result = new Expression(oldInstance, fld, "get", new Object[] { null }); //$NON-NLS-1$
         } else {
-            result = new Expression(oldInstance, Class.class, "forName", //$NON-NLS-1$ 
+            result = new Expression(oldInstance, String.class, "forName", //$NON-NLS-1$ 
                     new Object[] { value.getName() });
         }
         return result;

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_DoublePersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_DoublePersistenceDelegate.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_DoublePersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_DoublePersistenceDelegate.java Thu Jul 12 01:17:23 2007
@@ -25,7 +25,7 @@
     @Override
     protected Expression instantiate(Object oldInstance, Encoder out) {
         Double value = (Double) oldInstance;
-        return new Expression(oldInstance, Double.class, "new", new Object[] { value }); //$NON-NLS-1$
+        return new Expression(oldInstance, Double.class, "new", new Object[] { value.toString() }); //$NON-NLS-1$
     }
 
     @Override

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_FloatPersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_FloatPersistenceDelegate.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_FloatPersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_FloatPersistenceDelegate.java Thu Jul 12 01:17:23 2007
@@ -25,7 +25,7 @@
     @Override
     protected Expression instantiate(Object oldInstance, Encoder out) {
         Float value = (Float) oldInstance;
-        return new Expression(oldInstance, Float.class, "new", new Object[] { value }); //$NON-NLS-1$
+        return new Expression(oldInstance, Float.class, "new", new Object[] { value.toString() }); //$NON-NLS-1$
     }
 
     @Override

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_IntegerPersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_IntegerPersistenceDelegate.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_IntegerPersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_IntegerPersistenceDelegate.java Thu Jul 12 01:17:23 2007
@@ -25,10 +25,21 @@
     @Override
     protected Expression instantiate(Object oldInstance, Encoder out) {
         Integer value = (Integer) oldInstance;
-        return new Expression(oldInstance, Integer.class, "new", new Object[] { value }); //$NON-NLS-1$
+        return new Expression(oldInstance, Integer.class,
+				"new", new Object[] { value.toString() }); //$NON-NLS-1$
     }
 
     @Override
     protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out) {
+    }
+    
+    /*
+     * Two Integer objects are regarded mutatable if they are equal.
+     */
+    protected boolean mutatesTo(Object o1, Object o2) {
+        if (null == o2) {
+            return false;
+        }
+        return o1.equals(o2);
     }
 }

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_LongPersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_LongPersistenceDelegate.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_LongPersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_LongPersistenceDelegate.java Thu Jul 12 01:17:23 2007
@@ -25,7 +25,7 @@
     @Override
     protected Expression instantiate(Object oldInstance, Encoder out) {
         Long value = (Long) oldInstance;
-        return new Expression(oldInstance, Long.class, "new", new Object[] { value }); //$NON-NLS-1$
+        return new Expression(oldInstance, Long.class, "new", new Object[] { value.toString() }); //$NON-NLS-1$
     }
 
     @Override

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ShortPersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ShortPersistenceDelegate.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ShortPersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_ShortPersistenceDelegate.java Thu Jul 12 01:17:23 2007
@@ -25,7 +25,7 @@
     @Override
     protected Expression instantiate(Object oldInstance, Encoder out) {
         Short value = (Short) oldInstance;
-        return new Expression(oldInstance, Short.class, "new", new Object[] { value }); //$NON-NLS-1$
+        return new Expression(oldInstance, Short.class, "new", new Object[] { value.toString() }); //$NON-NLS-1$
     }
 
     @Override

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_reflect_FieldPersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_reflect_FieldPersistenceDelegate.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_reflect_FieldPersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_reflect_FieldPersistenceDelegate.java Thu Jul 12 01:17:23 2007
@@ -32,7 +32,7 @@
         assert oldInstance instanceof Field : oldInstance;
         Field oldField = (Field) oldInstance;
         Class<?> declClass = oldField.getDeclaringClass();
-        return new Expression(oldField, declClass, "getDeclaredField", //$NON-NLS-1$
+        return new Expression(oldField, declClass, "getField", //$NON-NLS-1$
                 new Object[] { oldField.getName() });
     }
 

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_reflect_ProxyPersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_reflect_ProxyPersistenceDelegate.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_reflect_ProxyPersistenceDelegate.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/org/apache/harmony/beans/java_lang_reflect_ProxyPersistenceDelegate.java Thu Jul 12 01:17:23 2007
@@ -17,13 +17,13 @@
 
 package org.apache.harmony.beans;
 
+import java.beans.DefaultPersistenceDelegate;
 import java.beans.Encoder;
 import java.beans.Expression;
-import java.beans.PersistenceDelegate;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Proxy;
 
-public class java_lang_reflect_ProxyPersistenceDelegate extends PersistenceDelegate {
+public class java_lang_reflect_ProxyPersistenceDelegate extends DefaultPersistenceDelegate {
     @Override
     protected Expression instantiate(Object oldInstance, Encoder out) {
         assert oldInstance instanceof Proxy : oldInstance;
@@ -39,11 +39,13 @@
         assert oldInstance instanceof Proxy : oldInstance;
         assert newInstance instanceof Proxy : newInstance;
         assert newInstance == oldInstance;
+        super.initialize(type, oldInstance, newInstance, out);
     }
 
     @Override
     protected boolean mutatesTo(Object oldInstance, Object newInstance) {
         assert oldInstance instanceof Proxy : oldInstance;
-        return oldInstance == newInstance;
+        assert oldInstance == newInstance;
+        return super.mutatesTo(oldInstance, newInstance);
     }
 }

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/EncoderTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/EncoderTest.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/EncoderTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/EncoderTest.java Thu Jul 12 01:17:23 2007
@@ -381,7 +381,7 @@
         Encoder enc = new Encoder();
         PersistenceDelegate pd = enc
                 .getPersistenceDelegate(MockFooLiYang.class);
-        assertTrue(pd instanceof VerbosePD);
+        assertTrue(pd instanceof DefaultPersistenceDelegate);
     }
 
     public void testGetPersistenceDelegate_Default() {

Modified: harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/PersistenceDelegateTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/PersistenceDelegateTest.java?view=diff&rev=555527&r1=555526&r2=555527
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/PersistenceDelegateTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/PersistenceDelegateTest.java Thu Jul 12 01:17:23 2007
@@ -30,7 +30,14 @@
 import org.apache.harmony.beans.tests.support.mock.MockFoo;
 import org.apache.harmony.beans.tests.support.mock.MockFooStop;
 
-
+import java.beans.XMLEncoder;
+import java.beans.XMLDecoder;
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.lang.reflect.Field;
 /**
  * Test java.beans.PersistenceDelegate
  */
@@ -206,7 +213,45 @@
         assertFalse(pd.mutatesTo(null, "test"));
     }
 
-    
+    public void test_writeObject_Null_LXMLEncoder() throws Exception{
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(byteArrayOutputStream));
+        encoder.writeObject(null);
+        encoder.close();
+
+        DataInputStream stream = new DataInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
+        XMLDecoder decoder = new XMLDecoder(stream);
+        assertNull(decoder.readObject());
+        stream = new DataInputStream(PersistenceDelegateTest.class.getResourceAsStream("/xml/null.xml"));
+        decoder = new XMLDecoder(stream);
+        assertNull(decoder.readObject());
+    }
+
+    class Bar {
+        public int value;
+        public void barTalk() {
+            System.out.println("Bar is coming!");
+        }
+    }
+    public void test_writeObject_java_lang_reflect_Field()
+			throws SecurityException, NoSuchFieldException, IOException {
+		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+		XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(
+				byteArrayOutputStream));
+		Field value = Bar.class.getField("value");
+		encoder.writeObject(value);
+		encoder.close();
+
+		DataInputStream stream = new DataInputStream(new ByteArrayInputStream(
+				byteArrayOutputStream.toByteArray()));
+		
+		XMLDecoder decoder = new XMLDecoder(stream); Field field = (Field)
+		decoder.readObject();
+
+        assertEquals(value, field);
+		assertEquals(value.getName(), field.getName());
+	}
+
     // <--
 
     private void assertWasAdded(Class<?> targetClass, String methodName,