[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [cp-patches] FYI: XMLEncoder - less dependencies & bugfix
From: |
Robert Schuster |
Subject: |
Re: [cp-patches] FYI: XMLEncoder - less dependencies & bugfix |
Date: |
Tue, 24 Jan 2006 19:18:54 +0100 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.12) Gecko/20051208 |
Hi,
the changelog was missing the info about the changes in
DefaultPersistenceDelegate.
Fixed that.
2006-01-24 Robert Schuster <address@hidden>
* java/beans/XMLEncoder.java:
(writeExpression): Added early return (fixes PR #25941).
* java/beans/Encoder: Removed unused imports.
(setupDefaultPersistenceDelegates): Removed unneccessary
PersistenceDelegates for subclasses.
* java/beans/PersistenceDelegate:
(initialize): Use local variable as first argument as it was
intended once.
* java/beans/DefaultPersistenceDelegate:
(initialize): Added call to superclass' implementation, added
early return.
Robert Schuster wrote:
> Hi,
> I spend some time finding out how the JDK makes it possible that a
> PersistenceDelegate registered for AbstractMap is used for all its subclasses.
>
> The funny thing is that the whole behavior depends on three places. Two of
> them
> were implemented already because they are part of the spec. The final
> component
> consists only of one line (calling super.inititialize() in
> DefaultPersistenceDelegate.initialize()).
>
> Along the lines I found out that the XMLEncoder gets into an endless recursion
> when it serializes a class which is not public. The problem is not specific to
> this case the recursion would happen in any when an exception occurs during
> the
> Expression.getValue() call. A simple early "return" fixes that. I have to
> admit
> that the wrong behavior slipped in when I copied most of
> Encoder.writeExpression's code into XMLEncoder.writeExpression. Anyway this
> fixes PR #25941 .
>
> The ChangeLog entry:
>
> 2006-01-24 Robert Schuster <address@hidden>
>
> * java/beans/XMLEncoder.java:
> (writeExpression): Added early return (fixes PR #25941).
> * java/beans/Encoder: Removed unused imports.
> (setupDefaultPersistenceDelegates): Removed unneccessary
> PersistenceDelegates for subclasses.
> * java/beans/PersistenceDelegate:
> (initialize): Use local variable as first argument as it was
> intended once.
>
>
>
> ------------------------------------------------------------------------
>
> Index: java/beans/DefaultPersistenceDelegate.java
> ===================================================================
> RCS file:
> /cvsroot/classpath/classpath/java/beans/DefaultPersistenceDelegate.java,v
> retrieving revision 1.1
> diff -u -r1.1 DefaultPersistenceDelegate.java
> --- java/beans/DefaultPersistenceDelegate.java 8 Jan 2006 19:31:38
> -0000 1.1
> +++ java/beans/DefaultPersistenceDelegate.java 24 Jan 2006 16:42:17
> -0000
> @@ -157,6 +157,23 @@
> protected void initialize(Class type, Object oldInstance, Object
> newInstance,
> Encoder out)
> {
> + // Calling the supertype's implementation of initialize makes it
> + // possible that descendants of classes like AbstractHashMap
> + // or Hashtable are serialized correctly. This mechanism grounds on
> + // two other facts:
> + // * Each class which has not registered a special purpose
> + // PersistenceDelegate is handled by a DefaultPersistenceDelegate
> + // instance.
> + // * PersistenceDelegate.initialize() is implemented in a way that it
> + // calls the initialize method of the superclass' persistence delegate.
> + super.initialize(type, oldInstance, newInstance, out);
> +
> + // Suppresses the writing of property setting statements when this
> delegate
> + // is not used for the exact instance type. By doing so the following
> code
> + // is called only once per object.
> + if (type != oldInstance.getClass())
> + return;
> +
> try
> {
> PropertyDescriptor[] propertyDescs = Introspector.getBeanInfo(
> Index: java/beans/Encoder.java
> ===================================================================
> RCS file: /cvsroot/classpath/classpath/java/beans/Encoder.java,v
> retrieving revision 1.1
> diff -u -r1.1 Encoder.java
> --- java/beans/Encoder.java 8 Jan 2006 19:31:38 -0000 1.1
> +++ java/beans/Encoder.java 24 Jan 2006 16:42:17 -0000
> @@ -44,15 +44,9 @@
> import gnu.java.beans.encoder.MapPersistenceDelegate;
> import gnu.java.beans.encoder.PrimitivePersistenceDelegate;
>
> -import java.util.ArrayList;
> +import java.util.AbstractCollection;
> import java.util.HashMap;
> -import java.util.HashSet;
> import java.util.IdentityHashMap;
> -import java.util.LinkedHashSet;
> -import java.util.LinkedList;
> -import java.util.TreeMap;
> -import java.util.TreeSet;
> -import java.util.Vector;
>
> /**
> * @author Robert Schuster (address@hidden)
> @@ -123,31 +117,11 @@
> delegates.put(Object[].class, new ArrayPersistenceDelegate());
>
> pd = new CollectionPersistenceDelegate();
> - delegates.put(ArrayList.class, pd);
> - delegates.put(LinkedList.class, pd);
> - delegates.put(Vector.class, pd);
> - delegates.put(HashSet.class, pd);
> - delegates.put(LinkedHashSet.class, pd);
> - delegates.put(TreeSet.class, pd);
> + delegates.put(AbstractCollection.class, pd);
>
> pd = new MapPersistenceDelegate();
> - delegates.put(HashMap.class, pd);
> - delegates.put(TreeMap.class, pd);
> + delegates.put(java.util.AbstractMap.class, pd);
> delegates.put(java.util.Hashtable.class, pd);
> - delegates.put(java.util.IdentityHashMap.class, pd);
> -
> - delegates.put(java.util.LinkedHashMap.class, pd);
> - delegates.put(java.util.Properties.class, pd);
> -
> - delegates.put(java.awt.RenderingHints.class, pd);
> - delegates.put(java.util.WeakHashMap.class, pd);
> - delegates.put(javax.swing.UIDefaults.class, pd);
> -
> - // TODO: These classes need to be implemented first
> - //delegates.put(java.security.AuthProvider.class, pd);
> - //delegates.put(java.util.concurrent.ConcurrentHashMap.class, pd);
> - //delegates.put(java.util.EnumMap.class, pd);
> - //delegates.put(javax.management.openmbean.TabularDataSupport.class,
> pd);
>
> defaultPersistenceDelegate = new DefaultPersistenceDelegate();
> delegates.put(Object.class, defaultPersistenceDelegate);
> @@ -199,7 +173,6 @@
> public void exceptionThrown(Exception e)
> {
> System.err.println("exception thrown: " + e);
> - e.printStackTrace();
> }
> };
> }
> Index: java/beans/PersistenceDelegate.java
> ===================================================================
> RCS file: /cvsroot/classpath/classpath/java/beans/PersistenceDelegate.java,v
> retrieving revision 1.1
> diff -u -r1.1 PersistenceDelegate.java
> --- java/beans/PersistenceDelegate.java 8 Jan 2006 19:31:38 -0000
> 1.1
> +++ java/beans/PersistenceDelegate.java 24 Jan 2006 16:42:17 -0000
> @@ -59,9 +59,8 @@
> {
> type = type.getSuperclass();
>
> - PersistenceDelegate pd = out.getPersistenceDelegate(
> - oldInstance.getClass().getSuperclass());
> -
> + PersistenceDelegate pd = out.getPersistenceDelegate(type);
> +
> pd.initialize(type, oldInstance, newInstance, out);
> }
> }
> Index: java/beans/XMLEncoder.java
> ===================================================================
> RCS file: /cvsroot/classpath/classpath/java/beans/XMLEncoder.java,v
> retrieving revision 1.1
> diff -u -r1.1 XMLEncoder.java
> --- java/beans/XMLEncoder.java 8 Jan 2006 19:31:38 -0000 1.1
> +++ java/beans/XMLEncoder.java 24 Jan 2006 16:42:17 -0000
> @@ -168,6 +168,8 @@
> // an erroneous state to the ScanEngine without behaving
> different
> // to the JDK.
> scanEngine.revoke();
> +
> + return;
> }
>
> writeObject(value);
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Classpath-patches mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/classpath-patches
signature.asc
Description: OpenPGP digital signature