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 &lt;= 
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 &lt;= 
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]

Reply via email to