You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by dk...@apache.org on 2016/02/01 22:06:32 UTC
[2/5] camel git commit: CAMEL-9534: optimize attribute handling in
StAX2SAXSource adapter
CAMEL-9534: optimize attribute handling in StAX2SAXSource adapter
Creating a copy of all attribute data for each START_ELEMENT event is not
necessary and wastes time and memory.
Use a custom SAX Attributes implementation that just forwards all calls to
the respective StAX XMLStreamReader.getAttribute* methods.
Signed-off-by: Karsten Blees <ka...@dcon.de>
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/7d90d5d1
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/7d90d5d1
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/7d90d5d1
Branch: refs/heads/master
Commit: 7d90d5d14012b688af4038f9e38df218185a810a
Parents: 3ac8d9f
Author: Karsten Blees <bl...@dcon.de>
Authored: Sat Jan 30 14:04:51 2016 +0100
Committer: Daniel Kulp <dk...@apache.org>
Committed: Mon Feb 1 16:06:24 2016 -0500
----------------------------------------------------------------------
.../camel/converter/jaxp/StAX2SAXSource.java | 154 ++++++++++++++-----
1 file changed, 112 insertions(+), 42 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/7d90d5d1/camel-core/src/main/java/org/apache/camel/converter/jaxp/StAX2SAXSource.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/converter/jaxp/StAX2SAXSource.java b/camel-core/src/main/java/org/apache/camel/converter/jaxp/StAX2SAXSource.java
index e4a68b6..957637b 100644
--- a/camel-core/src/main/java/org/apache/camel/converter/jaxp/StAX2SAXSource.java
+++ b/camel-core/src/main/java/org/apache/camel/converter/jaxp/StAX2SAXSource.java
@@ -33,7 +33,6 @@ import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.ext.LexicalHandler;
-import org.xml.sax.helpers.AttributesImpl;
/**
* Adapter to turn a StAX {@link XMLStreamReader} into a {@link SAXSource}.
@@ -60,6 +59,7 @@ public class StAX2SAXSource extends SAXSource implements XMLReader {
}
protected void parse() throws SAXException {
+ final StAX2SAXAttributes attributes = new StAX2SAXAttributes();
try {
while (true) {
switch (streamReader.getEventType()) {
@@ -110,19 +110,14 @@ public class StAX2SAXSource extends SAXSource implements XMLReader {
contentHandler.endDocument();
return;
case XMLStreamConstants.END_ELEMENT: {
- String uri = streamReader.getNamespaceURI();
+ String uri = nullToEmpty(streamReader.getNamespaceURI());
String localName = streamReader.getLocalName();
- String prefix = streamReader.getPrefix();
- String qname = prefix != null && prefix.length() > 0
- ? prefix + ":" + localName : localName;
+ String qname = getPrefixedName(streamReader.getPrefix(), localName);
contentHandler.endElement(uri, localName, qname);
+
// namespaces
for (int i = 0; i < streamReader.getNamespaceCount(); i++) {
String nsPrefix = streamReader.getNamespacePrefix(i);
- String nsUri = streamReader.getNamespaceURI(i);
- if (nsUri == null) {
- nsUri = "";
- }
contentHandler.endPrefixMapping(nsPrefix);
}
break;
@@ -138,21 +133,19 @@ public class StAX2SAXSource extends SAXSource implements XMLReader {
contentHandler.startDocument();
break;
case XMLStreamConstants.START_ELEMENT: {
- String uri = streamReader.getNamespaceURI();
- String localName = streamReader.getLocalName();
- String prefix = streamReader.getPrefix();
- String qname = prefix != null && prefix.length() > 0
- ? prefix + ":" + localName : localName;
// namespaces
for (int i = 0; i < streamReader.getNamespaceCount(); i++) {
String nsPrefix = streamReader.getNamespacePrefix(i);
- String nsUri = streamReader.getNamespaceURI(i);
- if (nsUri == null) {
- nsUri = "";
- }
+ String nsUri = nullToEmpty(streamReader.getNamespaceURI(i));
contentHandler.startPrefixMapping(nsPrefix, nsUri);
}
- contentHandler.startElement(uri == null ? "" : uri, localName, qname, getAttributes());
+
+ String uri = nullToEmpty(streamReader.getNamespaceURI());
+ String localName = streamReader.getLocalName();
+ String qname = getPrefixedName(streamReader.getPrefix(), localName);
+ attributes.init();
+ contentHandler.startElement(uri, localName, qname, attributes);
+ attributes.reset();
break;
}
default:
@@ -177,37 +170,114 @@ public class StAX2SAXSource extends SAXSource implements XMLReader {
}
}
- protected String getQualifiedName() {
- String prefix = streamReader.getPrefix();
- if (prefix != null && prefix.length() > 0) {
- return prefix + ":" + streamReader.getLocalName();
- } else {
- return streamReader.getLocalName();
+ private String getPrefixedName(String prefix, String localName) {
+ if (prefix == null || prefix.length() == 0) {
+ return localName;
}
+ return prefix + ":" + localName;
}
- protected Attributes getAttributes() {
- AttributesImpl attrs = new AttributesImpl();
+ private String nullToEmpty(String s) {
+ return s == null ? "" : s;
+ }
- for (int i = 0; i < streamReader.getAttributeCount(); i++) {
- String uri = streamReader.getAttributeNamespace(i);
- String localName = streamReader.getAttributeLocalName(i);
- String prefix = streamReader.getAttributePrefix(i);
- String qName;
- if (prefix != null && prefix.length() > 0) {
- qName = prefix + ':' + localName;
- } else {
- qName = localName;
+ class StAX2SAXAttributes implements Attributes {
+
+ private int attributeCount;
+
+ void init() {
+ attributeCount = streamReader.getAttributeCount();
+ }
+
+ void reset() {
+ attributeCount = 0;
+ }
+
+ @Override
+ public int getLength() {
+ return attributeCount;
+ }
+
+ private boolean checkIndex(int index) {
+ return index >= 0 && index < attributeCount;
+ }
+
+ @Override
+ public String getURI(int index) {
+ if (!checkIndex(index))
+ return null;
+ return nullToEmpty(streamReader.getAttributeNamespace(index));
+ }
+
+ @Override
+ public String getLocalName(int index) {
+ if (!checkIndex(index))
+ return null;
+ return streamReader.getAttributeLocalName(index);
+ }
+
+ @Override
+ public String getQName(int index) {
+ if (!checkIndex(index))
+ return null;
+ String localName = streamReader.getAttributeLocalName(index);
+ String prefix = streamReader.getAttributePrefix(index);
+ return getPrefixedName(prefix, localName);
+ }
+
+ @Override
+ public String getType(int index) {
+ if (!checkIndex(index))
+ return null;
+ return streamReader.getAttributeType(index);
+ }
+
+ @Override
+ public String getValue(int index) {
+ if (!checkIndex(index))
+ return null;
+ return nullToEmpty(streamReader.getAttributeType(index));
+ }
+
+ @Override
+ public int getIndex(String searchUri, String searchLocalName) {
+ for (int i = 0; i < attributeCount; i++) {
+ if (getURI(i).equals(searchUri) && getLocalName(i).equals(searchLocalName)) {
+ return i;
+ }
}
- String type = streamReader.getAttributeType(i);
- String value = streamReader.getAttributeValue(i);
- if (value == null) {
- value = "";
+ return -1;
+ }
+
+ @Override
+ public int getIndex(String searchQName) {
+ for (int i = 0; i < attributeCount; i++) {
+ if (getQName(i).equals(searchQName)) {
+ return i;
+ }
}
+ return -1;
+ }
+
+ @Override
+ public String getType(String uri, String localName) {
+ return getType(getIndex(uri, localName));
+ }
+
+ @Override
+ public String getType(String qName) {
+ return getType(getIndex(qName));
+ }
+
+ @Override
+ public String getValue(String uri, String localName) {
+ return getValue(getIndex(uri, localName));
+ }
- attrs.addAttribute(uri == null ? "" : uri, localName, qName, type, value);
+ @Override
+ public String getValue(String qName) {
+ return getValue(getIndex(qName));
}
- return attrs;
}
public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException {