001: package net.sf.saxon.om;
002:
003: import java.util.HashMap;
004: import java.util.Iterator;
005:
006: /**
007: * An object representing the collection of documents handled during
008: * a single transformation.
009: *
010: * <p>From Saxon 7.2, the function of allocating document numbers is performed
011: * by the NamePool, not by the DocumentPool. This has a
012: * number of effects: in particular it allows operations involving multiple
013: * documents (such as generateId() and document()) to occur in a free-standing
014: * XPath environment.</p>
015: */
016:
017: public final class DocumentPool {
018:
019: // The document pool ensures that the document()
020: // function, when called twice with the same URI, returns the same document
021: // each time. For this purpose we use a hashtable from
022: // URI to DocumentInfo object.
023:
024: private HashMap documentNameMap = new HashMap(10);
025:
026: /**
027: * Add a document to the pool
028: * @param doc The DocumentInfo for the document in question
029: * @param name The name of the document.
030: */
031:
032: public void add(DocumentInfo doc, String name) {
033: if (name != null) {
034: documentNameMap.put(name, doc);
035: }
036: }
037:
038: /**
039: * Get the document with a given name
040: * @return the DocumentInfo with the given name if it exists,
041: * or null if it is not found.
042: */
043:
044: public DocumentInfo find(String name) {
045: return (DocumentInfo) documentNameMap.get(name);
046: }
047:
048: /**
049: * Get the URI for a given document node, if it is present in the pool. This supports the
050: * document-uri() function.
051: * @param doc The document node
052: * @return The uri of the document node, if present in the pool, or null otherwise
053: */
054:
055: public String getDocumentURI(NodeInfo doc) {
056: Iterator iter = documentNameMap.keySet().iterator();
057: while (iter.hasNext()) {
058: String uri = (String) iter.next();
059: if (find(uri).isSameNodeInfo(doc)) {
060: return uri;
061: }
062: }
063: return null;
064: }
065:
066: /**
067: * Release a document from the document pool. This means that if the same document is
068: * loaded again later, the source will need to be re-parsed, and nodes will get new identities.
069: */
070:
071: public DocumentInfo discard(DocumentInfo doc) {
072: Iterator iter = documentNameMap.keySet().iterator();
073: while (iter.hasNext()) {
074: Object name = iter.next();
075: DocumentInfo entry = (DocumentInfo) documentNameMap
076: .get(name);
077: if (entry == doc) {
078: documentNameMap.remove(name);
079: return doc;
080: }
081: }
082: return doc;
083: }
084:
085: }
086:
087: //
088: // The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License");
089: // you may not use this file except in compliance with the License. You may obtain a copy of the
090: // License at http://www.mozilla.org/MPL/
091: //
092: // Software distributed under the License is distributed on an "AS IS" basis,
093: // WITHOUT WARRANTY OF ANY KIND, either express or implied.
094: // See the License for the specific language governing rights and limitations under the License.
095: //
096: // The Original Code is: all this file.
097: //
098: // The Initial Developer of the Original Code is Michael H. Kay.
099: //
100: // Portions created by (your name) are Copyright (C) (your legal entity). All Rights Reserved.
101: //
102: // Contributor(s): none.
103: //
|