You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by mr...@apache.org on 2008/09/15 19:40:05 UTC

svn commit: r695559 - /xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java

Author: mrglavas
Date: Mon Sep 15 10:40:05 2008
New Revision: 695559

URL: http://svn.apache.org/viewvc?rev=695559&view=rev
Log:
JIRA Issue #1298:
http://issues.apache.org/jira/browse/XERCESJ-1298

Store user data in a WeakHashMap to allow it and the node associated with it
to be garbage collected if no other references exist for the node. Thanks to
Ludger Bünger for the patch. I made a few modifications and added readObject(),
writeObject() methods to preserve object serialization compatibility with
previous versions of Xerces.

Modified:
    xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java

Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java?rev=695559&r1=695558&r2=695559&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/dom/CoreDocumentImpl.java Mon Sep 15 10:40:05 2008
@@ -17,9 +17,15 @@
 
 package org.apache.xerces.dom;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.lang.reflect.Constructor;
 import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.Map;
+import java.util.WeakHashMap;
+
 import org.apache.xerces.util.URI;
 
 import org.w3c.dom.DOMConfiguration;
@@ -124,10 +130,8 @@
     /**Experimental DOM Level 3 feature: documentURI */
     protected String fDocumentURI;
 
-	//Revisit :: change to a better data structure.
     /** Table for user data attached to this document nodes. */
-    protected Hashtable userData;
-
+    protected Map userData;
 
     /** Identifiers. */
     protected Hashtable identifiers;
@@ -1765,26 +1769,28 @@
         
         // Return null if the source is null
         
-        if (source == null ) {
+        if (source == null) {
         	return null;
-        } else if (source != null && source.getOwnerDocument() != null) {
+        } 
+        else if (source != null && source.getOwnerDocument() != null) {
 
             DOMImplementation thisImpl = this.getImplementation();
             DOMImplementation otherImpl = source.getOwnerDocument().getImplementation();
             
             // when the source node comes from a different implementation.
             if (thisImpl != otherImpl) {
-            
-                // Adopting from a DefferedDOM to DOM
+                // Adopting from a deferred DOM to a non-deferred DOM
                 if (thisImpl instanceof org.apache.xerces.dom.DOMImplementationImpl &&
                         otherImpl instanceof org.apache.xerces.dom.DeferredDOMImplementationImpl) {
-                    // traverse the DOM and expand deffered nodes and then allow adoption
+                    // traverse the DOM and expand deferred nodes and then allow adoption
                     undeferChildren (node);
-                } else if ( thisImpl instanceof org.apache.xerces.dom.DeferredDOMImplementationImpl
+                } 
+                else if ( thisImpl instanceof org.apache.xerces.dom.DeferredDOMImplementationImpl
                         && otherImpl instanceof org.apache.xerces.dom.DOMImplementationImpl) {
-                    // Adopting from a DOM into a DefferedDOM, this should be okay
-                } else {
-                    // Adopting between two dissimilar DOM's is not allowed
+                    // Adopting from a non-deferred DOM into a deferred DOM, this should be okay
+                } 
+                else {
+                    // Adopting between two dissimilar DOMs is not allowed
                     return null;  
                 }
         	}
@@ -2332,7 +2338,7 @@
         else {
             Hashtable t;
             if (userData == null) {
-                userData = new Hashtable();
+                userData = new WeakHashMap();
                 t = new Hashtable();
                 userData.put(n, t);
             }
@@ -2408,8 +2414,9 @@
      * @param data The user data table.
      */
     void setUserDataTable(Node n, Hashtable data) {
-		if (userData == null)
-			userData = new Hashtable();
+        if (userData == null) {
+            userData = new WeakHashMap();
+        }
         if (data != null) {
             userData.put(n, data);
         }
@@ -2754,5 +2761,37 @@
      */
     void renamedElement(Element oldEl, Element newEl) {
     }
+    
+    /**
+     * Serialized form of user data is a Hashtable. 
+     * Convert it into a WeakHashMap on load.
+     */
+    private void readObject(ObjectInputStream in)
+        throws IOException, ClassNotFoundException {
+        in.defaultReadObject();
+        if (userData != null) {
+            userData = new WeakHashMap(userData);
+        }
+    }
+    
+    /**
+     * To allow DOM trees serialized by newer versions of Xerces
+     * to be read by older versions briefly move the user data
+     * into a Hashtable.
+     */
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        final Map oldUserData = this.userData;
+        try {
+            if (oldUserData != null) {
+                this.userData = new Hashtable(oldUserData);
+            } 
+            out.defaultWriteObject();
+        }
+        // If the write fails for some reason ensure 
+        // that we restore the original object.
+        finally {
+            this.userData = oldUserData;
+        }
+    }
 
 } // class CoreDocumentImpl



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org