johng 01/08/23 21:49:31 Modified: java/src/org/apache/xml/dtm DTM.java java/src/org/apache/xml/dtm/ref DTMDefaultBase.java DTMDocumentImpl.java DTMManagerDefault.java Log: added document registration and release events to the DTM interface Submitted by: John Gentilin Revision Changes Path 1.4 +29 -12 xml-xalan/java/src/org/apache/xml/dtm/DTM.java Index: DTM.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/dtm/DTM.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- DTM.java 2001/07/11 04:00:13 1.3 +++ DTM.java 2001/08/24 04:49:31 1.4 @@ -2,7 +2,7 @@ * The Apache Software License, Version 1.1 * * - * Copyright (c) 1999 The Apache Software Foundation. All rights + * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,7 +10,7 @@ * are met: * * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in @@ -18,7 +18,7 @@ * distribution. * * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: + * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, @@ -26,7 +26,7 @@ * * 4. The names "Xalan" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this - * software without prior written permission. For written + * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", @@ -197,9 +197,9 @@ public void setProperty(String property, Object value); // ========= Document Navigation Functions ========= - + /** - * This returns a stateless "traverser", that can navigate over an + * This returns a stateless "traverser", that can navigate over an * XPath axis, though not in document order. * * @param axis One of Axes.ANCESTORORSELF, etc. @@ -207,9 +207,9 @@ * @return A DTMAxisIterator, or null if the givin axis isn't supported. */ public DTMAxisTraverser getAxisTraverser(final int axis); - + /** - * This is a shortcut to the iterators that implement + * This is a shortcut to the iterators that implement * XPath axes. * Returns a bare-bones iterator that must be initialized * with a start node (using iterator.setStartNode()). @@ -221,10 +221,10 @@ public DTMAxisIterator getAxisIterator(final int axis); /** - * Get an iterator that can navigate over an XPath Axis, predicated by + * Get an iterator that can navigate over an XPath Axis, predicated by * the extended type ID. * - * @param axis + * @param axis * @param type An extended type ID. * * @return A DTMAxisIterator, or null if the givin axis isn't supported. @@ -550,7 +550,7 @@ */ public short getLevel(int nodeHandle); - // ============== Document query functions ============== + // ============== Document query functions ============== /** * Tests whether DTM DOM implementation implements a specific feature and @@ -818,7 +818,7 @@ * * @param nodeHandle The node ID. * @param ch A non-null reference to a ContentHandler. - * @param normalize true if the content should be normalized according to + * @param normalize true if the content should be normalized according to * the rules for the XPath * <a href="http://www.w3.org/TR/xpath#function-normalize-space">normalize-space</a> * function. @@ -947,4 +947,21 @@ * is available */ public SourceLocator getSourceLocatorFor(int node); + + /** + * As the DTM is registered with the DTMManager, this method + * will be called. This will give the DTM implementation a + * chance to initialize any subsystems that are required to + * build the DTM + */ + public void documentRegistration(); + + /** + * As documents are released from the DTMManager, the DTM implementation + * will be notified of the event. This will allow the DTM implementation + * to shutdown any subsystem activity that may of been assoiated with + * the active DTM Implementation. + */ + + public void documentRelease(); } 1.16 +63 -44 xml-xalan/java/src/org/apache/xml/dtm/ref/DTMDefaultBase.java Index: DTMDefaultBase.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/dtm/ref/DTMDefaultBase.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- DTMDefaultBase.java 2001/08/10 17:57:37 1.15 +++ DTMDefaultBase.java 2001/08/24 04:49:31 1.16 @@ -2,7 +2,7 @@ * The Apache Software License, Version 1.1 * * - * Copyright (c) 1999 The Apache Software Foundation. All rights + * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,7 +10,7 @@ * are met: * * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in @@ -18,7 +18,7 @@ * distribution. * * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: + * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, @@ -26,7 +26,7 @@ * * 4. The names "Xalan" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this - * software without prior written permission. For written + * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", @@ -122,13 +122,13 @@ /** Previous sibling values, one array element for each node. */ protected SuballocatedIntVector m_parent; - + /** Experemental. -sb */ // protected boolean m_haveSeenNamespace = false; - + /** Vector of SuballocatedIntVectors of NS decl sets -jjk */ protected Vector m_namespaceDeclSets = null; - + /** SuballocatedIntVector of elements at which corresponding * namespaceDeclSets were defined -jjk */ protected SuballocatedIntVector m_namespaceDeclSetElements = null; @@ -350,7 +350,7 @@ * @param list A list of integers. * @param start The start index to begin the search. * @param len The number of items to search. - * @param value Find the slot that has a value that is greater than or + * @param value Find the slot that has a value that is greater than or * identical to this argument. * * @return The index in the list of the slot that is higher or identical @@ -454,7 +454,7 @@ // */ // protected void ensureSize(int index) // { -// // We've cut over to Suballocated*Vector, which are self-sizing. +// // We've cut over to Suballocated*Vector, which are self-sizing. // } /** @@ -538,8 +538,8 @@ // Boiler-plate code for each of the _xxx functions, except for the array. int info = (identity >= m_size) ? NOTPROCESSED : m_firstch.elementAt(identity); - // Check to see if the information requested has been processed, and, - // if not, advance the iterator until we the information has been + // Check to see if the information requested has been processed, and, + // if not, advance the iterator until we the information has been // processed. while (info == NOTPROCESSED) { @@ -571,8 +571,8 @@ // Boiler-plate code for each of the _xxx functions, except for the array. int info = (identity >= m_size) ? NOTPROCESSED : m_nextsib.elementAt(identity); - // Check to see if the information requested has been processed, and, - // if not, advance the iterator until we the information has been + // Check to see if the information requested has been processed, and, + // if not, advance the iterator until we the information has been // processed. while (info == NOTPROCESSED) { @@ -604,8 +604,8 @@ if (identity < m_size) return m_prevsib.elementAt(identity); - // Check to see if the information requested has been processed, and, - // if not, advance the iterator until we the information has been + // Check to see if the information requested has been processed, and, + // if not, advance the iterator until we the information has been // processed. while (true) { @@ -631,8 +631,8 @@ if (identity < m_size) return m_parent.elementAt(identity); - // Check to see if the information requested has been processed, and, - // if not, advance the iterator until we the information has been + // Check to see if the information requested has been processed, and, + // if not, advance the iterator until we the information has been // processed. while (true) { @@ -655,13 +655,13 @@ File f = new File("DTMDump"+((Object)this).hashCode()+".txt"); System.err.println("Dumping... "+f.getAbsolutePath()); PrintStream ps = new PrintStream(new FileOutputStream(f)); - + while (nextNode()){} - + int nRecords = m_size; - + ps.println("Total nodes: " + nRecords); - + for (int i = 0; i < nRecords; i++) { ps.println("=========== " + i + " ==========="); @@ -670,15 +670,15 @@ ps.println("LocalName: " + getLocalName(i)); ps.println("NamespaceURI: " + getNamespaceURI(i)); ps.println("Prefix: " + getPrefix(i)); - + int exTypeID = getExpandedTypeID(i); - + ps.println("Expanded Type ID: " + Integer.toHexString(exTypeID)); - + int type = getNodeType(i); String typestring; - + switch (type) { case DTM.ATTRIBUTE_NODE : @@ -727,47 +727,47 @@ typestring = "Unknown!"; break; } - + ps.println("Type: " + typestring); - + int firstChild = _firstch(i); - + if (DTM.NULL == firstChild) ps.println("First child: DTM.NULL"); else if (NOTPROCESSED == firstChild) ps.println("First child: NOTPROCESSED"); else ps.println("First child: " + firstChild); - + int prevSibling = _prevsib(i); - + if (DTM.NULL == prevSibling) ps.println("Prev sibling: DTM.NULL"); else if (NOTPROCESSED == prevSibling) ps.println("Prev sibling: NOTPROCESSED"); else ps.println("Prev sibling: " + prevSibling); - + int nextSibling = _nextsib(i); - + if (DTM.NULL == nextSibling) ps.println("Next sibling: DTM.NULL"); else if (NOTPROCESSED == nextSibling) ps.println("Next sibling: NOTPROCESSED"); else ps.println("Next sibling: " + nextSibling); - + int parent = _parent(i); - + if (DTM.NULL == parent) ps.println("Parent: DTM.NULL"); else if (NOTPROCESSED == parent) ps.println("Parent: NOTPROCESSED"); else ps.println("Parent: " + parent); - + int level = _level(i); - + ps.println("Level: " + level); ps.println("Node Value: " + getNodeValue(i)); ps.println("String Value: " + getStringValue(i)); @@ -937,7 +937,7 @@ } /** - * Given a node handle, advance to the next attribute. + * Given a node handle, advance to the next attribute. * If an attr, we advance to * the next attr on the same node. If not an attribute, we return NULL. * @@ -1021,7 +1021,7 @@ m_namespaceDeclSetElements.addElement(elementNodeIndex); nsList=new SuballocatedIntVector(); m_namespaceDeclSets.addElement(nsList); - + SuballocatedIntVector inherited= findNamespaceContext(_parent(elementNodeIndex)); if(inherited!=null) @@ -1053,7 +1053,7 @@ } nsList.addElement(namespaceNodeIndex | m_dtmIdent); } - + /** Retrieve list of namespace declaration locations * active at this node. List is an SuballocatedIntVector whose * entries are the namespace node HANDLES declared at that ID. @@ -1083,7 +1083,7 @@ int ancestor=_parent(elementNodeIndex); while(wouldBeAt>=0 && ancestor>0) { - candidate=m_namespaceDeclSetElements.elementAt(wouldBeAt); + candidate=m_namespaceDeclSetElements.elementAt(wouldBeAt); if(candidate==ancestor) // Found ancestor in list return (SuballocatedIntVector)m_namespaceDeclSets.elementAt(wouldBeAt); @@ -1133,7 +1133,7 @@ first = i + 1; // looked ot early } } - + if (first > i) { i = first; // Clean up at loop end } @@ -1159,7 +1159,7 @@ public int getFirstNamespaceNode(int nodeHandle, boolean inScope) { if(inScope) - { + { SuballocatedIntVector nsContext=findNamespaceContext(nodeHandle & m_mask); if(nsContext==null || nsContext.size()<1) return NULL; @@ -1529,7 +1529,7 @@ return (short) (_level(identity) + 1); } - // ============== Document query functions ============== + // ============== Document query functions ============== /** * Tests whether DTM DOM implementation implements a specific feature and @@ -1833,7 +1833,7 @@ * * @param nodeHandle The node ID. * @param ch A non-null reference to a ContentHandler. - * @param normalize true if the content should be normalized according to + * @param normalize true if the content should be normalized according to * the rules for the XPath * <a href="http://www.w3.org/TR/xpath#function-normalize-space">normalize-space</a> * function. @@ -1963,4 +1963,23 @@ if (null != m_shouldStripWhitespaceStack) m_shouldStripWhitespaceStack.setTop(shouldStrip); } + + /** + * A dummy routine to satisify the abstract interface. If the DTM + * implememtation that extends the default base requires notification + * of registration, they can override this method. + */ + public void documentRegistration() + { + } + + /** + * A dummy routine to satisify the abstract interface. If the DTM + * implememtation that extends the default base requires notification + * when the document is being released, they can override this method + */ + public void documentRelease() + { + } + } 1.6 +121 -100 xml-xalan/java/src/org/apache/xml/dtm/ref/DTMDocumentImpl.java Index: DTMDocumentImpl.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/dtm/ref/DTMDocumentImpl.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- DTMDocumentImpl.java 2001/08/10 17:57:37 1.5 +++ DTMDocumentImpl.java 2001/08/24 04:49:31 1.6 @@ -92,7 +92,7 @@ * <p>State: In progress!!</p> * * %REVIEW% I _think_ the SAX convention is that "no namespace" is expressed - * as "" rather than as null (which is the DOM's convention). What should + * as "" rather than as null (which is the DOM's convention). What should * DTM expect? What should it do with the other? * * <p>Origin: the implemention is a composite logic based on the DTM of XalanJ1 and @@ -106,7 +106,7 @@ protected static final byte DOCHANDLE_SHIFT = 22; // Masks the lower order of node handle. // Same as {@link DTMConstructor.IDENT_NODE_DEFAULT} - protected static final int NODEHANDLE_MASK = (1 << (DOCHANDLE_SHIFT + 1)) - 1; + protected static final int NODEHANDLE_MASK = (1 << (DOCHANDLE_SHIFT + 1)) - 1; // Masks the higher order Document handle // Same as {@link DTMConstructor.IDENT_DOC_DEFAULT} protected static final int DOCHANDLE_MASK = -1 - NODEHANDLE_MASK; @@ -132,7 +132,7 @@ boolean m_isError = false; private final boolean DEBUG = false; - + /** The document base URI. */ protected String m_documentBaseURI; @@ -144,7 +144,7 @@ * exception. We could try to wait-and-retry instead, as a very poor * fallback, but that has all the known problems with multithreading * on multiprocessors and we Don't Want to Go There. - * + * * @see setIncrementalSAXSource */ private IncrementalSAXSource m_incrSAXSource=null; @@ -182,9 +182,9 @@ // an interface _implemented_ by this class... which might be simplest! private ExpandedNameTable m_expandedNames= new ExpandedNameTable(m_localNames,m_nsNames); - + private XMLStringFactory m_xsf; - + /** * Construct a DTM. @@ -196,7 +196,7 @@ * DTMManager's responsibility to assign a unique number to each * document. */ - public DTMDocumentImpl(DTMManager mgr, int documentNumber, + public DTMDocumentImpl(DTMManager mgr, int documentNumber, DTMWSFilter whiteSpaceFilter, XMLStringFactory xstringfactory){ initDocument(documentNumber); // clear nodes and document handle @@ -228,7 +228,7 @@ //source.setDTDHandler(this); //source.setDeclHandler(this); } - + /** * Wrapper for ChunkedIntArray.append, to automatically update the * previous sibling's "next" reference (if necessary) and periodically @@ -337,7 +337,7 @@ void setContentBuffer(FastStringBuffer buffer) { m_char = buffer; } - + /** * Get a reference pointer to the content-text repository * @@ -363,7 +363,7 @@ else return this; } - + /** * Return this DTM's lexical handler. * @@ -382,7 +382,7 @@ else return this; } - + /** * Return this DTM's EntityResolver. * @@ -393,7 +393,7 @@ return null; } - + /** * Return this DTM's DTDHandler. * @@ -415,7 +415,7 @@ return null; } - + /** * Return this DTM's DeclHandler. * @@ -425,8 +425,8 @@ { return null; - } - + } + /** @return true iff we're building this model incrementally (eg * we're partnered with a IncrementalSAXSource) and thus require that the * transformation and the parse run simultaneously. Guidance to the @@ -462,7 +462,7 @@ m_char_current_start=len; } } - public void endDocument() + public void endDocument() throws org.xml.sax.SAXException { // May need to tell the low-level builder code to pop up a level. @@ -470,7 +470,7 @@ appendEndDocument(); } public void endElement(java.lang.String namespaceURI, java.lang.String localName, - java.lang.String qName) + java.lang.String qName) throws org.xml.sax.SAXException { processAccumulatedText(); @@ -478,39 +478,39 @@ // pop up a level. appendEndElement(); } - public void endPrefixMapping(java.lang.String prefix) + public void endPrefixMapping(java.lang.String prefix) throws org.xml.sax.SAXException { // No-op } - public void ignorableWhitespace(char[] ch, int start, int length) + public void ignorableWhitespace(char[] ch, int start, int length) throws org.xml.sax.SAXException { // %TBD% I believe ignorable text isn't part of the DTM model...? } - public void processingInstruction(java.lang.String target, java.lang.String data) + public void processingInstruction(java.lang.String target, java.lang.String data) throws org.xml.sax.SAXException { processAccumulatedText(); // %TBD% Which pools do target and data go into? } - public void setDocumentLocator(Locator locator) + public void setDocumentLocator(Locator locator) { // No-op for DTM } - public void skippedEntity(java.lang.String name) + public void skippedEntity(java.lang.String name) throws org.xml.sax.SAXException { processAccumulatedText(); //%TBD% } - public void startDocument() + public void startDocument() throws org.xml.sax.SAXException { appendStartDocument(); } public void startElement(java.lang.String namespaceURI, java.lang.String localName, - java.lang.String qName, Attributes atts) + java.lang.String qName, Attributes atts) throws org.xml.sax.SAXException { processAccumulatedText(); @@ -532,7 +532,7 @@ // %TBD% Is there an easier way to test for NSDecl? int nAtts=(atts==null) ? 0 : atts.getLength(); // %TBD% Countdown is more efficient if nobody cares about sequence. - for(int i=nAtts-1;i>=0;--i) + for(int i=nAtts-1;i>=0;--i) { qName=atts.getQName(i); if(qName.startsWith("xmlns:") || "xmlns".equals(qName)) @@ -548,7 +548,7 @@ // %REVEIW% Null or ""? prefix=null; // Default prefix } - + appendNSDeclaration( m_prefixNames.stringToIndex(prefix), @@ -556,8 +556,8 @@ atts.getType(i).equalsIgnoreCase("ID")); } } - - for(int i=nAtts-1;i>=0;--i) + + for(int i=nAtts-1;i>=0;--i) { qName=atts.getQName(i); if(!(qName.startsWith("xmlns:") || "xmlns".equals(qName))) @@ -577,11 +577,11 @@ 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), @@ -592,7 +592,7 @@ } } } - public void startPrefixMapping(java.lang.String prefix, java.lang.String uri) + public void startPrefixMapping(java.lang.String prefix, java.lang.String uri) throws org.xml.sax.SAXException { // No-op in DTM, handled during element/attr processing? @@ -602,42 +602,42 @@ // LexicalHandler support. Not all SAX2 parsers support these events // but we may want to pass them through when they exist... // - public void comment(char[] ch, int start, int length) + public void comment(char[] ch, int start, int length) throws org.xml.sax.SAXException { processAccumulatedText(); m_char.append(ch,start,length); // Single-string value appendComment(m_char_current_start,length); - m_char_current_start+=length; + m_char_current_start+=length; } - public void endCDATA() + public void endCDATA() throws org.xml.sax.SAXException { // No-op in DTM } - public void endDTD() + public void endDTD() throws org.xml.sax.SAXException { // No-op in DTM } - public void endEntity(java.lang.String name) + public void endEntity(java.lang.String name) throws org.xml.sax.SAXException { // No-op in DTM } - public void startCDATA() + public void startCDATA() throws org.xml.sax.SAXException { // No-op in DTM } public void startDTD(java.lang.String name, java.lang.String publicId, - java.lang.String systemId) + java.lang.String systemId) throws org.xml.sax.SAXException { // No-op in DTM } - public void startEntity(java.lang.String name) + public void startEntity(java.lang.String name) throws org.xml.sax.SAXException { // No-op in DTM @@ -831,14 +831,14 @@ // * @param name The element name // */ // public void endElement(String ns, String name) -// { +// { // // pop up the stacks -// // +// // // if (previousSiblingWasParent) // nodes.writeEntry(previousSibling, 2, NULL); -// // Pop parentage +// // Pop parentage // previousSibling = currentParent; // nodes.readSlot(currentParent, gotslot); // currentParent = gotslot[1] & 0xFFFF; @@ -877,10 +877,10 @@ // if (colonpos > 0) { // String prefix = qname.substring(0, colonpos); // if (prefix.equals("xml")) { -// //w0 = ATTRIBUTE_NODE | +// //w0 = ATTRIBUTE_NODE | // // (org.apache.xalan.templates.Constants.S_XMLNAMESPACEURI << 16); // } else { -// //w0 = ATTRIBUTE_NODE | +// //w0 = ATTRIBUTE_NODE | // } // } else { // w0 = ATTRIBUTE_NODE; @@ -924,7 +924,7 @@ // */ // public int createTextNode(String text) // throws DTMException -// { +// { // // wraps around the index value based createTextNode method // return createTextNode(text.toCharArray(), 0, text.length()); // } @@ -1047,7 +1047,7 @@ * @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 @@ -1057,7 +1057,7 @@ short type = (short) (gotslot[0] & 0xFFFF); // Check to see if Element or Document node - if ((type == ELEMENT_NODE) || (type == DOCUMENT_NODE) || + if ((type == ELEMENT_NODE) || (type == DOCUMENT_NODE) || (type == ENTITY_REFERENCE_NODE)) { // In case when Document root is given @@ -1073,19 +1073,19 @@ // points to next sibling kid = gotslot[2]; // Return NULL if node has only attributes - if (kid == NULL) return NULL; + if (kid == NULL) return NULL; nodes.readSlot(kid, gotslot); } // If parent slot matches given parent, return kid - if (gotslot[1] == nodeHandle) + if (gotslot[1] == nodeHandle) { int firstChild = kid | m_docHandle; - + return firstChild; } } // No child found - + return NULL; } @@ -1107,7 +1107,7 @@ nextkid = getNextSibling(nextkid)) { lastChild = nextkid; } - return lastChild | m_docHandle; + return lastChild | m_docHandle; } /** @@ -1161,7 +1161,7 @@ return NULL; // First Attribute (if any) should be at next position in table nodeHandle++; - return(ATTRIBUTE_NODE == (nodes.readEntry(nodeHandle, 0) & 0xFFFF)) ? + return(ATTRIBUTE_NODE == (nodes.readEntry(nodeHandle, 0) & 0xFFFF)) ? nodeHandle | m_docHandle : NULL; } @@ -1218,7 +1218,7 @@ } // Next Sibling is in the next position if it shares the same parent int thisParent = nodes.readEntry(nodeHandle, 1); - + if (nodes.readEntry(++nodeHandle, 1) == thisParent) return (m_docHandle | nodeHandle); @@ -1442,26 +1442,26 @@ * @return A string object that represents the string-value of the given node. */ public XMLString getStringValue(int nodeHandle) { - // ###zaj - researching + // ###zaj - researching nodes.readSlot(nodeHandle, gotslot); - int nodetype=gotslot[0] & 0xFF; + int nodetype=gotslot[0] & 0xFF; String value=null; - switch (nodetype) { - case TEXT_NODE: + switch (nodetype) { + case TEXT_NODE: case COMMENT_NODE: - case CDATA_SECTION_NODE: - value= m_char.getString(gotslot[2], gotslot[3]); + case CDATA_SECTION_NODE: + value= m_char.getString(gotslot[2], gotslot[3]); break; case PROCESSING_INSTRUCTION_NODE: - case ATTRIBUTE_NODE: + case ATTRIBUTE_NODE: case ELEMENT_NODE: case ENTITY_REFERENCE_NODE: default: break; } - return m_xsf.newstr( value ); - + return m_xsf.newstr( value ); + } /** @@ -1490,7 +1490,7 @@ //###zaj - tbd public int getStringValueChunkCount(int nodeHandle) { - //###zaj return value + //###zaj return value return 0; } @@ -1518,7 +1518,7 @@ * the chunk will be returned. * * @return The character array reference where the chunk occurs. */ - //###zaj - tbd + //###zaj - tbd public char[] getStringValueChunk(int nodeHandle, int chunkIndex, int[] startAndLen) {return new char[0];} @@ -1531,13 +1531,13 @@ */ public int getExpandedTypeID(int nodeHandle) { nodes.readSlot(nodeHandle, gotslot); - String qName = m_localNames.indexToString(gotslot[3]); + 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 - String namespace = m_nsNames.indexToString(gotslot[0] << 16); + String namespace = m_nsNames.indexToString(gotslot[0] << 16); // Create expanded name String expandedName = namespace + ":" + localName; int expandedNameID = m_nsNames.stringToIndex(expandedName); @@ -1578,7 +1578,7 @@ public String getLocalNameFromExpandedNameID(int ExpandedNameID) { // Get expanded name - String expandedName = m_localNames.indexToString(ExpandedNameID); + String expandedName = m_localNames.indexToString(ExpandedNameID); // Remove prefix from expanded name int colonpos = expandedName.indexOf(":"); String localName = expandedName.substring(colonpos+1); @@ -1595,7 +1595,7 @@ */ public String getNamespaceFromExpandedNameID(int ExpandedNameID) { - String expandedName = m_localNames.indexToString(ExpandedNameID); + String expandedName = m_localNames.indexToString(ExpandedNameID); // Remove local name from expanded name int colonpos = expandedName.indexOf(":"); String nsName = expandedName.substring(0, colonpos); @@ -1605,8 +1605,8 @@ /** - * fixednames - */ + * fixednames + */ static final String[] fixednames= { null,null, // nothing, Element @@ -1632,7 +1632,7 @@ if (null == name) { int i=gotslot[3]; /**/System.out.println("got i="+i+" "+(i>>16)+"/"+(i&0xffff)); - + name=m_localNames.indexToString(i & 0xFFFF); String prefix=m_prefixNames.indexToString(i >>16); if(prefix!=null && prefix.length()>0) @@ -1729,9 +1729,9 @@ switch (nodetype) { // ###zaj todo - document nodetypes case ATTRIBUTE_NODE: nodes.readSlot(nodeHandle+1, gotslot); - case TEXT_NODE: + case TEXT_NODE: case COMMENT_NODE: - case CDATA_SECTION_NODE: + case CDATA_SECTION_NODE: value=m_char.getString(gotslot[2], gotslot[3]); //###zaj break; case PROCESSING_INSTRUCTION_NODE: @@ -1740,7 +1740,7 @@ default: break; } - return value; + return value; } /** @@ -1797,10 +1797,10 @@ */ public String getDocumentBaseURI() { - + return m_documentBaseURI; } - + /** * Set the base URI of the document entity. * @@ -1808,10 +1808,10 @@ */ public void setDocumentBaseURI(String baseURI) { - + m_documentBaseURI = baseURI; } - + /** * Return the system identifier of the document entity. If * it is not known, the value of this property is unknown. @@ -2052,7 +2052,7 @@ public void dispatchToEvents(int nodeHandle, org.xml.sax.ContentHandler ch) throws org.xml.sax.SAXException {} - + /** * Return an DOM node for the given node. * @@ -2133,7 +2133,7 @@ int ourslot = appendNode(w0, w1, w2, w3); previousSibling = ourslot; } - + /** Append a comment child at the current insertion point. Assumes that the * actual content of the comment has previously been appended to the m_char * buffer (shared with the builder). @@ -2156,12 +2156,12 @@ int ourslot = appendNode(w0, w1, w2, w3); previousSibling = ourslot; } - - + + /** Append an Element child at the current insertion point. This * Element then _becomes_ the insertion point; subsequent appends * become its lastChild until an appendEndElement() call is made. - * + * * Assumes that the symbols (local name, namespace URI and prefix) * have already been added to the pools * @@ -2199,7 +2199,7 @@ if (m_docElement == NULL) m_docElement = ourslot; } - + /** Append a Namespace Declaration child at the current insertion point. * Assumes that the symbols (namespace URI and prefix) have already been * added to the pools @@ -2276,7 +2276,7 @@ // Add node int ourslot = appendNode(w0, w1, w2, w3); previousSibling = ourslot; // Should attributes be previous siblings - + // Attribute's content is currently appended as a Text Node // W0: Node Type @@ -2293,9 +2293,9 @@ previousSiblingWasParent = true; return ;//(m_docHandle | ourslot); } - + /** - * This returns a stateless "traverser", that can navigate over an + * This returns a stateless "traverser", that can navigate over an * XPath axis, though not in document order. * * @param axis One of Axes.ANCESTORORSELF, etc. @@ -2306,7 +2306,7 @@ { return null; } - + /** * This is a shortcut to the iterators that implement the * supported XPath axes (only namespace::) is not supported. @@ -2324,11 +2324,11 @@ } /** - * Get an iterator that can navigate over an XPath Axis, predicated by + * Get an iterator that can navigate over an XPath Axis, predicated by * the extended type ID. * * - * @param axis + * @param axis * @param type An extended type ID. * * @return A DTMAxisIterator, or null if the given axis isn't supported. @@ -2346,29 +2346,29 @@ void appendEndElement() { // pop up the stacks - + if (previousSiblingWasParent) nodes.writeEntry(previousSibling, 2, NULL); - - // Pop parentage + + // Pop parentage previousSibling = currentParent; nodes.readSlot(currentParent, gotslot); currentParent = gotslot[1] & 0xFFFF; - + // The element just being finished will be // the previous sibling for the next operation previousSiblingWasParent = true; - + // Pop a level of namespace table // namespaceTable.removeLastElem(); } - + /** Starting a new document. Perform any resets/initialization * not already handled. * */ void appendStartDocument() { - + // %TBD% reset slot 0 to indicate ChunkedIntArray reuse or wait for // the next initDocument(). m_docElement = NULL; // reset nodeHandle to the root of the actual dtm doc content @@ -2395,7 +2395,7 @@ public void setProperty(String property, Object value) { } - + /** * Source information is not handled yet, so return * <code>null</code> here. @@ -2407,4 +2407,25 @@ { return null; } + + + /** + * A dummy routine to satisify the abstract interface. If the DTM + * implememtation that extends the default base requires notification + * of registration, they can override this method. + */ + public void documentRegistration() + { + } + + /** + * A dummy routine to satisify the abstract interface. If the DTM + * implememtation that extends the default base requires notification + * when the document is being released, they can override this method + */ + public void documentRelease() + { + } + + } 1.21 +33 -31 xml-xalan/java/src/org/apache/xml/dtm/ref/DTMManagerDefault.java Index: DTMManagerDefault.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/dtm/ref/DTMManagerDefault.java,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- DTMManagerDefault.java 2001/08/12 18:06:58 1.20 +++ DTMManagerDefault.java 2001/08/24 04:49:31 1.21 @@ -2,7 +2,7 @@ * The Apache Software License, Version 1.1 * * - * Copyright (c) 1999 The Apache Software Foundation. All rights + * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,7 +10,7 @@ * are met: * * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in @@ -18,7 +18,7 @@ * distribution. * * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: + * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, @@ -26,7 +26,7 @@ * * 4. The names "Xalan" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this - * software without prior written permission. For written + * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", @@ -102,28 +102,29 @@ public class DTMManagerDefault extends DTMManager { - /** - * Vector of DTMs that this manager manages. + /** + * Vector of DTMs that this manager manages. */ protected DTM m_dtms[] = new DTM[IDENT_MAX_DTMS]; - + /** * Add a DTM to the DTM table. - * + * * @param dtm Should be a valid reference to a DTM. */ public void addDTM(DTM dtm, int id) { m_dtms[id] = dtm; + dtm.documentRegistration(); } - + /** * Get the first free DTM ID available. */ public int getFirstFreeDTMID() { int n = m_dtms.length; - for (int i = 1; i < n; i++) + for (int i = 1; i < n; i++) { if(null == m_dtms[i]) { @@ -132,7 +133,7 @@ } throw new DTMException(XSLMessages.createMessage(XSLTErrorResources.ER_NO_DTMIDS_AVAIL, null)); //"No more DTM IDs are available!"); } - + /** * The default table for exandedNameID lookups. */ @@ -147,7 +148,7 @@ /** Set this to true if you want a dump of the DTM after creation. */ private static final boolean DUMPTREE = false; - + /** Set this to true if you want a basic diagnostics. */ private static final boolean DEBUG = false; @@ -167,13 +168,13 @@ * be null. * @param incremental true if the DTM should be built incrementally, if * possible. - * @param doIndexing true if the caller considers it worth it to use + * @param doIndexing true if the caller considers it worth it to use * indexing schemes. * * @return a non-null DTM reference. */ public DTM getDTM(Source source, boolean unique, - DTMWSFilter whiteSpaceFilter, boolean incremental, + DTMWSFilter whiteSpaceFilter, boolean incremental, boolean doIndexing) { @@ -242,7 +243,7 @@ SAX2DTM dtm = new SAX2DTM(this, source, documentID, whiteSpaceFilter, xstringFactory, doIndexing); - // Go ahead and add the DTM to the lookup table. This needs to be + // Go ahead and add the DTM to the lookup table. This needs to be // done before any parsing occurs. addDTM(dtm, dtmPos); @@ -253,7 +254,7 @@ if (haveXercesParser) incremental = true; // No matter what. %REVIEW% - // If the reader is null, but they still requested an incremental build, + // If the reader is null, but they still requested an incremental build, // then we still want to set up the IncrementalSAXSource stuff. if (this.m_incremental && incremental /* || ((null == reader) && incremental) */) { @@ -283,7 +284,7 @@ filter.setXMLReader(reader); coParser=filter; } - + } // Have the DTM set itself up as the IncrementalSAXSource's listener. @@ -374,7 +375,7 @@ else { - // It should have been handled by a derived class or the caller + // It should have been handled by a derived class or the caller // made a mistake. throw new DTMException(XSLMessages.createMessage(XSLTErrorResources.ER_NOT_SUPPORTED, new Object[]{source})); //"Not supported: " + source); } @@ -404,7 +405,7 @@ // // NOTE that since a DOM2DTM may represent a subtree rather // than a full document, we have to be prepared to check more - // than one -- and there is no guarantee that we will find + // than one -- and there is no guarantee that we will find // one that contains ancestors or siblings of the node we're // seeking. // @@ -424,24 +425,24 @@ if(handle!=DTM.NULL) return handle; } } - - // Since the real root of our tree may be a DocumentFragment, we need to - // use getParent to find the root, instead of getOwnerDocument. Otherwise + + // Since the real root of our tree may be a DocumentFragment, we need to + // use getParent to find the root, instead of getOwnerDocument. Otherwise // DOM2DTM#getHandleOfNode will be very unhappy. Node root = node; - for (Node p = root.getParentNode(); p != null; p = p.getParentNode()) + for (Node p = root.getParentNode(); p != null; p = p.getParentNode()) { root = p; } - + DTM dtm = getDTM(new javax.xml.transform.dom.DOMSource(root), false, null, true, true); int handle = ((DOM2DTM)dtm).getHandleOfNode(node); - + if(DTM.NULL == handle) throw new RuntimeException(XSLMessages.createMessage(XSLTErrorResources.ER_COULD_NOT_RESOLVE_NODE, null)); //"Could not resolve the node to a handle!"); - + return handle; } } @@ -466,7 +467,7 @@ { XMLReader reader = (inputSource instanceof SAXSource) ? ((SAXSource) inputSource).getXMLReader() : null; - + boolean isUserReader = (reader != null); if (null == reader) @@ -509,7 +510,7 @@ // TODO: User diagnostics. } - // Commented out as per discussion with [EMAIL PROTECTED] + // Commented out as per discussion with [EMAIL PROTECTED] // about bug 2124. // if(!isUserReader) // { @@ -520,7 +521,7 @@ // } // catch (org.xml.sax.SAXException se) // { -// +// // // What can we do? // // TODO: User diagnostics. // } @@ -564,7 +565,7 @@ // [But we can't do it... sorry. -sb] int n = m_dtms.length; - for (int i = 0; i < n; i++) + for (int i = 0; i < n; i++) { DTM tdtm = m_dtms[i]; @@ -599,6 +600,7 @@ m_dtms[i] = null; } + dtm.documentRelease(); return true; } @@ -694,7 +696,7 @@ /** @todo: implement this org.apache.xml.dtm.DTMManager abstract method */ return null; } - + /** * return the expanded name table. * --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]