sboag 01/05/10 20:11:40
Modified: java/src/org/apache/xalan/transformer Tag: DTM_EXP
TransformerImpl.java
java/src/org/apache/xml/dtm Tag: DTM_EXP
DTMDocumentImpl.java DTMManagerDefault.java
TestDTM.java
Log:
DTMManagerDefault now creates a DTMDocumentImpl, and the
transformer is now hooked up. No threading yet. It crashes in
DTMDocumentImpl pretty quickly.
Revision Changes Path
No revision
No revision
1.90.2.5 +3 -160
xml-xalan/java/src/org/apache/xalan/transformer/TransformerImpl.java
Index: TransformerImpl.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/transformer/TransformerImpl.java,v
retrieving revision 1.90.2.4
retrieving revision 1.90.2.5
diff -u -r1.90.2.4 -r1.90.2.5
--- TransformerImpl.java 2001/05/10 20:48:26 1.90.2.4
+++ TransformerImpl.java 2001/05/11 03:11:32 1.90.2.5
@@ -498,165 +498,12 @@
public void transform(Source source)
throws TransformerException
{
- if(source instanceof DOMSource)
- {
- DOMSource dsource = (DOMSource)source;
- m_urlOfSource = dsource.getSystemId();
- // %TBD%
-// Node dNode = dsource.getNode();
-// if (null != dNode)
-// {
-// if(null != m_urlOfSource)
-// {
-// // System.out.println("Putting document in cache:
"+m_urlOfSource);
-//
this.getXPathContext().getSourceTreeManager().putDocumentInCache(dNode,
dsource);
-// }
-// this.transformNode(dsource.getNode());
-// return;
-// }
-// else
-// {
-// String messageStr =
XSLMessages.createMessage(XSLTErrorResources.ER_ILLEGAL_DOMSOURCE_INPUT, null);
-// throw new IllegalArgumentException(messageStr);
-// }
- }
- InputSource xmlSource = SAXSource.sourceToInputSource(source);
- if(null == xmlSource)
- {
- m_errorHandler.fatalError(new TransformerException("Can't transform a
Source of type "+
- source.getClass().getName()+"!"));
- }
-
- if (null != xmlSource.getSystemId())
- {
- m_urlOfSource =
org.apache.xml.utils.SystemIDResolver.getAbsoluteURI(xmlSource.getSystemId());
- xmlSource.setSystemId(m_urlOfSource);
- }
-
try
{
- m_hasTransformThreadErrorCatcher = true;
- XMLReader reader = null;
- if(source instanceof SAXSource)
- reader = ((SAXSource)source).getXMLReader();
-
- if (null == reader)
- {
- // Use JAXP1.1 ( if possible )
- try {
- javax.xml.parsers.SAXParserFactory factory=
-
javax.xml.parsers.SAXParserFactory.newInstance();
- factory.setNamespaceAware( true );
- javax.xml.parsers.SAXParser jaxpParser=
- factory.newSAXParser();
- reader=jaxpParser.getXMLReader();
-
- } catch( javax.xml.parsers.ParserConfigurationException ex ) {
- throw new org.xml.sax.SAXException( ex );
- } catch( javax.xml.parsers.FactoryConfigurationError ex1 ) {
- throw new org.xml.sax.SAXException( ex1.toString() );
- } catch( NoSuchMethodError ex2 ) {
- }
- catch (AbstractMethodError ame){}
- }
- if (null == reader)
- {
- reader = XMLReaderFactory.createXMLReader();
- }
+ DTMManager mgr = this.getXPathContext().getDTMManager();
+ DTM dtm = mgr.getDTM(source, false, this);
+ this.transformNode(dtm.getDocument());
- try
- {
- reader.setFeature("http://xml.org/sax/features/namespace-prefixes",
- true);
-
reader.setFeature("http://apache.org/xml/features/validation/dynamic",
- true);
- }
- catch (org.xml.sax.SAXException se)
- {
- // We don't care.
- }
-
- // Get the input content handler, which will handle the
- // parse events and create the source tree.
- ContentHandler inputHandler = getInputContentHandler();
-
- reader.setContentHandler(inputHandler);
- if(inputHandler instanceof org.xml.sax.DTDHandler)
- reader.setDTDHandler((org.xml.sax.DTDHandler)inputHandler);
- try
- {
- if(inputHandler instanceof org.xml.sax.ext.LexicalHandler)
- reader.setProperty("http://xml.org/sax/properties/lexical-handler",
- inputHandler);
- if(inputHandler instanceof org.xml.sax.ext.DeclHandler)
-
reader.setProperty("http://xml.org/sax/properties/declaration-handler",
- inputHandler);
- }
- catch(org.xml.sax.SAXException se) {}
- try
- {
- if(inputHandler instanceof org.xml.sax.ext.LexicalHandler)
- reader.setProperty("http://xml.org/sax/handlers/LexicalHandler",
- inputHandler);
- if(inputHandler instanceof org.xml.sax.ext.DeclHandler)
- reader.setProperty("http://xml.org/sax/handlers/DeclHandler",
- inputHandler);
- }
- catch(org.xml.sax.SAXNotRecognizedException snre)
- {
- }
-
- // Set the reader for cloning purposes.
- getXPathContext().setPrimaryReader(reader);
-
- this.m_exceptionThrown = null;
-
- if (inputHandler instanceof SourceTreeHandler)
- {
- SourceTreeHandler sth = (SourceTreeHandler) inputHandler;
-
- sth.setInputSource(source);
- sth.setUseMultiThreading(true);
-
- int doc = sth.getDTMRoot();
-
- if (DTM.NULL != doc)
- {
- SourceTreeManager stm = getXPathContext().getSourceTreeManager();
- // stm.putDocumentInCache(doc, source);
-
- m_xmlSource = source;
- // m_doc = doc;
-
- if (isParserEventsOnMain())
- {
- m_isTransformDone = false;
- try
- {
- getXPathContext().getPrimaryReader().parse(xmlSource);
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- }
- else
- {
- Thread t = createTransformThread();
-// m_reportInPostExceptionFromThread = false;
- t.start();
-
- // transformNode(doc);
- }
- }
- }
- else
- {
-
- // ??
- reader.parse(xmlSource);
- }
-
// Kick off the parse. When the ContentHandler gets
// the startDocument event, it will call transformNode( node ).
// reader.parse( xmlSource );
@@ -708,10 +555,6 @@
catch(org.xml.sax.SAXException se)
{
m_errorHandler.fatalError(new TransformerException( se ));
- }
- catch (IOException ioe)
- {
- m_errorHandler.fatalError(new TransformerException( ioe ));
}
finally
{
No revision
No revision
1.1.2.10 +1258
-1250xml-xalan/java/src/org/apache/xml/dtm/Attic/DTMDocumentImpl.java
Index: DTMDocumentImpl.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xml/dtm/Attic/DTMDocumentImpl.java,v
retrieving revision 1.1.2.9
retrieving revision 1.1.2.10
diff -u -r1.1.2.9 -r1.1.2.10
--- DTMDocumentImpl.java 2001/05/10 20:09:25 1.1.2.9
+++ DTMDocumentImpl.java 2001/05/11 03:11:35 1.1.2.10
@@ -96,185 +96,186 @@
implements DTM, org.xml.sax.ContentHandler, org.xml.sax.ext.LexicalHandler
{
- // Number of lower bits used to represent node index.
- protected static final byte DOCHANDLE_SHIFT = 20;
- // Masks the lower order of node handle.
- // Same as [EMAIL PROTECTED] DTMConstructor.IDENT_NODE_DEFAULT}
- protected static final int NODEHANDLE_MASK = (1 << (DOCHANDLE_SHIFT +
1)) - 1;
- // Masks the higher order Document handle
- // Same as [EMAIL PROTECTED] DTMConstructor.IDENT_DOC_DEFAULT}
- protected static final int DOCHANDLE_MASK = -1 - NODEHANDLE_MASK;
-
- int m_docHandle = NULL; // masked document handle for this dtm
document
- int m_docElement = NULL; // nodeHandle to the root of the
actual dtm doc content
-
- // Context for parse-and-append operations
- int currentParent = 0; // current parent - default is
document root
- int previousSibling = 0; // previous sibling - no
previous sibling
- protected int m_currentNode = -1; // current node
+ // Number of lower bits used to represent node index.
+ protected static final byte DOCHANDLE_SHIFT = 20;
+ // Masks the lower order of node handle.
+ // Same as [EMAIL PROTECTED] DTMConstructor.IDENT_NODE_DEFAULT}
+ protected static final int NODEHANDLE_MASK = (1 << (DOCHANDLE_SHIFT
+ 1)) - 1;
+ // Masks the higher order Document handle
+ // Same as [EMAIL PROTECTED] DTMConstructor.IDENT_DOC_DEFAULT}
+ protected static final int DOCHANDLE_MASK = -1 - NODEHANDLE_MASK;
+
+ int m_docHandle = NULL; // masked document handle for
this dtm document
+ int m_docElement = NULL; // nodeHandle to the root of the
actual dtm doc content
+
+ // Context for parse-and-append operations
+ int currentParent = 0; // current parent -
default is document root
+ int previousSibling = 0; // previous sibling - no
previous sibling
+ protected int m_currentNode = -1; // current node
// The tree under construction can itself be used as
// the element stack, so m_elemStack isn't needed.
- //protected Stack m_elemStack = new Stack(); // element stack
+ //protected Stack m_elemStack = new Stack(); // element stack
- private boolean previousSiblingWasParent = false;
- // Local cache for record-at-a-time fetch
- int gotslot[] = new int[4];
+ private boolean previousSiblingWasParent = false;
+ // Local cache for record-at-a-time fetch
+ int gotslot[] = new int[4];
- // endDocument recieved?
- private boolean done = false;
- boolean m_isError = false;
+ // endDocument recieved?
+ private boolean done = false;
+ boolean m_isError = false;
- private final boolean DEBUG = false;
+ private final boolean DEBUG = false;
- // ========= DTM data structure declarations. ==============
+ // ========= DTM data structure declarations. ==============
- // nodes array: integer array blocks to hold the first level reference
of the nodes,
- // each reference slot is addressed by a nodeHandle index value.
- // Assumes indices are not larger than [EMAIL PROTECTED]
NODEHANDLE_MASK}
+ // nodes array: integer array blocks to hold the first level
reference of the nodes,
+ // each reference slot is addressed by a nodeHandle index value.
+ // Assumes indices are not larger than [EMAIL PROTECTED]
NODEHANDLE_MASK}
// ([EMAIL PROTECTED] DOCHANDLE_SHIFT} bits).
- ChunkedIntArray nodes = new ChunkedIntArray(4);
+ ChunkedIntArray nodes = new ChunkedIntArray(4);
- // text/comment table: string buffer to hold the text string values of
the document,
- // each of which is addressed by the absolute offset and length in the
buffer
- private FastStringBuffer m_char = new FastStringBuffer();
+ // text/comment table: string buffer to hold the text string values
of the document,
+ // each of which is addressed by the absolute offset and length in
the buffer
+ private FastStringBuffer m_char = new FastStringBuffer();
// Start of string currently being accumulated into m_char;
- // needed because the string may be appended in several chunks.
- private int m_char_current_start=0;
+ // needed because the string may be appended in several chunks.
+ private int m_char_current_start=0;
// %TBD% INITIALIZATION/STARTUP ISSUES
- // -- Should we really be creating these, or should they be
+ // -- Should we really be creating these, or should they be
// passed in from outside? Scott want to be able to share
- // pools across multiple documents, so setting them here is
- // probably not the right default.
+ // pools across multiple documents, so setting them here is
+ // probably not the right default.
// %TBD% If we use an ExpandedNameTable mapper, it needs to be bound
// to the NS and local name pools. Which means it needs to attach
- // to them AFTER we've resolved their startup. Or it needs to attach
+ // to them AFTER we've resolved their startup. Or it needs to attach
// to this document and retieve them each time...?
- private DTMStringPool m_localNames = new DTMStringPool();
- private DTMStringPool m_nsNames = new DTMStringPool();
- private DTMStringPool m_prefixNames = new DTMStringPool();
-
- /**
- * Construct a DTM.
- *
- * @param documentNumber the ID number assigned to this document.
- * It will be shifted up into the high bits and returned as part of
- * all node ID numbers, so those IDs indicate which document they
- * came from as well as a location within the document. It is the
- * DTMManager's responsibility to assign a unique number to each
- * document.
- */
- public DTMDocumentImpl(int documentNumber){
- initDocument(documentNumber); // clear nodes and document
handle
- }
-
- /**
- * Wrapper for ChunkedIntArray.append, to automatically update the
- * previous sibling's "next" reference (if necessary) and periodically
- * wake a reader who may have encountered incomplete data and entered
- * a wait state.
- * @param w0 int As in ChunkedIntArray.append
- * @param w1 int As in ChunkedIntArray.append
- * @param w2 int As in ChunkedIntArray.append
- * @param w3 int As in ChunkedIntArray.append
- * @return int As in ChunkedIntArray.append
- * @see ChunkedIntArray.append
- */
- private final int appendNode(int w0, int w1, int w2, int w3)
- {
- // A decent compiler may inline this.
- int slotnumber = nodes.appendSlot(w0, w1, w2, w3);
-
- if (DEBUG) System.out.println(slotnumber+": "+w0+" "+w1+"
"+w2+" "+w3);
-
- if (previousSiblingWasParent)
- nodes.writeEntry(previousSibling,2,slotnumber);
-
- previousSiblingWasParent = false; // Set the default;
endElement overrides
-
- return slotnumber;
- }
-
- // ========= DTM Implementation Control Functions. ==============
-
- /**
- * Set a suggested parse block size for the parser.
- *
- * @param blockSizeSuggestion Suggested size of the parse blocks, in
bytes.
- */
- public void setParseBlockSize(int blockSizeSuggestion) {};
-
- /**
- * Set an implementation dependent feature.
- * <p>
- * %REVIEW% Do we really expect to set features on DTMs?
- *
- * @param featureId A feature URL.
- * @param state true if this feature should be on, false otherwise.
- */
- public void setFeature(String featureId, boolean state) {};
-
- /**
- * Set a reference pointer to the element name symbol table.
- * %REVIEW% Should this really be Public? Changing it while
- * DTM is in use would be a disaster.
- *
- * @param poolRef DTMStringPool reference to an instance of table.
- */
- public void setLocalNameTable(DTMStringPool poolRef) {
- m_localNames = poolRef;
- }
-
- /**
- * Get a reference pointer to the element name symbol table.
- *
- * @return DTMStringPool reference to an instance of table.
- */
+ private DTMStringPool m_localNames = new DTMStringPool();
+ private DTMStringPool m_nsNames = new DTMStringPool();
+ private DTMStringPool m_prefixNames = new DTMStringPool();
+
+ /**
+ * Construct a DTM.
+ *
+ * @param documentNumber the ID number assigned to this document.
+ * It will be shifted up into the high bits and returned as part of
+ * all node ID numbers, so those IDs indicate which document they
+ * came from as well as a location within the document. It is the
+ * DTMManager's responsibility to assign a unique number to each
+ * document.
+ */
+ public DTMDocumentImpl(DTMManager mgr, int documentNumber,
+ DTMWSFilter whiteSpaceFilter){
+ initDocument(documentNumber); // clear nodes and
document handle
+ }
+
+ /**
+ * Wrapper for ChunkedIntArray.append, to automatically update the
+ * previous sibling's "next" reference (if necessary) and
periodically
+ * wake a reader who may have encountered incomplete data and entered
+ * a wait state.
+ * @param w0 int As in ChunkedIntArray.append
+ * @param w1 int As in ChunkedIntArray.append
+ * @param w2 int As in ChunkedIntArray.append
+ * @param w3 int As in ChunkedIntArray.append
+ * @return int As in ChunkedIntArray.append
+ * @see ChunkedIntArray.append
+ */
+ private final int appendNode(int w0, int w1, int w2, int w3)
+ {
+ // A decent compiler may inline this.
+ int slotnumber = nodes.appendSlot(w0, w1, w2, w3);
+
+ if (DEBUG) System.out.println(slotnumber+": "+w0+" "+w1+"
"+w2+" "+w3);
+
+ if (previousSiblingWasParent)
+ nodes.writeEntry(previousSibling,2,slotnumber);
+
+ previousSiblingWasParent = false; // Set the default;
endElement overrides
+
+ return slotnumber;
+ }
+
+ // ========= DTM Implementation Control Functions. ==============
+
+ /**
+ * Set a suggested parse block size for the parser.
+ *
+ * @param blockSizeSuggestion Suggested size of the parse blocks, in
bytes.
+ */
+ public void setParseBlockSize(int blockSizeSuggestion) {};
+
+ /**
+ * Set an implementation dependent feature.
+ * <p>
+ * %REVIEW% Do we really expect to set features on DTMs?
+ *
+ * @param featureId A feature URL.
+ * @param state true if this feature should be on, false otherwise.
+ */
+ public void setFeature(String featureId, boolean state) {};
+
+ /**
+ * Set a reference pointer to the element name symbol table.
+ * %REVIEW% Should this really be Public? Changing it while
+ * DTM is in use would be a disaster.
+ *
+ * @param poolRef DTMStringPool reference to an instance of table.
+ */
+ public void setLocalNameTable(DTMStringPool poolRef) {
+ m_localNames = poolRef;
+ }
+
+ /**
+ * Get a reference pointer to the element name symbol table.
+ *
+ * @return DTMStringPool reference to an instance of table.
+ */
public DTMStringPool getLocalNameTable() {
return m_localNames;
}
+
+ /**
+ * Set a reference pointer to the namespace URI symbol table.
+ * %REVIEW% Should this really be Public? Changing it while
+ * DTM is in use would be a disaster.
+ *
+ * @param poolRef DTMStringPool reference to an instance of table.
+ */
+ public void setNsNameTable(DTMStringPool poolRef) {
+ m_nsNames = poolRef;
+ }
- /**
- * Set a reference pointer to the namespace URI symbol table.
- * %REVIEW% Should this really be Public? Changing it while
- * DTM is in use would be a disaster.
- *
- * @param poolRef DTMStringPool reference to an instance of table.
- */
- public void setNsNameTable(DTMStringPool poolRef) {
- m_nsNames = poolRef;
- }
-
- /**
- * Get a reference pointer to the namespace URI symbol table.
- *
- * @return DTMStringPool reference to an instance of table.
- */
+ /**
+ * Get a reference pointer to the namespace URI symbol table.
+ *
+ * @return DTMStringPool reference to an instance of table.
+ */
public DTMStringPool getNsNameTable() {
return m_nsNames;
}
- /**
- * Set a reference pointer to the prefix name symbol table.
- * %REVIEW% Should this really be Public? Changing it while
- * DTM is in use would be a disaster.
- *
- * @param poolRef DTMStringPool reference to an instance of table.
- */
- public void setPrefixNameTable(DTMStringPool poolRef) {
- m_prefixNames = poolRef;
- }
-
- /**
- * Get a reference pointer to the prefix name symbol table.
- *
- * @return DTMStringPool reference to an instance of table.
- */
- public DTMStringPool getPrefixNameTable() {
- return m_prefixNames;
- }
+ /**
+ * Set a reference pointer to the prefix name symbol table.
+ * %REVIEW% Should this really be Public? Changing it while
+ * DTM is in use would be a disaster.
+ *
+ * @param poolRef DTMStringPool reference to an instance of table.
+ */
+ public void setPrefixNameTable(DTMStringPool poolRef) {
+ m_prefixNames = poolRef;
+ }
+ /**
+ * Get a reference pointer to the prefix name symbol table.
+ *
+ * @return DTMStringPool reference to an instance of table.
+ */
+ public DTMStringPool getPrefixNameTable() {
+ return m_prefixNames;
+ }
+
/**
* Set a reference pointer to the content-text repository
*
@@ -315,9 +316,9 @@
int len=m_char.length();
if(len!=m_char_current_start)
{
- // The FastStringBuffer has been previously agreed upon
- appendTextChild(m_char_current_start,len-m_char_current_start);
- m_char_current_start=len;
+ // The FastStringBuffer has been previously agreed upon
+ appendTextChild(m_char_current_start,len-m_char_current_start);
+ m_char_current_start=len;
}
}
public void endDocument()
@@ -381,8 +382,8 @@
// %TBD% Where do we pool expandedName, or is it just the union, or...
appendStartElement(m_nsNames.stringToIndex(namespaceURI),
- m_localNames.stringToIndex(localName),
- m_prefixNames.stringToIndex(prefix)); /////// %TBD%
+ m_localNames.stringToIndex(localName),
+ m_prefixNames.stringToIndex(prefix)); /////// %TBD%
// %TBD% I'm assuming that DTM will require resequencing of
// NS decls before other attrs, hence two passes are taken.
@@ -391,61 +392,61 @@
// %TBD% Countdown is more efficient if nobody cares about sequence.
for(int i=nAtts-1;i>=0;--i)
{
- qName=atts.getQName(i);
- if(qName.startsWith("xmlns:") || "xmlns".equals(qName))
- {
- prefix=null;
- colon=qName.indexOf(':');
- if(colon>0)
- {
- prefix=qName.substring(0,colon);
- }
- else
- {
- prefix=""; // Default prefix
- }
-
-
- appendNSDeclaration(
- m_prefixNames.stringToIndex(prefix),
- m_nsNames.stringToIndex(atts.getValue(i)),
- atts.getType(i).equalsIgnoreCase("ID"));
- }
+ qName=atts.getQName(i);
+ if(qName.startsWith("xmlns:") || "xmlns".equals(qName))
+ {
+ prefix=null;
+ colon=qName.indexOf(':');
+ if(colon>0)
+ {
+ prefix=qName.substring(0,colon);
+ }
+ else
+ {
+ prefix=""; // Default prefix
+ }
+
+
+ appendNSDeclaration(
+ m_prefixNames.stringToIndex(prefix),
+
m_nsNames.stringToIndex(atts.getValue(i)),
+ atts.getType(i).equalsIgnoreCase("ID"));
+ }
}
for(int i=nAtts-1;i>=0;--i)
{
- qName=atts.getQName(i);
- if(qName.startsWith("xmlns:") || "xmlns".equals(qName))
- {
- // %TBD% I hate having to extract the prefix into a new
- // string when we may never use it. Consider pooling whole
- // qNames, which are already strings?
- prefix=null;
- colon=qName.indexOf(':');
- if(colon>0)
- {
- prefix=qName.substring(0,colon);
- localName=qName.substring(colon+1);
- }
- else
- {
- prefix=""; // Default prefix
- localName=qName;
- }
-
-
- m_char.append(atts.getValue(i)); // Single-string value
- int contentEnd=m_char.length();
-
- if(!("xmlns".equals(prefix) || "xmlns".equals(qName)))
- appendAttribute(m_nsNames.stringToIndex(atts.getURI(i)),
- m_localNames.stringToIndex(localName),
- m_prefixNames.stringToIndex(prefix),
- atts.getType(i).equalsIgnoreCase("ID"),
- m_char_current_start,
contentEnd-m_char_current_start);
- m_char_current_start=contentEnd;
- }
+ qName=atts.getQName(i);
+ if(qName.startsWith("xmlns:") || "xmlns".equals(qName))
+ {
+ // %TBD% I hate having to extract the prefix into a new
+ // string when we may never use it. Consider pooling whole
+ // qNames, which are already strings?
+ prefix=null;
+ colon=qName.indexOf(':');
+ if(colon>0)
+ {
+ prefix=qName.substring(0,colon);
+ localName=qName.substring(colon+1);
+ }
+ else
+ {
+ prefix=""; // Default prefix
+ localName=qName;
+ }
+
+
+ m_char.append(atts.getValue(i)); // Single-string value
+ int contentEnd=m_char.length();
+
+ if(!("xmlns".equals(prefix) || "xmlns".equals(qName)))
+ appendAttribute(m_nsNames.stringToIndex(atts.getURI(i)),
+ m_localNames.stringToIndex(localName),
+ m_prefixNames.stringToIndex(prefix),
+ atts.getType(i).equalsIgnoreCase("ID"),
+ m_char_current_start,
contentEnd-m_char_current_start);
+ m_char_current_start=contentEnd;
+ }
}
}
public void startPrefixMapping(java.lang.String prefix, java.lang.String
uri)
@@ -506,23 +507,23 @@
// and this wasn't a fully compliant or declared implementation of that API
// in any case. Phase out in favor of SAX2 ContentHandler/LexicalHandler
- /**
- * Reset a dtm document to its initial (empty) state.
- *
- * The DTMManager will invoke this method when the dtm is created.
- *
- * @param docHandle int the handle for the DTM document.
- */
- final void initDocument(int documentNumber)
- {
- // save masked DTM document handle
- m_docHandle = documentNumber<<DOCHANDLE_SHIFT;
-
- // Initialize the doc -- no parent, no next-sib
- nodes.writeSlot(0,DOCUMENT_NODE,-1,-1,0);
- // wait for the first startElement to create the doc root node
- done = false;
- }
+ /**
+ * Reset a dtm document to its initial (empty) state.
+ *
+ * The DTMManager will invoke this method when the dtm is created.
+ *
+ * @param docHandle int the handle for the DTM document.
+ */
+ final void initDocument(int documentNumber)
+ {
+ // save masked DTM document handle
+ m_docHandle = documentNumber<<DOCHANDLE_SHIFT;
+
+ // Initialize the doc -- no parent, no next-sib
+ nodes.writeSlot(0,DOCUMENT_NODE,-1,-1,0);
+ // wait for the first startElement to create the doc root
node
+ done = false;
+ }
// /**
// * Receive hint of the end of a document.
@@ -877,1030 +878,1037 @@
// // of appendAccumulatedText for the next set of characters receives
// int charStringStart=0,charStringLength=0;
+
+ // ========= Document Navigation Functions =========
+
+ /** Given a node handle, test if it has child nodes.
+ * <p> %REVIEW% This is obviously useful at the DOM layer, where it
+ * would permit testing this without having to create a proxy
+ * node. It's less useful in the DTM API, where
+ * (dtm.getFirstChild(nodeHandle)!=DTM.NULL) is just as fast and
+ * almost as self-evident. But it's a convenience, and eases porting
+ * of DOM code to DTM. </p>
+ *
+ * @param nodeHandle int Handle of the node.
+ * @return int true if the given node has child nodes.
+ */
+ public boolean hasChildNodes(int nodeHandle) {
+ return(getFirstChild(nodeHandle) != NULL);
+ }
+
+ /**
+ * Given a node handle, get the handle of the node's first child.
+ * If not yet resolved, waits for more nodes to be added to the
document and
+ * tries again.
+ *
+ * @param nodeHandle int Handle of the node.
+ * @return int DTM node-number of first child, or DTM.NULL to
indicate none exists.
+ */
+ public int getFirstChild(int nodeHandle) {
+
+ // ###shs worry about tracing/debug later
+ nodeHandle &= NODEHANDLE_MASK;
+ // Read node into variable
+ nodes.readSlot(nodeHandle, gotslot);
+
+ // type is the last half of first slot
+ short type = (short) (gotslot[0] & 0xFFFF);
+
+ // Check to see if Element or Document node
+ if ((type == ELEMENT_NODE) || (type == DOCUMENT_NODE) ||
+ (type == ENTITY_REFERENCE_NODE)) {
+ // In case when Document root is given
+ if (nodeHandle == 0) nodeHandle = 1;
+ int kid = nodeHandle + 1;
+ nodes.readSlot(kid, gotslot);
+ while (ATTRIBUTE_NODE == (gotslot[0] & 0xFFFF)) {
+ // points to next sibling
+ kid = gotslot[2];
+ // Return NULL if node has only attributes
+ if (kid == NULL) return NULL;
+ nodes.readSlot(kid, gotslot);
+ }
+ // If parent slot matches given parent, return kid
+ if (gotslot[1] == nodeHandle)
+ {
+ int firstChild = kid | m_docHandle;
+
+ return firstChild;
+ }
+ }
+ // No child found
+
+ return NULL;
+ }
+
+ /**
+ * Given a node handle, advance to its last child.
+ * If not yet resolved, waits for more nodes to be added to the
document and
+ * tries again.
+ *
+ * @param nodeHandle int Handle of the node.
+ * @return int Node-number of last child,
+ * or DTM.NULL to indicate none exists.
+ */
+ public int getLastChild(int nodeHandle) {
+ // ###shs put trace/debug later
+ nodeHandle &= NODEHANDLE_MASK;
+ // do not need to test node type since getFirstChild does
that
+ int lastChild = NULL;
+ for (int nextkid = getFirstChild(nodeHandle); nextkid !=
NULL;
+ nextkid = getNextSibling(nextkid)) {
+ lastChild = nextkid;
+ }
+ return lastChild | m_docHandle;
+ }
+
+ /**
+ * Retrieves an attribute node by by qualified name and namespace
URI.
+ *
+ * @param nodeHandle int Handle of the node upon which to look up
this attribute.
+ * @param namespaceURI The namespace URI of the attribute to
+ * retrieve, or null.
+ * @param name The local name of the attribute to
+ * retrieve.
+ * @return The attribute node handle with the specified name (
+ * <code>nodeName</code>) or <code>DTM.NULL</code> if there is no
such
+ * attribute.
+ */
+ public int getAttributeNode(int nodeHandle, String namespaceURI,
String name) {
+ int nsIndex = m_nsNames.stringToIndex(namespaceURI),
+
nameIndex = m_localNames.stringToIndex(name);
+ nodeHandle &= NODEHANDLE_MASK;
+ nodes.readSlot(nodeHandle, gotslot);
+ short type = (short) (gotslot[0] & 0xFFFF);
+ // If nodeHandle points to element next slot would be first
attribute
+ if (type == ELEMENT_NODE)
+ nodeHandle++;
+ // Iterate through Attribute Nodes
+ while (type == ATTRIBUTE_NODE) {
+ if ((nsIndex == (gotslot[0] << 16)) && (gotslot[3]
== nameIndex))
+ return nodeHandle | m_docHandle;
+ // Goto next sibling
+ nodeHandle = gotslot[2];
+ nodes.readSlot(nodeHandle, gotslot);
+ }
+ return NULL;
+ }
+
+ /**
+ * Given a node handle, get the index of the node's first attribute.
+ *
+ * @param nodeHandle int Handle of the Element node.
+ * @return Handle of first attribute, or DTM.NULL to indicate none
exists.
+ */
+ public int getFirstAttribute(int nodeHandle) {
+ nodeHandle &= NODEHANDLE_MASK;
+
+ // %REVIEW% jjk: Just a quick observation: If you're going to
+ // call readEntry repeatedly on the same node, it may be
+ // more efficiently to do a readSlot to get the data locally,
+ // reducing the addressing and call-and-return overhead.
+
+ // Should we check if handle is element (do we want sanity
checks?)
+ if (ELEMENT_NODE != (nodes.readEntry(nodeHandle, 0) &
0xFFFF))
+ return NULL;
+ // First Attribute (if any) should be at next position in
table
+ nodeHandle++;
+ return(ATTRIBUTE_NODE == (nodes.readEntry(nodeHandle, 0) &
0xFFFF)) ?
+ nodeHandle | m_docHandle : NULL;
+ }
+
+ /**
+ * Given a node handle, get the index of the node's first child.
+ * If not yet resolved, waits for more nodes to be added to the
document and
+ * tries again
+ *
+ * @param nodeHandle handle to node, which should probably be an
element
+ * node, but need not be.
+ *
+ * @param inScope true if all namespaces in scope should be
returned,
+ * false if only the namespace declarations should
be
+ * returned.
+ * @return handle of first namespace, or DTM.NULL to indicate none
exists.
+ */
+ public int getFirstNamespaceNode(int nodeHandle, boolean inScope) {
+
+ return NULL;
+ }
+
+ /**
+ * Given a node handle, advance to its next sibling.
+ * %TBD% Remove - If not yet resolved, waits for more nodes to be
added to the document and
+ * tries again.
+ * @param nodeHandle int Handle of the node.
+ * @return int Node-number of next sibling,
+ * or DTM.NULL to indicate none exists.
+ */
+ public int getNextSibling(int nodeHandle) {
+ nodeHandle &= NODEHANDLE_MASK;
+ // Document root has no next sibling
+ if (nodeHandle == 0)
+ return NULL;
+
+ short type = (short) (nodes.readEntry(nodeHandle, 0) &
0xFFFF);
+ if ((type == ELEMENT_NODE) || (type == ATTRIBUTE_NODE) ||
+ (type == ENTITY_REFERENCE_NODE)) {
+ int nextSib = nodes.readEntry(nodeHandle, 2);
+ if (nextSib == NULL)
+ return NULL;
+ if (nextSib != 0)
+ return (m_docHandle | nextSib);
+ // ###shs should cycle/wait if nextSib is 0? Working
on threading next
+ }
+ // Next Sibling is in the next position if it shares the
same parent
+ int thisParent = nodes.readEntry(nodeHandle, 1);
+
+ // %REVIEW% jjk: Old code was reading from nodehandle+1.
+ // That would be ++nodeHandle, not nodeHandle++. Check this!
+ if (nodes.readEntry(nodeHandle++, 1) == thisParent)
+ return (m_docHandle | nodeHandle);
+
+ return NULL;
+ }
+
+ /**
+ * Given a node handle, find its preceeding sibling.
+ * WARNING: DTM is asymmetric; this operation is resolved by search,
and is
+ * relatively expensive.
+ *
+ * @param nodeHandle the id of the node.
+ * @return int Node-number of the previous sib,
+ * or DTM.NULL to indicate none exists.
+ */
+ public int getPreviousSibling(int nodeHandle) {
+ nodeHandle &= NODEHANDLE_MASK;
+ // Document root has no previous sibling
+ if (nodeHandle == 0)
+ return NULL;
+
+ int parent = nodes.readEntry(nodeHandle, 1);
+ int kid = NULL;
+ for (int nextkid = getFirstChild(parent); nextkid !=
nodeHandle;
+ nextkid = getNextSibling(nextkid)) {
+ kid = nextkid;
+ }
+ return kid | m_docHandle;
+ }
+
+ /**
+ * Given a node handle, advance to the next attribute. If an
+ * element, we advance to its first attribute; if an attr, we
advance to
+ * the next attr on the same node.
+ *
+ * @param nodeHandle int Handle of the node.
+ * @return int DTM node-number of the resolved attr,
+ * or DTM.NULL to indicate none exists.
+ */
+ public int getNextAttribute(int nodeHandle) {
+ nodeHandle &= NODEHANDLE_MASK;
+ nodes.readSlot(nodeHandle, gotslot);
+
+ //%REVIEW% Why are we using short here? There's no storage
+ //reduction for an automatic variable, especially one used
+ //so briefly, and it typically costs more cycles to process
+ //than an int would.
+ short type = (short) (gotslot[0] & 0xFFFF);
+
+ if (type == ELEMENT_NODE) {
+ return getFirstAttribute(nodeHandle);
+ } else if (type == ATTRIBUTE_NODE) {
+ if (gotslot[2] != NULL)
+ return (m_docHandle | gotslot[2]);
+ }
+ return NULL;
+ }
+
+ /**
+ * Given a namespace handle, advance to the next namespace.
+ *
+ * %TBD% THIS METHOD DOES NOT MATCH THE CURRENT SIGNATURE IN
+ * THE DTM INTERFACE. FIX IT, OR JUSTIFY CHANGING THE DTM
+ * API.
+ *
+ * @param namespaceHandle handle to node which must be of type
NAMESPACE_NODE.
+ * @return handle of next namespace, or DTM.NULL to indicate none
exists.
+ */
+ public int getNextNamespaceNode(int baseHandle,int namespaceHandle,
boolean inScope) {
+ // ###shs need to work on namespace
+ return NULL;
+ }
+
+ /**
+ * Given a node handle, advance to its next descendant.
+ * If not yet resolved, waits for more nodes to be added to the
document and
+ * tries again.
+ *
+ * @param subtreeRootNodeHandle
+ * @param nodeHandle int Handle of the node.
+ * @return handle of next descendant,
+ * or DTM.NULL to indicate none exists.
+ */
+ public int getNextDescendant(int subtreeRootHandle, int nodeHandle) {
+ subtreeRootHandle &= NODEHANDLE_MASK;
+ nodeHandle &= NODEHANDLE_MASK;
+ // Document root [Document Node? -- jjk] - no next-sib
+ if (nodeHandle == 0)
+ return NULL;
+ while (!m_isError) {
+ // Document done and node out of bounds
+ if (done && (nodeHandle > nodes.slotsUsed()))
+ break;
+ if (nodeHandle > subtreeRootHandle) {
+ nodes.readSlot(nodeHandle+1, gotslot);
+ if (gotslot[2] != 0) {
+ short type = (short) (gotslot[0] &
0xFFFF);
+ if (type == ATTRIBUTE_NODE) {
+ nodeHandle +=2;
+ } else {
+ int nextParentPos =
gotslot[1];
+ if (nextParentPos >=
subtreeRootHandle)
+ return (m_docHandle
| (nodeHandle+1));
+ else
+ break;
+ }
+ } else if (!done) {
+ // Add wait logic here
+ } else
+ break;
+ } else {
+ nodeHandle++;
+ }
+ }
+ // Probably should throw error here like original instead of
returning
+ return NULL;
+ }
- // ========= Document Navigation Functions =========
+ /**
+ * Given a node handle, advance to the next node on the following
axis.
+ *
+ * @param axisContextHandle the start of the axis that is being
traversed.
+ * @param nodeHandle
+ * @return handle of next sibling,
+ * or DTM.NULL to indicate none exists.
+ */
+ public int getNextFollowing(int axisContextHandle, int nodeHandle) {
+ //###shs still working on
+ return NULL;
+ }
+
+ /**
+ * Given a node handle, advance to the next node on the preceding
axis.
+ *
+ * @param axisContextHandle the start of the axis that is being
traversed.
+ * @param nodeHandle the id of the node.
+ * @return int Node-number of preceding sibling,
+ * or DTM.NULL to indicate none exists.
+ */
+ public int getNextPreceding(int axisContextHandle, int nodeHandle) {
+ // ###shs copied from Xalan 1, what is this suppose to do?
+ nodeHandle &= NODEHANDLE_MASK;
+ while (nodeHandle > 1) {
+ nodeHandle--;
+ if (ATTRIBUTE_NODE == (nodes.readEntry(nodeHandle,
0) & 0xFFFF))
+ continue;
+
+ // if nodeHandle is _not_ an ancestor of
+ // axisContextHandle, specialFind will return it.
+ // If it _is_ an ancestor, specialFind will return -1
+
+ // %REVIEW% unconditional return defeats the
+ // purpose of the while loop -- does this
+ // logic make any sense?
+
+ return (m_docHandle |
nodes.specialFind(axisContextHandle, nodeHandle));
+ }
+ return NULL;
+ }
+
+ /**
+ * Given a node handle, find its parent node.
+ *
+ * @param nodeHandle the id of the node.
+ * @return int Node-number of parent,
+ * or DTM.NULL to indicate none exists.
+ */
+ public int getParent(int nodeHandle) {
+ // Should check to see within range?
+
+ // Document Root should not have to be handled differently
+ return (m_docHandle | nodes.readEntry(nodeHandle, 1));
+ }
+
+ /**
+ * Returns the root element of the document.
+ * @return nodeHandle to the Document Root.
+ */
+ public int getDocumentRoot() {
+ return (m_docHandle | m_docElement);
+ }
+
+ /**
+ * Given a node handle, find the owning document node.
+ *
+ * @param nodeHandle the id of the node.
+ * @return int Node handle of document, which should always
be valid.
+ */
+ public int getDocument() {
+ return m_docHandle;
+ }
- /** Given a node handle, test if it has child nodes.
- * <p> %REVIEW% This is obviously useful at the DOM layer, where it
- * would permit testing this without having to create a proxy
- * node. It's less useful in the DTM API, where
- * (dtm.getFirstChild(nodeHandle)!=DTM.NULL) is just as fast and
- * almost as self-evident. But it's a convenience, and eases porting
- * of DOM code to DTM. </p>
- *
- * @param nodeHandle int Handle of the node.
- * @return int true if the given node has child nodes.
- */
- public boolean hasChildNodes(int nodeHandle) {
- return(getFirstChild(nodeHandle) != NULL);
- }
-
- /**
- * Given a node handle, get the handle of the node's first child.
- * If not yet resolved, waits for more nodes to be added to the
document and
- * tries again.
- *
- * @param nodeHandle int Handle of the node.
- * @return int DTM node-number of first child, or DTM.NULL to indicate
none exists.
- */
- public int getFirstChild(int nodeHandle) {
- // ###shs worry about tracing/debug later
- nodeHandle &= NODEHANDLE_MASK;
- // Read node into variable
- nodes.readSlot(nodeHandle, gotslot);
-
- // type is the last half of first slot
- short type = (short) (gotslot[0] & 0xFFFF);
-
- // Check to see if Element or Document node
- if ((type == ELEMENT_NODE) || (type == DOCUMENT_NODE) ||
- (type == ENTITY_REFERENCE_NODE)) {
- // In case when Document root is given
- if (nodeHandle == 0) nodeHandle = 1;
- int kid = nodeHandle + 1;
- nodes.readSlot(kid, gotslot);
- while (ATTRIBUTE_NODE == (gotslot[0] & 0xFFFF)) {
- // points to next sibling
- kid = gotslot[2];
- // Return NULL if node has only attributes
- if (kid == NULL) return NULL;
- nodes.readSlot(kid, gotslot);
- }
- // If parent slot matches given parent, return kid
- if (gotslot[1] == nodeHandle) return kid |
m_docHandle;
- }
- // No child found
- return NULL;
- }
-
- /**
- * Given a node handle, advance to its last child.
- * If not yet resolved, waits for more nodes to be added to the document
and
- * tries again.
- *
- * @param nodeHandle int Handle of the node.
- * @return int Node-number of last child,
- * or DTM.NULL to indicate none exists.
- */
- public int getLastChild(int nodeHandle) {
- // ###shs put trace/debug later
- nodeHandle &= NODEHANDLE_MASK;
- // do not need to test node type since getFirstChild does that
- int lastChild = NULL;
- for (int nextkid = getFirstChild(nodeHandle); nextkid != NULL;
- nextkid = getNextSibling(nextkid)) {
- lastChild = nextkid;
- }
- return lastChild | m_docHandle;
- }
-
- /**
- * Retrieves an attribute node by by qualified name and namespace URI.
- *
- * @param nodeHandle int Handle of the node upon which to look up this
attribute.
- * @param namespaceURI The namespace URI of the attribute to
- * retrieve, or null.
- * @param name The local name of the attribute to
- * retrieve.
- * @return The attribute node handle with the specified name (
- * <code>nodeName</code>) or <code>DTM.NULL</code> if there is no such
- * attribute.
- */
- public int getAttributeNode(int nodeHandle, String namespaceURI, String
name) {
- int nsIndex = m_nsNames.stringToIndex(namespaceURI),
-
nameIndex = m_localNames.stringToIndex(name);
- nodeHandle &= NODEHANDLE_MASK;
- nodes.readSlot(nodeHandle, gotslot);
- short type = (short) (gotslot[0] & 0xFFFF);
- // If nodeHandle points to element next slot would be first
attribute
- if (type == ELEMENT_NODE)
- nodeHandle++;
- // Iterate through Attribute Nodes
- while (type == ATTRIBUTE_NODE) {
- if ((nsIndex == (gotslot[0] << 16)) && (gotslot[3] ==
nameIndex))
- return nodeHandle | m_docHandle;
- // Goto next sibling
- nodeHandle = gotslot[2];
- nodes.readSlot(nodeHandle, gotslot);
- }
- return NULL;
- }
-
- /**
- * Given a node handle, get the index of the node's first attribute.
- *
- * @param nodeHandle int Handle of the Element node.
- * @return Handle of first attribute, or DTM.NULL to indicate none
exists.
- */
- public int getFirstAttribute(int nodeHandle) {
- nodeHandle &= NODEHANDLE_MASK;
-
- // %REVIEW% jjk: Just a quick observation: If you're going to
- // call readEntry repeatedly on the same node, it may be
- // more efficiently to do a readSlot to get the data locally,
- // reducing the addressing and call-and-return overhead.
-
- // Should we check if handle is element (do we want sanity
checks?)
- if (ELEMENT_NODE != (nodes.readEntry(nodeHandle, 0) & 0xFFFF))
- return NULL;
- // First Attribute (if any) should be at next position in table
- nodeHandle++;
- return(ATTRIBUTE_NODE == (nodes.readEntry(nodeHandle, 0) &
0xFFFF)) ?
- nodeHandle | m_docHandle : NULL;
- }
-
- /**
- * Given a node handle, get the index of the node's first child.
- * If not yet resolved, waits for more nodes to be added to the
document and
- * tries again
- *
- * @param nodeHandle handle to node, which should probably be an element
- * node, but need not be.
- *
- * @param inScope true if all namespaces in scope should be returned,
- * false if only the namespace declarations should be
- * returned.
- * @return handle of first namespace, or DTM.NULL to indicate none
exists.
- */
- public int getFirstNamespaceNode(int nodeHandle, boolean inScope) {
-
- return NULL;
- }
-
- /**
- * Given a node handle, advance to its next sibling.
- * %TBD% Remove - If not yet resolved, waits for more nodes to be added
to the document and
- * tries again.
- * @param nodeHandle int Handle of the node.
- * @return int Node-number of next sibling,
- * or DTM.NULL to indicate none exists.
- */
- public int getNextSibling(int nodeHandle) {
- nodeHandle &= NODEHANDLE_MASK;
- // Document root has no next sibling
- if (nodeHandle == 0)
- return NULL;
-
- short type = (short) (nodes.readEntry(nodeHandle, 0) & 0xFFFF);
- if ((type == ELEMENT_NODE) || (type == ATTRIBUTE_NODE) ||
- (type == ENTITY_REFERENCE_NODE)) {
- int nextSib = nodes.readEntry(nodeHandle, 2);
- if (nextSib == NULL)
- return NULL;
- if (nextSib != 0)
- return (m_docHandle | nextSib);
- // ###shs should cycle/wait if nextSib is 0? Working on
threading next
- }
- // Next Sibling is in the next position if it shares the same
parent
- int thisParent = nodes.readEntry(nodeHandle, 1);
-
- // %REVIEW% jjk: Old code was reading from nodehandle+1.
- // That would be ++nodeHandle, not nodeHandle++. Check this!
- if (nodes.readEntry(nodeHandle++, 1) == thisParent)
- return (m_docHandle | nodeHandle);
-
- return NULL;
- }
-
- /**
- * Given a node handle, find its preceeding sibling.
- * WARNING: DTM is asymmetric; this operation is resolved by search,
and is
- * relatively expensive.
- *
- * @param nodeHandle the id of the node.
- * @return int Node-number of the previous sib,
- * or DTM.NULL to indicate none exists.
- */
- public int getPreviousSibling(int nodeHandle) {
- nodeHandle &= NODEHANDLE_MASK;
- // Document root has no previous sibling
- if (nodeHandle == 0)
- return NULL;
-
- int parent = nodes.readEntry(nodeHandle, 1);
- int kid = NULL;
- for (int nextkid = getFirstChild(parent); nextkid != nodeHandle;
- nextkid = getNextSibling(nextkid)) {
- kid = nextkid;
- }
- return kid | m_docHandle;
- }
-
- /**
- * Given a node handle, advance to the next attribute. If an
- * element, we advance to its first attribute; if an attr, we advance to
- * the next attr on the same node.
- *
- * @param nodeHandle int Handle of the node.
- * @return int DTM node-number of the resolved attr,
- * or DTM.NULL to indicate none exists.
- */
- public int getNextAttribute(int nodeHandle) {
- nodeHandle &= NODEHANDLE_MASK;
- nodes.readSlot(nodeHandle, gotslot);
-
- //%REVIEW% Why are we using short here? There's no storage
- //reduction for an automatic variable, especially one used
- //so briefly, and it typically costs more cycles to process
- //than an int would.
- short type = (short) (gotslot[0] & 0xFFFF);
-
- if (type == ELEMENT_NODE) {
- return getFirstAttribute(nodeHandle);
- } else if (type == ATTRIBUTE_NODE) {
- if (gotslot[2] != NULL)
- return (m_docHandle | gotslot[2]);
- }
- return NULL;
- }
-
- /**
- * Given a namespace handle, advance to the next namespace.
- *
- * %TBD% THIS METHOD DOES NOT MATCH THE CURRENT SIGNATURE IN
- * THE DTM INTERFACE. FIX IT, OR JUSTIFY CHANGING THE DTM
- * API.
- *
- * @param namespaceHandle handle to node which must be of type
NAMESPACE_NODE.
- * @return handle of next namespace, or DTM.NULL to indicate none
exists.
- */
- public int getNextNamespaceNode(int baseHandle,int namespaceHandle,
boolean inScope) {
- // ###shs need to work on namespace
- return NULL;
- }
-
- /**
- * Given a node handle, advance to its next descendant.
- * If not yet resolved, waits for more nodes to be added to the
document and
- * tries again.
- *
- * @param subtreeRootNodeHandle
- * @param nodeHandle int Handle of the node.
- * @return handle of next descendant,
- * or DTM.NULL to indicate none exists.
- */
- public int getNextDescendant(int subtreeRootHandle, int nodeHandle) {
- subtreeRootHandle &= NODEHANDLE_MASK;
- nodeHandle &= NODEHANDLE_MASK;
- // Document root [Document Node? -- jjk] - no next-sib
- if (nodeHandle == 0)
- return NULL;
- while (!m_isError) {
- // Document done and node out of bounds
- if (done && (nodeHandle > nodes.slotsUsed()))
- break;
- if (nodeHandle > subtreeRootHandle) {
- nodes.readSlot(nodeHandle+1, gotslot);
- if (gotslot[2] != 0) {
- short type = (short) (gotslot[0] &
0xFFFF);
- if (type == ATTRIBUTE_NODE) {
- nodeHandle +=2;
- } else {
- int nextParentPos = gotslot[1];
- if (nextParentPos >=
subtreeRootHandle)
- return (m_docHandle |
(nodeHandle+1));
- else
- break;
- }
- } else if (!done) {
- // Add wait logic here
- } else
- break;
- } else {
- nodeHandle++;
- }
- }
- // Probably should throw error here like original instead of
returning
- return NULL;
- }
-
- /**
- * Given a node handle, advance to the next node on the following axis.
- *
- * @param axisContextHandle the start of the axis that is being
traversed.
- * @param nodeHandle
- * @return handle of next sibling,
- * or DTM.NULL to indicate none exists.
- */
- public int getNextFollowing(int axisContextHandle, int nodeHandle) {
- //###shs still working on
- return NULL;
- }
-
- /**
- * Given a node handle, advance to the next node on the preceding axis.
- *
- * @param axisContextHandle the start of the axis that is being
traversed.
- * @param nodeHandle the id of the node.
- * @return int Node-number of preceding sibling,
- * or DTM.NULL to indicate none exists.
- */
- public int getNextPreceding(int axisContextHandle, int nodeHandle) {
- // ###shs copied from Xalan 1, what is this suppose to do?
- nodeHandle &= NODEHANDLE_MASK;
- while (nodeHandle > 1) {
- nodeHandle--;
- if (ATTRIBUTE_NODE == (nodes.readEntry(nodeHandle, 0) &
0xFFFF))
- continue;
-
- // if nodeHandle is _not_ an ancestor of
- // axisContextHandle, specialFind will return it.
- // If it _is_ an ancestor, specialFind will return -1
-
- // %REVIEW% unconditional return defeats the
- // purpose of the while loop -- does this
- // logic make any sense?
-
- return (m_docHandle |
nodes.specialFind(axisContextHandle, nodeHandle));
- }
- return NULL;
- }
-
- /**
- * Given a node handle, find its parent node.
- *
- * @param nodeHandle the id of the node.
- * @return int Node-number of parent,
- * or DTM.NULL to indicate none exists.
- */
- public int getParent(int nodeHandle) {
- // Should check to see within range?
-
- // Document Root should not have to be handled differently
- return (m_docHandle | nodes.readEntry(nodeHandle, 1));
- }
-
- /**
- * Returns the root element of the document.
- * @return nodeHandle to the Document Root.
- */
- public int getDocumentRoot() {
- return (m_docHandle | m_docElement);
- }
-
- /**
- * Given a node handle, find the owning document node.
- *
- * @param nodeHandle the id of the node.
- * @return int Node handle of document, which should always be
valid.
- */
- public int getDocument() {
- return m_docHandle;
- }
-
- /**
- * Given a node handle, find the owning document node. This has the
exact
- * same semantics as the DOM Document method of the same name, in that
if
- * the nodeHandle is a document node, it will return NULL.
- *
- * <p>%REVIEW% Since this is DOM-specific, it may belong at the DOM
- * binding layer. Included here as a convenience function and to
- * aid porting of DOM code to DTM.</p>
- *
- * @param nodeHandle the id of the node.
- * @return int Node handle of owning document, or NULL if the
nodeHandle is
- * a document.
- */
- public int getOwnerDocument(int nodeHandle) {
- // Assumption that Document Node is always in 0 slot
- if ((nodeHandle & NODEHANDLE_MASK) == 0)
- return NULL;
- return (nodeHandle & DOCHANDLE_MASK);
- }
-
-
- /**
- * Get the string-value of a node as a String object
- * (see http://www.w3.org/TR/xpath#data-model
- * for the definition of a node's string-value).
- *
- * @param nodeHandle The node ID.
- *
- * @return A string object that represents the string-value of the
given node.
- */
- public String getStringValue(int nodeHandle) {
- // ###zaj - researching
- nodes.readSlot(nodeHandle, gotslot);
- int nodetype=gotslot[0] & 0xFF;
- String value=null;
-
- switch (nodetype) {
- case TEXT_NODE:
- case COMMENT_NODE:
- case CDATA_SECTION_NODE:
- value=m_char.getString(gotslot[2], gotslot[3]);
- break;
- case PROCESSING_INSTRUCTION_NODE:
- case ATTRIBUTE_NODE:
- case ELEMENT_NODE:
- case ENTITY_REFERENCE_NODE:
- default:
- break;
- }
- return value;
-
- }
-
- /**
- * Get number of character array chunks in
- * the string-value of a node.
- * (see http://www.w3.org/TR/xpath#data-model
- * for the definition of a node's string-value).
- * Note that a single text node may have multiple text chunks.
- *
- * EXPLANATION: This method is an artifact of the fact that the
- * underlying m_chars object may not store characters in a
- * single contiguous array -- for example,the current
- * FastStringBuffer may split a single node's text across
- * multiple allocation units. This call tells us how many
- * separate accesses will be required to retrieve the entire
- * content. PLEASE NOTE that this may not be the same as the
- * number of SAX characters() events that caused the text node
- * to be built in the first place, since m_chars buffering may
- * be on different boundaries than the parser's buffers.
- *
- * @param nodeHandle The node ID.
- *
- * @return number of character array chunks in
- * the string-value of a node.
- * */
- //###zaj - tbd
- public int getStringValueChunkCount(int nodeHandle)
- {
- //###zaj return value
- return 0;
- }
-
- /**
- * Get a character array chunk in the string-value of a node.
- * (see http://www.w3.org/TR/xpath#data-model
- * for the definition of a node's string-value).
- * Note that a single text node may have multiple text chunks.
- *
- * EXPLANATION: This method is an artifact of the fact that
- * the underlying m_chars object may not store characters in a
- * single contiguous array -- for example,the current
- * FastStringBuffer may split a single node's text across
- * multiple allocation units. This call retrieves a single
- * contiguous portion of the text -- as much as m-chars was
- * able to store in a single allocation unit. PLEASE NOTE
- * that this may not be the same granularityas the SAX
- * characters() events that caused the text node to be built
- * in the first place, since m_chars buffering may be on
- * different boundaries than the parser's buffers.
- *
- * @param nodeHandle The node ID.
- * @param chunkIndex Which chunk to get.
- * @param startAndLen An array of 2 where the start position and length
of
- * the chunk will be returned.
- *
- * @return The character array reference where the chunk occurs. */
- //###zaj - tbd
- public char[] getStringValueChunk(int nodeHandle, int chunkIndex,
-
int[]
startAndLen) {return new char[0];}
-
- /**
- * Given a node handle, return an ID that represents the node's
expanded name.
- *
- * @param nodeHandle The handle to the node in question.
- *
- * @return the expanded-name id of the node.
- */
- public int getExpandedNameID(int nodeHandle) {
- nodes.readSlot(nodeHandle, gotslot);
+ /**
+ * Given a node handle, find the owning document node. This has the
exact
+ * same semantics as the DOM Document method of the same name, in
that if
+ * the nodeHandle is a document node, it will return NULL.
+ *
+ * <p>%REVIEW% Since this is DOM-specific, it may belong at the DOM
+ * binding layer. Included here as a convenience function and to
+ * aid porting of DOM code to DTM.</p>
+ *
+ * @param nodeHandle the id of the node.
+ * @return int Node handle of owning document, or NULL if the
nodeHandle is
+ * a document.
+ */
+ public int getOwnerDocument(int nodeHandle) {
+ // Assumption that Document Node is always in 0 slot
+ if ((nodeHandle & NODEHANDLE_MASK) == 0)
+ return NULL;
+ return (nodeHandle & DOCHANDLE_MASK);
+ }
+
+
+ /**
+ * Get the string-value of a node as a String object
+ * (see http://www.w3.org/TR/xpath#data-model
+ * for the definition of a node's string-value).
+ *
+ * @param nodeHandle The node ID.
+ *
+ * @return A string object that represents the string-value of the
given node.
+ */
+ public String getStringValue(int nodeHandle) {
+ // ###zaj - researching
+ nodes.readSlot(nodeHandle, gotslot);
+ int nodetype=gotslot[0] & 0xFF;
+ String value=null;
+
+ switch (nodetype) {
+ case TEXT_NODE:
+ case COMMENT_NODE:
+ case CDATA_SECTION_NODE:
+ value=m_char.getString(gotslot[2], gotslot[3]);
+ break;
+ case PROCESSING_INSTRUCTION_NODE:
+ case ATTRIBUTE_NODE:
+ case ELEMENT_NODE:
+ case ENTITY_REFERENCE_NODE:
+ default:
+ break;
+ }
+ return value;
+
+ }
+ /**
+ * Get number of character array chunks in
+ * the string-value of a node.
+ * (see http://www.w3.org/TR/xpath#data-model
+ * for the definition of a node's string-value).
+ * Note that a single text node may have multiple text chunks.
+ *
+ * EXPLANATION: This method is an artifact of the fact that the
+ * underlying m_chars object may not store characters in a
+ * single contiguous array -- for example,the current
+ * FastStringBuffer may split a single node's text across
+ * multiple allocation units. This call tells us how many
+ * separate accesses will be required to retrieve the entire
+ * content. PLEASE NOTE that this may not be the same as the
+ * number of SAX characters() events that caused the text node
+ * to be built in the first place, since m_chars buffering may
+ * be on different boundaries than the parser's buffers.
+ *
+ * @param nodeHandle The node ID.
+ *
+ * @return number of character array chunks in
+ * the string-value of a node.
+ * */
+ //###zaj - tbd
+ public int getStringValueChunkCount(int nodeHandle)
+ {
+ //###zaj return value
+ return 0;
+ }
+
+ /**
+ * Get a character array chunk in the string-value of a node.
+ * (see http://www.w3.org/TR/xpath#data-model
+ * for the definition of a node's string-value).
+ * Note that a single text node may have multiple text chunks.
+ *
+ * EXPLANATION: This method is an artifact of the fact that
+ * the underlying m_chars object may not store characters in a
+ * single contiguous array -- for example,the current
+ * FastStringBuffer may split a single node's text across
+ * multiple allocation units. This call retrieves a single
+ * contiguous portion of the text -- as much as m-chars was
+ * able to store in a single allocation unit. PLEASE NOTE
+ * that this may not be the same granularityas the SAX
+ * characters() events that caused the text node to be built
+ * in the first place, since m_chars buffering may be on
+ * different boundaries than the parser's buffers.
+ *
+ * @param nodeHandle The node ID.
+ * @param chunkIndex Which chunk to get.
+ * @param startAndLen An array of 2 where the start position and
length of
+ * the chunk will be returned.
+ *
+ * @return The character array reference where the chunk occurs. */
+ //###zaj - tbd
+ public char[] getStringValueChunk(int nodeHandle, int chunkIndex,
+
int[]
startAndLen) {return new char[0];}
+
+ /**
+ * Given a node handle, return an ID that represents the node's
expanded name.
+ *
+ * @param nodeHandle The handle to the node in question.
+ *
+ * @return the expanded-name id of the node.
+ */
+ public int getExpandedNameID(int nodeHandle) {
+ nodes.readSlot(nodeHandle, gotslot);
+
String qName = m_localNames.indexToString(gotslot[3]);
// Remove prefix from qName
- // %TBD% jjk This is assuming the elementName is the qName.
- int colonpos = qName.indexOf(":");
- String localName = qName.substring(colonpos+1);
- // Get NS
+ // %TBD% jjk This is assuming the elementName is the qName.
+ int colonpos = qName.indexOf(":");
+ String localName = qName.substring(colonpos+1);
+ // Get NS
String namespace = m_nsNames.indexToString(gotslot[0] << 16);
- // Create expanded name
- String expandedName = namespace + ":" + localName;
- int expandedNameID = m_nsNames.stringToIndex(expandedName);
+ // Create expanded name
+ String expandedName = namespace + ":" + localName;
+ int expandedNameID = m_nsNames.stringToIndex(expandedName);
return expandedNameID;
}
/**
- * Given an expanded name, return an ID. If the expanded-name does not
- * exist in the internal tables, the entry will be created, and the ID
will
- * be returned. Any additional nodes that are created that have this
- * expanded name will use this ID.
- *
- * @param nodeHandle The handle to the node in question.
- *
- * @return the expanded-name id of the node.
- */
+ * Given an expanded name, return an ID. If the expanded-name does
not
+ * exist in the internal tables, the entry will be created, and the
ID will
+ * be returned. Any additional nodes that are created that have this
+ * expanded name will use this ID.
+ *
+ * @param nodeHandle The handle to the node in question.
+ *
+ * @return the expanded-name id of the node.
+ */
public int getExpandedNameID(String namespace, String localName, int
type) {
- // Create expanded name
- // %TBD% jjk Expanded name is bitfield-encoded as
- // typeID[6]nsuriID[10]localID[16]. Switch to that form, and to
- // accessing the ns/local via their tables rather than confusing
- // nsnames and expandednames.
- String expandedName = namespace + ":" + localName;
- int expandedNameID = m_nsNames.stringToIndex(expandedName);
-
- return expandedNameID;
- }
+ // Create expanded name
+ // %TBD% jjk Expanded name is bitfield-encoded as
+ // typeID[6]nsuriID[10]localID[16]. Switch to that form, and to
+ // accessing the ns/local via their tables rather than confusing
+ // nsnames and expandednames.
+ String expandedName = namespace + ":" + localName;
+ int expandedNameID = m_nsNames.stringToIndex(expandedName);
+ return expandedNameID;
+ }
- /**
- * Given an expanded-name ID, return the local name part.
- *
- * @param ExpandedNameID an ID that represents an expanded-name.
- * @return String Local name of this node.
- */
- public String getLocalNameFromExpandedNameID(int ExpandedNameID) {
-
- // Get expanded name
- String expandedName = m_localNames.indexToString(ExpandedNameID);
- // Remove prefix from expanded name
- int colonpos = expandedName.indexOf(":");
- String localName = expandedName.substring(colonpos+1);
+ /**
+ * Given an expanded-name ID, return the local name part.
+ *
+ * @param ExpandedNameID an ID that represents an expanded-name.
+ * @return String Local name of this node.
+ */
+ public String getLocalNameFromExpandedNameID(int ExpandedNameID) {
+
+ // Get expanded name
+ String expandedName = m_localNames.indexToString(ExpandedNameID);
+ // Remove prefix from expanded name
+ int colonpos = expandedName.indexOf(":");
+ String localName = expandedName.substring(colonpos+1);
+
return localName;
- }
+ }
+
+
+ /**
+ * Given an expanded-name ID, return the namespace URI part.
+ *
+ * @param ExpandedNameID an ID that represents an expanded-name.
+ * @return String URI value of this node's namespace, or null if no
+ * namespace was resolved.
+ */
+ public String getNamespaceFromExpandedNameID(int ExpandedNameID) {
+
+ String expandedName = m_localNames.indexToString(ExpandedNameID);
+ // Remove local name from expanded name
+ int colonpos = expandedName.indexOf(":");
+ String nsName = expandedName.substring(0, colonpos);
+
+ return nsName;
+ }
+
+
+ /**
+ * fixednames
+ */
+ static final String[] fixednames=
+ {
+ null,null,
// nothing, Element
+ null,"#text",
// Attr, Text
+ "#cdata_section",null, // CDATA, EntityReference
+ null,null,
// Entity, PI
+ "#comment","#document", // Comment, Document
+ null,"#document-fragment", // Doctype, DocumentFragment
+ null};
// Notation
+
+ /**
+ * Given a node handle, return its DOM-style node name. This will
+ * include names such as #text or #document.
+ *
+ * @param nodeHandle the id of the node.
+ * @return String Name of this node, which may be an empty string.
+ * %REVIEW% Document when empty string is possible...
+ */
+ public String getNodeName(int nodeHandle) {
+ nodes.readSlot(nodeHandle, gotslot);
+ short type = (short) (gotslot[0] & 0xFFFF);
+ String name = fixednames[type];
+ if (null == name) {
+ if (type == ELEMENT_NODE)
+ name =
m_localNames.indexToString(gotslot[3]);
+ else if (type == ATTRIBUTE_NODE)
+ name =
m_localNames.indexToString(gotslot[3]);
+ }
+ return name;
+ }
+ /**
+ * Given a node handle, return the XPath node name. This should be
+ * the name as described by the XPath data model, NOT the DOM-style
+ * name.
+ *
+ * @param nodeHandle the id of the node.
+ * @return String Name of this node.
+ */
+ public String getNodeNameX(int nodeHandle) {return null;}
+
+ /**
+ * Given a node handle, return its DOM-style localname.
+ * (As defined in Namespaces, this is the portion of the name after
any
+ * colon character)
+ *
+ * @param nodeHandle the id of the node.
+ * @return String Local name of this node.
+ */
+ public String getLocalName(int nodeHandle) {
+ String name = getNodeName(nodeHandle);
+ if (null != name) {
+ int colonpos = name.indexOf(":");
+ return (colonpos < 0) ? name :
name.substring(colonpos+1);
+ }
+ return null;
+ }
+
+ /**
+ * Given a namespace handle, return the prefix that the namespace
decl is
+ * mapping.
+ * Given a node handle, return the prefix used to map to the
namespace.
+ *
+ * <p> %REVIEW% Are you sure you want "" for no prefix? </p>
+ *
+ * @param nodeHandle the id of the node.
+ * @return String prefix of this node's name, or "" if no explicit
+ * namespace prefix was given.
+ */
+ public String getPrefix(int nodeHandle) {
+ String name = getNodeName(nodeHandle);
+ int colonpos = name.indexOf(":");
+ return (colonpos < 0) ? "" : name.substring(0, colonpos);
+ }
+
+ /**
+ * Given a node handle, return its DOM-style namespace URI
+ * (As defined in Namespaces, this is the declared URI which this
node's
+ * prefix -- or default in lieu thereof -- was mapped to.)
+ *
+ * @param nodeHandle the id of the node.
+ * @return String URI value of this node's namespace, or null if no
+ * namespace was resolved.
+ */
+ public String getNamespaceURI(int nodeHandle) {return null;}
+
+ /**
+ * Given a node handle, return its node value. This is mostly
+ * as defined by the DOM, but may ignore some conveniences.
+ * <p>
+ *
+ * @param nodeHandle The node id.
+ * @return String Value of this node, or null if not
+ * meaningful for this node type.
+ */
+ public String getNodeValue(int nodeHandle)
+ {
+ nodes.readSlot(nodeHandle, gotslot);
+ int nodetype=gotslot[0] & 0xFF; // ###zaj use
mask to get node type
+ String value=null;
+
+ switch (nodetype) { // ###zaj todo -
document nodetypes
+ case ATTRIBUTE_NODE:
+ nodes.readSlot(nodeHandle+1, gotslot);
+ case TEXT_NODE:
+ case COMMENT_NODE:
+ case CDATA_SECTION_NODE:
+ value=m_char.getString(gotslot[2], gotslot[3]);
//###zaj
+ break;
+ case PROCESSING_INSTRUCTION_NODE:
+ case ELEMENT_NODE:
+ case ENTITY_REFERENCE_NODE:
+ default:
+ break;
+ }
+ return value;
+ }
+
+ /**
+ * Given a node handle, return its DOM-style node type.
+ * <p>
+ * %REVIEW% Generally, returning short is false economy. Return int?
+ *
+ * @param nodeHandle The node id.
+ * @return int Node type, as per the DOM's Node._NODE constants.
+ */
+ public short getNodeType(int nodeHandle) {
+ return(short) (nodes.readEntry(nodeHandle, 0) & 0xFFFF);
+ }
- /**
- * Given an expanded-name ID, return the namespace URI part.
- *
- * @param ExpandedNameID an ID that represents an expanded-name.
- * @return String URI value of this node's namespace, or null if no
- * namespace was resolved.
- */
- public String getNamespaceFromExpandedNameID(int ExpandedNameID) {
-
- String expandedName = m_localNames.indexToString(ExpandedNameID);
- // Remove local name from expanded name
- int colonpos = expandedName.indexOf(":");
- String nsName = expandedName.substring(0, colonpos);
-
- return nsName;
- }
-
-
- /**
- * fixednames
- */
- static final String[] fixednames=
- {
- null,null,
// nothing, Element
- null,"#text", //
Attr, Text
- "#cdata_section",null, // CDATA, EntityReference
- null,null,
// Entity, PI
- "#comment","#document", // Comment, Document
- null,"#document-fragment", // Doctype, DocumentFragment
- null};
// Notation
-
- /**
- * Given a node handle, return its DOM-style node name. This will
- * include names such as #text or #document.
- *
- * @param nodeHandle the id of the node.
- * @return String Name of this node, which may be an empty string.
- * %REVIEW% Document when empty string is possible...
- */
- public String getNodeName(int nodeHandle) {
- nodes.readSlot(nodeHandle, gotslot);
- short type = (short) (gotslot[0] & 0xFFFF);
- String name = fixednames[type];
- if (null == name) {
- if (type == ELEMENT_NODE)
- name = m_localNames.indexToString(gotslot[3]);
- else if (type == ATTRIBUTE_NODE)
- name = m_localNames.indexToString(gotslot[3]);
- }
- return name;
- }
-
- /**
- * Given a node handle, return the XPath node name. This should be
- * the name as described by the XPath data model, NOT the DOM-style
- * name.
- *
- * @param nodeHandle the id of the node.
- * @return String Name of this node.
- */
- public String getNodeNameX(int nodeHandle) {return null;}
-
- /**
- * Given a node handle, return its DOM-style localname.
- * (As defined in Namespaces, this is the portion of the name after any
- * colon character)
- *
- * @param nodeHandle the id of the node.
- * @return String Local name of this node.
- */
- public String getLocalName(int nodeHandle) {
- String name = getNodeName(nodeHandle);
- if (null != name) {
- int colonpos = name.indexOf(":");
- return (colonpos < 0) ? name :
name.substring(colonpos+1);
- }
- return null;
- }
-
- /**
- * Given a namespace handle, return the prefix that the namespace decl
is
- * mapping.
- * Given a node handle, return the prefix used to map to the namespace.
- *
- * <p> %REVIEW% Are you sure you want "" for no prefix? </p>
- *
- * @param nodeHandle the id of the node.
- * @return String prefix of this node's name, or "" if no explicit
- * namespace prefix was given.
- */
- public String getPrefix(int nodeHandle) {
- String name = getNodeName(nodeHandle);
- int colonpos = name.indexOf(":");
- return (colonpos < 0) ? "" : name.substring(0, colonpos);
- }
-
- /**
- * Given a node handle, return its DOM-style namespace URI
- * (As defined in Namespaces, this is the declared URI which this node's
- * prefix -- or default in lieu thereof -- was mapped to.)
- *
- * @param nodeHandle the id of the node.
- * @return String URI value of this node's namespace, or null if no
- * namespace was resolved.
- */
- public String getNamespaceURI(int nodeHandle) {return null;}
-
- /**
- * Given a node handle, return its node value. This is mostly
- * as defined by the DOM, but may ignore some conveniences.
- * <p>
- *
- * @param nodeHandle The node id.
- * @return String Value of this node, or null if not
- * meaningful for this node type.
- */
- public String getNodeValue(int nodeHandle)
- {
- nodes.readSlot(nodeHandle, gotslot);
- int nodetype=gotslot[0] & 0xFF; // ###zaj use mask to
get node type
- String value=null;
-
- switch (nodetype) { // ###zaj todo -
document nodetypes
- case ATTRIBUTE_NODE:
- nodes.readSlot(nodeHandle+1, gotslot);
- case TEXT_NODE:
- case COMMENT_NODE:
- case CDATA_SECTION_NODE:
- value=m_char.getString(gotslot[2], gotslot[3]);
//###zaj
- break;
- case PROCESSING_INSTRUCTION_NODE:
- case ELEMENT_NODE:
- case ENTITY_REFERENCE_NODE:
- default:
- break;
- }
- return value;
- }
-
- /**
- * Given a node handle, return its DOM-style node type.
- * <p>
- * %REVIEW% Generally, returning short is false economy. Return int?
- *
- * @param nodeHandle The node id.
- * @return int Node type, as per the DOM's Node._NODE constants.
- */
- public short getNodeType(int nodeHandle) {
- return(short) (nodes.readEntry(nodeHandle, 0) & 0xFFFF);
- }
-
- /**
- * <meta name="usage" content="internal"/>
- * Get the depth level of this node in the tree (equals 1 for
- * a parentless node).
- *
- * @param nodeHandle The node id.
- * @return the number of ancestors, plus one
- */
- public short getLevel(int nodeHandle) {
- short count = 0;
- while (nodeHandle != 0) {
- count++;
- nodeHandle = nodes.readEntry(nodeHandle, 1);
- }
- return count;
- }
-
- // ============== Document query functions ==============
-
- /**
- * Tests whether DTM DOM implementation implements a specific feature
and
- * that feature is supported by this node.
- *
- * @param feature The name of the feature to test.
- * @param versionThis is the version number of the feature to test.
- * If the version is not
- * specified, supporting any version of the feature will cause the
- * method to return <code>true</code>.
- * @return Returns <code>true</code> if the specified feature is
- * supported on this node, <code>false</code> otherwise.
- */
- public boolean isSupported(String feature,
-
String version) {return false;}
-
- /**
- * Return the base URI of the document entity. If it is not known
- * (because the document was parsed from a socket connection or from
- * standard input, for example), the value of this property is unknown.
- *
- * @param nodeHandle The node id, which can be any valid node handle.
- * @return the document base URI String object or null if unknown.
- */
- public String getDocumentBaseURI(int nodeHandle) {return null;}
-
- /**
- * Return the system identifier of the document entity. If
- * it is not known, the value of this property is unknown.
- *
- * @param nodeHandle The node id, which can be any valid node handle.
- * @return the system identifier String object or null if unknown.
- */
- public String getDocumentSystemIdentifier(int nodeHandle) {return null;}
-
- /**
- * Return the name of the character encoding scheme
- * in which the document entity is expressed.
- *
- * @param nodeHandle The node id, which can be any valid node handle.
- * @return the document encoding String object.
- */
- public String getDocumentEncoding(int nodeHandle) {return null;}
-
- /**
- * Return an indication of the standalone status of the document,
- * either "yes" or "no". This property is derived from the
optional
- * standalone document declaration in the XML declaration at the
- * beginning of the document entity, and has no value if there
is no
- * standalone document declaration.
- *
- * @param nodeHandle The node id, which can be any valid node handle.
- * @return the document standalone String object, either "yes", "no",
or null.
- */
- public String getDocumentStandalone(int nodeHandle) {return null;}
-
- /**
- * Return a string representing the XML version of the document. This
- * property is derived from the XML declaration optionally present at
the
- * beginning of the document entity, and has no value if there is no XML
- * declaration.
- *
- * @param the document handle
- *
- * @return the document version String object
- */
- public String getDocumentVersion(int documentHandle) {return null;}
-
- /**
- * Return an indication of
- * whether the processor has read the complete DTD. Its value is a
- * boolean. If it is false, then certain properties (indicated in their
- * descriptions below) may be unknown. If it is true, those properties
- * are never unknown.
- *
- * @return <code>true</code> if all declarations were processed {};
- * <code>false</code> otherwise.
- */
- public boolean getDocumentAllDeclarationsProcessed() {return false;}
-
- /**
- * A document type declaration information item has the following
properties:
- *
- * 1. [system identifier] The system identifier of the external
subset, if
- * it exists. Otherwise this property has no value.
- *
- * @return the system identifier String object, or null if there is
none.
- */
- public String getDocumentTypeDeclarationSystemIdentifier() {return
null;}
-
- /**
- * Return the public identifier of the external subset,
- * normalized as described in 4.2.2 External Entities [XML]. If there is
- * no external subset or if it has no public identifier, this property
- * has no value.
- *
- * @param the document type declaration handle
- *
- * @return the public identifier String object, or null if there is
none.
- */
- public String getDocumentTypeDeclarationPublicIdentifier() {return
null;}
-
- /**
- * Returns the <code>Element</code> whose <code>ID</code> is given by
- * <code>elementId</code>. If no such element exists, returns
- * <code>DTM.NULL</code>. Behavior is not defined if more than one
element
- * has this <code>ID</code>. Attributes (including those
- * with the name "ID") are not of type ID unless so defined by
DTD/Schema
- * information available to the DTM implementation.
- * Implementations that do not know whether attributes are of type ID or
- * not are expected to return <code>DTM.NULL</code>.
- *
- * <p>%REVIEW% Presumably IDs are still scoped to a single document,
- * and this operation searches only within a single document, right?
- * Wouldn't want collisions between DTMs in the same process.</p>
- *
- * @param elementId The unique <code>id</code> value for an element.
- * @return The handle of the matching element.
- */
- public int getElementById(String elementId) {return 0;}
-
- /**
- * The getUnparsedEntityURI function returns the URI of the unparsed
- * entity with the specified name in the same document as the context
- * node (see [3.3 Unparsed Entities]). It returns the empty string if
- * there is no such entity.
- * <p>
- * XML processors may choose to use the System Identifier (if one
- * is provided) to resolve the entity, rather than the URI in the
- * Public Identifier. The details are dependent on the processor, and
- * we would have to support some form of plug-in resolver to handle
- * this properly. Currently, we simply return the System Identifier if
- * present, and hope that it a usable URI or that our caller can
- * map it to one.
- * TODO: Resolve Public Identifiers... or consider changing function
name.
- * <p>
- * If we find a relative URI
- * reference, XML expects it to be resolved in terms of the base URI
- * of the document. The DOM doesn't do that for us, and it isn't
- * entirely clear whether that should be done here; currently that's
- * pushed up to a higher level of our application. (Note that DOM Level
- * 1 didn't store the document's base URI.)
- * TODO: Consider resolving Relative URIs.
- * <p>
- * (The DOM's statement that "An XML processor may choose to
- * completely expand entities before the structure model is passed
- * to the DOM" refers only to parsed entities, not unparsed, and hence
- * doesn't affect this function.)
- *
- * @param name A string containing the Entity Name of the unparsed
- * entity.
- *
- * @return String containing the URI of the Unparsed Entity, or an
- * empty string if no such entity exists.
- */
- public String getUnparsedEntityURI(String name) {return null;}
-
-
- // ============== Boolean methods ================
-
- /**
- * Return true if the xsl:strip-space or xsl:preserve-space was
processed
- * during construction of the DTM document.
- *
- * <p>%REVEIW% Presumes a 1:1 mapping from DTM to Document, since
- * we aren't saying which Document to query...?</p>
- */
- public boolean supportsPreStripping() {return false;}
-
- /**
- * Figure out whether nodeHandle2 should be considered as being later
- * in the document than nodeHandle1, in Document Order as defined
- * by the XPath model. This may not agree with the ordering defined
- * by other XML applications.
- * <p>
- * There are some cases where ordering isn't defined, and neither are
- * the results of this function -- though we'll generally return true.
- *
- * TODO: Make sure this does the right thing with attribute nodes!!!
- *
- * @param node1 DOM Node to perform position comparison on.
- * @param node2 DOM Node to perform position comparison on .
- *
- * @return false if node2 comes before node1, otherwise return true.
- * You can think of this as
- * <code>(node1.documentOrderPosition <=
node2.documentOrderPosition)</code>.
- */
- public boolean isNodeAfter(int nodeHandle1, int nodeHandle2) {return
false;}
-
- /**
- * 2. [element content whitespace] A boolean indicating whether the
- * character is white space appearing within element content
(see [XML],
- * 2.10 "White Space Handling"). Note that validating XML
processors are
- * required by XML 1.0 to provide this information. If there is
no
- * declaration for the containing element, this property has no
value for
- * white space characters. If no declaration has been read, but
the [all
- * declarations processed] property of the document information
item is
- * false (so there may be an unread declaration), then the value
of this
- * property is unknown for white space characters. It is always
false for
- * characters that are not white space.
- *
- * @param nodeHandle the node ID.
- * @return <code>true</code> if the character data is whitespace;
- * <code>false</code> otherwise.
- */
- public boolean isCharacterElementContentWhitespace(int nodeHandle)
{return false;}
-
- /**
- * 10. [all declarations processed] This property is not strictly
speaking
- * part of the infoset of the document. Rather it is an
indication of
- * whether the processor has read the complete DTD. Its value is
a
- * boolean. If it is false, then certain properties (indicated
in their
- * descriptions below) may be unknown. If it is true, those
properties
- * are never unknown.
- *
- * @param the document handle
- *
- * @param documentHandle A node handle that must identify a document.
- * @return <code>true</code> if all declarations were processed;
- * <code>false</code> otherwise.
- */
- public boolean isDocumentAllDeclarationsProcessed(int documentHandle)
{return false;}
-
- /**
- * 5. [specified] A flag indicating whether this attribute was
actually
- * specified in the start-tag of its element, or was defaulted
from the
- * DTD.
- *
- * @param the attribute handle
- *
- * NEEDSDOC @param attributeHandle
- * @return <code>true</code> if the attribute was specified;
- * <code>false</code> if it was defaulted.
- */
- public boolean isAttributeSpecified(int attributeHandle) {return false;}
-
- // ========== Direct SAX Dispatch, for optimization purposes ========
-
- /**
- * Directly call the
- * characters method on the passed ContentHandler for the
- * string-value of the given node (see
http://www.w3.org/TR/xpath#data-model
- * for the definition of a node's string-value). Multiple calls to the
- * ContentHandler's characters methods may well occur for a single call
to
- * this method.
- *
- * @param nodeHandle The node ID.
- * @param ch A non-null reference to a ContentHandler.
- *
- * @throws org.xml.sax.SAXException
- */
- public void dispatchCharactersEvents(
-
int
nodeHandle, org.xml.sax.ContentHandler ch)
- throws org.xml.sax.SAXException {}
-
- /**
- * Directly create SAX parser events from a subtree.
- *
- * @param nodeHandle The node ID.
- * @param ch A non-null reference to a ContentHandler.
- *
- * @throws org.xml.sax.SAXException
- */
-
- public void dispatchToEvents(int nodeHandle, org.xml.sax.ContentHandler
ch)
- throws org.xml.sax.SAXException {}
-
- // ==== Construction methods (may not be supported by some
implementations!) =====
- // %REVIEW% jjk: These probably aren't the right API. At the very least
- // they need to deal with current-insertion-location and end-element
- // issues.
-
- /**
- * Append a child to the end of the child list of the current node.
Please note that the node
- * is always cloned if it is owned by another document.
- *
- * <p>%REVIEW% "End of the document" needs to be defined more clearly.
- * Does it become the last child of the Document? Of the root
element?</p>
- *
- * @param newChild Must be a valid new node handle.
- * @param clone true if the child should be cloned into the document.
- * @param cloneDepth if the clone argument is true, specifies that the
- * clone should include all it's children.
- */
- public void appendChild(int newChild, boolean clone, boolean
cloneDepth) {
- boolean sameDoc = ((newChild & DOCHANDLE_MASK) == m_docHandle);
- if (clone || !sameDoc) {
-
- } else {
-
- }
- }
-
- /**
- * Append a text node child that will be constructed from a string,
- * to the end of the document.
- *
- * <p>%REVIEW% "End of the document" needs to be defined more clearly.
- * Does it become the last child of the Document? Of the root
element?</p>
- *
- * @param str Non-null reference to a string.
- */
- public void appendTextChild(String str) {
- // ###shs Think more about how this differs from createTextNode
- //%TBD%
- }
+ /**
+ * <meta name="usage" content="internal"/>
+ * Get the depth level of this node in the tree (equals 1 for
+ * a parentless node).
+ *
+ * @param nodeHandle The node id.
+ * @return the number of ancestors, plus one
+ */
+ public short getLevel(int nodeHandle) {
+ short count = 0;
+ while (nodeHandle != 0) {
+ count++;
+ nodeHandle = nodes.readEntry(nodeHandle, 1);
+ }
+ return count;
+ }
+
+ // ============== Document query functions ==============
+
+ /**
+ * Tests whether DTM DOM implementation implements a specific
feature and
+ * that feature is supported by this node.
+ *
+ * @param feature The name of the feature to test.
+ * @param versionThis is the version number of the feature to test.
+ * If the version is not
+ * specified, supporting any version of the feature will cause the
+ * method to return <code>true</code>.
+ * @return Returns <code>true</code> if the specified feature is
+ * supported on this node, <code>false</code> otherwise.
+ */
+ public boolean isSupported(String feature,
+
String version) {return false;}
+
+ /**
+ * Return the base URI of the document entity. If it is not known
+ * (because the document was parsed from a socket connection or from
+ * standard input, for example), the value of this property is
unknown.
+ *
+ * @param nodeHandle The node id, which can be any valid node handle.
+ * @return the document base URI String object or null if unknown.
+ */
+ public String getDocumentBaseURI(int nodeHandle) {return null;}
+
+ /**
+ * Return the system identifier of the document entity. If
+ * it is not known, the value of this property is unknown.
+ *
+ * @param nodeHandle The node id, which can be any valid node handle.
+ * @return the system identifier String object or null if unknown.
+ */
+ public String getDocumentSystemIdentifier(int nodeHandle) {return
null;}
+
+ /**
+ * Return the name of the character encoding scheme
+ * in which the document entity is expressed.
+ *
+ * @param nodeHandle The node id, which can be any valid node handle.
+ * @return the document encoding String object.
+ */
+ public String getDocumentEncoding(int nodeHandle) {return null;}
+
+ /**
+ * Return an indication of the standalone status of the document,
+ * either "yes" or "no". This property is derived from the
optional
+ * standalone document declaration in the XML declaration at
the
+ * beginning of the document entity, and has no value if
there is no
+ * standalone document declaration.
+ *
+ * @param nodeHandle The node id, which can be any valid node handle.
+ * @return the document standalone String object, either "yes",
"no", or null.
+ */
+ public String getDocumentStandalone(int nodeHandle) {return null;}
+
+ /**
+ * Return a string representing the XML version of the document. This
+ * property is derived from the XML declaration optionally present
at the
+ * beginning of the document entity, and has no value if there is no
XML
+ * declaration.
+ *
+ * @param the document handle
+ *
+ * @return the document version String object
+ */
+ public String getDocumentVersion(int documentHandle) {return null;}
+
+ /**
+ * Return an indication of
+ * whether the processor has read the complete DTD. Its value is a
+ * boolean. If it is false, then certain properties (indicated in
their
+ * descriptions below) may be unknown. If it is true, those
properties
+ * are never unknown.
+ *
+ * @return <code>true</code> if all declarations were processed {};
+ * <code>false</code> otherwise.
+ */
+ public boolean getDocumentAllDeclarationsProcessed() {return false;}
+
+ /**
+ * A document type declaration information item has the following
properties:
+ *
+ * 1. [system identifier] The system identifier of the external
subset, if
+ * it exists. Otherwise this property has no value.
+ *
+ * @return the system identifier String object, or null if there is
none.
+ */
+ public String getDocumentTypeDeclarationSystemIdentifier() {return
null;}
+
+ /**
+ * Return the public identifier of the external subset,
+ * normalized as described in 4.2.2 External Entities [XML]. If
there is
+ * no external subset or if it has no public identifier, this
property
+ * has no value.
+ *
+ * @param the document type declaration handle
+ *
+ * @return the public identifier String object, or null if there is
none.
+ */
+ public String getDocumentTypeDeclarationPublicIdentifier() {return
null;}
+
+ /**
+ * Returns the <code>Element</code> whose <code>ID</code> is given by
+ * <code>elementId</code>. If no such element exists, returns
+ * <code>DTM.NULL</code>. Behavior is not defined if more than one
element
+ * has this <code>ID</code>. Attributes (including those
+ * with the name "ID") are not of type ID unless so defined by
DTD/Schema
+ * information available to the DTM implementation.
+ * Implementations that do not know whether attributes are of type
ID or
+ * not are expected to return <code>DTM.NULL</code>.
+ *
+ * <p>%REVIEW% Presumably IDs are still scoped to a single document,
+ * and this operation searches only within a single document, right?
+ * Wouldn't want collisions between DTMs in the same process.</p>
+ *
+ * @param elementId The unique <code>id</code> value for an element.
+ * @return The handle of the matching element.
+ */
+ public int getElementById(String elementId) {return 0;}
+
+ /**
+ * The getUnparsedEntityURI function returns the URI of the unparsed
+ * entity with the specified name in the same document as the context
+ * node (see [3.3 Unparsed Entities]). It returns the empty string if
+ * there is no such entity.
+ * <p>
+ * XML processors may choose to use the System Identifier (if one
+ * is provided) to resolve the entity, rather than the URI in the
+ * Public Identifier. The details are dependent on the processor, and
+ * we would have to support some form of plug-in resolver to handle
+ * this properly. Currently, we simply return the System Identifier
if
+ * present, and hope that it a usable URI or that our caller can
+ * map it to one.
+ * TODO: Resolve Public Identifiers... or consider changing function
name.
+ * <p>
+ * If we find a relative URI
+ * reference, XML expects it to be resolved in terms of the base URI
+ * of the document. The DOM doesn't do that for us, and it isn't
+ * entirely clear whether that should be done here; currently that's
+ * pushed up to a higher level of our application. (Note that DOM
Level
+ * 1 didn't store the document's base URI.)
+ * TODO: Consider resolving Relative URIs.
+ * <p>
+ * (The DOM's statement that "An XML processor may choose to
+ * completely expand entities before the structure model is passed
+ * to the DOM" refers only to parsed entities, not unparsed, and
hence
+ * doesn't affect this function.)
+ *
+ * @param name A string containing the Entity Name of the unparsed
+ * entity.
+ *
+ * @return String containing the URI of the Unparsed Entity, or an
+ * empty string if no such entity exists.
+ */
+ public String getUnparsedEntityURI(String name) {return null;}
+
+
+ // ============== Boolean methods ================
+
+ /**
+ * Return true if the xsl:strip-space or xsl:preserve-space was
processed
+ * during construction of the DTM document.
+ *
+ * <p>%REVEIW% Presumes a 1:1 mapping from DTM to Document, since
+ * we aren't saying which Document to query...?</p>
+ */
+ public boolean supportsPreStripping() {return false;}
+
+ /**
+ * Figure out whether nodeHandle2 should be considered as being later
+ * in the document than nodeHandle1, in Document Order as defined
+ * by the XPath model. This may not agree with the ordering defined
+ * by other XML applications.
+ * <p>
+ * There are some cases where ordering isn't defined, and neither are
+ * the results of this function -- though we'll generally return
true.
+ *
+ * TODO: Make sure this does the right thing with attribute nodes!!!
+ *
+ * @param node1 DOM Node to perform position comparison on.
+ * @param node2 DOM Node to perform position comparison on .
+ *
+ * @return false if node2 comes before node1, otherwise return true.
+ * You can think of this as
+ * <code>(node1.documentOrderPosition <=
node2.documentOrderPosition)</code>.
+ */
+ public boolean isNodeAfter(int nodeHandle1, int nodeHandle2) {return
false;}
+
+ /**
+ * 2. [element content whitespace] A boolean indicating whether
the
+ * character is white space appearing within element content
(see [XML],
+ * 2.10 "White Space Handling"). Note that validating XML
processors are
+ * required by XML 1.0 to provide this information. If there
is no
+ * declaration for the containing element, this property has
no value for
+ * white space characters. If no declaration has been read,
but the [all
+ * declarations processed] property of the document
information item is
+ * false (so there may be an unread declaration), then the
value of this
+ * property is unknown for white space characters. It is
always false for
+ * characters that are not white space.
+ *
+ * @param nodeHandle the node ID.
+ * @return <code>true</code> if the character data is whitespace;
+ * <code>false</code> otherwise.
+ */
+ public boolean isCharacterElementContentWhitespace(int nodeHandle)
{return false;}
+
+ /**
+ * 10. [all declarations processed] This property is not strictly
speaking
+ * part of the infoset of the document. Rather it is an
indication of
+ * whether the processor has read the complete DTD. Its value
is a
+ * boolean. If it is false, then certain properties
(indicated in their
+ * descriptions below) may be unknown. If it is true, those
properties
+ * are never unknown.
+ *
+ * @param the document handle
+ *
+ * @param documentHandle A node handle that must identify a document.
+ * @return <code>true</code> if all declarations were processed;
+ * <code>false</code> otherwise.
+ */
+ public boolean isDocumentAllDeclarationsProcessed(int
documentHandle) {return false;}
+
+ /**
+ * 5. [specified] A flag indicating whether this attribute was
actually
+ * specified in the start-tag of its element, or was
defaulted from the
+ * DTD.
+ *
+ * @param the attribute handle
+ *
+ * NEEDSDOC @param attributeHandle
+ * @return <code>true</code> if the attribute was specified;
+ * <code>false</code> if it was defaulted.
+ */
+ public boolean isAttributeSpecified(int attributeHandle) {return
false;}
+
+ // ========== Direct SAX Dispatch, for optimization purposes ========
+
+ /**
+ * Directly call the
+ * characters method on the passed ContentHandler for the
+ * string-value of the given node (see
http://www.w3.org/TR/xpath#data-model
+ * for the definition of a node's string-value). Multiple calls to
the
+ * ContentHandler's characters methods may well occur for a single
call to
+ * this method.
+ *
+ * @param nodeHandle The node ID.
+ * @param ch A non-null reference to a ContentHandler.
+ *
+ * @throws org.xml.sax.SAXException
+ */
+ public void dispatchCharactersEvents(
+
int
nodeHandle, org.xml.sax.ContentHandler ch)
+ throws org.xml.sax.SAXException {}
+
+ /**
+ * Directly create SAX parser events from a subtree.
+ *
+ * @param nodeHandle The node ID.
+ * @param ch A non-null reference to a ContentHandler.
+ *
+ * @throws org.xml.sax.SAXException
+ */
+
+ public void dispatchToEvents(int nodeHandle,
org.xml.sax.ContentHandler ch)
+ throws org.xml.sax.SAXException {}
+
+ // ==== Construction methods (may not be supported by some
implementations!) =====
+ // %REVIEW% jjk: These probably aren't the right API. At the very
least
+ // they need to deal with current-insertion-location and end-element
+ // issues.
+
+ /**
+ * Append a child to the end of the child list of the current node.
Please note that the node
+ * is always cloned if it is owned by another document.
+ *
+ * <p>%REVIEW% "End of the document" needs to be defined more
clearly.
+ * Does it become the last child of the Document? Of the root
element?</p>
+ *
+ * @param newChild Must be a valid new node handle.
+ * @param clone true if the child should be cloned into the document.
+ * @param cloneDepth if the clone argument is true, specifies that
the
+ * clone should include all it's children.
+ */
+ public void appendChild(int newChild, boolean clone, boolean
cloneDepth) {
+ boolean sameDoc = ((newChild & DOCHANDLE_MASK) ==
m_docHandle);
+ if (clone || !sameDoc) {
+
+ } else {
+
+ }
+ }
+
+ /**
+ * Append a text node child that will be constructed from a string,
+ * to the end of the document.
+ *
+ * <p>%REVIEW% "End of the document" needs to be defined more
clearly.
+ * Does it become the last child of the Document? Of the root
element?</p>
+ *
+ * @param str Non-null reference to a string.
+ */
+ public void appendTextChild(String str) {
+ // ###shs Think more about how this differs from
createTextNode
+ //%TBD%
+ }
//================================================================
@@ -1972,10 +1980,10 @@
* */
void appendStartElement(int namespaceIndex,int localNameIndex, int
prefixIndex)
{
- // do document root node creation here on the first element,
create nodes for
- // this element and its attributes, store the element,
namespace, and attritute
- // name indexes to the nodes array, keep track of the current
node and parent
- // element used
+ // do document root node creation here on the first element,
create nodes for
+ // this element and its attributes, store the element,
namespace, and attritute
+ // name indexes to the nodes array, keep track of the
current node and parent
+ // element used
// %TBD% PREFIX NEEDS TO BE STORED SOMEWHERE ... If we're using
// the 6type+10ns+16local ExpandedName index, that all fits into a
@@ -1984,22 +1992,22 @@
// should W3 just hold the prefix, leaving us with most of that
// word unused?
- // W0 High: Namespace Low: Node Type
- int w0 = (namespaceIndex << 16) | ELEMENT_NODE;
- // W1: Parent
- int w1 = currentParent;
- // W2: Next (initialized as 0)
- int w2 = 0;
- // W3: Tagname
- int w3 = localNameIndex;
- //int ourslot = nodes.appendSlot(w0, w1, w2, w3);
- int ourslot = appendNode(w0, w1, w2, w3);
- currentParent = ourslot;
- previousSibling = 0;
-
- // set the root element pointer when creating the first element
node
- if (m_docElement == NULL)
- m_docElement = ourslot;
+ // W0 High: Namespace Low: Node Type
+ int w0 = (namespaceIndex << 16) | ELEMENT_NODE;
+ // W1: Parent
+ int w1 = currentParent;
+ // W2: Next (initialized as 0)
+ int w2 = 0;
+ // W3: Tagname
+ int w3 = localNameIndex;
+ //int ourslot = nodes.appendSlot(w0, w1, w2, w3);
+ int ourslot = appendNode(w0, w1, w2, w3);
+ currentParent = ourslot;
+ previousSibling = 0;
+
+ // set the root element pointer when creating the first
element node
+ if (m_docElement == NULL)
+ m_docElement = ourslot;
}
/** Append a Namespace Declaration child at the current insertion point.
1.1.2.4 +171 -28
xml-xalan/java/src/org/apache/xml/dtm/Attic/DTMManagerDefault.java
Index: DTMManagerDefault.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xml/dtm/Attic/DTMManagerDefault.java,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -r1.1.2.3 -r1.1.2.4
--- DTMManagerDefault.java 2001/05/07 13:15:22 1.1.2.3
+++ DTMManagerDefault.java 2001/05/11 03:11:36 1.1.2.4
@@ -58,23 +58,39 @@
import java.util.Vector;
+// JAXP 1.1
import javax.xml.parsers.*;
-
import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.Source;
+import javax.xml.transform.SourceLocator;
+// Apache XML Utilities
import org.apache.xml.utils.PrefixResolver;
-
+import org.apache.xml.utils.SystemIDResolver;
import org.apache.xml.dtm.dom2dtm.DOM2DTM;
+// W3C DOM
import org.w3c.dom.Document;
import org.w3c.dom.Node;
+// SAX2
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.helpers.XMLReaderFactory;
+import org.xml.sax.ext.DeclHandler;
+import org.xml.sax.ext.LexicalHandler;
+
/**
* The default implementation for the DTMManager.
*/
public class DTMManagerDefault extends DTMManager
{
+
+ /** NEEDSDOC Field m_dtms */
protected Vector m_dtms = new Vector();
/**
@@ -95,43 +111,164 @@
* @param source the specification of the source object.
* @param unique true if the returned DTM must be unique, probably because
it
* is going to be mutated.
- * @param whiteSpaceFilter Enables filtering of whitespace nodes, and may
+ * @param whiteSpaceFilter Enables filtering of whitespace nodes, and may
* be null.
*
* @return a non-null DTM reference.
*/
- public DTM getDTM(Source source, boolean unique, DTMWSFilter
whiteSpaceFilter)
+ public DTM getDTM(Source source, boolean unique,
+ DTMWSFilter whiteSpaceFilter)
{
+
+ int documentID = m_dtms.size() << 20;
- if(source instanceof DOMSource)
+ if (source instanceof DOMSource)
{
- int documentID = m_dtms.size() << 20;
- DTM dtm = new DOM2DTM(this, (DOMSource)source, documentID,
whiteSpaceFilter);
+ DTM dtm = new DOM2DTM(this, (DOMSource) source, documentID,
+ whiteSpaceFilter);
+
m_dtms.add(dtm);
+
return dtm;
}
else
{
- throw new DTMException("Not supported: "+source);
+ boolean isSAXSource = (source instanceof SAXSource);
+ boolean isStreamSource = (source instanceof StreamSource);
+
+ if (isSAXSource || isStreamSource)
+ {
+ XMLReader reader = getXMLReader(source);
+
+ // transformer.setIsTransformDone(false);
+ InputSource xmlSource = SAXSource.sourceToInputSource(source);
+ String urlOfSource = xmlSource.getSystemId();
+
+ if (null != urlOfSource)
+ {
+ try
+ {
+ urlOfSource = SystemIDResolver.getAbsoluteURI(urlOfSource);
+ }
+ catch (Exception e)
+ {
+
+ // %REVIEW% Is there a better way to send a warning?
+ System.err.println("Can not absolutize URL: " + urlOfSource);
+ }
+
+ xmlSource.setSystemId(urlOfSource);
+ }
+
+ DTMDocumentImpl dtm = new DTMDocumentImpl(this,
+ documentID,
+ whiteSpaceFilter);
+
+ // It looks like you just construct this??
+ DTMBuilder builder = new DTMBuilder(dtm, xmlSource, reader);
+
+ m_dtms.add(dtm);
+
+ return dtm;
+ }
+ else
+ {
+
+ // It should have been handled by a derived class or the caller
+ // made a mistake.
+ throw new DTMException("Not supported: " + source);
+ }
}
}
/**
- * NEEDSDOC Method getDTM
+ * This method returns the SAX2 parser to use with the InputSource
+ * obtained from this URI.
+ * It may return null if any SAX2-conformant XML parser can be used,
+ * or if getInputSource() will also return null. The parser must
+ * be free for use (i.e.
+ * not currently in use for another parse().
*
+ * @param inputSource The value returned from the URIResolver.
+ * @returns a SAX2 XMLReader to use to resolve the inputSource argument.
*
+ * @return non-null XMLReader reference ready to parse.
+ */
+ public XMLReader getXMLReader(Source inputSource)
+ {
+
+ try
+ {
+ XMLReader reader = (inputSource instanceof SAXSource)
+ ? ((SAXSource) inputSource).getXMLReader() : null;
+
+ if (null == reader)
+ {
+ try
+ {
+ javax.xml.parsers.SAXParserFactory factory =
+ javax.xml.parsers.SAXParserFactory.newInstance();
+
+ factory.setNamespaceAware(true);
+
+ javax.xml.parsers.SAXParser jaxpParser = factory.newSAXParser();
+
+ reader = jaxpParser.getXMLReader();
+ }
+ catch (javax.xml.parsers.ParserConfigurationException ex)
+ {
+ throw new org.xml.sax.SAXException(ex);
+ }
+ catch (javax.xml.parsers.FactoryConfigurationError ex1)
+ {
+ throw new org.xml.sax.SAXException(ex1.toString());
+ }
+ catch (NoSuchMethodError ex2){}
+ catch (AbstractMethodError ame){}
+
+ if (null == reader)
+ reader = XMLReaderFactory.createXMLReader();
+ }
+
+ try
+ {
+ reader.setFeature("http://xml.org/sax/features/namespace-prefixes",
+ true);
+
reader.setFeature("http://apache.org/xml/features/validation/dynamic",
+ true);
+ }
+ catch (org.xml.sax.SAXException se)
+ {
+
+ // What can we do?
+ // TODO: User diagnostics.
+ }
+
+ return reader;
+ }
+ catch (org.xml.sax.SAXException se)
+ {
+ throw new DTMException(se.getMessage(), se);
+ }
+ }
+
+ /**
+ * NEEDSDOC Method getDTM
+ *
+ *
* NEEDSDOC @param nodeHandle
*
* NEEDSDOC (getDTM) @return
*/
public DTM getDTM(int nodeHandle)
{
+
// Performance critical function.
- return (DTM)m_dtms.elementAt(nodeHandle >> 20);
+ return (DTM) m_dtms.elementAt(nodeHandle >> 20);
}
-
+
/**
- * NEEDSDOC Method getDTMIdentity
+ * NEEDSDOC Method getDTMIdentity
*
*
* NEEDSDOC @param dtm
@@ -143,18 +280,20 @@
// A backwards search should normally be the fastest.
int n = m_dtms.size();
- for (int i = (n-1); i >= 0; i--)
+
+ for (int i = (n - 1); i >= 0; i--)
{
- DTM tdtm = (DTM)m_dtms.elementAt(i);
- if(tdtm == dtm)
+ DTM tdtm = (DTM) m_dtms.elementAt(i);
+
+ if (tdtm == dtm)
return i;
}
-
+
return -1;
}
/**
- * NEEDSDOC Method release
+ * NEEDSDOC Method release
*
*
* NEEDSDOC @param dtm
@@ -164,9 +303,11 @@
*/
public boolean release(DTM dtm, boolean shouldHardDelete)
{
+
int i = getDTMIdentity(dtm);
+
// %TBD% Recover space.
- if(i >= 0)
+ if (i >= 0)
{
m_dtms.setElementAt(null, i);
}
@@ -174,33 +315,36 @@
/** @todo: implement this org.apache.xml.dtm.DTMManager abstract method
*/
return true;
}
-
+
/**
- * NEEDSDOC Method createDocumentFragment
+ * NEEDSDOC Method createDocumentFragment
*
*
* NEEDSDOC (createDocumentFragment) @return
*/
public DTM createDocumentFragment()
{
+
try
{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+
dbf.setNamespaceAware(true);
+
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.newDocument();
Node df = doc.createDocumentFragment();
-
+
return getDTM(new DOMSource(df), true, null);
}
- catch(Exception e)
+ catch (Exception e)
{
throw new DTMException(e);
}
}
-
+
/**
- * NEEDSDOC Method createDTMIterator
+ * NEEDSDOC Method createDTMIterator
*
*
* NEEDSDOC @param whatToShow
@@ -218,7 +362,7 @@
}
/**
- * NEEDSDOC Method createDTMIterator
+ * NEEDSDOC Method createDTMIterator
*
*
* NEEDSDOC @param xpathString
@@ -235,7 +379,7 @@
}
/**
- * NEEDSDOC Method createDTMIterator
+ * NEEDSDOC Method createDTMIterator
*
*
* NEEDSDOC @param node
@@ -250,7 +394,7 @@
}
/**
- * NEEDSDOC Method createDTMIterator
+ * NEEDSDOC Method createDTMIterator
*
*
* NEEDSDOC @param xpathCompiler
@@ -264,5 +408,4 @@
/** @todo: implement this org.apache.xml.dtm.DTMManager abstract method
*/
return null;
}
-
}
1.1.2.8 +68 -68 xml-xalan/java/src/org/apache/xml/dtm/Attic/TestDTM.java
Index: TestDTM.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/dtm/Attic/TestDTM.java,v
retrieving revision 1.1.2.7
retrieving revision 1.1.2.8
diff -u -r1.1.2.7 -r1.1.2.8
--- TestDTM.java 2001/05/10 21:30:16 1.1.2.7
+++ TestDTM.java 2001/05/11 03:11:36 1.1.2.8
@@ -28,87 +28,87 @@
* <C>My Anaconda<D/>Words</C>
* </top> */
- DTMDocumentImpl doc = new DTMDocumentImpl(0);
+ DTMDocumentImpl doc = new DTMDocumentImpl(null, 0, null);
try
{
- doc.startDocument();
+ doc.startDocument();
- doc.startElement("", "top", "top", null);
+ doc.startElement("", "top", "top", null);
- doc.startElement("", "A", "A", null);
+ doc.startElement("", "A", "A", null);
- AttributesImpl atts = new AttributesImpl();
- atts.addAttribute("", "", "hat", "CDATA", "new");
- atts.addAttribute("", "", "car", "CDATA", "Honda");
- atts.addAttribute("", "", "dog", "CDATA", "Boxer");
- doc.startElement("","B","B", atts);
- text="Life is good";
- doc.characters(text.toCharArray(),0,text.length());
- doc.endElement("","B","B");
-
- doc.endElement("","A","A");
- doc.startElement("","C","C", null);
-
- text="My Anaconda";
- doc.characters(text.toCharArray(),0,text.length());
- doc.startElement("","D","D",null);
- doc.endElement("","D","D");
- text="Words";
- doc.characters(text.toCharArray(),0,text.length());
-
- doc.endElement("", "C", "C");
-
- boolean BUILDPURCHASEORDER=false;
- if(BUILDPURCHASEORDER)
- {
- int root, h, c1, c2, c3, c4, c1_text, c2_text, c3_text, c4_text;
-
- doc.startElement(null,"PurchaseOrderList","PurchaseOrderList",
null);
-
- for (int i = 0; i < 10; i++) {
-
- doc.startElement("","PurchaseOrder","PurchaseOrder", null);
-
- doc.startElement("","Item","Item", null);
- text="Basketball" + " - " + i;
- doc.characters(text.toCharArray(),0,text.length());
-
- doc.endElement("", "Item", "Item");
-
- doc.startElement("","Description","Description", null);
- // c2.createAttribute();
- text="Professional Leather Michael Jordan Signatured Basketball";
- doc.characters(text.toCharArray(),0,text.length());
-
- doc.endElement("", "Description", "Description");
-
- doc.startElement("","UnitPrice","UnitPrice", null);
- text="$12.99";
- doc.characters(text.toCharArray(),0,text.length());
-
- doc.endElement("", "UnitPrice", "UnitPrice");
-
- doc.startElement("","Quantity","Quantity", null);
- text="50";
- doc.characters(text.toCharArray(),0,text.length());
-
- doc.endElement("", "Quantity", "Quantity");
+ AttributesImpl atts = new AttributesImpl();
+ atts.addAttribute("", "", "hat", "CDATA", "new");
+ atts.addAttribute("", "", "car", "CDATA", "Honda");
+ atts.addAttribute("", "", "dog", "CDATA", "Boxer");
+ doc.startElement("","B","B", atts);
+ text="Life is good";
+ doc.characters(text.toCharArray(),0,text.length());
+ doc.endElement("","B","B");
+
+ doc.endElement("","A","A");
+ doc.startElement("","C","C", null);
+
+ text="My Anaconda";
+ doc.characters(text.toCharArray(),0,text.length());
+ doc.startElement("","D","D",null);
+ doc.endElement("","D","D");
+ text="Words";
+ doc.characters(text.toCharArray(),0,text.length());
+
+ doc.endElement("", "C", "C");
+
+ boolean BUILDPURCHASEORDER=false;
+ if(BUILDPURCHASEORDER)
+ {
+ int root, h, c1, c2, c3, c4, c1_text, c2_text, c3_text, c4_text;
+
+ doc.startElement(null,"PurchaseOrderList","PurchaseOrderList",
null);
+
+ for (int i = 0; i < 10; i++) {
+
+ doc.startElement("","PurchaseOrder","PurchaseOrder", null);
+
+ doc.startElement("","Item","Item", null);
+ text="Basketball" + " - " + i;
+ doc.characters(text.toCharArray(),0,text.length());
+
+ doc.endElement("", "Item", "Item");
+
+ doc.startElement("","Description","Description", null);
+ // c2.createAttribute();
+ text="Professional Leather Michael Jordan Signatured
Basketball";
+ doc.characters(text.toCharArray(),0,text.length());
+
+ doc.endElement("", "Description", "Description");
+
+ doc.startElement("","UnitPrice","UnitPrice", null);
+ text="$12.99";
+ doc.characters(text.toCharArray(),0,text.length());
+
+ doc.endElement("", "UnitPrice", "UnitPrice");
+
+ doc.startElement("","Quantity","Quantity", null);
+ text="50";
+ doc.characters(text.toCharArray(),0,text.length());
+
+ doc.endElement("", "Quantity", "Quantity");
- doc.endElement("", "PurchaseOrder", "PurchaseOrder");
- }
+ doc.endElement("", "PurchaseOrder", "PurchaseOrder");
+ }
- doc.endElement("", "PurchaseOrderList", "PurchaseOrderList");
- } // if(BUILDPURCHASEORDER)
+ doc.endElement("", "PurchaseOrderList", "PurchaseOrderList");
+ } // if(BUILDPURCHASEORDER)
- doc.endElement("", "top", "top");
- doc.endDocument();
+ doc.endElement("", "top", "top");
+ doc.endDocument();
}
catch(org.xml.sax.SAXException e)
{
- e.printStackTrace();
+ e.printStackTrace();
}
-
+
TestDTMNodes.printNodeTable(doc);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]