You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2016/02/08 21:16:17 UTC

svn commit: r1729243 - in /webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push: NamespaceContextPreservationFilterHandler.java NamespaceHelper.java SerializerImpl.java

Author: veithen
Date: Mon Feb  8 20:16:17 2016
New Revision: 1729243

URL: http://svn.apache.org/viewvc?rev=1729243&view=rev
Log:
Extract the namespace preservation logic from SerializerImpl.

Added:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/NamespaceContextPreservationFilterHandler.java   (with props)
Modified:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/NamespaceHelper.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java

Added: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/NamespaceContextPreservationFilterHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/NamespaceContextPreservationFilterHandler.java?rev=1729243&view=auto
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/NamespaceContextPreservationFilterHandler.java (added)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/NamespaceContextPreservationFilterHandler.java Mon Feb  8 20:16:17 2016
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.om.impl.common.serializer.push;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.apache.axiom.om.OMContainer;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMNamespace;
+import org.apache.axiom.om.impl.stream.StreamException;
+import org.apache.axiom.om.impl.stream.XmlHandler;
+import org.apache.axiom.om.impl.stream.XmlHandlerWrapper;
+
+public final class NamespaceContextPreservationFilterHandler extends XmlHandlerWrapper {
+    private final OMElement contextElement;
+    // Maintain a set of the prefixes we have already seen. This is required to take into
+    // account that a namespace mapping declared on an element can hide another one declared
+    // for the same prefix on an ancestor of the element.
+    private Set<String> prefixesAlreadyBound;
+    private boolean done = false;
+    
+    public NamespaceContextPreservationFilterHandler(XmlHandler parent, OMElement contextElement) {
+        super(parent);
+        this.contextElement = contextElement;
+    }
+
+    @Override
+    public void startElement(String namespaceURI, String localName, String prefix) throws StreamException {
+        super.startElement(namespaceURI, localName, prefix);
+        if (!done) {
+            prefixesAlreadyBound = new HashSet<String>();
+        }
+    }
+
+    @Override
+    public void processNamespaceDeclaration(String prefix, String namespaceURI) throws StreamException {
+        super.processNamespaceDeclaration(prefix, namespaceURI);
+        if (!done) {
+            prefixesAlreadyBound.add(prefix);
+        }
+    }
+
+    @Override
+    public void attributesCompleted() throws StreamException {
+        if (!done) {
+            OMElement current = contextElement;
+            while (true) {
+                for (Iterator<OMNamespace> it = current.getAllDeclaredNamespaces(); it.hasNext(); ) {
+                    OMNamespace ns = it.next();
+                    if (prefixesAlreadyBound.add(ns.getPrefix())) {
+                        super.processNamespaceDeclaration(ns.getPrefix(), ns.getNamespaceURI());
+                    }
+                }
+                OMContainer parent = current.getParent();
+                if (!(parent instanceof OMElement)) {
+                    break;
+                }
+                current = (OMElement)parent;
+            }
+            prefixesAlreadyBound = null;
+            done = true;
+        }
+        super.attributesCompleted();
+    }
+}

