You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2013/11/12 21:38:21 UTC

svn commit: r1541222 - /cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/staxutils/OverlayW3CDOMStreamWriter.java

Author: dkulp
Date: Tue Nov 12 20:38:20 2013
New Revision: 1541222

URL: http://svn.apache.org/r1541222
Log:
Merged revisions 1541220 via  git cherry-pick from
https://svn.apache.org/repos/asf/cxf/trunk

........
  r1541220 | dkulp | 2013-11-12 15:36:20 -0500 (Tue, 12 Nov 2013) | 2 lines

  [CXF-5381] Fix problems detecting overlays when elements of same name are stuck in an overlay element.

........

Modified:
    cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/staxutils/OverlayW3CDOMStreamWriter.java

Modified: cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/staxutils/OverlayW3CDOMStreamWriter.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/staxutils/OverlayW3CDOMStreamWriter.java?rev=1541222&r1=1541221&r2=1541222&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/staxutils/OverlayW3CDOMStreamWriter.java (original)
+++ cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/staxutils/OverlayW3CDOMStreamWriter.java Tue Nov 12 20:38:20 2013
@@ -51,9 +51,33 @@ public class OverlayW3CDOMStreamWriter e
     public OverlayW3CDOMStreamWriter(Document doc, Element e) {
         super(doc, e);
     }
-    
+
+    @Override
+    protected void createAndAddElement(String prefix, String local, String namespace) {
+        super.createAndAddElement(prefix, local, namespace);
+        if (isOverlaid) {
+            try {
+                //mark this as new so we don't consider this for overlaying
+                getCurrentNode().setUserData("new", "new", null);
+            } catch (Throwable t) {
+                //ignore
+            }
+        }
+    }
+
     @Override
     public void writeEndElement() throws XMLStreamException {
+        if (isOverlaid) {
+            Node nd = getCurrentNode().getFirstChild();
+            while (nd != null) {
+                try {
+                    getCurrentNode().setUserData("new", null, null);
+                } catch (Throwable t) {
+                    //ignore
+                }
+                nd = nd.getNextSibling();
+            }
+        }
         isOverlaid = isOverlaidStack.remove(0);
         super.writeEndElement();
     }
@@ -68,18 +92,29 @@ public class OverlayW3CDOMStreamWriter e
                 nd2 = nd.getFirstChild();
             }
             while (nd2 != null) {
+                Object userData = null;
+                try {
+                    userData = nd2.getUserData("new");
+                } catch (Throwable t) {
+                    //ignore - non DOM level 3
+                }
                 if (nd2.getNodeType() == Node.ELEMENT_NODE 
                     && local.equals(nd2.getLocalName())
-                    && StringUtils.isEmpty(nd2.getNamespaceURI())) {
+                    && StringUtils.isEmpty(nd2.getNamespaceURI())
+                    && userData != null) {
                     adjustOverlaidNode(nd2, null);
                     setChild((Element)nd2, false);
+                    if (nd2.getFirstChild() == null) {
+                        //optimize a case where we KNOW anything added cannot be an overlay
+                        isOverlaid = false;
+                    }
                     return;
                 }
                 nd2 = nd2.getNextSibling();
             }
         }
-        isOverlaid = false;
         super.writeStartElement(local);
+        isOverlaid = false;
     }
 
     protected void adjustOverlaidNode(Node nd2, String pfx) {
@@ -96,18 +131,29 @@ public class OverlayW3CDOMStreamWriter e
                 nd2 = nd.getFirstChild();
             }
             while (nd2 != null) {
+                Object userData = null;
+                try {
+                    userData = nd2.getUserData("new");
+                } catch (Throwable t) {
+                    //ignore - non DOM level 3
+                }
                 if (nd2.getNodeType() == Node.ELEMENT_NODE 
                     && local.equals(nd2.getLocalName())
-                    && namespace.equals(nd2.getNamespaceURI())) {
+                    && namespace.equals(nd2.getNamespaceURI())
+                    && userData == null) {
                     adjustOverlaidNode(nd2, "");
                     setChild((Element)nd2, false);
+                    if (nd2.getFirstChild() == null) {
+                        //optimize a case where we KNOW anything added cannot be an overlay
+                        isOverlaid = false;
+                    }
                     return;
                 }
                 nd2 = nd2.getNextSibling();
             }
         }
-        isOverlaid = false;
         super.writeStartElement(namespace, local);
+        isOverlaid = false;
     }
 
     public void writeStartElement(String prefix, String local, String namespace) throws XMLStreamException {
@@ -116,7 +162,6 @@ public class OverlayW3CDOMStreamWriter e
         } else {
             isOverlaidStack.add(0, isOverlaid);
             if (isOverlaid) {
-    
                 Element nd = getCurrentNode();
                 Node nd2 = null;
                 if (nd == null) {
@@ -126,18 +171,30 @@ public class OverlayW3CDOMStreamWriter e
                 }
                 
                 while (nd2 != null) {
+                    Object userData = null;
+                    try {
+                        userData = nd2.getUserData("new");
+                    } catch (Throwable t) {
+                        //ignore - non DOM level 3
+                    }
+
                     if (nd2.getNodeType() == Node.ELEMENT_NODE 
                         && local.equals(nd2.getLocalName())
-                        && namespace.equals(nd2.getNamespaceURI())) {
+                        && namespace.equals(nd2.getNamespaceURI())
+                        && userData == null) {
                         adjustOverlaidNode(nd2, prefix);
                         setChild((Element)nd2, false);
+                        if (nd2.getFirstChild() == null) {
+                            //optimize a case where we KNOW anything added cannot be an overlay
+                            isOverlaid = false;
+                        }
                         return;
                     }
                     nd2 = nd2.getNextSibling();
                 }
             }
-            isOverlaid = false;
             super.writeStartElement(prefix, local, namespace);
+            isOverlaid = false;
         }
     }