mkwan 2003/02/21 14:20:28
Modified: java/src/org/apache/xalan/xsltc/dom Tag: XSLTC_DTM
SAXImpl.java
java/src/org/apache/xml/dtm/ref/sax2dtm Tag: XSLTC_DTM
SAX2DTM2.java
Log:
XSLTC_DTM performance work
Small improvement to SAXImpl.copyElement().
Move the getStringValue() method from SAXImpl to SAX2DTM2.
Remove the SAXImpl.stringValueAux() method.
Revision Changes Path
No revision
No revision
1.1.2.32 +58 -28
xml-xalan/java/src/org/apache/xalan/xsltc/dom/Attic/SAXImpl.java
Index: SAXImpl.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/Attic/SAXImpl.java,v
retrieving revision 1.1.2.31
retrieving revision 1.1.2.32
diff -u -r1.1.2.31 -r1.1.2.32
--- SAXImpl.java 19 Feb 2003 18:15:46 -0000 1.1.2.31
+++ SAXImpl.java 21 Feb 2003 22:20:27 -0000 1.1.2.32
@@ -65,9 +65,6 @@
package org.apache.xalan.xsltc.dom;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
import java.util.Enumeration;
import javax.xml.transform.Source;
@@ -1759,7 +1756,10 @@
public void copy(final int node, TransletOutputHandler handler)
throws TransletException
{
- final int type = getNodeType(node); //_type[node];
+ //final int type = getNodeType(node); //_type[node];
+ int nodeID = makeNodeIdentity(node);
+ int exptype = _exptype2(nodeID);
+ int type = _exptype2Type(exptype);
switch(type)
{
@@ -1797,10 +1797,10 @@
shallowCopy(node, handler);
break;
default:
- if (isElement(node))
+ if (type == DTM.ELEMENT_NODE)
{
// Start element definition
- final String name = copyElement(node, type, handler);
+ final String name = copyElement(nodeID, exptype, handler);
// Copy element attribute
for(int a=getFirstAttribute(node); a!=DTM.NULL;
a=getNextAttribute(a))
{
@@ -1869,11 +1869,17 @@
throws TransletException
{
- final int type = getNodeType(node);
+ //final int type = getNodeType(node);
+ int nodeID = makeNodeIdentity(node);
+ int exptype = _exptype2(nodeID);
+ int type = _exptype2Type(exptype);
+
switch(type)
{
+ case DTM.ELEMENT_NODE:
+ return(copyElement(nodeID, exptype, handler));
case DTM.ROOT_NODE: // do nothing
- case DTM.DOCUMENT_NODE:
+ case DTM.DOCUMENT_NODE:
return EMPTYSTRING;
case DTM.TEXT_NODE:
characters(node, handler);
@@ -1897,12 +1903,6 @@
handler.attribute(getNodeName(node), getNodeValue(node));
//makeStringValue(node));
return null;
default:
- if (type == DTM.ELEMENT_NODE) //isElement(node))
- {
- return(copyElement(node, type, handler));
- }
- else
- {
final String uri1 = getNamespaceName(node);
if (uri1.length() != 0) {
final String prefix = getPrefix(node); //
_prefixArray[_prefix[node]];
@@ -1910,32 +1910,59 @@
}
handler.attribute(getNodeName(node), getNodeValue(node));
//makeStringValue(node));
return null;
- }
}
}
- private String copyElement(int node, int type,
+ // %REVISIT% We can move this interface into SAX2DTM2 with the
serializer changes.
+ private String copyElement(int nodeID, int exptype,
TransletOutputHandler handler)
throws TransletException
{
- final String name = getNodeName(node);
- final String localName = getLocalName(node);
- final String uri = getNamespaceName(node);
-
- handler.startElement(name);
-
- if (name.length() != localName.length()) {
- handler.namespace(getPrefix(node), uri);
- } else if (uri.length() != 0) {
- handler.namespace(EMPTYSTRING, uri);
+ final ExtendedType extType = m_extendedTypes[exptype];
+ String uri = extType.getNamespace();
+ String name = extType.getLocalName();
+
+ if (uri.length() == 0)
+ {
+ handler.startElement(name);
+ return name;
}
+ else
+ {
+ int qnameIndex = m_dataOrQName.elementAt(nodeID);
- return name;
+ if (qnameIndex == 0)
+ {
+ handler.startElement(name);
+ handler.namespace(EMPTYSTRING, uri);
+ return name;
+ }
+
+ if (qnameIndex < 0)
+ {
+ qnameIndex = -qnameIndex;
+ qnameIndex = m_data.elementAt(qnameIndex);
+ }
+
+ String qName = m_valuesOrPrefixes.indexToString(qnameIndex);
+ handler.startElement(qName);
+
+ int prefixIndex = qName.indexOf(':');
+ String prefix;
+ if (prefixIndex > 0)
+ prefix = qName.substring(0, prefixIndex);
+ else
+ prefix = null;
+
+ handler.namespace(prefix, uri);
+ return qName;
+ }
}
/**
* Returns the string value of the entire tree
*/
+ /*
public String getStringValue()
{
final int doc = getDocument();
@@ -1948,6 +1975,7 @@
else
return stringValueAux(new StringBuffer(), doc).toString();
}
+ */
/**
* Returns the string value of any element
@@ -1964,6 +1992,7 @@
/**
* Helper to getStringValue() above
*/
+ /*
private StringBuffer stringValueAux(StringBuffer buffer, final int
element)
{
for (int child = getFirstChild(element);
@@ -1984,6 +2013,7 @@
}
return buffer;
}
+ */
public String getTreeString() {
StringBuffer buf = new StringBuffer();
No revision
No revision
1.1.2.17 +38 -7
xml-xalan/java/src/org/apache/xml/dtm/ref/sax2dtm/Attic/SAX2DTM2.java
Index: SAX2DTM2.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xml/dtm/ref/sax2dtm/Attic/SAX2DTM2.java,v
retrieving revision 1.1.2.16
retrieving revision 1.1.2.17
diff -u -r1.1.2.16 -r1.1.2.17
--- SAX2DTM2.java 20 Feb 2003 16:44:35 -0000 1.1.2.16
+++ SAX2DTM2.java 21 Feb 2003 22:20:28 -0000 1.1.2.17
@@ -1727,7 +1727,7 @@
private int[][] m_parent_map;
// %OPT% Cache the array of extended types in this class
- private ExtendedType[] m_extendedTypes;
+ protected ExtendedType[] m_extendedTypes;
// Cache the shift and mask values for the SuballocatedIntVectors.
protected int m_SHIFT;
@@ -1853,6 +1853,17 @@
else
return NULL;
}
+
+ /**
+ * Return the node type from the expanded type
+ */
+ public final int _exptype2Type(int exptype)
+ {
+ if (NULL != exptype)
+ return m_extendedTypes[exptype].getNodeType();
+ else
+ return NULL;
+ }
/**
* Given a node identity and an expanded type, return a node in the
@@ -2659,7 +2670,7 @@
if (type == DTM.TEXT_NODE || type == DTM.CDATA_SECTION_NODE)
{
- int dataIndex = _dataOrQName(identity);
+ int dataIndex = m_dataOrQName.elementAt(identity);
if (-1 == offset)
{
@@ -2684,7 +2695,7 @@
}
else if (DTM.TEXT_NODE == type || DTM.CDATA_SECTION_NODE == type)
{
- int dataIndex = _dataOrQName(identity);
+ int dataIndex = m_dataOrQName.elementAt(identity);
int offset = m_data.elementAt(dataIndex);
int length = m_data.elementAt(dataIndex + 1);
@@ -2692,7 +2703,7 @@
}
else
{
- int dataIndex = _dataOrQName(identity);
+ int dataIndex = m_dataOrQName.elementAt(identity);
if (dataIndex < 0)
{
@@ -2704,6 +2715,26 @@
}
/**
+ * Returns the string value of the entire tree
+ */
+ public String getStringValue()
+ {
+ int child = _firstch2(ROOTNODE);
+ if (child == DTM.NULL) return EMPTY_STR;
+
+ // optimization: only create StringBuffer if > 1 child
+ if ((_exptype2(child) == DTM.TEXT_NODE) && (_nextsib2(child) ==
DTM.NULL))
+ {
+ int dataIndex = m_dataOrQName.elementAt(child);
+ return m_chars.getString(m_data.elementAt(dataIndex),
+ m_data.elementAt(dataIndex + 1));
+ }
+ else
+ return getStringValueX(getDocument());
+
+ }
+
+ /**
* The optimized version of SAX2DTM.dispatchCharactersEvents(int,
ContentHandler, boolean).
* This one does not have the third boolean parameter.
*
@@ -2751,7 +2782,7 @@
if (type == DTM.TEXT_NODE || type == DTM.CDATA_SECTION_NODE)
{
- int dataIndex = _dataOrQName(identity);
+ int dataIndex = m_dataOrQName.elementAt(identity);
if (-1 == offset)
{
@@ -2772,14 +2803,14 @@
}
else if (DTM.TEXT_NODE == type || DTM.CDATA_SECTION_NODE == type)
{
- int dataIndex = _dataOrQName(identity);
+ int dataIndex = m_dataOrQName.elementAt(identity);
m_chars.sendSAXcharacters(ch, m_data.elementAt(dataIndex),
m_data.elementAt(dataIndex + 1));
}
else
{
- int dataIndex = _dataOrQName(identity);
+ int dataIndex = m_dataOrQName.elementAt(identity);
if (dataIndex < 0)
{
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]