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);
+ }
}