summaryrefslogtreecommitdiffstats
path: root/libjava/gnu/xml/dom/DomDocument.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/gnu/xml/dom/DomDocument.java')
-rw-r--r--libjava/gnu/xml/dom/DomDocument.java1387
1 files changed, 0 insertions, 1387 deletions
diff --git a/libjava/gnu/xml/dom/DomDocument.java b/libjava/gnu/xml/dom/DomDocument.java
deleted file mode 100644
index ec422d1b4de..00000000000
--- a/libjava/gnu/xml/dom/DomDocument.java
+++ /dev/null
@@ -1,1387 +0,0 @@
-/* DomDocument.java --
- Copyright (C) 1999,2000,2001,2004 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-package gnu.xml.dom;
-
-import java.util.Iterator;
-import javax.xml.XMLConstants;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.CDATASection;
-import org.w3c.dom.Comment;
-import org.w3c.dom.Document;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.DocumentType;
-import org.w3c.dom.DOMConfiguration;
-import org.w3c.dom.DOMImplementation;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Element;
-import org.w3c.dom.Entity;
-import org.w3c.dom.EntityReference;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.Notation;
-import org.w3c.dom.ProcessingInstruction;
-import org.w3c.dom.Text;
-import org.w3c.dom.UserDataHandler;
-import org.w3c.dom.traversal.DocumentTraversal;
-import org.w3c.dom.traversal.NodeFilter;
-import org.w3c.dom.traversal.NodeIterator;
-import org.w3c.dom.traversal.TreeWalker;
-import org.w3c.dom.xpath.XPathEvaluator;
-import org.w3c.dom.xpath.XPathException;
-import org.w3c.dom.xpath.XPathExpression;
-import org.w3c.dom.xpath.XPathNSResolver;
-
-/**
- * <p> "Document" and "DocumentTraversal" implementation.
- *
- * <p> Note that when this checks names for legality, it uses an
- * approximation of the XML rules, not the real ones. Specifically,
- * it uses Unicode rules, with sufficient tweaks to pass a majority
- * of basic XML conformance tests. (The huge XML character tables are
- * hairy to implement.)
- *
- * @author David Brownell
- * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
- */
-public class DomDocument
- extends DomNode
- implements Document, DocumentTraversal, XPathEvaluator
-{
-
- private final DOMImplementation implementation;
- private boolean checkingCharacters = true;
- boolean checkingWellformedness = true;
-
- boolean building; // if true, skip mutation events in the tree
-
- DomDocumentConfiguration config;
-
- String inputEncoding;
- String encoding;
- String version = "1.0";
- boolean standalone;
- String systemId;
-
- /**
- * Constructs a Document node, associating it with an instance
- * of the DomImpl class.
- *
- * <p> Note that this constructor disables character checking.
- * It is normally used when connecting a DOM to an XML parser,
- * and duplicating such checks is undesirable. When used for
- * purposes other than connecting to a parser, you should
- * re-enable that checking.
- *
- * @see #setCheckingCharacters
- */
- public DomDocument()
- {
- this(new DomImpl());
- }
-
- /**
- * Constructs a Document node, associating it with the specified
- * implementation. This should only be used in conjunction with
- * a specialized implementation; it will normally be called by
- * that implementation.
- *
- * @see DomImpl
- * @see #setCheckingCharacters
- */
- protected DomDocument(DOMImplementation impl)
- {
- super(DOCUMENT_NODE, null);
- implementation = impl;
- }
-
- /**
- * Sets the <code>building</code> flag.
- * Mutation events in the document are not reported.
- */
- public void setBuilding(boolean flag)
- {
- building = flag;
- }
-
- /**
- * Sets whether to check for document well-formedness.
- * If true, an exception will be raised if a second doctype or root
- * element node is added to the document.
- */
- public void setCheckWellformedness(boolean flag)
- {
- checkingWellformedness = flag;
- }
-
- /**
- * <b>DOM L1</b>
- * Returns the constant "#document".
- */
- final public String getNodeName()
- {
- return "#document";
- }
-
- /**
- * <b>DOM L1</b>
- * Returns the document's root element, or null.
- */
- final public Element getDocumentElement()
- {
- for (DomNode ctx = first; ctx != null; ctx = ctx.next)
- {
- if (ctx.nodeType == ELEMENT_NODE)
- {
- return (Element) ctx;
- }
- }
- return null;
- }
-
- /**
- * <b>DOM L1</b>
- * Returns the document's DocumentType, or null.
- */
- final public DocumentType getDoctype()
- {
- for (DomNode ctx = first; ctx != null; ctx = ctx.next)
- {
- if (ctx.nodeType == DOCUMENT_TYPE_NODE)
- {
- return (DocumentType) ctx;
- }
- }
- return null;
- }
-
- /**
- * <b>DOM L1</b>
- * Returns the document's DOMImplementation.
- */
- final public DOMImplementation getImplementation()
- {
- return implementation;
- }
-
- /**
- * <b>DOM L1 (relocated in DOM L2)</b>
- * Returns the element with the specified "ID" attribute, or null.
- *
- * <p>Returns null unless {@link Consumer} was used to populate internal
- * DTD declaration information, using package-private APIs. If that
- * internal DTD information is available, the document may be searched for
- * the element with that ID.
- */
- public Element getElementById(String id)
- {
- DomDoctype doctype = (DomDoctype) getDoctype();
-
- if (doctype == null || !doctype.hasIds()
- || id == null || id.length() == 0)
- {
- return null;
- }
-
- // yes, this is linear in size of document.
- // it'd be easy enough to maintain a hashtable.
- Node current = getDocumentElement();
- Node temp;
-
- if (current == null)
- {
- return null;
- }
- while (current != this)
- {
- // done?
- if (current.getNodeType() == ELEMENT_NODE)
- {
- DomElement element = (DomElement) current;
- DTDElementTypeInfo info =
- doctype.getElementTypeInfo(current.getNodeName());
- if (info != null &&
- id.equals(element.getAttribute(info.idAttrName)))
- {
- return element;
- }
- else if (element.userIdAttrs != null)
- {
- for (Iterator i = element.userIdAttrs.iterator();
- i.hasNext(); )
- {
- Node idAttr = (Node) i.next();
- if (id.equals(idAttr.getNodeValue()))
- {
- return element;
- }
- }
- }
- }
-
- // descend?
- if (current.hasChildNodes())
- {
- current = current.getFirstChild();
- continue;
- }
-
- // lateral?
- temp = current.getNextSibling();
- if (temp != null)
- {
- current = temp;
- continue;
- }
-
- // back up ...
- do
- {
- temp = current.getParentNode();
- if (temp == null)
- {
- return null;
- }
- current = temp;
- temp = current.getNextSibling();
- }
- while (temp == null);
- current = temp;
- }
- return null;
- }
-
- private void checkNewChild(Node newChild)
- {
- if (newChild.getNodeType() == ELEMENT_NODE
- && getDocumentElement() != null)
- {
- throw new DomDOMException(DOMException.HIERARCHY_REQUEST_ERR,
- "document element already present: " +
- getDocumentElement(), newChild, 0);
- }
- if (newChild.getNodeType() == DOCUMENT_TYPE_NODE
- && getDoctype() != null)
- {
- throw new DomDOMException(DOMException.HIERARCHY_REQUEST_ERR,
- "document type already present: " +
- getDoctype(), newChild, 0);
- }
- }
-
- /**
- * <b>DOM L1</b>
- * Appends the specified node to this node's list of children,
- * enforcing the constraints that there be only one root element
- * and one document type child.
- */
- public Node appendChild(Node newChild)
- {
- if (checkingWellformedness)
- {
- checkNewChild(newChild);
- }
- return super.appendChild(newChild);
- }
-
- /**
- * <b>DOM L1</b>
- * Inserts the specified node in this node's list of children,
- * enforcing the constraints that there be only one root element
- * and one document type child.
- */
- public Node insertBefore(Node newChild, Node refChild)
- {
- if (checkingWellformedness)
- {
- checkNewChild(newChild);
- }
- return super.insertBefore(newChild, refChild);
- }
-
- /**
- * <b>DOM L1</b>
- * Replaces the specified node in this node's list of children,
- * enforcing the constraints that there be only one root element
- * and one document type child.
- */
- public Node replaceChild(Node newChild, Node refChild)
- {
- if (checkingWellformedness &&
- ((newChild.getNodeType() == ELEMENT_NODE &&
- refChild.getNodeType() != ELEMENT_NODE) ||
- (newChild.getNodeType() == DOCUMENT_TYPE_NODE &&
- refChild.getNodeType() != DOCUMENT_TYPE_NODE)))
- {
- checkNewChild(newChild);
- }
- return super.replaceChild(newChild, refChild);
- }
-
- // NOTE: DOM can't really tell when the name of an entity,
- // notation, or PI must follow the namespace rules (excluding
- // colons) instead of the XML rules (which allow them without
- // much restriction). That's an API issue. verifyXmlName
- // aims to enforce the XML rules, not the namespace rules.
-
- /**
- * Throws a DOM exception if the specified name is not a legal XML 1.0
- * Name.
- * @deprecated This method is deprecated and may be removed in future
- * versions of GNU JAXP
- */
- public static void verifyXmlName(String name)
- {
- // XXX why is this public?
- checkName(name, false);
- }
-
- static void checkName(String name, boolean xml11)
- {
- if (name == null)
- {
- throw new DomDOMException(DOMException.NAMESPACE_ERR, name, null, 0);
- }
- int len = name.length();
- if (len == 0)
- {
- throw new DomDOMException(DOMException.NAMESPACE_ERR, name, null, 0);
- }
-
- // dog: rewritten to use the rules for XML 1.0 and 1.1
-
- // Name start character
- char c = name.charAt(0);
- if (xml11)
- {
- // XML 1.1
- if ((c < 0x0041 || c > 0x005a) &&
- (c < 0x0061 || c > 0x007a) &&
- c != ':' && c != '_' &&
- (c < 0x00c0 || c > 0x00d6) &&
- (c < 0x00d8 || c > 0x00f6) &&
- (c < 0x00f8 || c > 0x02ff) &&
- (c < 0x0370 || c > 0x037d) &&
- (c < 0x037f || c > 0x1fff) &&
- (c < 0x200c || c > 0x200d) &&
- (c < 0x2070 || c > 0x218f) &&
- (c < 0x2c00 || c > 0x2fef) &&
- (c < 0x3001 || c > 0xd7ff) &&
- (c < 0xf900 || c > 0xfdcf) &&
- (c < 0xfdf0 || c > 0xfffd) &&
- (c < 0x10000 || c > 0xeffff))
- {
- throw new DomDOMException(DOMException.INVALID_CHARACTER_ERR,
- name, null, c);
- }
- }
- else
- {
- // XML 1.0
- int type = Character.getType(c);
- switch (type)
- {
- case Character.LOWERCASE_LETTER: // Ll
- case Character.UPPERCASE_LETTER: // Lu
- case Character.OTHER_LETTER: // Lo
- case Character.TITLECASE_LETTER: // Lt
- case Character.LETTER_NUMBER: // Nl
- if ((c > 0xf900 && c < 0xfffe) ||
- (c >= 0x20dd && c <= 0x20e0))
- {
- // Compatibility area and Unicode 2.0 exclusions
- throw new DomDOMException(DOMException.INVALID_CHARACTER_ERR,
- name, null, c);
- }
- break;
- default:
- if (c != ':' && c != '_' && (c < 0x02bb || c > 0x02c1) &&
- c != 0x0559 && c != 0x06e5 && c != 0x06e6)
- {
- throw new DomDOMException(DOMException.INVALID_CHARACTER_ERR,
- name, null, c);
- }
- }
- }
-
- // Subsequent characters
- for (int i = 1; i < len; i++)
- {
- c = name.charAt(i);
- if (xml11)
- {
- // XML 1.1
- if ((c < 0x0041 || c > 0x005a) &&
- (c < 0x0061 || c > 0x007a) &&
- (c < 0x0030 || c > 0x0039) &&
- c != ':' && c != '_' && c != '-' && c != '.' &&
- (c < 0x00c0 || c > 0x00d6) &&
- (c < 0x00d8 || c > 0x00f6) &&
- (c < 0x00f8 || c > 0x02ff) &&
- (c < 0x0370 || c > 0x037d) &&
- (c < 0x037f || c > 0x1fff) &&
- (c < 0x200c || c > 0x200d) &&
- (c < 0x2070 || c > 0x218f) &&
- (c < 0x2c00 || c > 0x2fef) &&
- (c < 0x3001 || c > 0xd7ff) &&
- (c < 0xf900 || c > 0xfdcf) &&
- (c < 0xfdf0 || c > 0xfffd) &&
- (c < 0x10000 || c > 0xeffff) &&
- c != 0x00b7 &&
- (c < 0x0300 || c > 0x036f) &&
- (c < 0x203f || c > 0x2040))
- {
- throw new DomDOMException(DOMException.INVALID_CHARACTER_ERR, name,
- null, c);
- }
- }
- else
- {
- // XML 1.0
- int type = Character.getType(c);
- switch (type)
- {
- case Character.LOWERCASE_LETTER: // Ll
- case Character.UPPERCASE_LETTER: // Lu
- case Character.DECIMAL_DIGIT_NUMBER: // Nd
- case Character.OTHER_LETTER: // Lo
- case Character.TITLECASE_LETTER: // Lt
- case Character.LETTER_NUMBER: // Nl
- case Character.COMBINING_SPACING_MARK: // Mc
- case Character.ENCLOSING_MARK: // Me
- case Character.NON_SPACING_MARK: // Mn
- case Character.MODIFIER_LETTER: // Lm
- if ((c > 0xf900 && c < 0xfffe) ||
- (c >= 0x20dd && c <= 0x20e0))
- {
- // Compatibility area and Unicode 2.0 exclusions
- throw new DomDOMException(DOMException.INVALID_CHARACTER_ERR,
- name, null, c);
- }
- break;
- default:
- if (c != '-' && c != '.' && c != ':' && c != '_' &&
- c != 0x0387 && (c < 0x02bb || c > 0x02c1) &&
- c != 0x0559 && c != 0x06e5 && c != 0x06e6 && c != 0x00b7)
- {
- throw new DomDOMException(DOMException.INVALID_CHARACTER_ERR,
- name, null, c);
- }
- }
- }
- }
-
- // FIXME characters with a font or compatibility decomposition (i.e.
- // those with a "compatibility formatting tag" in field 5 of the
- // database -- marked by field 5 beginning with a "<") are not allowed.
- }
-
- // package private
- static void checkNCName(String name, boolean xml11)
- {
- checkName(name, xml11);
- int len = name.length();
- int index = name.indexOf(':');
- if (index != -1)
- {
- if (index == 0 || index == (len - 1) ||
- name.lastIndexOf(':') != index)
- {
- throw new DomDOMException(DOMException.NAMESPACE_ERR,
- name, null, 0);
- }
- }
- }
-
- // package private
- static void checkChar(String value, boolean xml11)
- {
- char[] chars = value.toCharArray();
- checkChar(chars, 0, chars.length, xml11);
- }
-
- static void checkChar(char[] buf, int off, int len, boolean xml11)
- {
- for (int i = 0; i < len; i++)
- {
- char c = buf[i];
-
- // assume surrogate pairing checks out OK, for simplicity
- if ((c >= 0x0020 && c <= 0xd7ff) ||
- (c == 0x000a || c == 0x000d || c == 0x0009) ||
- (c >= 0xe000 && c <= 0xfffd) ||
- (c >= 0x10000 && c <= 0x10ffff))
- {
- continue;
- }
- if (xml11)
- {
- if ((c >= 0x0001 && c <= 0x001f) ||
- (c >= 0x007f && c <= 0x0084) ||
- (c >= 0x0086 && c <= 0x009f))
- {
- continue;
- }
- }
- throw new DomDOMException(DOMException.INVALID_CHARACTER_ERR,
- new String(buf, off, len), null, c);
- }
- }
-
- /**
- * <b>DOM L1</b>
- * Returns a newly created element with the specified name.
- */
- public Element createElement(String name)
- {
- Element element;
-
- if (checkingCharacters)
- {
- checkName(name, "1.1".equals(version));
- }
- if (name.startsWith("xml:"))
- {
- element = createElementNS(null, name);
- }
- else
- {
- element = new DomElement(this, null, name);
- }
- defaultAttributes(element, name);
- return element;
- }
-
- /**
- * <b>DOM L2</b>
- * Returns a newly created element with the specified name
- * and namespace information.
- */
- public Element createElementNS(String namespaceURI, String name)
- {
- if (checkingCharacters)
- {
- checkNCName(name, "1.1".equals(version));
- }
-
- if ("".equals(namespaceURI))
- {
- namespaceURI = null;
- }
- if (name.startsWith("xml:"))
- {
- if (namespaceURI != null
- && !XMLConstants.XML_NS_URI.equals(namespaceURI))
- {
- throw new DomDOMException(DOMException.NAMESPACE_ERR,
- "xml namespace is always " +
- XMLConstants.XML_NS_URI, this, 0);
- }
- namespaceURI = XMLConstants.XML_NS_URI;
- }
- else if (XMLConstants.XMLNS_ATTRIBUTE.equals(name) ||
- name.startsWith("xmlns:"))
- {
- throw new DomDOMException(DOMException.NAMESPACE_ERR,
- "xmlns is reserved", this, 0);
- }
- else if (namespaceURI == null && name.indexOf(':') != -1)
- {
- throw new DomDOMException(DOMException.NAMESPACE_ERR,
- "prefixed name '" + name +
- "' needs a URI", this, 0);
- }
-
- Element element = new DomElement(this, namespaceURI, name);
- defaultAttributes(element, name);
- return element;
- }
-
- private void defaultAttributes(Element element, String name)
- {
- DomDoctype doctype = (DomDoctype) getDoctype();
- if (doctype == null)
- {
- return;
- }
-
- // default any attributes that need it
- DTDElementTypeInfo info = doctype.getElementTypeInfo(name);
- if (info != null)
- {
- for (Iterator i = info.attributes(); i != null && i.hasNext(); )
- {
- DTDAttributeTypeInfo attr = (DTDAttributeTypeInfo) i.next();
- DomAttr node = (DomAttr) createAttribute(attr.name);
-
- String value = attr.value;
- if (value == null)
- {
- value = "";
- }
- node.setValue(value);
- node.setSpecified(false);
- element.setAttributeNode(node);
- }
- }
- }
-
- /**
- * <b>DOM L1</b>
- * Returns a newly created document fragment.
- */
- public DocumentFragment createDocumentFragment()
- {
- return new DomDocumentFragment(this);
- }
-
- /**
- * <b>DOM L1</b>
- * Returns a newly created text node with the specified value.
- */
- public Text createTextNode(String value)
- {
- if (checkingCharacters)
- {
- checkChar(value, "1.1".equals(version));
- }
- return new DomText(this, value);
- }
-
- /**
- * Returns a newly created text node with the specified value.
- */
- public Text createTextNode(char[] buf, int off, int len)
- {
- if (checkingCharacters)
- {
- checkChar(buf, off, len, "1.1".equals(version));
- }
- return new DomText(this, buf, off, len);
- }
-
- /**
- * <b>DOM L1</b>
- * Returns a newly created comment node with the specified value.
- */
- public Comment createComment(String value)
- {
- if (checkingCharacters)
- {
- checkChar(value, "1.1".equals(version));
- }
- return new DomComment(this, value);
- }
-
- /**
- * <b>DOM L1</b>
- * Returns a newly created CDATA section node with the specified value.
- */
- public CDATASection createCDATASection(String value)
- {
- if (checkingCharacters)
- {
- checkChar(value, "1.1".equals(version));
- }
- return new DomCDATASection(this, value);
- }
-
- /**
- * Returns a newly created CDATA section node with the specified value.
- */
- public CDATASection createCDATASection(char[] buf, int off, int len)
- {
- if (checkingCharacters)
- {
- checkChar(buf, off, len, "1.1".equals(version));
- }
- return new DomCDATASection(this, buf, off, len);
- }
-
- /**
- * <b>DOM L1</b>
- * Returns a newly created processing instruction.
- */
- public ProcessingInstruction createProcessingInstruction(String target,
- String data)
- {
- if (checkingCharacters)
- {
- boolean xml11 = "1.1".equals(version);
- checkName(target, xml11);
- if ("xml".equalsIgnoreCase(target))
- {
- throw new DomDOMException(DOMException.SYNTAX_ERR,
- "illegal PI target name",
- this, 0);
- }
- checkChar(data, xml11);
- }
- return new DomProcessingInstruction(this, target, data);
- }
-
- /**
- * <b>DOM L1</b>
- * Returns a newly created attribute with the specified name.
- */
- public Attr createAttribute(String name)
- {
- if (checkingCharacters)
- {
- checkName(name, "1.1".equals(version));
- }
- if (name.startsWith("xml:"))
- {
- return createAttributeNS(XMLConstants.XML_NS_URI, name);
- }
- else if (XMLConstants.XMLNS_ATTRIBUTE.equals(name) ||
- name.startsWith("xmlns:"))
- {
- return createAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, name);
- }
- else
- {
- return new DomAttr(this, null, name);
- }
- }
-
- /**
- * <b>DOM L2</b>
- * Returns a newly created attribute with the specified name
- * and namespace information.
- */
- public Attr createAttributeNS(String namespaceURI, String name)
- {
- if (checkingCharacters)
- {
- checkNCName(name, "1.1".equals(version));
- }
-
- if ("".equals(namespaceURI))
- {
- namespaceURI = null;
- }
- if (name.startsWith ("xml:"))
- {
- if (namespaceURI == null)
- {
- namespaceURI = XMLConstants.XML_NS_URI;
- }
- else if (!XMLConstants.XML_NS_URI.equals(namespaceURI))
- {
- throw new DomDOMException(DOMException.NAMESPACE_ERR,
- "xml namespace is always " +
- XMLConstants.XML_NS_URI,
- this, 0);
- }
- }
- else if (XMLConstants.XMLNS_ATTRIBUTE.equals(name) ||
- name.startsWith("xmlns:"))
- {
- if (namespaceURI == null)
- {
- namespaceURI = XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
- }
- else if (!XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceURI))
- {
- throw new DomDOMException(DOMException.NAMESPACE_ERR,
- "xmlns namespace must be " +
- XMLConstants.XMLNS_ATTRIBUTE_NS_URI,
- this, 0);
- }
- }
- else if (namespaceURI == null && name.indexOf(':') != -1)
- {
- throw new DomDOMException(DOMException.NAMESPACE_ERR,
- "prefixed name needs a URI: " + name, this, 0);
- }
- return new DomAttr(this, namespaceURI, name);
- }
-
- /**
- * <b>DOM L1</b>
- * Returns a newly created reference to the specified entity.
- * The caller should populate this with the appropriate children
- * and then mark it as readonly.
- *
- * @see DomNode#makeReadonly
- */
- public EntityReference createEntityReference(String name)
- {
- DomEntityReference ret = new DomEntityReference(this, name);
- DocumentType doctype = getDoctype();
- if (doctype != null)
- {
- DomEntity ent = (DomEntity) doctype.getEntities().getNamedItem(name);
- if (ent != null)
- {
- for (DomNode ctx = ent.first; ctx != null; ctx = ctx.next)
- {
- ret.appendChild(ctx.cloneNode(true));
- }
- }
- }
- ret.makeReadonly();
- return ret;
- }
-
- /**
- * <b>DOM L2</b>
- * Makes a copy of the specified node, with all nodes "owned" by
- * this document and with children optionally copied. This type
- * of standard utility has become, well, a standard utility.
- *
- * <p> Note that EntityReference nodes created through this method (either
- * directly, or recursively) never have children, and that there is no
- * portable way to associate them with such children.
- *
- * <p> Note also that there is no requirement that the specified node
- * be associated with a different document. This differs from the
- * <em>cloneNode</em> operation in that the node itself is not given
- * an opportunity to participate, so that any information managed
- * by node subclasses will be lost.
- */
- public Node importNode(Node src, boolean deep)
- {
- Node dst = null;
- switch (src.getNodeType())
- {
- case TEXT_NODE:
- dst = createTextNode(src.getNodeValue());
- break;
- case CDATA_SECTION_NODE:
- dst = createCDATASection(src.getNodeValue());
- break;
- case COMMENT_NODE:
- dst = createComment(src.getNodeValue());
- break;
- case PROCESSING_INSTRUCTION_NODE:
- dst = createProcessingInstruction(src.getNodeName(),
- src.getNodeValue());
- break;
- case NOTATION_NODE:
- // NOTE: There's no standard way to create
- // these, or add them to a doctype. Useless.
- Notation notation = (Notation) src;
- dst = new DomNotation(this, notation.getNodeName(),
- notation.getPublicId(),
- notation.getSystemId());
- break;
- case ENTITY_NODE:
- // NOTE: There's no standard way to create
- // these, or add them to a doctype. Useless.
- Entity entity = (Entity) src;
- dst = new DomEntity(this, entity.getNodeName(),
- entity.getPublicId(),
- entity.getSystemId(),
- entity.getNotationName());
- if (deep)
- {
- for (Node ctx = src.getFirstChild(); ctx != null;
- ctx = ctx.getNextSibling())
- {
- dst.appendChild(importNode(ctx, deep));
- }
- }
- break;
- case ENTITY_REFERENCE_NODE:
- dst = createEntityReference(src.getNodeName());
- break;
- case DOCUMENT_FRAGMENT_NODE:
- dst = new DomDocumentFragment(this);
- if (deep)
- {
- for (Node ctx = src.getFirstChild(); ctx != null;
- ctx = ctx.getNextSibling())
- {
- dst.appendChild(importNode(ctx, deep));
- }
- }
- break;
- case ATTRIBUTE_NODE:
- String attr_nsuri = src.getNamespaceURI();
- if (attr_nsuri != null)
- {
- dst = createAttributeNS(attr_nsuri, src.getNodeName());
- }
- else
- {
- dst = createAttribute(src.getNodeName());
- }
- // this is _always_ done regardless of "deep" setting
- for (Node ctx = src.getFirstChild(); ctx != null;
- ctx = ctx.getNextSibling())
- {
- dst.appendChild(importNode(ctx, false));
- }
- break;
- case ELEMENT_NODE:
- String elem_nsuri = src.getNamespaceURI();
- if (elem_nsuri != null)
- {
- dst = createElementNS(elem_nsuri, src.getNodeName());
- }
- else
- {
- dst = createElement(src.getNodeName());
- }
- NamedNodeMap srcAttrs = src.getAttributes();
- NamedNodeMap dstAttrs = dst.getAttributes();
- int len = srcAttrs.getLength();
- for (int i = 0; i < len; i++)
- {
- Attr a = (Attr) srcAttrs.item(i);
- Attr dflt;
-
- // maybe update defaulted attributes
- dflt = (Attr) dstAttrs.getNamedItem(a.getNodeName());
- if (dflt != null)
- {
- String newval = a.getNodeValue();
- if (!dflt.getNodeValue().equals(newval)
- || a.getSpecified () == true)
- {
- dflt.setNodeValue (newval);
- }
- continue;
- }
-
- dstAttrs.setNamedItem((Attr) importNode(a, false));
- }
- if (deep)
- {
- for (Node ctx = src.getFirstChild(); ctx != null;
- ctx = ctx.getNextSibling())
- {
- dst.appendChild(importNode(ctx, true));
- }
- }
- break;
- // can't import document or doctype nodes
- case DOCUMENT_NODE:
- case DOCUMENT_TYPE_NODE:
- // FALLTHROUGH
- // can't import unrecognized or nonstandard nodes
- default:
- throw new DomDOMException(DOMException.NOT_SUPPORTED_ERR, null, src, 0);
- }
-
- // FIXME cleanup a bit -- for deep copies, copy those
- // children in one place, here (code sharing is healthy)
-
- if (src instanceof DomNode)
- {
- ((DomNode) src).notifyUserDataHandlers(UserDataHandler.NODE_IMPORTED,
- src, dst);
- }
- return dst;
- }
-
- /**
- * <b>DOM L2 (Traversal)</b>
- * Returns a newly created node iterator. Don't forget to detach
- * this iterator when you're done using it!
- *
- * @see DomIterator
- */
- public NodeIterator createNodeIterator(Node root,
- int whatToShow,
- NodeFilter filter,
- boolean expandEntities)
- {
- return new DomNodeIterator(root, whatToShow, filter, expandEntities,
- false);
- }
-
- public TreeWalker createTreeWalker(Node root,
- int whatToShow,
- NodeFilter filter,
- boolean expandEntities)
- {
- return new DomNodeIterator(root, whatToShow, filter, expandEntities,
- true);
- }
-
- // DOM Level 3 methods
-
- /**
- * DOM L3
- */
- public String getInputEncoding()
- {
- return inputEncoding;
- }
-
- public void setInputEncoding(String inputEncoding)
- {
- this.inputEncoding = inputEncoding;
- }
-
- /**
- * DOM L3
- */
- public String getXmlEncoding()
- {
- return encoding;
- }
-
- public void setXmlEncoding(String encoding)
- {
- this.encoding = encoding;
- }
-
- public boolean getXmlStandalone()
- {
- return standalone;
- }
-
- public void setXmlStandalone(boolean xmlStandalone)
- {
- standalone = xmlStandalone;
- }
-
- public String getXmlVersion()
- {
- return version;
- }
-
- public void setXmlVersion(String xmlVersion)
- {
- if (xmlVersion == null)
- {
- xmlVersion = "1.0";
- }
- if ("1.0".equals(xmlVersion) ||
- "1.1".equals(xmlVersion))
- {
- version = xmlVersion;
- }
- else
- {
- throw new DomDOMException(DOMException.NOT_SUPPORTED_ERR);
- }
- }
-
- public boolean getStrictErrorChecking()
- {
- return checkingCharacters;
- }
-
- public void setStrictErrorChecking(boolean strictErrorChecking)
- {
- checkingCharacters = strictErrorChecking;
- }
-
- public String lookupPrefix(String namespaceURI)
- {
- Node root = getDocumentElement();
- return (root == null) ? null : root.lookupPrefix(namespaceURI);
- }
-
- public boolean isDefaultNamespace(String namespaceURI)
- {
- Node root = getDocumentElement();
- return (root == null) ? false : root.isDefaultNamespace(namespaceURI);
- }
-
- public String lookupNamespaceURI(String prefix)
- {
- Node root = getDocumentElement();
- return (root == null) ? null : root.lookupNamespaceURI(prefix);
- }
-
- public String getBaseURI()
- {
- return getDocumentURI();
- /*
- Node root = getDocumentElement();
- if (root != null)
- {
- NamedNodeMap attrs = root.getAttributes();
- Node xmlBase = attrs.getNamedItemNS(XMLConstants.XML_NS_URI, "base");
- if (xmlBase != null)
- {
- return xmlBase.getNodeValue();
- }
- }
- return systemId;
- */
- }
-
- public String getDocumentURI()
- {
- return systemId;
- }
-
- public void setDocumentURI(String documentURI)
- {
- systemId = documentURI;
- }
-
- public Node adoptNode(Node source)
- {
- switch (source.getNodeType())
- {
- case DOCUMENT_NODE:
- case DOCUMENT_TYPE_NODE:
- throw new DomDOMException(DOMException.NOT_SUPPORTED_ERR);
- case ENTITY_NODE:
- case NOTATION_NODE:
- throw new DomDOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR);
- }
- if (source instanceof DomNode)
- {
- DomNode src = (DomNode) source;
- DomNode dst = src;
- if (dst.parent != null)
- {
- dst = (DomNode) dst.cloneNode(true);
- }
- dst.setOwner(this);
- src.notifyUserDataHandlers(UserDataHandler.NODE_ADOPTED, src, dst);
- return dst;
- }
- return null;
- }
-
- public DOMConfiguration getDomConfig()
- {
- if (config == null)
- {
- config = new DomDocumentConfiguration();
- }
- return config;
- }
-
- public void normalizeDocument()
- {
- boolean save = building;
- building = true;
- normalizeNode(this);
- building = save;
- }
-
- void normalizeNode(DomNode node)
- {
- node.normalize();
- if (config != null)
- {
- switch (node.nodeType)
- {
- case CDATA_SECTION_NODE:
- if (!config.cdataSections)
- {
- // replace CDATA section with text node
- Text text = createTextNode(node.getNodeValue());
- node.parent.insertBefore(text, node);
- node.parent.removeChild(node);
- // merge adjacent text nodes
- String data = text.getWholeText();
- node = (DomNode) text.replaceWholeText(data);
- }
- else if (config.splitCdataSections)
- {
- String value = node.getNodeValue();
- int i = value.indexOf("]]>");
- while (i != -1)
- {
- Node node2 = createCDATASection(value.substring(0, i));
- node.parent.insertBefore(node2, node);
- value = value.substring(i + 3);
- node.setNodeValue(value);
- i = value.indexOf("]]>");
- }
- }
- break;
- case COMMENT_NODE:
- if (!config.comments)
- {
- node.parent.removeChild(node);
- }
- break;
- case TEXT_NODE:
- if (!config.elementContentWhitespace &&
- ((Text) node).isElementContentWhitespace())
- {
- node.parent.removeChild(node);
- }
- break;
- case ENTITY_REFERENCE_NODE:
- if (!config.entities)
- {
- for (DomNode ctx = node.first; ctx != null; )
- {
- DomNode ctxNext = ctx.next;
- node.parent.insertBefore(ctx, node);
- ctx = ctxNext;
- }
- node.parent.removeChild(node);
- }
- break;
- case ELEMENT_NODE:
- if (!config.namespaceDeclarations)
- {
- DomNamedNodeMap attrs =
- (DomNamedNodeMap) node.getAttributes();
- boolean aro = attrs.readonly;
- attrs.readonly = false; // Ensure we can delete if necessary
- int len = attrs.getLength();
- for (int i = 0; i < len; i++)
- {
- Node attr = attrs.item(i);
- String namespace = attr.getNamespaceURI();
- if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespace))
- {
- attrs.removeNamedItemNS(namespace,
- attr.getLocalName());
- i--;
- len--;
- }
- }
- attrs.readonly = aro;
- }
- break;
- }
- }
- for (DomNode ctx = node.first; ctx != null; )
- {
- DomNode ctxNext = ctx.next;
- normalizeNode(ctx);
- ctx = ctxNext;
- }
- }
-
- public Node renameNode(Node n, String namespaceURI, String qualifiedName)
- throws DOMException
- {
- if (n instanceof DomNsNode)
- {
- DomNsNode src = (DomNsNode) n;
- if (src == null)
- {
- throw new DomDOMException(DOMException.NOT_FOUND_ERR);
- }
- if (src.owner != this)
- {
- throw new DomDOMException(DOMException.WRONG_DOCUMENT_ERR,
- null, src, 0);
- }
- boolean xml11 = "1.1".equals(version);
- checkName(qualifiedName, xml11);
- int ci = qualifiedName.indexOf(':');
- if ("".equals(namespaceURI))
- {
- namespaceURI = null;
- }
- if (namespaceURI != null)
- {
- checkNCName(qualifiedName, xml11);
- String prefix = (ci == -1) ? "" :
- qualifiedName.substring(0, ci);
- if (XMLConstants.XML_NS_PREFIX.equals(prefix) &&
- !XMLConstants.XML_NS_URI.equals(namespaceURI))
- {
- throw new DomDOMException(DOMException.NAMESPACE_ERR,
- "xml namespace must be " +
- XMLConstants.XML_NS_URI, src, 0);
- }
- else if (src.nodeType == ATTRIBUTE_NODE &&
- (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix) ||
- XMLConstants.XMLNS_ATTRIBUTE.equals(qualifiedName)) &&
- !XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceURI))
- {
- throw new DomDOMException(DOMException.NAMESPACE_ERR,
- "xmlns namespace must be " +
- XMLConstants.XMLNS_ATTRIBUTE_NS_URI, src, 0);
- }
- if (XMLConstants.XML_NS_URI.equals(namespaceURI) &&
- !XMLConstants.XML_NS_PREFIX.equals(prefix))
- {
- throw new DomDOMException(DOMException.NAMESPACE_ERR,
- "xml namespace must be " +
- XMLConstants.XML_NS_URI, src, 0);
- }
- else if (src.nodeType == ATTRIBUTE_NODE &&
- XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceURI) &&
- !(XMLConstants.XMLNS_ATTRIBUTE.equals(prefix) ||
- XMLConstants.XMLNS_ATTRIBUTE.equals(qualifiedName)))
- {
- throw new DomDOMException(DOMException.NAMESPACE_ERR,
- "xmlns namespace must be " +
- XMLConstants.XMLNS_ATTRIBUTE_NS_URI, src, 0);
- }
-
- }
- src.setNodeName(qualifiedName);
- src.setNamespaceURI(namespaceURI);
- src.notifyUserDataHandlers(UserDataHandler.NODE_RENAMED, src, src);
- // TODO MutationNameEvents
- // DOMElementNameChanged or DOMAttributeNameChanged
- return src;
- }
- throw new DomDOMException(DOMException.NOT_SUPPORTED_ERR, null, n, 0);
- }
-
- // -- XPathEvaluator --
-
- public XPathExpression createExpression(String expression,
- XPathNSResolver resolver)
- throws XPathException, DOMException
- {
- return new DomXPathExpression(this, expression, resolver);
- }
-
- public XPathNSResolver createNSResolver(Node nodeResolver)
- {
- return new DomXPathNSResolver(nodeResolver);
- }
-
- public Object evaluate(String expression,
- Node contextNode,
- XPathNSResolver resolver,
- short type,
- Object result)
- throws XPathException, DOMException
- {
- XPathExpression xpe =
- new DomXPathExpression(this, expression, resolver);
- return xpe.evaluate(contextNode, type, result);
- }
-
-}
-
OpenPOWER on IntegriCloud