/*
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
/*
* Copyright 1999-2002,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
*
*
* 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.
*/
/**
* Elements represent most of the "markup" and structure of the
* document. They contain both the data for the element itself
* (element name and attributes), and any contained nodes, including
* document text (as children).
* <P>
* Elements may have Attributes associated with them; the API for this is
* defined in Node, but the function is implemented here. In general, XML
* applications should retrive Attributes as Nodes, since they may contain
* entity references and hence be a fairly complex sub-tree. HTML users will
* be dealing with simple string values, and convenience methods are provided
* to work in terms of Strings.
* <P>
* ElementImpl does not support Namespaces. ElementNSImpl, which inherits from
* it, does.
* @see ElementNSImpl
*
* @xerces.internal
*
* @author Arnaud Le Hors, IBM
* @author Joe Kesselman, IBM
* @author Andy Clark, IBM
* @author Ralf Pfeiffer, IBM
* @since PR-DOM-Level-1-19980818.
*/
public class ElementImpl
extends ParentNode
//
// Constants
//
/** Serialization version. */
//
// Data
//
/** Element name. */
/** Attributes. */
//
// Constructors
//
/** Factory constructor. */
super(ownerDoc);
needsSyncData(true); // synchronizeData will initialize attributes
}
// for ElementNSImpl
protected ElementImpl() {}
// Support for DOM Level 3 renameNode method.
// Note: This only deals with part of the pb. CoreDocumentImpl
// does all the work.
if (needsSyncData()) {
}
}
//
// Node methods
//
/**
* A short integer indicating what type of node this is. The named
* constants for this value are defined in the org.w3c.dom.Node interface.
*/
public short getNodeType() {
return Node.ELEMENT_NODE;
}
/**
* Returns the element name
*/
if (needsSyncData()) {
}
return name;
}
/**
* Retrieve all the Attributes as a set. Note that this API is inherited
* from Node rather than specified on Element; in fact only Elements will
* ever have Attributes, but they want to allow folks to "blindly" operate
* on the tree as a set of Nodes.
*/
if (needsSyncData()) {
}
if (attributes == null) {
}
return attributes;
} // getAttributes():NamedNodeMap
/**
* Return a duplicate copy of this Element. Note that its children
* will not be copied unless the "deep" flag is true, but Attributes
* are <i>always</i> replicated.
*
* @see org.w3c.dom.Node#cloneNode(boolean)
*/
// Replicate NamedNodeMap rather than sharing it.
if (attributes != null) {
}
return newnode;
} // cloneNode(boolean):Node
/**
* DOM Level 3 WD - Experimental.
* Retrieve baseURI
*/
if (needsSyncData()) {
}
// Absolute base URI is computed according to
// XML Base (http://www.w3.org/TR/xmlbase/#granularity)
// 1. The base URI specified by an xml:base attribute on the element,
// if one exists
if (attributes != null) {
try {
}
// This may be a relative URI.
// Make any parentURI into a URI object to use with the URI(URI, String) constructor
if (parentBaseURI != null){
try{
}
// This should never happen: parent should have checked the URI and returned null if invalid.
return null;
}
return uri;
}
return null;
}
return uri;
}
}
}
// 2.the base URI of the element's parent element within the
// document or external entity, if one exists
// 3. the base URI of the document entity or external entity
// containing the element
// ownerNode serves as a parent or as document
//base URI of parent element is not null
try {
//return valid absolute base URI
}
return null;
}
}
return null;
} //getBaseURI
/**
* NON-DOM
* set the ownerDocument of this node, its children, and its attributes
*/
super.setOwnerDocument(doc);
if (attributes != null) {
}
}
//
// Element methods
//
/**
* Look up a single Attribute by name. Returns the Attribute's
* string value, or an empty string (NOT null!) to indicate that the
* name did not map to a currently defined attribute.
* <p>
* Note: Attributes may contain complex node trees. This method
* returns the "flattened" string obtained from Attribute.getValue().
* If you need the structure information, see getAttributeNode().
*/
if (needsSyncData()) {
}
if (attributes == null) {
return "";
}
} // getAttribute(String):String
/**
* Look up a single Attribute by name. Returns the Attribute Node,
* so its complete child tree is available. This could be important in
* XML, where the string rendering may not be sufficient information.
* <p>
* If no matching attribute is available, returns null.
*/
if (needsSyncData()) {
}
if (attributes == null) {
return null;
}
} // getAttributeNode(String):Attr
/**
* Returns a NodeList of all descendent nodes (children,
* grandchildren, and so on) which are Elements and which have the
* specified tag name.
* <p>
* Note: NodeList is a "live" view of the DOM. Its contents will
* change as the DOM changes, and alterations made to the NodeList
* will be reflected in the DOM.
*
* @param tagname The type of element to gather. To obtain a list of
* all elements no matter what their names, use the wild-card tag
* name "*".
*
* @see DeepNodeListImpl
*/
return new DeepNodeListImpl(this,tagname);
}
/**
* Returns the name of the Element. Note that Element.nodeName() is
* defined to also return the tag name.
* <p>
* This is case-preserving in XML. HTML should uppercasify it on the
* way in.
*/
if (needsSyncData()) {
}
return name;
}
/**
* In "normal form" (as read from a source file), there will never be two
* Text children in succession. But DOM users may create successive Text
* nodes in the course of manipulating the document. Normalize walks the
* sub-tree and merges adjacent Texts, as if the DOM had been written out
* and read back in again. This simplifies implementation of higher-level
* functions that may want to assume that the document is in standard form.
* <p>
* To normalize a Document, normalize its top-level Element child.
* <p>
* As of PR-DOM-Level-1-19980818, CDATA -- despite being a subclass of
* Text -- is considered "markup" and will _not_ be merged either with
* normal Text or with other CDATASections.
*/
public void normalize() {
// No need to normalize if already normalized.
if (isNormalized()) {
return;
}
if (needsSyncChildren()) {
}
// If kid is a text node, we need to check for one of two
// conditions:
// 1) There is an adjacent text node
// 2) There is no adjacent text node, but kid is
// an empty text node.
{
// If an adjacent text node, merge it with kid
{
removeChild( next );
}
else
{
// If kid is empty, remove it
removeChild( kid );
}
}
}
// Otherwise it might be an Element, which is handled recursively
}
}
// We must also normalize all of the attributes
if ( attributes!=null )
{
{
}
}
// changed() will have occurred when the removeChild() was done,
// so does not have to be reissued.
isNormalized(true);
} // normalize()
/**
* Remove the named attribute from this Element. If the removed
* Attribute has a default value, it is immediately replaced thereby.
* <P>
* The default logic is actually implemented in NamedNodeMapImpl.
* PR-DOM-Level-1-19980818 doesn't fully address the DTD, so some
* of this behavior is likely to change in future versions. ?????
* <P>
* Note that this call "succeeds" even if no attribute by this name
* existed -- unlike removeAttributeNode, which will throw a not-found
* exception in that case.
*
* @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) if the node is
* readonly.
*/
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
}
if (needsSyncData()) {
}
if (attributes == null) {
return;
}
} // removeAttribute(String)
/**
* Attribute has a default value, it is immediately replaced.
* <p>
* NOTE: Specifically removes THIS NODE -- not the node with this
* name, nor the node with these contents. If the specific Attribute
* object passed in is not stored in this Element, we throw a
* DOMException. If you really want to remove an attribute by name,
* use removeAttribute().
*
* @return the Attribute object that was removed.
* @throws DOMException(NOT_FOUND_ERR) if oldattr is not an attribute of
* this Element.
* @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) if the node is
* readonly.
*/
throws DOMException {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
}
if (needsSyncData()) {
}
if (attributes == null) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_FOUND_ERR", null);
}
} // removeAttributeNode(Attr):Attr
/**
* attribute having that name.
*
* Note: this method supports only the simplest kind of Attribute,
* one whose value is a string contained in a single Text node.
* If you want to assert a more complex value (which XML permits,
* though HTML doesn't), see setAttributeNode().
*
* The attribute is created with specified=true, meaning it's an
* explicit value rather than inherited from the DTD as a default.
* Again, setAttributeNode can be used to achieve other results.
*
* @throws DOMException(INVALID_NAME_ERR) if the name is not acceptable.
* (Attribute factory will do that test for us.)
*
* @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) if the node is
* readonly.
*/
"NO_MODIFICATION_ALLOWED_ERR",
null);
}
if (needsSyncData()) {
}
if (attributes == null) {
}
}
else {
}
} // setAttribute(String,String)
/**
* existing attribute with that name.
* <P>
* This method allows you to add an Attribute that has already been
* constructed, and hence avoids the limitations of the simple
* setAttribute() call. It can handle attribute values that have
* arbitrarily complex tree structure -- in particular, those which
* had entity references mixed into their text.
*
* @throws DOMException(INUSE_ATTRIBUTE_ERR) if the Attribute object
* has already been assigned to another Element.
*/
throws DOMException
{
if (needsSyncData()) {
}
if (ownerDocument.errorChecking) {
if (isReadOnly()) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
throw new DOMException(
msg);
}
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "WRONG_DOCUMENT_ERR", null);
}
}
if (attributes == null) {
}
// This will throw INUSE if necessary
} // setAttributeNode(Attr):Attr
//
// DOM2: Namespace methods
//
/**
* Introduced in DOM Level 2. <p>
*
* Retrieves an attribute value by local name and namespace URI.
*
* @param namespaceURI
* The namespace URI of the attribute to
* retrieve.
* @param localName The local name of the attribute to retrieve.
* @return String The Attr value as a string, or empty string
* if that attribute
* does not have a specified or default value.
* @since WD-DOM-Level-2-19990923
*/
if (needsSyncData()) {
}
if (attributes == null) {
return "";
}
} // getAttributeNS(String,String):String
/**
* Introduced in DOM Level 2. <p>
*
* Adds a new attribute.
* If the given namespaceURI is null or an empty string and the
* qualifiedName has a prefix that is "xml", the new attribute is bound to
* the predefined namespace "http://www.w3.org/XML/1998/namespace"
* [Namespaces]. If an attribute with the same local name and namespace
* URI is already present on the element, its prefix is changed to be the
* prefix part of the qualifiedName, and its value is changed to be the
* value parameter. This value is a simple string, it is not parsed as it
* is being set. So any markup (such as syntax to be recognized as an
* entity reference) is treated as literal text, and needs to be
* appropriately escaped by the implementation when it is written out. In
* order to assign an attribute value that contains entity references, the
* user must create an Attr node plus any Text and EntityReference nodes,
* build the appropriate subtree, and use setAttributeNodeNS or
* setAttributeNode to assign it as the value of an attribute.
*
* @param namespaceURI The namespace URI of the attribute to create
* or alter.
* @param qualifiedName The qualified name of the attribute to create or
* alter.
* @param value The value to set in string form.
* @throws INVALID_CHARACTER_ERR: Raised if the specified
* name contains an invalid character.
*
* @throws NO_MODIFICATION_ALLOWED_ERR: Raised if this
* node is readonly.
*
* @throws NAMESPACE_ERR: Raised if the qualifiedName
* has a prefix that is "xml" and the namespaceURI
* is neither null nor an empty string nor
* "http://www.w3.org/XML/1998/namespace", or if
* the qualifiedName has a prefix that is "xmlns"
* but the namespaceURI is neither null nor an
* empty string, or if if the qualifiedName has a
* prefix different from "xml" and "xmlns" and the
* namespaceURI is null or an empty string.
* @since WD-DOM-Level-2-19990923
*/
"NO_MODIFICATION_ALLOWED_ERR",
null);
throw new DOMException(
msg);
}
if (needsSyncData()) {
}
if (index < 0) {
}
else {
}
// REVISIT: this is not efficient, we are creating twice the same
// strings for prefix and localName.
if (attributes == null) {
}
}
else {
if (newAttr instanceof AttrNSImpl){
// Note: we can't just change the name of the attribute. Names have to be in sorted
// order in the attributes vector because a binary search is used to locate them.
// If the new name has a different prefix, the list may become unsorted.
// Maybe it would be better to resort the list, but the simplest
// fix seems to be to remove the old attribute and re-insert it.
// -- Norman.Walsh@Sun.COM, 2 Feb 2007
}
}
else {
// This case may happen if user calls:
// elem.setAttribute("name", "value");
// elem.setAttributeNS(null, "name", "value");
// This case is not defined by the DOM spec, we choose
// to create a new attribute in this case and remove an old one from the tree
// note this might cause events to be propagated or user data to be lost
newAttr = new AttrNSImpl((CoreDocumentImpl)getOwnerDocument(), namespaceURI, qualifiedName, localName);
}
}
} // setAttributeNS(String,String,String)
/**
* Introduced in DOM Level 2. <p>
*
* Removes an attribute by local name and namespace URI. If the removed
* attribute has a default value it is immediately replaced.
* The replacing attribute has the same namespace URI and local name,
* as well as the original prefix.<p>
*
* @param namespaceURI The namespace URI of the attribute to remove.
*
* @param localName The local name of the attribute to remove.
* @throws NO_MODIFICATION_ALLOWED_ERR: Raised if this
* node is readonly.
* @since WD-DOM-Level-2-19990923
*/
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
}
if (needsSyncData()) {
}
if (attributes == null) {
return;
}
} // removeAttributeNS(String,String)
/**
* Retrieves an Attr node by local name and namespace URI.
*
* @param namespaceURI The namespace URI of the attribute to
* retrieve.
* @param localName The local name of the attribute to retrieve.
* @return Attr The Attr node with the specified attribute
* local name and namespace
* URI or null if there is no such attribute.
* @since WD-DOM-Level-2-19990923
*/
if (needsSyncData()) {
}
if (attributes == null) {
return null;
}
} // getAttributeNodeNS(String,String):Attr
/**
* Introduced in DOM Level 2. <p>
*
* Adds a new attribute. If an attribute with that local name and
* namespace URI is already present in the element, it is replaced
* by the new one.
*
* @param Attr The Attr node to add to the attribute list. When
* the Node has no namespaceURI, this method behaves
* like setAttributeNode.
* @return Attr If the newAttr attribute replaces an existing attribute
* with the same local name and namespace URI, the *
* previously existing Attr node is returned, otherwise
* null is returned.
* @throws WRONG_DOCUMENT_ERR: Raised if newAttr
* was created from a different document than the one that
* created the element.
*
* @throws NO_MODIFICATION_ALLOWED_ERR: Raised if
* this node is readonly.
*
* @throws INUSE_ATTRIBUTE_ERR: Raised if newAttr is
* already an attribute of another Element object. The
* DOM user must explicitly clone Attr nodes to re-use
* them in other elements.
* @since WD-DOM-Level-2-19990923
*/
throws DOMException
{
if (needsSyncData()) {
}
if (ownerDocument.errorChecking) {
if (isReadOnly()) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
throw new DOMException(
msg);
}
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "WRONG_DOCUMENT_ERR", null);
}
}
if (attributes == null) {
}
// This will throw INUSE if necessary
} // setAttributeNodeNS(Attr):Attr
/**
* NON-DOM: sets attribute node for this element
*/
if (needsSyncData()) {
}
if (attributes == null) {
}
}
/**
* NON-DOM: get inded of an attribute
*/
if (needsSyncData()) {
}
if (attributes == null) {
return -1;
}
}
/**
* Introduced in DOM Level 2.
*/
public boolean hasAttributes() {
if (needsSyncData()) {
}
}
/**
* Introduced in DOM Level 2.
*/
}
/**
* Introduced in DOM Level 2.
*/
}
/**
* Introduced in DOM Level 2. <p>
*
* Returns a NodeList of all the Elements with a given local name and
* namespace URI in the order in which they would be encountered in a
* preorder traversal of the Document tree, starting from this node.
*
* @param namespaceURI The namespace URI of the elements to match
* on. The special value "*" matches all
* namespaces. When it is null or an empty
* string, this method behaves like
* getElementsByTagName.
* @param localName The local name of the elements to match on.
* The special value "*" matches all local names.
* @return NodeList A new NodeList object containing all the matched
* Elements.
* @since WD-DOM-Level-2-19990923
*/
}
/**
* DOM Level 3 WD- Experimental.
* Override inherited behavior from NodeImpl and ParentNode to check on
* attributes
*/
if (!super.isEqualNode(arg)) {
return false;
}
boolean hasAttrs = hasAttributes();
return false;
}
if (hasAttrs) {
return false;
}
for (int i = 0; i < len; i++) {
return false;
}
}
else {
n1.getLocalName());
return false;
}
}
}
}
return true;
}
/**
* DOM Level 3: register the given attribute node as an ID attribute
*/
if (needsSyncData()) {
}
if (ownerDocument.errorChecking) {
if (isReadOnly()) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
throw new DOMException(
msg);
}
if (at.getOwnerElement() != this) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_FOUND_ERR", null);
}
}
if (!makeId) {
}
else {
}
}
/**
* DOM Level 3: register the given attribute node as an ID attribute
*/
if (needsSyncData()) {
}
"NOT_FOUND_ERR", null);
}
if (ownerDocument.errorChecking) {
if (isReadOnly()) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
throw new DOMException(
msg);
}
if (at.getOwnerElement() != this) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_FOUND_ERR", null);
}
}
if (!makeId) {
}
else {
}
}
/**
* DOM Level 3: register the given attribute node as an ID attribute
*/
boolean makeId) {
if (needsSyncData()) {
}
//if namespace uri is empty string, set it to 'null'
if (namespaceURI != null) {
}
"NOT_FOUND_ERR", null);
}
if (ownerDocument.errorChecking) {
if (isReadOnly()) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
throw new DOMException(
msg);
}
if (at.getOwnerElement() != this) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_FOUND_ERR", null);
}
}
if (!makeId) {
}
else {
}
}
/**
* @see org.w3c.dom.TypeInfo#getTypeName()
*/
return null;
}
/**
* @see org.w3c.dom.TypeInfo#getTypeNamespace()
*/
return null;
}
/**
* Introduced in DOM Level 3. <p>
* Checks if a type is derived from another by restriction. See:
* http://www.w3.org/TR/DOM-Level-3-Core/core.html#TypeInfo-isDerivedFrom
*
* @param ancestorNS
* The namspace of the ancestor type declaration
* @param ancestorName
* The name of the ancestor type declaration
* @param type
* The reference type definition
*
* @return boolean True if the type is derived by restriciton for the
* reference type
*/
int derivationMethod) {
return false;
}
/**
* Method getSchemaTypeInfo.
* @return TypeInfo
*/
if(needsSyncData()) {
}
return this;
}
//
// Public methods
//
/**
* NON-DOM: Subclassed to flip the attributes' readonly switch as well.
* @see NodeImpl#setReadOnly
*/
if (attributes != null) {
}
}
//
// Protected methods
//
/** Synchronizes the data (name and value) for fast nodes. */
protected void synchronizeData() {
// no need to sync in the future
needsSyncData(false);
// we don't want to generate any event for this so turn them off
ownerDocument.setMutationEvents(false);
// attributes
// set mutation events flag back to its original value
} // synchronizeData()
// support for DOM Level 3 renameNode method
// @param el The element from which to take the attributes
if (needsSyncData()) {
}
if (el.hasAttributes()) {
if (attributes == null) {
}
}
}
/** Setup the default attributes. */
protected void setupDefaultAttributes() {
}
}
/** Reconcile default attributes. */
protected void reconcileDefaultAttributes() {
if (attributes != null) {
}
}
/** Get the default attributes. */
return null;
}
.getNamedItem(getNodeName());
return null;
}
} // getDefaultAttributes()
} // class ElementImpl