package client.net.sf.saxon.ce.tree.wrapper; import client.net.sf.saxon.ce.Configuration; import client.net.sf.saxon.ce.event.Stripper; import client.net.sf.saxon.ce.lib.NamespaceConstant; import client.net.sf.saxon.ce.om.Axis; import client.net.sf.saxon.ce.om.DocumentInfo; import client.net.sf.saxon.ce.om.NamePool; import client.net.sf.saxon.ce.om.NodeInfo; import client.net.sf.saxon.ce.pattern.NodeKindTest; import client.net.sf.saxon.ce.tree.iter.AxisIterator; import client.net.sf.saxon.ce.tree.util.Navigator; import java.util.HashMap; /** * A SpaceStrippedDocument represents a view of a real Document in which selected * whitespace text nodes are treated as having been stripped. */ public class SpaceStrippedDocument extends SpaceStrippedNode implements DocumentInfo { private Stripper stripper; private boolean preservesSpace; private HashMap<String, Object> userData; /** * Create a space-stripped view of a document * @param doc the underlying document * @param stripper an object that contains the rules defining which whitespace * text nodes are to be absent from the view */ public SpaceStrippedDocument(DocumentInfo doc, Stripper stripper) { node = doc; parent = null; docWrapper = this; this.stripper = stripper; preservesSpace = findPreserveSpace(doc); } /** * Create a wrapped node within this document */ public SpaceStrippedNode wrap(NodeInfo node) { return makeWrapper(node, this, null); } /** * Get the document's stripper */ public Stripper getStripper() { return stripper; } /** * Get the configuration previously set using setConfiguration */ public Configuration getConfiguration() { return node.getConfiguration(); } /** * Get the name pool used for the names in this document */ public NamePool getNamePool() { return node.getNamePool(); } /** * Get the unique document number */ public int getDocumentNumber() { return node.getDocumentNumber(); } /** * Get the element with a given ID, if any * @param id the required ID value * @return the element with the given ID value, or null if there is none. */ public NodeInfo selectID(String id) { NodeInfo n = ((DocumentInfo)node).selectID(id); if (n==null) { return null; } else { return makeWrapper(n, this, null); } } /** * Determine whether the wrapped document contains any xml:space="preserve" attributes. If it * does, we will look for them when stripping individual nodes. It's more efficient to scan * the document in advance checking for xml:space attributes than to look for them every time * we hit a whitespace text node. */ private static boolean findPreserveSpace(DocumentInfo doc) { AxisIterator iter = doc.iterateAxis(Axis.DESCENDANT, NodeKindTest.ELEMENT); while (true) { NodeInfo node = (NodeInfo)iter.next(); if (node == null) { return false; } String val = Navigator.getAttributeValue(node, NamespaceConstant.XML, "space"); if ("preserve".equals(val)) { return true; } } } /** * Does the stripped document contain any xml:space="preserve" attributes? */ public boolean containsPreserveSpace() { return preservesSpace; } /** * Set user data on the document node. The user data can be retrieved subsequently * using {@link #getUserData} * @param key A string giving the name of the property to be set. Clients are responsible * for choosing a key that is likely to be unique. Must not be null. * @param value The value to be set for the property. May be null, which effectively * removes the existing value for the property. */ public void setUserData(String key, Object value) { if (userData == null) { userData = new HashMap(4); } if (value == null) { userData.remove(key); } else { userData.put(key, value); } } /** * Get user data held in the document node. This retrieves properties previously set using * {@link #setUserData} * @param key A string giving the name of the property to be retrieved. * @return the value of the property, or null if the property has not been defined. */ public Object getUserData(String key) { if (userData == null) { return null; } else { return userData.get(key); } } } // This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. // If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. // This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public License, v. 2.0.