< prev index next >

src/java.xml/share/classes/com/sun/org/apache/xml/internal/dtm/ref/DTMManagerDefault.java

Print this page
rev 1063 : 8172974: [JAXP] XALAN: Wrong result when transforming namespace unaware StAX Input

*** 1,56 **** /* ! * reserved comment block ! * DO NOT REMOVE OR ALTER! */ /* ! * Copyright 1999-2004 The Apache Software Foundation. ! * ! * Licensed under the Apache License, Version 2.0 (the "License"); ! * you may not use this file except in compliance with the License. ! * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ ! /* ! * $Id: DTMManagerDefault.java,v 1.2.4.1 2005/09/15 08:15:02 suresh_emailid Exp $ ! */ package com.sun.org.apache.xml.internal.dtm.ref; import com.sun.org.apache.xalan.internal.utils.FactoryImpl; - import javax.xml.parsers.DocumentBuilder; - import javax.xml.parsers.DocumentBuilderFactory; - import javax.xml.transform.Source; - import javax.xml.transform.dom.DOMSource; - import javax.xml.transform.sax.SAXSource; - import javax.xml.transform.stream.StreamSource; - import com.sun.org.apache.xml.internal.dtm.DTM; import com.sun.org.apache.xml.internal.dtm.DTMException; import com.sun.org.apache.xml.internal.dtm.DTMFilter; import com.sun.org.apache.xml.internal.dtm.DTMIterator; import com.sun.org.apache.xml.internal.dtm.DTMManager; import com.sun.org.apache.xml.internal.dtm.DTMWSFilter; import com.sun.org.apache.xml.internal.dtm.ref.dom2dtm.DOM2DTM; import com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM; import com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2RTFDTM; import com.sun.org.apache.xml.internal.res.XMLErrorResources; import com.sun.org.apache.xml.internal.res.XMLMessages; import com.sun.org.apache.xml.internal.utils.PrefixResolver; import com.sun.org.apache.xml.internal.utils.SystemIDResolver; import com.sun.org.apache.xml.internal.utils.XMLReaderManager; import com.sun.org.apache.xml.internal.utils.XMLStringFactory; ! import org.w3c.dom.Document; import org.w3c.dom.Node; - import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.XMLReader; --- 1,54 ---- /* ! * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved. */ /* ! * Licensed to the Apache Software Foundation (ASF) under one or more ! * contributor license agreements. See the NOTICE file distributed with ! * this work for additional information regarding copyright ownership. ! * The ASF licenses this file to You under the Apache License, Version 2.0 ! * (the "License"); you may not use this file except in compliance with ! * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ ! package com.sun.org.apache.xml.internal.dtm.ref; import com.sun.org.apache.xalan.internal.utils.FactoryImpl; import com.sun.org.apache.xml.internal.dtm.DTM; import com.sun.org.apache.xml.internal.dtm.DTMException; import com.sun.org.apache.xml.internal.dtm.DTMFilter; import com.sun.org.apache.xml.internal.dtm.DTMIterator; import com.sun.org.apache.xml.internal.dtm.DTMManager; import com.sun.org.apache.xml.internal.dtm.DTMWSFilter; import com.sun.org.apache.xml.internal.dtm.ref.dom2dtm.DOM2DTM; + import com.sun.org.apache.xml.internal.dtm.ref.dom2dtm.DOM2DTMdefaultNamespaceDeclarationNode; import com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM; import com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2RTFDTM; import com.sun.org.apache.xml.internal.res.XMLErrorResources; import com.sun.org.apache.xml.internal.res.XMLMessages; import com.sun.org.apache.xml.internal.utils.PrefixResolver; import com.sun.org.apache.xml.internal.utils.SystemIDResolver; + import com.sun.org.apache.xml.internal.utils.WrappedRuntimeException; import com.sun.org.apache.xml.internal.utils.XMLReaderManager; import com.sun.org.apache.xml.internal.utils.XMLStringFactory; ! import javax.xml.parsers.DocumentBuilder; ! import javax.xml.parsers.DocumentBuilderFactory; ! import javax.xml.transform.Source; ! import javax.xml.transform.dom.DOMSource; ! import javax.xml.transform.sax.SAXSource; ! import javax.xml.transform.stream.StreamSource; ! import jdk.xml.internal.JdkXmlUtils; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.XMLReader;
*** 71,89 **** * process that queue on an infrequent basis during main-thread * activity (eg, when getDTM() is invoked). The downside of that solution * would be a greater delay before the DTM's storage is actually released * for reuse. * */ ! public class DTMManagerDefault extends DTMManager ! { ! //static final boolean JKESS_XNI_EXPERIMENT=true; ! ! /** 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; /** * Map from DTM identifier numbers to DTM objects that this manager manages. * One DTM may have several prefix numbers, if extended node indexing * is in use; in that case, m_dtm_offsets[] will used to control which --- 69,79 ---- * process that queue on an infrequent basis during main-thread * activity (eg, when getDTM() is invoked). The downside of that solution * would be a greater delay before the DTM's storage is actually released * for reuse. * */ ! public class DTMManagerDefault extends DTMManager { /** * Map from DTM identifier numbers to DTM objects that this manager manages. * One DTM may have several prefix numbers, if extended node indexing * is in use; in that case, m_dtm_offsets[] will used to control which
*** 128,139 **** * be used if you want to add "extended" DTM IDs with nonzero offsets. * * @param dtm Should be a valid reference to a DTM. * @param id Integer DTM ID to be bound to this DTM */ ! synchronized public void addDTM(DTM dtm, int id) { addDTM(dtm,id,0); } ! /** * Add a DTM to the DTM table. * * @param dtm Should be a valid reference to a DTM. --- 118,130 ---- * be used if you want to add "extended" DTM IDs with nonzero offsets. * * @param dtm Should be a valid reference to a DTM. * @param id Integer DTM ID to be bound to this DTM */ ! synchronized public void addDTM(DTM dtm, int id) { ! addDTM(dtm,id,0); ! } /** * Add a DTM to the DTM table. * * @param dtm Should be a valid reference to a DTM.
*** 141,216 **** * @param offset Integer addressing offset. The internal DTM Node ID is * obtained by adding this offset to the node-number field of the * public DTM Handle. For the first DTM ID accessing each DTM, this is 0; * for overflow addressing it will be a multiple of 1<<IDENT_DTM_NODE_BITS. */ ! synchronized public void addDTM(DTM dtm, int id, int offset) ! { ! if(id>=IDENT_MAX_DTMS) ! { ! // TODO: %REVIEW% Not really the right error message. ! throw new DTMException(XMLMessages.createXMLMessage(XMLErrorResources.ER_NO_DTMIDS_AVAIL, null)); //"No more DTM IDs are available!"); ! } ! ! // We used to just allocate the array size to IDENT_MAX_DTMS. ! // But we expect to increase that to 16 bits, and I'm not willing ! // to allocate that much space unless needed. We could use one of our ! // handy-dandy Fast*Vectors, but this will do for now. ! // %REVIEW% ! int oldlen=m_dtms.length; ! if(oldlen<=id) ! { ! // Various growth strategies are possible. I think we don't want ! // to over-allocate excessively, and I'm willing to reallocate ! // more often to get that. See also Fast*Vector classes. ! // ! // %REVIEW% Should throw a more diagnostic error if we go over the max... ! int newlen=Math.min((id+256),IDENT_MAX_DTMS); ! ! DTM new_m_dtms[] = new DTM[newlen]; ! System.arraycopy(m_dtms,0,new_m_dtms,0,oldlen); ! m_dtms=new_m_dtms; ! int new_m_dtm_offsets[] = new int[newlen]; ! System.arraycopy(m_dtm_offsets,0,new_m_dtm_offsets,0,oldlen); ! m_dtm_offsets=new_m_dtm_offsets; ! } m_dtms[id] = dtm; ! m_dtm_offsets[id]=offset; dtm.documentRegistration(); ! // The DTM should have been told who its manager was when we created it. ! // Do we need to allow for adopting DTMs _not_ created by this manager? } /** * Get the first free DTM ID available. %OPT% Linear search is inefficient! */ ! synchronized public int getFirstFreeDTMID() ! { int n = m_dtms.length; ! for (int i = 1; i < n; i++) ! { ! if(null == m_dtms[i]) ! { return i; } } ! return n; // count on addDTM() to throw exception if out of range } /** * The default table for exandedNameID lookups. */ ! private ExpandedNameTable m_expandedNameTable = ! new ExpandedNameTable(); /** * Constructor DTMManagerDefault * */ ! public DTMManagerDefault(){} ! /** * Get an instance of a DTM, loaded with the content from the * specified source. If the unique flag is true, a new instance will * always be returned. Otherwise it is up to the DTMManager to return a --- 132,198 ---- * @param offset Integer addressing offset. The internal DTM Node ID is * obtained by adding this offset to the node-number field of the * public DTM Handle. For the first DTM ID accessing each DTM, this is 0; * for overflow addressing it will be a multiple of 1<<IDENT_DTM_NODE_BITS. */ ! synchronized public void addDTM(DTM dtm, int id, int offset) { ! if (id >= IDENT_MAX_DTMS) { ! // TODO: %REVIEW% Not really the right error message. ! throw new DTMException(XMLMessages.createXMLMessage(XMLErrorResources.ER_NO_DTMIDS_AVAIL, null)); //"No more DTM IDs are available!"); ! } ! ! // We used to just allocate the array size to IDENT_MAX_DTMS. ! // But we expect to increase that to 16 bits, and I'm not willing ! // to allocate that much space unless needed. We could use one of our ! // handy-dandy Fast*Vectors, but this will do for now. ! // %REVIEW% ! int oldlen = m_dtms.length; ! if(oldlen <= id) { ! // Various growth strategies are possible. I think we don't want ! // to over-allocate excessively, and I'm willing to reallocate ! // more often to get that. See also Fast*Vector classes. ! // ! // %REVIEW% Should throw a more diagnostic error if we go over the max... ! int newlen = Math.min((id+256),IDENT_MAX_DTMS); ! DTM new_m_dtms[] = new DTM[newlen]; ! System.arraycopy(m_dtms,0,new_m_dtms,0,oldlen); ! m_dtms=new_m_dtms; ! int new_m_dtm_offsets[] = new int[newlen]; ! System.arraycopy(m_dtm_offsets,0,new_m_dtm_offsets,0,oldlen); ! m_dtm_offsets=new_m_dtm_offsets; ! } m_dtms[id] = dtm; ! m_dtm_offsets[id]=offset; dtm.documentRegistration(); ! // The DTM should have been told who its manager was when we created it. ! // Do we need to allow for adopting DTMs _not_ created by this manager? } /** * Get the first free DTM ID available. %OPT% Linear search is inefficient! */ ! synchronized public int getFirstFreeDTMID() { int n = m_dtms.length; ! for (int i = 1; i < n; i++) { ! if(null == m_dtms[i]) { return i; } } ! return n; // count on addDTM() to throw exception if out of range } /** * The default table for exandedNameID lookups. */ ! private ExpandedNameTable m_expandedNameTable = new ExpandedNameTable(); /** * Constructor DTMManagerDefault * */ ! public DTMManagerDefault() {} /** * Get an instance of a DTM, loaded with the content from the * specified source. If the unique flag is true, a new instance will * always be returned. Otherwise it is up to the DTMManager to return a
*** 238,278 **** */ synchronized public DTM getDTM(Source source, boolean unique, DTMWSFilter whiteSpaceFilter, boolean incremental, boolean doIndexing) { ! ! if(DEBUG && null != source) ! System.out.println("Starting "+ ! (unique ? "UNIQUE" : "shared")+ ! " source: "+source.getSystemId() ! ); XMLStringFactory xstringFactory = m_xsf; int dtmPos = getFirstFreeDTMID(); int documentID = dtmPos << IDENT_DTM_NODE_BITS; ! if ((null != source) && source instanceof DOMSource) ! { DOM2DTM dtm = new DOM2DTM(this, (DOMSource) source, documentID, whiteSpaceFilter, xstringFactory, doIndexing); addDTM(dtm, dtmPos, 0); ! // if (DUMPTREE) ! // { ! // dtm.dumpDTM(); ! // } return dtm; ! } ! else ! { ! boolean isSAXSource = (null != source) ! ? (source instanceof SAXSource) : true; ! boolean isStreamSource = (null != source) ! ? (source instanceof StreamSource) : false; if (isSAXSource || isStreamSource) { XMLReader reader = null; SAX2DTM dtm; --- 220,255 ---- */ synchronized public DTM getDTM(Source source, boolean unique, DTMWSFilter whiteSpaceFilter, boolean incremental, boolean doIndexing) { ! /* Uncomment for debugging ! if (null != source) { ! System.out.println("Starting " + ! (unique ? "UNIQUE" : "shared") + ! " source: " + source.getSystemId()); ! } ! */ XMLStringFactory xstringFactory = m_xsf; int dtmPos = getFirstFreeDTMID(); int documentID = dtmPos << IDENT_DTM_NODE_BITS; ! if ((null != source) && source instanceof DOMSource) { DOM2DTM dtm = new DOM2DTM(this, (DOMSource) source, documentID, whiteSpaceFilter, xstringFactory, doIndexing); addDTM(dtm, dtmPos, 0); ! /* Uncomment for debugging ! dtm.dumpDTM(); ! */ return dtm; ! } else { ! boolean isSAXSource = (null != source) ? (source instanceof SAXSource) : true; ! boolean isStreamSource = (null != source) ? (source instanceof StreamSource) : false; if (isSAXSource || isStreamSource) { XMLReader reader = null; SAX2DTM dtm;
*** 307,356 **** // // %REVIEW% This is a sloppy way to request this mode; // we need to consider architectural improvements. dtm = new SAX2RTFDTM(this, source, documentID, whiteSpaceFilter, xstringFactory, doIndexing); ! } ! /************************************************************** ! // EXPERIMENTAL 3/22/02 ! else if(JKESS_XNI_EXPERIMENT && m_incremental) { ! dtm = new XNI2DTM(this, source, documentID, whiteSpaceFilter, ! xstringFactory, doIndexing); ! } ! **************************************************************/ ! // Create the basic SAX2DTM. ! else { dtm = new SAX2DTM(this, source, documentID, whiteSpaceFilter, xstringFactory, doIndexing); } // Go ahead and add the DTM to the lookup table. This needs to be // done before any parsing occurs. Note offset 0, since we've just // created a new DTM. addDTM(dtm, dtmPos, 0); - boolean haveXercesParser = (null != reader) && (reader.getClass() .getName() ! .equals("com.sun.org.apache.xerces.internal.parsers.SAXParser") ); if (haveXercesParser) { incremental = true; // No matter what. %REVIEW% } // If the reader is null, but they still requested an incremental // build, then we still want to set up the IncrementalSAXSource stuff. ! if (m_incremental && incremental ! /* || ((null == reader) && incremental) */) { IncrementalSAXSource coParser=null; if (haveXercesParser) { // IncrementalSAXSource_Xerces to avoid threading. try { ! coParser = new com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource_Xerces(); } catch( Exception ex ) { ex.printStackTrace(); coParser=null; } } --- 284,323 ---- // // %REVIEW% This is a sloppy way to request this mode; // we need to consider architectural improvements. dtm = new SAX2RTFDTM(this, source, documentID, whiteSpaceFilter, xstringFactory, doIndexing); ! } else { ! // Create the basic SAX2DTM. dtm = new SAX2DTM(this, source, documentID, whiteSpaceFilter, xstringFactory, doIndexing); } // Go ahead and add the DTM to the lookup table. This needs to be // done before any parsing occurs. Note offset 0, since we've just // created a new DTM. addDTM(dtm, dtmPos, 0); boolean haveXercesParser = (null != reader) && (reader.getClass() .getName() ! .equals("com.sun.org.apache.xerces.internal.parsers.SAXParser")); if (haveXercesParser) { incremental = true; // No matter what. %REVIEW% } // If the reader is null, but they still requested an incremental // build, then we still want to set up the IncrementalSAXSource stuff. ! if (m_incremental && incremental) { IncrementalSAXSource coParser=null; if (haveXercesParser) { // IncrementalSAXSource_Xerces to avoid threading. try { ! coParser = new IncrementalSAXSource_Xerces(); } catch( Exception ex ) { ex.printStackTrace(); coParser=null; } }
*** 365,398 **** filter.setXMLReader(reader); coParser=filter; } } - - /************************************************************** - // EXPERIMENTAL 3/22/02 - if (JKESS_XNI_EXPERIMENT && m_incremental && - dtm instanceof XNI2DTM && - coParser instanceof IncrementalSAXSource_Xerces) { - com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration xpc= - ((IncrementalSAXSource_Xerces)coParser) - .getXNIParserConfiguration(); - if (xpc!=null) { - // Bypass SAX; listen to the XNI stream - ((XNI2DTM)dtm).setIncrementalXNISource(xpc); - } else { - // Listen to the SAX stream (will fail, diagnostically...) - dtm.setIncrementalSAXSource(coParser); - } - } else - ***************************************************************/ - // Have the DTM set itself up as IncrementalSAXSource's listener. dtm.setIncrementalSAXSource(coParser); if (null == xmlSource) { - // Then the user will construct it themselves. return dtm; } if (null == reader.getErrorHandler()) { --- 332,345 ----
*** 404,426 **** // Launch parsing coroutine. Launches a second thread, // if we're using IncrementalSAXSource.filter(). coParser.startParse(xmlSource); } catch (RuntimeException re) { - dtm.clearCoRoutine(); - throw re; } catch (Exception e) { - dtm.clearCoRoutine(); ! ! throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(e); } } else { if (null == reader) { - // Then the user will construct it themselves. return dtm; } // not incremental --- 351,368 ---- // Launch parsing coroutine. Launches a second thread, // if we're using IncrementalSAXSource.filter(). coParser.startParse(xmlSource); } catch (RuntimeException re) { dtm.clearCoRoutine(); throw re; } catch (Exception e) { dtm.clearCoRoutine(); ! throw new WrappedRuntimeException(e); } } else { if (null == reader) { // Then the user will construct it themselves. return dtm; } // not incremental
*** 428,461 **** reader.setDTDHandler(dtm); if (null == reader.getErrorHandler()) { reader.setErrorHandler(dtm); } ! try { ! reader.setProperty( ! "http://xml.org/sax/properties/lexical-handler", ! dtm); ! } catch (SAXNotRecognizedException e){} ! catch (SAXNotSupportedException e){} try { reader.parse(xmlSource); } catch (RuntimeException re) { dtm.clearCoRoutine(); - throw re; } catch (Exception e) { dtm.clearCoRoutine(); ! ! throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(e); } } ! if (DUMPTREE) { ! System.out.println("Dumping SAX2DOM"); ! dtm.dumpDTM(System.err); ! } return dtm; } finally { // Reset the ContentHandler, DTDHandler, ErrorHandler to the DefaultHandler // after creating the DTM. --- 370,397 ---- reader.setDTDHandler(dtm); if (null == reader.getErrorHandler()) { reader.setErrorHandler(dtm); } ! JdkXmlUtils.setXMLReaderPropertyIfSupport(reader, ! "http://xml.org/sax/properties/lexical-handler", dtm, false); try { reader.parse(xmlSource); } catch (RuntimeException re) { dtm.clearCoRoutine(); throw re; } catch (Exception e) { dtm.clearCoRoutine(); ! throw new WrappedRuntimeException(e); } } ! /* Uncomment for debugging ! System.out.println("Dumping SAX2DOM"); ! dtm.dumpDTM(System.err); ! */ return dtm; } finally { // Reset the ContentHandler, DTDHandler, ErrorHandler to the DefaultHandler // after creating the DTM.
*** 471,481 **** catch (Exception e) {} } releaseXMLReader(reader); } } else { - // It should have been handled by a derived class or the caller // made a mistake. throw new DTMException(XMLMessages.createXMLMessage(XMLErrorResources.ER_NOT_SUPPORTED, new Object[]{source})); //"Not supported: " + source); } } --- 407,416 ----
*** 488,507 **** * * @param node Non-null reference to a DOM node. * * @return a valid DTM handle. */ ! synchronized public int getDTMHandleFromNode(org.w3c.dom.Node node) { ! if(null == node) throw new IllegalArgumentException(XMLMessages.createXMLMessage(XMLErrorResources.ER_NODE_NON_NULL, null)); //"node must be non-null for getDTMHandleFromNode!"); ! if (node instanceof com.sun.org.apache.xml.internal.dtm.ref.DTMNodeProxy) ! return ((com.sun.org.apache.xml.internal.dtm.ref.DTMNodeProxy) node).getDTMNodeNumber(); ! ! else ! { // Find the DOM2DTMs wrapped around this Document (if any) // and check whether they contain the Node in question. // // NOTE that since a DOM2DTM may represent a subtree rather // than a full document, we have to be prepared to check more --- 423,441 ---- * * @param node Non-null reference to a DOM node. * * @return a valid DTM handle. */ ! synchronized public int getDTMHandleFromNode(Node node) { ! if (node == null) { throw new IllegalArgumentException(XMLMessages.createXMLMessage(XMLErrorResources.ER_NODE_NON_NULL, null)); //"node must be non-null for getDTMHandleFromNode!"); + } ! if (node instanceof DTMNodeProxy) { ! return ((DTMNodeProxy)node).getDTMNodeNumber(); ! } else { // Find the DOM2DTMs wrapped around this Document (if any) // and check whether they contain the Node in question. // // NOTE that since a DOM2DTM may represent a subtree rather // than a full document, we have to be prepared to check more
*** 512,583 **** // %REVIEW% We could search for the one which contains this // node at the deepest level, and thus covers the widest // subtree, but that's going to entail additional work // checking more DTMs... and getHandleOfNode is not a // cheap operation in most implementations. ! // ! // TODO: %REVIEW% If overflow addressing, we may recheck a DTM ! // already examined. Ouch. But with the increased number of DTMs, ! // scanning back to check this is painful. ! // POSSIBLE SOLUTIONS: ! // Generate a list of _unique_ DTM objects? ! // Have each DTM cache last DOM node search? ! int max = m_dtms.length; ! for(int i = 0; i < max; i++) ! { ! DTM thisDTM=m_dtms[i]; ! if((null != thisDTM) && thisDTM instanceof DOM2DTM) ! { ! int handle=((DOM2DTM)thisDTM).getHandleOfNode(node); ! if(handle!=DTM.NULL) return handle; } ! } ! // Not found; generate a new DTM. ! // ! // %REVIEW% Is this really desirable, or should we return null ! // and make folks explicitly instantiate from a DOMSource? The ! // latter is more work but gives the caller the opportunity to ! // explicitly add the DTM to a DTMManager... and thus to know when ! // it can be discarded again, which is something we need to pay much ! // more attention to. (Especially since only DTMs which are assigned ! // to a manager can use the overflow addressing scheme.) ! // ! // %BUG% If the source node was a DOM2DTM$defaultNamespaceDeclarationNode ! // and the DTM wasn't registered with this DTMManager, we will create ! // a new DTM and _still_ not be able to find the node (since it will ! // be resynthesized). Another reason to push hard on making all DTMs ! // be managed DTMs. ! // 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; Node p = (root.getNodeType() == Node.ATTRIBUTE_NODE) ? ((org.w3c.dom.Attr)root).getOwnerElement() : root.getParentNode(); ! for (; p != null; p = p.getParentNode()) ! { root = p; } ! DOM2DTM dtm = (DOM2DTM) getDTM(new javax.xml.transform.dom.DOMSource(root), ! false, null, true, true); int handle; ! if(node instanceof com.sun.org.apache.xml.internal.dtm.ref.dom2dtm.DOM2DTMdefaultNamespaceDeclarationNode) ! { ! // Can't return the same node since it's unique to a specific DTM, ! // but can return the equivalent node -- find the corresponding ! // Document Element, then ask it for the xml: namespace decl. ! handle=dtm.getHandleOfNode(((org.w3c.dom.Attr)node).getOwnerElement()); ! handle=dtm.getAttributeNode(handle,node.getNamespaceURI(),node.getLocalName()); } - else - handle = ((DOM2DTM)dtm).getHandleOfNode(node); ! if(DTM.NULL == handle) throw new RuntimeException(XMLMessages.createXMLMessage(XMLErrorResources.ER_COULD_NOT_RESOLVE_NODE, null)); //"Could not resolve the node to a handle!"); return handle; } } --- 446,515 ---- // %REVIEW% We could search for the one which contains this // node at the deepest level, and thus covers the widest // subtree, but that's going to entail additional work // checking more DTMs... and getHandleOfNode is not a // cheap operation in most implementations. ! // ! // TODO: %REVIEW% If overflow addressing, we may recheck a DTM ! // already examined. Ouch. But with the increased number of DTMs, ! // scanning back to check this is painful. ! // POSSIBLE SOLUTIONS: ! // Generate a list of _unique_ DTM objects? ! // Have each DTM cache last DOM node search? ! int max = m_dtms.length; ! for (int i = 0; i < max; i++) { ! DTM thisDTM = m_dtms[i]; ! if ((null != thisDTM) && thisDTM instanceof DOM2DTM) { ! int handle=((DOM2DTM)thisDTM).getHandleOfNode(node); ! if (handle!=DTM.NULL) { ! return handle; } ! } ! } ! // Not found; generate a new DTM. ! // ! // %REVIEW% Is this really desirable, or should we return null ! // and make folks explicitly instantiate from a DOMSource? The ! // latter is more work but gives the caller the opportunity to ! // explicitly add the DTM to a DTMManager... and thus to know when ! // it can be discarded again, which is something we need to pay much ! // more attention to. (Especially since only DTMs which are assigned ! // to a manager can use the overflow addressing scheme.) ! // ! // %BUG% If the source node was a DOM2DTM$defaultNamespaceDeclarationNode ! // and the DTM wasn't registered with this DTMManager, we will create ! // a new DTM and _still_ not be able to find the node (since it will ! // be resynthesized). Another reason to push hard on making all DTMs ! // be managed DTMs. ! // 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; Node p = (root.getNodeType() == Node.ATTRIBUTE_NODE) ? ((org.w3c.dom.Attr)root).getOwnerElement() : root.getParentNode(); ! for (; p != null; p = p.getParentNode()) { root = p; } ! DOM2DTM dtm = (DOM2DTM) getDTM(new javax.xml.transform.dom.DOMSource(root), false, null, true, true); int handle; ! if (node instanceof DOM2DTMdefaultNamespaceDeclarationNode) { ! // Can't return the same node since it's unique to a specific DTM, ! // but can return the equivalent node -- find the corresponding ! // Document Element, then ask it for the xml: namespace decl. ! handle = dtm.getHandleOfNode(((org.w3c.dom.Attr)node).getOwnerElement()); ! handle = dtm.getAttributeNode(handle, node.getNamespaceURI(), node.getLocalName()); ! } else { ! handle = ((DOM2DTM)dtm).getHandleOfNode(node); } ! if (DTM.NULL == handle) { throw new RuntimeException(XMLMessages.createXMLMessage(XMLErrorResources.ER_COULD_NOT_RESOLVE_NODE, null)); //"Could not resolve the node to a handle!"); + } return handle; } }
*** 593,607 **** * @param inputSource The value returned from the URIResolver. * @return a SAX2 XMLReader to use to resolve the inputSource argument. * * @return non-null XMLReader reference ready to parse. */ ! synchronized public XMLReader getXMLReader(Source inputSource) ! { ! ! try ! { XMLReader reader = (inputSource instanceof SAXSource) ? ((SAXSource) inputSource).getXMLReader() : null; // If user did not supply a reader, ask for one from the reader manager if (null == reader) { --- 525,536 ---- * @param inputSource The value returned from the URIResolver. * @return a SAX2 XMLReader to use to resolve the inputSource argument. * * @return non-null XMLReader reference ready to parse. */ ! synchronized public XMLReader getXMLReader(Source inputSource) { ! try { XMLReader reader = (inputSource instanceof SAXSource) ? ((SAXSource) inputSource).getXMLReader() : null; // If user did not supply a reader, ask for one from the reader manager if (null == reader) {
*** 611,621 **** reader = m_readerManager.getXMLReader(); } return reader; - } catch (SAXException se) { throw new DTMException(se.getMessage(), se); } } --- 540,549 ----
*** 640,662 **** * * @param nodeHandle DTM Handle indicating which node to retrieve * * @return a reference to the DTM object containing this node. */ ! synchronized public DTM getDTM(int nodeHandle) ! { ! try ! { // Performance critical function. return m_dtms[nodeHandle >>> IDENT_DTM_NODE_BITS]; ! } ! catch(java.lang.ArrayIndexOutOfBoundsException e) ! { ! if(nodeHandle==DTM.NULL) ! return null; // Accept as a special case. else ! throw e; // Programming error; want to know about it. } } /** * Given a DTM, find the ID number in the DTM tables which addresses --- 568,586 ---- * * @param nodeHandle DTM Handle indicating which node to retrieve * * @return a reference to the DTM object containing this node. */ ! synchronized public DTM getDTM(int nodeHandle) { ! try { // Performance critical function. return m_dtms[nodeHandle >>> IDENT_DTM_NODE_BITS]; ! } catch(java.lang.ArrayIndexOutOfBoundsException e) { ! if (nodeHandle==DTM.NULL) ! return null; // Accept as a special case. else ! throw e; // Programming error; want to know about it. } } /** * Given a DTM, find the ID number in the DTM tables which addresses
*** 666,692 **** * @param dtm The DTM which (hopefully) contains this node. * * @return The DTM ID (as the high bits of a NodeHandle, not as our * internal index), or -1 if the DTM doesn't belong to this manager. */ ! synchronized public int getDTMIdentity(DTM dtm) ! { ! // Shortcut using DTMDefaultBase's extension hooks ! // %REVIEW% Should the lookup be part of the basic DTM API? ! if(dtm instanceof DTMDefaultBase) ! { ! DTMDefaultBase dtmdb=(DTMDefaultBase)dtm; ! if(dtmdb.getManager()==this) ! return dtmdb.getDTMIDs().elementAt(0); ! else ! return -1; ! } int n = m_dtms.length; ! for (int i = 0; i < n; i++) ! { DTM tdtm = m_dtms[i]; if (tdtm == dtm && m_dtm_offsets[i]==0) return i << IDENT_DTM_NODE_BITS; } --- 590,613 ---- * @param dtm The DTM which (hopefully) contains this node. * * @return The DTM ID (as the high bits of a NodeHandle, not as our * internal index), or -1 if the DTM doesn't belong to this manager. */ ! synchronized public int getDTMIdentity(DTM dtm) { ! // Shortcut using DTMDefaultBase's extension hooks ! // %REVIEW% Should the lookup be part of the basic DTM API? ! if (dtm instanceof DTMDefaultBase) { ! DTMDefaultBase dtmdb = (DTMDefaultBase)dtm; ! if (dtmdb.getManager() == this) ! return dtmdb.getDTMIDs().elementAt(0); ! else ! return -1; ! } int n = m_dtms.length; ! for (int i = 0; i < n; i++) { DTM tdtm = m_dtms[i]; if (tdtm == dtm && m_dtm_offsets[i]==0) return i << IDENT_DTM_NODE_BITS; }
*** 707,756 **** * in this version of the DTM manager. * * @return true if the DTM was released, false if shouldHardDelete was set * and we decided not to. */ ! synchronized public boolean release(DTM dtm, boolean shouldHardDelete) ! { ! if(DEBUG) ! { ! System.out.println("Releasing "+ ! (shouldHardDelete ? "HARD" : "soft")+ ! " dtm="+ ! // Following shouldn't need a nodeHandle, but does... ! // and doesn't seem to report the intended value ! dtm.getDocumentBaseURI() ! ); ! } ! ! if (dtm instanceof SAX2DTM) ! { ! ((SAX2DTM) dtm).clearCoRoutine(); ! } ! ! // Multiple DTM IDs may be assigned to a single DTM. ! // The Right Answer is to ask which (if it supports ! // extension, the DTM will need a list anyway). The ! // Wrong Answer, applied if the DTM can't help us, ! // is to linearly search them all; this may be very ! // painful. ! // ! // %REVIEW% Should the lookup move up into the basic DTM API? ! if(dtm instanceof DTMDefaultBase) ! { ! com.sun.org.apache.xml.internal.utils.SuballocatedIntVector ids=((DTMDefaultBase)dtm).getDTMIDs(); ! for(int i=ids.size()-1;i>=0;--i) ! m_dtms[ids.elementAt(i)>>>DTMManager.IDENT_DTM_NODE_BITS]=null; ! } ! else ! { ! int i = getDTMIdentity(dtm); ! if (i >= 0) ! { ! m_dtms[i >>> DTMManager.IDENT_DTM_NODE_BITS] = null; ! } ! } dtm.documentRelease(); return true; } --- 628,670 ---- * in this version of the DTM manager. * * @return true if the DTM was released, false if shouldHardDelete was set * and we decided not to. */ ! synchronized public boolean release(DTM dtm, boolean shouldHardDelete) { ! /* Uncomment for debugging ! System.out.println("Releasing "+ ! (shouldHardDelete ? "HARD" : "soft") + ! " dtm=" + ! // Following shouldn't need a nodeHandle, but does... ! // and doesn't seem to report the intended value ! dtm.getDocumentBaseURI()); ! */ ! ! if (dtm instanceof SAX2DTM) { ! ((SAX2DTM)dtm).clearCoRoutine(); ! } ! ! // Multiple DTM IDs may be assigned to a single DTM. ! // The Right Answer is to ask which (if it supports ! // extension, the DTM will need a list anyway). The ! // Wrong Answer, applied if the DTM can't help us, ! // is to linearly search them all; this may be very ! // painful. ! // ! // %REVIEW% Should the lookup move up into the basic DTM API? ! if (dtm instanceof DTMDefaultBase) { ! com.sun.org.apache.xml.internal.utils.SuballocatedIntVector ids=((DTMDefaultBase)dtm).getDTMIDs(); ! for (int i=ids.size() - 1; i >= 0; --i) { ! m_dtms[ids.elementAt(i)>>>DTMManager.IDENT_DTM_NODE_BITS] = null; ! } ! } else { ! int i = getDTMIdentity(dtm); ! if (i >= 0) { ! m_dtms[i >>> DTMManager.IDENT_DTM_NODE_BITS] = null; ! } ! } dtm.documentRelease(); return true; }
*** 758,783 **** * Method createDocumentFragment * * * NEEDSDOC (createDocumentFragment) @return */ ! synchronized public DTM createDocumentFragment() ! { ! ! try ! { DocumentBuilderFactory dbf = FactoryImpl.getDOMFactory(super.useServicesMechnism()); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.newDocument(); Node df = doc.createDocumentFragment(); return getDTM(new DOMSource(df), true, null, false, false); ! } ! catch (Exception e) ! { throw new DTMException(e); } } /** --- 672,692 ---- * Method createDocumentFragment * * * NEEDSDOC (createDocumentFragment) @return */ ! synchronized public DTM createDocumentFragment() { ! try { DocumentBuilderFactory dbf = FactoryImpl.getDOMFactory(super.useServicesMechnism()); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.newDocument(); Node df = doc.createDocumentFragment(); return getDTM(new DOMSource(df), true, null, false, false); ! } catch (Exception e) { throw new DTMException(e); } } /**
*** 789,801 **** * NEEDSDOC @param entityReferenceExpansion * * NEEDSDOC (createDTMIterator) @return */ synchronized public DTMIterator createDTMIterator(int whatToShow, DTMFilter filter, ! boolean entityReferenceExpansion) ! { ! /** @todo: implement this com.sun.org.apache.xml.internal.dtm.DTMManager abstract method */ return null; } /** --- 698,708 ---- * NEEDSDOC @param entityReferenceExpansion * * NEEDSDOC (createDTMIterator) @return */ synchronized public DTMIterator createDTMIterator(int whatToShow, DTMFilter filter, ! boolean entityReferenceExpansion) { /** @todo: implement this com.sun.org.apache.xml.internal.dtm.DTMManager abstract method */ return null; } /**
*** 806,818 **** * NEEDSDOC @param presolver * * NEEDSDOC (createDTMIterator) @return */ synchronized public DTMIterator createDTMIterator(String xpathString, ! PrefixResolver presolver) ! { ! /** @todo: implement this com.sun.org.apache.xml.internal.dtm.DTMManager abstract method */ return null; } /** --- 713,723 ---- * NEEDSDOC @param presolver * * NEEDSDOC (createDTMIterator) @return */ synchronized public DTMIterator createDTMIterator(String xpathString, ! PrefixResolver presolver) { /** @todo: implement this com.sun.org.apache.xml.internal.dtm.DTMManager abstract method */ return null; } /**
*** 821,833 **** * * NEEDSDOC @param node * * NEEDSDOC (createDTMIterator) @return */ ! synchronized public DTMIterator createDTMIterator(int node) ! { ! /** @todo: implement this com.sun.org.apache.xml.internal.dtm.DTMManager abstract method */ return null; } /** --- 726,736 ---- * * NEEDSDOC @param node * * NEEDSDOC (createDTMIterator) @return */ ! synchronized public DTMIterator createDTMIterator(int node) { /** @todo: implement this com.sun.org.apache.xml.internal.dtm.DTMManager abstract method */ return null; } /**
*** 837,849 **** * NEEDSDOC @param xpathCompiler * NEEDSDOC @param pos * * NEEDSDOC (createDTMIterator) @return */ ! synchronized public DTMIterator createDTMIterator(Object xpathCompiler, int pos) ! { ! /** @todo: implement this com.sun.org.apache.xml.internal.dtm.DTMManager abstract method */ return null; } /** --- 740,750 ---- * NEEDSDOC @param xpathCompiler * NEEDSDOC @param pos * * NEEDSDOC (createDTMIterator) @return */ ! synchronized public DTMIterator createDTMIterator(Object xpathCompiler, int pos) { /** @todo: implement this com.sun.org.apache.xml.internal.dtm.DTMManager abstract method */ return null; } /**
*** 851,860 **** * * NEEDSDOC @param dtm * * NEEDSDOC ($objectName$) @return */ ! public ExpandedNameTable getExpandedNameTable(DTM dtm) ! { return m_expandedNameTable; } } --- 752,760 ---- * * NEEDSDOC @param dtm * * NEEDSDOC ($objectName$) @return */ ! public ExpandedNameTable getExpandedNameTable(DTM dtm) { return m_expandedNameTable; } }
< prev index next >