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/07 10:55:54 UTC

svn commit: r1728940 - in /webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common: ./ builder/ factory/

Author: veithen
Date: Sun Feb  7 09:55:54 2016
New Revision: 1728940

URL: http://svn.apache.org/viewvc?rev=1728940&view=rev
Log:
Rewrite and unify the namespace repairing logic used by the different builders.

Added:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/OMNamespaceCache.java   (with props)
Removed:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderUtil.java
Modified:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/Handler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/OMContentHandler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.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/builder/AbstractPushBuilder.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandlerXMLStreamWriter.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/PushOMBuilder.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/SAXOMBuilder.java

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/Handler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/Handler.java?rev=1728940&r1=1728939&r2=1728940&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/Handler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/Handler.java Sun Feb  7 09:55:54 2016
@@ -34,6 +34,8 @@ public interface Handler {
     
     void endElement();
     
+    void createAttribute(String namespaceURI, String localName, String prefix, String value, String type, boolean specified);
+    
     void createOMText(String text, int type);
     
     void createProcessingInstruction(String piTarget, String piData);

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/OMContentHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/OMContentHandler.java?rev=1728940&r1=1728939&r2=1728940&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/OMContentHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/OMContentHandler.java Sun Feb  7 09:55:54 2016
@@ -18,9 +18,7 @@
  */
 package org.apache.axiom.om.impl.common;
 
-import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMElement;
-import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
@@ -240,7 +238,7 @@ public final class OMContentHandler impl
                 localName = qName.substring(qName.indexOf(':') + 1);
             int idx = qName.indexOf(':');
             String prefix = idx == -1 ? "" : qName.substring(0, idx);
-            OMElement element = handler.createOMElement(localName, namespaceURI, prefix, namespaces, namespaceCount);
+            handler.createOMElement(localName, namespaceURI, prefix, namespaces, namespaceCount);
             namespaceCount = 0;
     
             int j = atts.getLength();
@@ -253,20 +251,9 @@ public final class OMContentHandler impl
                 //       See http://forum.springframework.org/showthread.php?t=43958 for a discussion.
                 //       If this test causes problems with other parsers, don't hesitate to remove it.
                 if (!attrQName.startsWith("xmlns")) {
-                    String attrNamespaceURI = atts.getURI(i);
                     idx = attrQName.indexOf(':');
                     String attrPrefix = idx == -1 ? "" : attrQName.substring(0, idx);
-                    OMNamespace ns;
-                    if (attrNamespaceURI.length() > 0) {
-                        ns = element.findNamespace(attrNamespaceURI, attrPrefix);
-                        if (ns == null) {
-                            throw new SAXException("Unbound namespace " + attrNamespaceURI);
-                        }
-                    } else {
-                        ns = null;
-                    }
-                    OMAttribute attr = element.addAttribute(atts.getLocalName(i), atts.getValue(i), ns);
-                    attr.setAttributeType(atts.getType(i));
+                    handler.createAttribute(atts.getURI(i), atts.getLocalName(i), attrPrefix, atts.getValue(i), atts.getType(i), true);
                 }
             }
         }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java?rev=1728940&r1=1728939&r2=1728940&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java Sun Feb  7 09:55:54 2016
@@ -18,10 +18,13 @@
  */
 package org.apache.axiom.om.impl.common;
 
+import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMDocument;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
 
 public final  class SAXResultContentHandler implements Handler {
@@ -69,6 +72,23 @@ public final  class SAXResultContentHand
         target = ((OMNode)target).getParent();
     }
 