Propchange: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/NamespaceContextPreservationFilterHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/NamespaceHelper.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/NamespaceHelper.java?rev=1729243&r1=1729242&r2=1729243&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/NamespaceHelper.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/NamespaceHelper.java Mon Feb  8 20:16:17 2016
@@ -21,6 +21,7 @@ package org.apache.axiom.om.impl.common.
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.impl.stream.StreamException;
+import org.apache.axiom.om.impl.stream.XmlHandler;
 import org.apache.axiom.om.impl.stream.XmlHandlerWrapper;
 
 final class NamespaceHelper extends XmlHandlerWrapper {
@@ -30,8 +31,8 @@ final class NamespaceHelper extends XmlH
     private final SerializerImpl serializer;
     private final OMElement contextElement;
 
-    NamespaceHelper(SerializerImpl serializer, OMElement contextElement) {
-        super(serializer);
+    NamespaceHelper(SerializerImpl serializer, XmlHandler handler, OMElement contextElement) {
+        super(handler);
         this.serializer = serializer;
         this.contextElement = contextElement;
     }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java?rev=1729243&r1=1729242&r2=1729243&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java Mon Feb  8 20:16:17 2016
@@ -18,9 +18,7 @@
  */
 package org.apache.axiom.om.impl.common.serializer.push;
 
-import java.util.HashSet;
 import java.util.Iterator;
-import java.util.Set;
 
 import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamException;
@@ -45,9 +43,7 @@ import org.apache.axiom.om.impl.stream.S
 import org.apache.axiom.om.impl.stream.XmlHandler;
 
 public abstract class SerializerImpl implements Serializer {
-    private final OMSerializable root;
     private final XmlHandler handler;
-    private final boolean preserveNamespaceContext;
     
     /**
      * Constructor.
@@ -63,7 +59,6 @@ public abstract class SerializerImpl imp
      *            should be strictly preserved in the output
      */
     public SerializerImpl(OMSerializable root, boolean namespaceRepairing, boolean preserveNamespaceContext) {
-        this.root = root;
         OMElement contextElement;
         if (root instanceof OMNode) {
             OMContainer parent = ((OMNode)root).getParent();
@@ -75,8 +70,14 @@ public abstract class SerializerImpl imp
         } else {
             contextElement = null;
         }
-        handler = namespaceRepairing ? new NamespaceHelper(this, contextElement) : this;
-        this.preserveNamespaceContext = preserveNamespaceContext;
+        XmlHandler handler = this;
+        if (preserveNamespaceContext && contextElement != null) {
+            handler = new NamespaceContextPreservationFilterHandler(handler, contextElement);
+        }
+        if (namespaceRepairing) {
+            handler = new NamespaceHelper(this, handler, contextElement);
+        }
+        this.handler = handler;
     }
 
     public final void serializeStartpart(OMElement element) throws StreamException {
@@ -86,30 +87,9 @@ public abstract class SerializerImpl imp
         } else {
             handler.startElement(ns.getNamespaceURI(), element.getLocalName(), ns.getPrefix());
         }
-        if (preserveNamespaceContext && element == root) {
-            // Maintain a set of the prefixes we have already seen. This is required to take into
-            // account that a namespace mapping declared on an element can hide another one declared
-            // for the same prefix on an ancestor of the element.
-            Set<String> seenPrefixes = new HashSet<String>();
-            OMElement current = element;
-            while (true) {
-                for (Iterator<OMNamespace> it = current.getAllDeclaredNamespaces(); it.hasNext(); ) {
-                    ns = it.next();
-                    if (seenPrefixes.add(ns.getPrefix())) {
-                        handler.processNamespaceDeclaration(ns.getPrefix(), ns.getNamespaceURI());
-                    }
-                }
-                OMContainer parent = current.getParent();
-                if (!(parent instanceof OMElement)) {
-                    break;
-                }
-                current = (OMElement)parent;
-            }
-        } else {
-            for (Iterator<OMNamespace> it = element.getAllDeclaredNamespaces(); it.hasNext(); ) {
-                ns = it.next();
-                handler.processNamespaceDeclaration(ns.getPrefix(), ns.getNamespaceURI());
-            }
+        for (Iterator<OMNamespace> it = element.getAllDeclaredNamespaces(); it.hasNext(); ) {
+            ns = it.next();
+            handler.processNamespaceDeclaration(ns.getPrefix(), ns.getNamespaceURI());
         }
         for (Iterator<OMAttribute> it = element.getAllAttributes(); it.hasNext(); ) {
             OMAttribute attr = it.next();
@@ -120,7 +100,7 @@ public abstract class SerializerImpl imp
                 handler.processAttribute(ns.getNamespaceURI(), attr.getLocalName(), ns.getPrefix(), attr.getAttributeValue(), attr.getAttributeType(), ((CoreAttribute)attr).coreGetSpecified());
             }
         }
-        attributesCompleted();
+        handler.attributesCompleted();
     }
     
     /**