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/22 21:51:51 UTC

svn commit: r1731737 - in /webservices/axiom/trunk/aspects: core-aspects/src/main/java/org/apache/axiom/core/stream/ om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/ om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/p...

Author: veithen
Date: Mon Feb 22 20:51:51 2016
New Revision: 1731737

URL: http://svn.apache.org/viewvc?rev=1731737&view=rev
Log:
Unify the namespace repairing logic and only look up namespace bindings from XMLStreamWriter if necessary.

Added:
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/NamespaceContextProvider.java   (with props)
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/XMLStreamWriterNamespaceContextProvider.java
      - copied, changed from r1731722, webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java
Removed:
    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
Modified:
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/NamespaceRepairingFilterHandler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractBuilder.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerSupport.aj

Added: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/NamespaceContextProvider.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/NamespaceContextProvider.java?rev=1731737&view=auto
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/NamespaceContextProvider.java (added)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/NamespaceContextProvider.java Mon Feb 22 20:51:51 2016
@@ -0,0 +1,23 @@
+/*
+ * 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.core.stream;
+
+public interface NamespaceContextProvider {
+    boolean isBound(String prefix, String namespaceURI) throws StreamException;
+}

Propchange: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/NamespaceContextProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/NamespaceRepairingFilterHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/NamespaceRepairingFilterHandler.java?rev=1731737&r1=1731736&r2=1731737&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/NamespaceRepairingFilterHandler.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/stream/NamespaceRepairingFilterHandler.java Mon Feb 22 20:51:51 2016
@@ -21,28 +21,19 @@ package org.apache.axiom.core.stream;
 import javax.xml.XMLConstants;
 
 public final class NamespaceRepairingFilterHandler extends XmlHandlerWrapper {
+    private final NamespaceContextProvider parentNamespaceContext;
+    private final boolean removeRedundantDeclarations;
     private String[] namespaceStack = new String[32];
     private int bindings;
     private int[] scopeStack = new int[8];
     private int scopes;
 
-    public NamespaceRepairingFilterHandler(XmlHandler parent) {
+    public NamespaceRepairingFilterHandler(XmlHandler parent, NamespaceContextProvider parentNamespaceContext, boolean removeRedundantDeclarations) {
         super(parent);
+        this.parentNamespaceContext = parentNamespaceContext;
+        this.removeRedundantDeclarations = removeRedundantDeclarations;
     }
 
-    private boolean isBound(String prefix, String namespaceURI) {
-        if (prefix.equals(XMLConstants.XML_NS_PREFIX) && namespaceURI.equals(XMLConstants.XML_NS_URI)) {
-            return true;
-        } else {
-            for (int i=(bindings-1)*2; i>=0; i-=2) {
-                if (prefix.equals(namespaceStack[i])) {
-                    return namespaceURI.equals(namespaceStack[i+1]);
-                }
-            }
-            return prefix.length() == 0 && namespaceURI.length() == 0;
-        }
-    }
-    
     private void setPrefix(String prefix, String namespaceURI) {
         if (bindings*2 == namespaceStack.length) {
             int len = namespaceStack.length;
@@ -56,7 +47,27 @@ public final class NamespaceRepairingFil
     }
     
     private void ensureNamespaceDeclared(String prefix, String namespaceURI) throws StreamException {
-        if (!isBound(prefix, namespaceURI)) {
+        if (prefix.equals(XMLConstants.XML_NS_PREFIX) && namespaceURI.equals(XMLConstants.XML_NS_URI)) {
+            return;
+        }
+        boolean prefixFound = false;
+        for (int i=(bindings-1)*2; i>=0; i-=2) {
+            if (prefix.equals(namespaceStack[i])) {
+                if (namespaceURI.equals(namespaceStack[i+1])) {
+                    return;
+                } else {
+                    prefixFound = true;
+                    break;
+                }
+            }
+        }
+        if (!prefixFound && parentNamespaceContext != null) {
+            if (!parentNamespaceContext.isBound(prefix, namespaceURI)) {
+                super.processNamespaceDeclaration(prefix, namespaceURI);
+            }
+            // Always call setPrefix even if the namespace is bound, so that we cache the lookup
+            setPrefix(prefix, namespaceURI);
+        } else if (prefixFound || !prefix.isEmpty() || !namespaceURI.isEmpty()) {
             super.processNamespaceDeclaration(prefix, namespaceURI);
             setPrefix(prefix, namespaceURI);
         }
@@ -86,17 +97,21 @@ public final class NamespaceRepairingFil
     }
     
     public void processNamespaceDeclaration(String prefix, String namespaceURI) throws StreamException {
-        for (int i = scopeStack[scopes-1]; i < bindings; i++) {
-            if (namespaceStack[i*2].equals(prefix)) {
-                if (namespaceStack[i*2+1].equals(namespaceURI)) {
-                    return;
-                } else {
-                    // TODO: this causes a failure in the FOM tests
+        if (removeRedundantDeclarations) {
+            ensureNamespaceDeclared(prefix, namespaceURI);
+        } else {
+            for (int i = scopeStack[scopes-1]; i < bindings; i++) {
+                if (namespaceStack[i*2].equals(prefix)) {
+                    if (namespaceStack[i*2+1].equals(namespaceURI)) {
+                        return;
+                    } else {
+                        // TODO: this causes a failure in the FOM tests
 //                        throw new OMException("The same prefix cannot be bound to two different namespaces");
+                    }
                 }
             }
+            super.processNamespaceDeclaration(prefix, namespaceURI);
+            setPrefix(prefix, namespaceURI);
         }
-        super.processNamespaceDeclaration(prefix, namespaceURI);
-        setPrefix(prefix, namespaceURI);
     }
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractBuilder.java?rev=1731737&r1=1731736&r2=1731737&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractBuilder.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractBuilder.java Mon Feb 22 20:51:51 2016
@@ -33,7 +33,7 @@ public abstract class AbstractBuilder im
 
     public AbstractBuilder(NodeFactory nodeFactory, Model model, AxiomSourcedElement root, boolean repairNamespaces) {
         builderHandler = new BuilderHandler(nodeFactory, model, root, this);
-        handler = repairNamespaces ? new NamespaceRepairingFilterHandler(builderHandler) : builderHandler;
+        handler = repairNamespaces ? new NamespaceRepairingFilterHandler(builderHandler, null, false) : builderHandler;
     }
 
     public final void addListener(BuilderListener listener) {

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java?rev=1731737&r1=1731736&r2=1731737&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java Mon Feb 22 20:51:51 2016
@@ -21,22 +21,16 @@ package org.apache.axiom.om.impl.common.
 import java.io.IOException;
 
 import org.apache.axiom.core.stream.StreamException;
+import org.apache.axiom.core.stream.XmlHandler;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
-import org.apache.axiom.om.OMException;
-import org.apache.axiom.om.impl.common.serializer.push.SerializerImpl;
 import org.apache.axiom.om.impl.intf.TextContent;
 import org.apache.axiom.util.stax.XMLStreamWriterUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 
-import javax.xml.namespace.NamespaceContext;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
-public class StAXSerializer extends SerializerImpl {
-    private static final Log log = LogFactory.getLog(StAXSerializer.class);
-    
+public class StAXSerializer implements XmlHandler {
     private final XMLStreamWriter writer;
     private DataHandlerWriter dataHandlerWriter;
     
@@ -102,87 +96,6 @@ public class StAXSerializer extends Seri
         // Nothing to do here
     }
 
-    /**
-     * @param prefix 
-     * @param namespace
-     * @return true if the prefix is associated with the namespace in the current context
-     */
-    protected boolean isAssociated(String prefix, String namespace) throws StreamException {
-        try {
-            // The "xml" prefix is always (implicitly) associated. Returning true here makes sure that
-            // we never write a declaration for the xml namespace. See AXIOM-37 for a discussion
-            // of this issue.
-            if ("xml".equals(prefix)) {
-                return true;
-            }
-            
-            // NOTE: Calling getNamespaceContext() on many XMLStreamWriter implementations is expensive.
-            // Please use other writer methods first.
-            
-            // For consistency, convert null arguments.
-            // This helps get around the parser implementation differences.
-            // In addition, the getPrefix/getNamespace methods cannot be called with null parameters.
-            prefix = (prefix == null) ? "" : prefix;
-            namespace = (namespace == null) ? "" : namespace;
-            
-            if (namespace.length() > 0) {
-                // QUALIFIED NAMESPACE
-                // Get the namespace associated with the prefix
-                String writerPrefix = writer.getPrefix(namespace);
-                if (prefix.equals(writerPrefix)) {
-                    return true;
-                }
-                
-                // It is possible that the namespace is associated with multiple prefixes,
-                // So try getting the namespace as a second step.
-                if (writerPrefix != null) {
-                    NamespaceContext nsContext = writer.getNamespaceContext();
-                    if(nsContext != null) {
-                        String writerNS = nsContext.getNamespaceURI(prefix);
-                        return namespace.equals(writerNS);
-                    }
-                }
-                return false;
-            } else {
-                // UNQUALIFIED NAMESPACE
-                
-                // Neither XML 1.0 nor XML 1.1 allow to associate a prefix with an unqualified name (see also AXIOM-372).
-                if (prefix.length() > 0) {
-                    throw new OMException("Invalid namespace declaration: Prefixed namespace bindings may not be empty.");  
-                }
-                
-                // Get the namespace associated with the prefix.
-                // It is illegal to call getPrefix with null, but the specification is not
-                // clear on what happens if called with "".  So the following code is 
-                // protected
-                try {
-                    String writerPrefix = writer.getPrefix("");
-                    if (writerPrefix != null && writerPrefix.length() == 0) {
-                        return true;
-                    }
-                } catch (Throwable t) {
-                    if (log.isDebugEnabled()) {
-                        log.debug("Caught exception from getPrefix(\"\"). Processing continues: " + t);
-                    }
-                }
-                
-                
-                
-                // Fallback to using the namespace context
-                NamespaceContext nsContext = writer.getNamespaceContext();
-                if (nsContext != null) {
-                    String writerNS = nsContext.getNamespaceURI("");
-                    if (writerNS != null && writerNS.length() > 0) {
-                        return false;
-                    }
-                }
-                return true;
-            }
-        } catch (XMLStreamException ex) {
-            throw new StreamException(ex);
-        }
-    }
-
     public void endElement() throws StreamException {
         try {
             writer.writeEndElement();

Copied: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/XMLStreamWriterNamespaceContextProvider.java (from r1731722, webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java)
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/XMLStreamWriterNamespaceContextProvider.java?p2=webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/XMLStreamWriterNamespaceContextProvider.java&p1=webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java&r1=1731722&r2=1731737&rev=1731737&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/XMLStreamWriterNamespaceContextProvider.java Mon Feb 22 20:51:51 2016
@@ -18,15 +18,9 @@
  */
 package org.apache.axiom.om.impl.common.serializer.push.stax;
 
-import java.io.IOException;
-
+import org.apache.axiom.core.stream.NamespaceContextProvider;
 import org.apache.axiom.core.stream.StreamException;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
-import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
 import org.apache.axiom.om.OMException;
-import org.apache.axiom.om.impl.common.serializer.push.SerializerImpl;
-import org.apache.axiom.om.impl.intf.TextContent;
-import org.apache.axiom.util.stax.XMLStreamWriterUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -34,80 +28,21 @@ import javax.xml.namespace.NamespaceCont
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
-public class StAXSerializer extends SerializerImpl {
-    private static final Log log = LogFactory.getLog(StAXSerializer.class);
+public class XMLStreamWriterNamespaceContextProvider implements NamespaceContextProvider {
+    private static final Log log = LogFactory.getLog(XMLStreamWriterNamespaceContextProvider.class);
     
     private final XMLStreamWriter writer;
-    private DataHandlerWriter dataHandlerWriter;
     
-    public StAXSerializer(XMLStreamWriter writer) {
+    public XMLStreamWriterNamespaceContextProvider(XMLStreamWriter writer) {
         this.writer = writer;
     }
 
-    public XMLStreamWriter getWriter() {
-        return writer;
-    }
-
-    @Override
-    public void startDocument(String inputEncoding, String xmlVersion, String xmlEncoding,
-            boolean standalone) throws StreamException {
-        try {
-            if (xmlEncoding == null) {
-                writer.writeStartDocument(xmlVersion);
-            } else {
-                writer.writeStartDocument(xmlEncoding, xmlVersion);
-            }
-        } catch (XMLStreamException ex) {
-            throw new StreamException(ex);
-        }
-    }
-
-    public void processDocumentTypeDeclaration(String rootName, String publicId, String systemId, String internalSubset) throws StreamException {
-        try {
-            XMLStreamWriterUtils.writeDTD(writer, rootName, publicId, systemId, internalSubset);
-        } catch (XMLStreamException ex) {
-            throw new StreamException(ex);
-        }
-    }
-
-    public void startElement(String namespaceURI, String localName, String prefix) throws StreamException {
-        try {
-            writer.writeStartElement(prefix, localName, namespaceURI);
-        } catch (XMLStreamException ex) {
-            throw new StreamException(ex);
-        }
-    }
-
-    public void processNamespaceDeclaration(String prefix, String namespaceURI) throws StreamException {
-        try {
-            if (prefix.length() != 0) {
-                writer.writeNamespace(prefix, namespaceURI);
-            } else {
-                writer.writeDefaultNamespace(namespaceURI);
-            }
-        } catch (XMLStreamException ex) {
-            throw new StreamException(ex);
-        }
-    }
-
-    public void processAttribute(String namespaceURI, String localName, String prefix, String value, String type, boolean specified) throws StreamException {
-        try {
-            writer.writeAttribute(prefix, namespaceURI, localName, value);
-        } catch (XMLStreamException ex) {
-            throw new StreamException(ex);
-        }
-    }
-
-    public void attributesCompleted() throws StreamException {
-        // Nothing to do here
-    }
-
     /**
      * @param prefix 
      * @param namespace
      * @return true if the prefix is associated with the namespace in the current context
      */
-    protected boolean isAssociated(String prefix, String namespace) throws StreamException {
+    public boolean isBound(String prefix, String namespace) throws StreamException {
         try {
             // The "xml" prefix is always (implicitly) associated. Returning true here makes sure that
             // we never write a declaration for the xml namespace. See AXIOM-37 for a discussion
@@ -182,79 +117,4 @@ public class StAXSerializer extends Seri
             throw new StreamException(ex);
         }
     }
-
-    public void endElement() throws StreamException {
-        try {
-            writer.writeEndElement();
-        } catch (XMLStreamException ex) {
-            throw new StreamException(ex);
-        }
-    }
-
-    public void processCharacterData(Object data, boolean ignorable) throws StreamException {
-        try {
-            if (data instanceof TextContent) {
-                TextContent textContent = (TextContent)data;
-                if (textContent.isBinary()) {
-                    Object dataHandlerObject = textContent.getDataHandlerObject();
-                    if (dataHandlerObject instanceof DataHandlerProvider) {
-                        getDataHandlerWriter().writeDataHandler((DataHandlerProvider)dataHandlerObject, textContent.getContentID(), textContent.isOptimize());
-                    } else {
-                        getDataHandlerWriter().writeDataHandler(textContent.getDataHandler(), textContent.getContentID(), textContent.isOptimize());
-                    }
-                    return;
-                }
-            }
-            writer.writeCharacters(data.toString());
-        } catch (XMLStreamException ex) {
-            throw new StreamException(ex);
-        } catch (IOException ex) {
-            throw new StreamException(ex);
-        }
-    }
-    
-    @Override
-    public void processCDATASection(String content) throws StreamException {
-        try {
-            writer.writeCData(content);
-        } catch (XMLStreamException ex) {
-            throw new StreamException(ex);
-        }
-    }
-
-    public void processComment(String data) throws StreamException {
-        try {
-            writer.writeComment(data);
-        } catch (XMLStreamException ex) {
-            throw new StreamException(ex);
-        }
-    }
-
-    public void processProcessingInstruction(String target, String data) throws StreamException {
-        try {
-            writer.writeProcessingInstruction(target, data);
-        } catch (XMLStreamException ex) {
-            throw new StreamException(ex);
-        }
-    }
-
-    public void processEntityReference(String name, String replacementText) throws StreamException {
-        try {
-            writer.writeEntityRef(name);
-        } catch (XMLStreamException ex) {
-            throw new StreamException(ex);
-        }
-    }
-
-    private DataHandlerWriter getDataHandlerWriter() {
-        // We only retrieve/create the DataHandlerWriter if necessary
-        if (dataHandlerWriter == null) {
-            dataHandlerWriter = XMLStreamWriterUtils.getDataHandlerWriter(writer);
-        }
-        return dataHandlerWriter;
-    }
-
-    public void endDocument() throws StreamException {
-        // TODO: the original StAX serialization code newer called writeEndDocument; this is probably a mistake
-    }
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerSupport.aj?rev=1731737&r1=1731736&r2=1731737&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerSupport.aj (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomContainerSupport.aj Mon Feb 22 20:51:51 2016
@@ -37,6 +37,7 @@ import org.apache.axiom.core.CoreNSAware
 import org.apache.axiom.core.CoreNode;
 import org.apache.axiom.core.ElementMatcher;
 import org.apache.axiom.core.Mapper;
+import org.apache.axiom.core.stream.NamespaceRepairingFilterHandler;
 import org.apache.axiom.core.stream.StreamException;
 import org.apache.axiom.core.stream.XmlHandler;
 import org.apache.axiom.core.stream.sax.XmlHandlerContentHandler;
@@ -59,10 +60,10 @@ import org.apache.axiom.om.impl.common.S
 import org.apache.axiom.om.impl.common.builder.StAXHelper;
 import org.apache.axiom.om.impl.common.serializer.pull.OMXMLStreamReaderExAdapter;
 import org.apache.axiom.om.impl.common.serializer.pull.PullSerializer;
-import org.apache.axiom.om.impl.common.serializer.push.NamespaceHelper;
 import org.apache.axiom.om.impl.common.serializer.push.XsiTypeFilterHandler;
 import org.apache.axiom.om.impl.common.serializer.push.sax.XMLReaderImpl;
 import org.apache.axiom.om.impl.common.serializer.push.stax.StAXSerializer;
+import org.apache.axiom.om.impl.common.serializer.push.stax.XMLStreamWriterNamespaceContextProvider;
 import org.apache.axiom.om.impl.intf.AxiomChildNode;
 import org.apache.axiom.om.impl.intf.AxiomContainer;
 import org.apache.axiom.om.impl.intf.OMFactoryEx;
@@ -266,14 +267,16 @@ public aspect AxiomContainerSupport {
         return result;
     }
 
-    private XmlHandler AxiomContainer.createSerializer(XMLStreamWriter writer) {
+    private XmlHandler AxiomContainer.createSerializer(XMLStreamWriter writer, boolean useExistingNamespaceContext) {
         StAXSerializer serializer = new StAXSerializer(writer);
         XmlHandler handler = serializer;
         CoreElement contextElement = getContextElement();
         if (contextElement != null) {
             handler = new XsiTypeFilterHandler(handler, contextElement);
         }
-        return new NamespaceHelper(serializer, handler);
+        return new NamespaceRepairingFilterHandler(handler,
+                useExistingNamespaceContext ? new XMLStreamWriterNamespaceContextProvider(writer) : null,
+                true);
     }
     
     public abstract CoreElement AxiomContainer.getContextElement();
@@ -284,7 +287,7 @@ public aspect AxiomContainerSupport {
                 (MTOMXMLStreamWriter) xmlWriter : 
                     new MTOMXMLStreamWriter(xmlWriter);
         try {
-            internalSerialize(createSerializer(writer), writer.getOutputFormat(), cache);
+            internalSerialize(createSerializer(writer, true), writer.getOutputFormat(), cache);
         } catch (StreamException ex) {
             throw AxiomExceptionTranslator.toXMLStreamException(ex);
         }
@@ -321,7 +324,7 @@ public aspect AxiomContainerSupport {
         MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format, true);
         try {
             try {
-                internalSerialize(createSerializer(writer), format, true);
+                internalSerialize(createSerializer(writer, false), format, true);
             } catch (StreamException ex) {
                 throw AxiomExceptionTranslator.toXMLStreamException(ex);
             }
@@ -336,7 +339,7 @@ public aspect AxiomContainerSupport {
         writer.setOutputFormat(format);
         try {
             try {
-                internalSerialize(createSerializer(writer), format, true);
+                internalSerialize(createSerializer(writer, false), format, true);
             } catch (StreamException ex) {
                 throw AxiomExceptionTranslator.toXMLStreamException(ex);
             }
@@ -350,7 +353,7 @@ public aspect AxiomContainerSupport {
         MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format, false);
         try {
             try {
-                internalSerialize(createSerializer(writer), format, false);
+                internalSerialize(createSerializer(writer, false), format, false);
             } catch (StreamException ex) {
                 throw AxiomExceptionTranslator.toXMLStreamException(ex);
             }
@@ -366,7 +369,7 @@ public aspect AxiomContainerSupport {
         writer.setOutputFormat(format);
         try {
             try {
-                internalSerialize(createSerializer(writer), format, false);
+                internalSerialize(createSerializer(writer, false), format, false);
             } catch (StreamException ex) {
                 throw AxiomExceptionTranslator.toXMLStreamException(ex);
             }