+    @Override
+    public void createAttribute(String namespaceURI, String localName, String prefix, String value,
+            String type, boolean specified) {
+        OMElement element = (OMElement)target;
+        OMNamespace ns;
+        if (namespaceURI.length() > 0) {
+            ns = element.findNamespace(namespaceURI, prefix);
+            if (ns == null) {
+                throw new OMException("Unbound namespace " + namespaceURI);
+            }
+        } else {
+            ns = null;
+        }
+        OMAttribute attr = element.addAttribute(localName, value, ns);
+        attr.setAttributeType(type);
+    }
+
     public void createOMText(String text, int type) {
         factory.createOMText(target, text, type);
     }

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=1728940&r1=1728939&r2=1728940&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 Sun Feb  7 09:55:54 2016
@@ -27,8 +27,8 @@ import org.apache.axiom.om.impl.intf.Axi
 public abstract class AbstractBuilder implements OMXMLParserWrapper {
     protected final BuilderHandler handler;
 
-    public AbstractBuilder(NodeFactory nodeFactory, Model model, AxiomSourcedElement root) {
-        handler = new BuilderHandler(nodeFactory, model, root, this);
+    public AbstractBuilder(NodeFactory nodeFactory, Model model, AxiomSourcedElement root, boolean repairNamespaces) {
+        handler = new BuilderHandler(nodeFactory, model, root, this, repairNamespaces);
     }
 
     public final void addNodePostProcessor(NodePostProcessor nodePostProcessor) {

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractPushBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractPushBuilder.java?rev=1728940&r1=1728939&r2=1728940&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractPushBuilder.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractPushBuilder.java Sun Feb  7 09:55:54 2016
@@ -24,8 +24,9 @@ import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.impl.intf.AxiomSourcedElement;
 
 public abstract class AbstractPushBuilder extends AbstractBuilder {
-    public AbstractPushBuilder(NodeFactory nodeFactory, Model model, AxiomSourcedElement root) {
-        super(nodeFactory, model, root);
+    public AbstractPushBuilder(NodeFactory nodeFactory, Model model, AxiomSourcedElement root,
+            boolean repairNamespaces) {
+        super(nodeFactory, model, root, repairNamespaces);
     }
     
     public final void discard(OMElement el) throws OMException {

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java?rev=1728940&r1=1728939&r2=1728940&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java Sun Feb  7 09:55:54 2016
@@ -27,9 +27,13 @@ import javax.xml.stream.XMLStreamConstan
 import org.apache.axiom.core.CoreParentNode;
 import org.apache.axiom.core.NodeFactory;
 import org.apache.axiom.om.OMContainer;
+import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMSerializable;
 import org.apache.axiom.om.OMXMLParserWrapper;
 import org.apache.axiom.om.impl.common.AxiomSemantics;
+import org.apache.axiom.om.impl.common.OMNamespaceImpl;
+import org.apache.axiom.om.impl.intf.AxiomAttribute;
 import org.apache.axiom.om.impl.intf.AxiomCDATASection;
 import org.apache.axiom.om.impl.intf.AxiomCharacterDataNode;
 import org.apache.axiom.om.impl.intf.AxiomChildNode;
@@ -39,18 +43,24 @@ import org.apache.axiom.om.impl.intf.Axi
 import org.apache.axiom.om.impl.intf.AxiomDocument;
 import org.apache.axiom.om.impl.intf.AxiomElement;
 import org.apache.axiom.om.impl.intf.AxiomEntityReference;
+import org.apache.axiom.om.impl.intf.AxiomNamespaceDeclaration;
 import org.apache.axiom.om.impl.intf.AxiomProcessingInstruction;
 import org.apache.axiom.om.impl.intf.AxiomSourcedElement;
+import org.apache.axiom.util.namespace.ScopedNamespaceContext;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 public final class BuilderHandler {
     private static final Log log = LogFactory.getLog(BuilderHandler.class);
     
+    private static final OMNamespace DEFAULT_NS = new OMNamespaceImpl("", "");
+    
     private final NodeFactory nodeFactory;
     private final Model model;
     private final AxiomSourcedElement root;
     private final OMXMLParserWrapper builder;
+    private final ScopedNamespaceContext nsContext;
+    private final OMNamespaceCache nsCache = new OMNamespaceCache();
     public AxiomContainer target;
     // returns the state of completion
     public boolean done;
@@ -73,11 +83,13 @@ public final class BuilderHandler {
     
     private ArrayList<NodePostProcessor> nodePostProcessors;
 
-    public BuilderHandler(NodeFactory nodeFactory, Model model, AxiomSourcedElement root, OMXMLParserWrapper builder) {
+    public BuilderHandler(NodeFactory nodeFactory, Model model, AxiomSourcedElement root, OMXMLParserWrapper builder,
+            boolean repairNamespaces) {
         this.nodeFactory = nodeFactory;
         this.model = model;
         this.root = root;
         this.builder = builder;
+        nsContext = repairNamespaces ? new ScopedNamespaceContext() : null;
     }
 
     public void addNodePostProcessor(NodePostProcessor nodePostProcessor) {
@@ -136,25 +148,46 @@ public final class BuilderHandler {
         addChild(node);
     }
     
+    private void ensureNamespaceDeclared(OMNamespace ns) {
+        if (ns == null) {
+            ns = DEFAULT_NS;
+        }
+        if (!ns.getNamespaceURI().equals(nsContext.getNamespaceURI(ns.getPrefix()))) {
+            AxiomNamespaceDeclaration decl = nodeFactory.createNode(AxiomNamespaceDeclaration.class);
+            decl.setDeclaredNamespace(ns);
+            ((AxiomElement)target).coreAppendAttribute(decl);
+            nsContext.setPrefix(ns.getPrefix(), ns.getNamespaceURI());
+        }
+    }
+    
     public AxiomElement startElement(String namespaceURI, String localName, String prefix) {
         elementLevel++;
         AxiomElement element;
+        OMNamespace ns = nsCache.getOMNamespace(namespaceURI, prefix);
         if (elementLevel == 1 && root != null) {
             root.validateName(prefix, localName, namespaceURI);
+            root.initName(localName, ns, false);
             element = root;
         } else {
             element = nodeFactory.createNode(model.determineElementType(
                     target, elementLevel, namespaceURI, localName));
             element.coreSetBuilder(builder);
             element.coreSetState(CoreParentNode.ATTRIBUTES_PENDING);
-            element.initName(localName, /*ns*/ null, false);
+            element.initName(localName, ns, false);
             addChild(element);
         }
         target = element;
+        if (nsContext != null) {
+            nsContext.startScope();
+            ensureNamespaceDeclared(ns);
+        }
         return element;
     }
     
     public void endElement() {
+        if (nsContext != null) {
+            nsContext.endScope();
+        }
         elementLevel--;
         target.setComplete(true);
         if (elementLevel == 0) {
@@ -167,6 +200,45 @@ public final class BuilderHandler {
         }
     }
 
+    public void createAttribute(String namespaceURI, String localName, String prefix, String value, String type, boolean specified) {
+        OMNamespace ns = nsCache.getOMNamespace(namespaceURI, prefix);
+        AxiomAttribute attr = nodeFactory.createNode(AxiomAttribute.class);
+        attr.internalSetLocalName(localName);
+        attr.coreSetCharacterData(value, AxiomSemantics.INSTANCE);
+        attr.internalSetNamespace(ns);
+        attr.coreSetType(type);
+        attr.coreSetSpecified(specified);
+        ((AxiomElement)target).coreAppendAttribute(attr);
+        if (nsContext != null && ns != null) {
+            ensureNamespaceDeclared(ns);
+        }
+    }
+    
+    public void createNamespaceDeclaration(String prefix, String namespaceURI) {
+        if (nsContext != null) {
+            for (int i=nsContext.getFirstBindingInCurrentScope(); i<nsContext.getBindingsCount(); i++) {
+                if (nsContext.getPrefix(i).equals(prefix)) {
+                    if (nsContext.getNamespaceURI(i).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");
+                    }
+                }
+            }
+        }
+        OMNamespace ns = nsCache.getOMNamespace(namespaceURI, prefix);
+        if (ns == null) {
+            ns = DEFAULT_NS;
+        }
+        AxiomNamespaceDeclaration decl = nodeFactory.createNode(AxiomNamespaceDeclaration.class);
+        decl.setDeclaredNamespace(ns);
+        ((AxiomElement)target).coreAppendAttribute(decl);
+        if (nsContext != null) {
+            nsContext.setPrefix(prefix, namespaceURI);
+        }
+    }
+    
     public void attributesCompleted() {
         target.coreSetState(CoreParentNode.INCOMPLETE);
     }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandlerXMLStreamWriter.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandlerXMLStreamWriter.java?rev=1728940&r1=1728939&r2=1728940&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandlerXMLStreamWriter.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandlerXMLStreamWriter.java Sun Feb  7 09:55:54 2016
@@ -26,24 +26,20 @@ import javax.xml.stream.XMLStreamExcepti
 
 import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerWriter;
-import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMConstants;
 import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMNamespace;
-import org.apache.axiom.om.impl.intf.AxiomElement;
 import org.apache.axiom.om.impl.intf.AxiomSourcedElement;
-import org.apache.axiom.om.impl.intf.OMFactoryEx;
 import org.apache.axiom.om.impl.intf.TextContent;
 import org.apache.axiom.util.stax.AbstractXMLStreamWriter;
 
 public class BuilderHandlerXMLStreamWriter extends AbstractXMLStreamWriter implements DataHandlerWriter {
-    private final OMFactoryEx factory;
     private final BuilderHandler handler;
     private boolean inStartElement;
 
     public BuilderHandlerXMLStreamWriter(BuilderHandler handler, AxiomSourcedElement root) throws XMLStreamException {
         this.handler = handler;
-        factory = (OMFactoryEx)root.getOMFactory();
         // Seed the namespace context with the namespace context from the parent
         OMContainer parent = root.getParent();
         if (parent instanceof OMElement) {
@@ -54,6 +50,10 @@ public class BuilderHandlerXMLStreamWrit
         }
     }
     
+    private static String normalize(String s) {
+        return s == null ? "" : s;
+    }
+    
     public Object getProperty(String name) throws IllegalArgumentException {
         if (DataHandlerWriter.PROPERTY.equals(name)) {
             return this;
@@ -82,34 +82,8 @@ public class BuilderHandlerXMLStreamWrit
         throw new XMLStreamException("A DTD must not appear in element content");
     }
 
-    private OMNamespace getOMNamespace(String prefix, String namespaceURI, boolean isDecl) {
-        if (prefix == null) {
-            prefix = "";
-        }
-        if (namespaceURI == null) {
-            namespaceURI = "";
-        }
-        if (!isDecl && namespaceURI.length() == 0) {
-            return null;
-        } else {
-            if (handler.target != null) {
-                // If possible, locate an existing OMNamespace object
-                OMNamespace ns = ((OMElement)handler.target).findNamespaceURI(prefix);
-                if (ns != null && ns.getNamespaceURI().equals(namespaceURI)) {
-                    return ns;
-                }
-            }
-            return factory.createOMNamespace(namespaceURI, prefix);
-        }
-    }
-    
     protected void doWriteStartElement(String prefix, String localName, String namespaceURI) {
-        // Get the OMNamespace object before we change the parent
-        OMNamespace ns = getOMNamespace(prefix, namespaceURI, false);
-        handler.startElement(namespaceURI, localName, prefix);
-        if (ns != null) {
-            ((OMElement)handler.target).setNamespace(ns, false);
-        }
+        handler.startElement(normalize(namespaceURI), localName, normalize(prefix));
         inStartElement = true;
     }
 
@@ -139,11 +113,7 @@ public class BuilderHandlerXMLStreamWrit
     }
 
     protected void doWriteAttribute(String prefix, String namespaceURI, String localName, String value) {
-        OMAttribute attr = factory.createOMAttribute(localName, getOMNamespace(prefix, namespaceURI, false), value);
-        // Use the internal appendAttribute method instead of addAttribute in order to avoid
-        // automatic of a namespace declaration (the OMDataSource is required to produce well formed
-        // XML with respect to namespaces, so it will take care of the namespace declarations).
-        ((AxiomElement)handler.target).internalAppendAttribute(attr);
+        handler.createAttribute(normalize(namespaceURI), localName, normalize(prefix), value, OMConstants.XMLATTRTYPE_CDATA, true);
     }
 
     protected void doWriteAttribute(String localName, String value) throws XMLStreamException {
@@ -151,7 +121,7 @@ public class BuilderHandlerXMLStreamWrit
     }
 
     protected void doWriteNamespace(String prefix, String namespaceURI) {
-        ((AxiomElement)handler.target).addNamespaceDeclaration(getOMNamespace(prefix, namespaceURI, true));
+        handler.createNamespaceDeclaration(normalize(prefix), normalize(namespaceURI));
     }
 
     protected void doWriteDefaultNamespace(String namespaceURI) {

Added: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/OMNamespaceCache.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/OMNamespaceCache.java?rev=1728940&view=auto
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/OMNamespaceCache.java (added)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/OMNamespaceCache.java Sun Feb  7 09:55:54 2016
@@ -0,0 +1,73 @@
+/*
+ * 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.builder;
+
+import org.apache.axiom.om.OMNamespace;
+import org.apache.axiom.om.impl.common.OMNamespaceImpl;
+
+public final class OMNamespaceCache {
+    private OMNamespace[] items = new OMNamespace[16];
+    private int size;
+    
+    public OMNamespace getOMNamespace(String uri, String prefix) {
+        if (uri.isEmpty() && prefix.isEmpty()) {
+            return null;
+        }
+        int index = index(uri, prefix);
+        while (true) {
+            OMNamespace ns = items[index];
+            if (ns == null) {
+                break;
+            } else if (ns.getNamespaceURI().equals(uri) && ns.getPrefix().equals(prefix)) {
+                return ns;
+            }
+            if (++index == items.length) {
+                index = 0;
+            }
+        }
+        if (items.length < size*4/3) {
+            OMNamespace[] oldItems = items;
+            items = new OMNamespace[items.length*2];
+            for (OMNamespace ns : oldItems) {
+                if (ns != null) {
+                    items[freeIndex(ns.getNamespaceURI(), ns.getPrefix())] = ns;
+                }
+            }
+            index = freeIndex(uri, prefix);
+        }
+        OMNamespace ns = new OMNamespaceImpl(uri, prefix);
+        items[index] = ns;
+        size++;
+        return ns;
+    }
+    
+    private int index(String uri, String prefix) {
+        return (uri.hashCode() ^ prefix.hashCode()) & (items.length-1);
+    }
+    
+    private int freeIndex(String uri, String prefix) {
+        int index = index(uri, prefix);
+        while (items[index] != null) {
+            if (++index == items.length) {
+                index = 0;
+            }
+        }
+        return index;
+    }
+}

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

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/PushOMBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/PushOMBuilder.java?rev=1728940&r1=1728939&r2=1728940&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/PushOMBuilder.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/PushOMBuilder.java Sun Feb  7 09:55:54 2016
@@ -29,7 +29,9 @@ public final class PushOMBuilder extends
     private final OMDataSource dataSource;
 
     public PushOMBuilder(AxiomSourcedElement root, OMDataSource dataSource) {
-        super(root.coreGetNodeFactory(), PlainXMLModel.INSTANCE, root);
+        // Disable namespace repairing because the OMDataSource is required to produce well formed
+        // XML with respect to namespaces.
+        super(root.coreGetNodeFactory(), PlainXMLModel.INSTANCE, root, false);
         this.root = root;
         this.dataSource = dataSource;
     }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java?rev=1728940&r1=1728939&r2=1728940&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java Sun Feb  7 09:55:54 2016
@@ -19,17 +19,14 @@
 
 package org.apache.axiom.om.impl.common.builder;
 
-import org.apache.axiom.core.CoreAttribute;
 import org.apache.axiom.core.NodeFactory;
 import org.apache.axiom.ext.stax.DTDReader;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
 import org.apache.axiom.om.DeferredParsingException;
-import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMFactory;
-import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.impl.builder.Builder;
 import org.apache.axiom.om.impl.builder.CustomBuilder;
@@ -133,7 +130,8 @@ public class StAXOMBuilder extends Abstr
     protected StAXOMBuilder(NodeFactory nodeFactory, XMLStreamReader parser,
             boolean autoClose, Detachable detachable, Closeable closeable, Model model, PayloadSelector payloadSelector,
             AxiomSourcedElement root) {
-        super(nodeFactory, model, root);
+        // TODO: disable namespace repairing for XMLStreamReader created from a parser
+        super(nodeFactory, model, root, true);
         if (parser.getEventType() != XMLStreamReader.START_DOCUMENT) {
             throw new IllegalStateException("The XMLStreamReader must be positioned on a START_DOCUMENT event");
         }
@@ -157,6 +155,10 @@ public class StAXOMBuilder extends Abstr
         this(nodeFactory, parser, true, null, null, PlainXMLModel.INSTANCE, PayloadSelector.DEFAULT, element);
     }
     
+    private static String normalize(String s) {
+        return s == null ? "" : s;
+    }
+    
     /**
      * Method processAttributes.
      *
@@ -165,28 +167,13 @@ public class StAXOMBuilder extends Abstr
     private void processAttributes(OMElement node) {
         int attribCount = parser.getAttributeCount();
         for (int i = 0; i < attribCount; i++) {
-            String uri = parser.getAttributeNamespace(i);
-            String prefix = parser.getAttributePrefix(i);
-
-
-            OMNamespace namespace = null;
-            if (uri != null && uri.length() > 0) {
-
-                // prefix being null means this elements has a default namespace or it has inherited
-                // a default namespace from its parent
-                namespace = node.findNamespace(uri, prefix);
-                if (namespace == null) {
-                    namespace = node.declareNamespace(uri, prefix);
-                }
-            }
-
-            // todo if the attributes are supposed to namespace qualified all the time
-            // todo then this should throw an exception here
-
-            OMAttribute attr = node.addAttribute(parser.getAttributeLocalName(i),
-                              parser.getAttributeValue(i), namespace);
-            attr.setAttributeType(parser.getAttributeType(i));
-            ((CoreAttribute)attr).coreSetSpecified(parser.isAttributeSpecified(i));
+            handler.createAttribute(
+                    normalize(parser.getAttributeNamespace(i)),
+                    parser.getAttributeLocalName(i),
+                    normalize(parser.getAttributePrefix(i)),
+                    parser.getAttributeValue(i),
+                    parser.getAttributeType(i),
+                    parser.isAttributeSpecified(i));
         }
     }
 
@@ -607,18 +594,21 @@ public class StAXOMBuilder extends Abstr
      * @return TODO
      */
     private OMNode createNextOMElement() {
+        String namespaceURI = normalize(parser.getNamespaceURI());
+        String localName = parser.getLocalName();
+        String prefix = normalize(parser.getPrefix());
         OMElement newElement = null;
         if (customBuilderForPayload != null && payloadSelector.isPayload(handler.elementLevel+1, handler.target)) {
             newElement = createWithCustomBuilder(customBuilderForPayload);
         }
         if (newElement == null && customBuilders != null && handler.elementLevel < this.maxDepthForCustomBuilders) {
-            CustomBuilder customBuilder = customBuilders.get(parser.getNamespaceURI(), parser.getLocalName());
+            CustomBuilder customBuilder = customBuilders.get(namespaceURI, localName);
             if (customBuilder != null) {
                 newElement = createWithCustomBuilder(customBuilder);
             }
         }
         if (newElement == null) {
-            newElement = handler.startElement(parser.getNamespaceURI(), parser.getLocalName(), parser.getPrefix());
+            newElement = handler.startElement(namespaceURI, localName, prefix);
             populateOMElement(newElement);
         }
         return newElement;
@@ -755,13 +745,10 @@ public class StAXOMBuilder extends Abstr
     private void processNamespaceData(OMElement node) {
         int namespaceCount = parser.getNamespaceCount();
         for (int i = 0; i < namespaceCount; i++) {
-            String prefix = parser.getNamespacePrefix(i);
-            String namespaceURI = parser.getNamespaceURI(i);
-            ((AxiomElement)node).addNamespaceDeclaration(
-                    namespaceURI == null ? "" : namespaceURI,
-                    prefix == null ? "" : prefix);
+            handler.createNamespaceDeclaration(
+                    normalize(parser.getNamespacePrefix(i)),
+                    normalize(parser.getNamespaceURI(i)));
         }
-        BuilderUtil.setNamespace(node, parser.getNamespaceURI(), parser.getPrefix());
     }
 
     /**

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/SAXOMBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/SAXOMBuilder.java?rev=1728940&r1=1728939&r2=1728940&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/SAXOMBuilder.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/SAXOMBuilder.java Sun Feb  7 09:55:54 2016
@@ -25,7 +25,6 @@ import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.impl.common.Handler;
 import org.apache.axiom.om.impl.common.OMContentHandler;
 import org.apache.axiom.om.impl.common.builder.AbstractPushBuilder;
-import org.apache.axiom.om.impl.common.builder.BuilderUtil;
 import org.apache.axiom.om.impl.common.builder.Model;
 import org.apache.axiom.om.impl.intf.AxiomElement;
 import org.xml.sax.SAXException;
@@ -41,7 +40,7 @@ public final class SAXOMBuilder extends
     private final SAXSource source;
     
     public SAXOMBuilder(NodeFactory nodeFactory, Model model, SAXSource source, boolean expandEntityReferences) {
-        super(nodeFactory, model, null);
+        super(nodeFactory, model, null, true);
         this.expandEntityReferences = expandEntityReferences;
         this.source = source;
     }
@@ -86,11 +85,10 @@ public final class SAXOMBuilder extends
 
     public OMElement createOMElement(String localName,
             String namespaceURI, String prefix, String[] namespaces, int namespaceCount) {
-        AxiomElement element = handler.startElement(null, localName, null);
+        AxiomElement element = handler.startElement(namespaceURI, localName, prefix);
         for (int i = 0; i < namespaceCount; i++) {
-            element.addNamespaceDeclaration(namespaces[2*i+1], namespaces[2*i]);
+            handler.createNamespaceDeclaration(namespaces[2*i], namespaces[2*i+1]);
         }
-        BuilderUtil.setNamespace(element, namespaceURI, prefix);
         // TODO: not entirely correct, but should work
         handler.attributesCompleted();
         return element;
@@ -127,4 +125,8 @@ public final class SAXOMBuilder extends
     public void createEntityReference(String name, String replacementText) {
         handler.createEntityReference(name, replacementText);
     }
+
+    public void createAttribute(String namespaceURI, String localName, String prefix, String value, String type, boolean specified) {
+        handler.createAttribute(namespaceURI, localName, prefix, value, type, specified);
+    }
 }