AttributeMappublic class AttributeMap extends NamedNodeMapImpl AttributeMap inherits from NamedNodeMapImpl and extends it to deal with the
specifics of storing attributes. These are:
- managing ownership of attribute nodes
- managing default attributes
- firing mutation events
This class doesn't directly support mutation events, however, it notifies
the document when mutations are performed so that the document class do so. |
Fields Summary |
---|
static final long | serialVersionUIDSerialization version. |
Constructors Summary |
---|
protected AttributeMap(ElementImpl ownerNode, NamedNodeMapImpl defaults)Constructs a named node map.
//
// Constructors
//
super(ownerNode);
if (defaults != null) {
// initialize map with the defaults
cloneContent(defaults);
if (nodes != null) {
hasDefaults(true);
}
}
|
Methods Summary |
---|
protected void | cloneContent(com.sun.org.apache.xerces.internal.dom.NamedNodeMapImpl srcmap)Override parent's method to set the ownerNode correctly
Vector srcnodes = srcmap.nodes;
if (srcnodes != null) {
int size = srcnodes.size();
if (size != 0) {
if (nodes == null) {
nodes = new Vector(size);
}
nodes.setSize(size);
for (int i = 0; i < size; ++i) {
NodeImpl n = (NodeImpl) srcnodes.elementAt(i);
NodeImpl clone = (NodeImpl) n.cloneNode(true);
clone.isSpecified(n.isSpecified());
nodes.setElementAt(clone, i);
clone.ownerNode = ownerNode;
clone.isOwned(true);
}
}
}
| public com.sun.org.apache.xerces.internal.dom.NamedNodeMapImpl | cloneMap(com.sun.org.apache.xerces.internal.dom.NodeImpl ownerNode)Cloning a NamedNodeMap is a DEEP OPERATION; it always clones
all the nodes contained in the map.
AttributeMap newmap =
new AttributeMap((ElementImpl) ownerNode, null);
newmap.hasDefaults(hasDefaults());
newmap.cloneContent(this);
return newmap;
| protected final org.w3c.dom.Node | internalRemoveNamedItem(java.lang.String name, boolean raiseEx)Internal removeNamedItem method allowing to specify whether an exception
must be thrown if the specified name is not found.
if (isReadOnly()) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, msg);
}
int i = findNamePoint(name,0);
if (i < 0) {
if (raiseEx) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_FOUND_ERR", null);
throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
} else {
return null;
}
}
return remove((AttrImpl)nodes.elementAt(i), i, true);
| protected final org.w3c.dom.Node | internalRemoveNamedItemNS(java.lang.String namespaceURI, java.lang.String name, boolean raiseEx)Internal removeNamedItemNS method allowing to specify whether an
exception must be thrown if the specified local name and namespace URI
is not found.
CoreDocumentImpl ownerDocument = ownerNode.ownerDocument();
if (ownerDocument.errorChecking && isReadOnly()) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, msg);
}
int i = findNamePoint(namespaceURI, name);
if (i < 0) {
if (raiseEx) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_FOUND_ERR", null);
throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
} else {
return null;
}
}
AttrImpl n = (AttrImpl)nodes.elementAt(i);
if (n.isIdAttribute()) {
ownerDocument.removeIdentifier(n.getValue());
}
// If there's a default, add it instead
String nodeName = n.getNodeName();
if (hasDefaults()) {
NamedNodeMapImpl defaults = ((ElementImpl) ownerNode).getDefaultAttributes();
Node d;
if (defaults != null
&& (d = defaults.getNamedItem(nodeName)) != null)
{
int j = findNamePoint(nodeName,0);
if (j>=0 && findNamePoint(nodeName, j+1) < 0) {
NodeImpl clone = (NodeImpl)d.cloneNode(true);
clone.ownerNode = ownerNode;
if (d.getLocalName() != null) {
// we must rely on the name to find a default attribute
// ("test:attr"), but while copying it from the DOCTYPE
// we should not loose namespace URI that was assigned
// to the attribute in the instance document.
((AttrNSImpl)clone).namespaceURI = namespaceURI;
}
clone.isOwned(true);
clone.isSpecified(false);
nodes.setElementAt(clone, i);
if (clone.isIdAttribute()) {
ownerDocument.putIdentifier(clone.getNodeValue(),
(ElementImpl)ownerNode);
}
} else {
nodes.removeElementAt(i);
}
} else {
nodes.removeElementAt(i);
}
} else {
nodes.removeElementAt(i);
}
// changed(true);
// remove reference to owner
n.ownerNode = ownerDocument;
n.isOwned(false);
// make sure it won't be mistaken with defaults in case it's
// reused
n.isSpecified(true);
// update id table if needed
n.isIdAttribute(false);
// notify document
ownerDocument.removedAttrNode(n, ownerNode, name);
return n;
| void | moveSpecifiedAttributes(com.sun.org.apache.xerces.internal.dom.AttributeMap srcmap)Move specified attributes from the given map to this one
int nsize = (srcmap.nodes != null) ? srcmap.nodes.size() : 0;
for (int i = nsize - 1; i >= 0; i--) {
AttrImpl attr = (AttrImpl) srcmap.nodes.elementAt(i);
if (attr.isSpecified()) {
srcmap.remove(attr, i, false);
if (attr.getLocalName() != null) {
setNamedItem(attr);
}
else {
setNamedItemNS(attr);
}
}
}
| protected void | reconcileDefaults(com.sun.org.apache.xerces.internal.dom.NamedNodeMapImpl defaults)Get this AttributeMap in sync with the given "defaults" map.
// remove any existing default
int nsize = (nodes != null) ? nodes.size() : 0;
for (int i = nsize - 1; i >= 0; i--) {
AttrImpl attr = (AttrImpl) nodes.elementAt(i);
if (!attr.isSpecified()) {
remove(attr, i, false);
}
}
// add the new defaults
if (defaults == null) {
return;
}
if (nodes == null || nodes.size() == 0) {
cloneContent(defaults);
}
else {
int dsize = defaults.nodes.size();
for (int n = 0; n < dsize; n++) {
AttrImpl d = (AttrImpl) defaults.nodes.elementAt(n);
int i = findNamePoint(d.getNodeName(), 0);
if (i < 0) {
i = -1 - i;
NodeImpl clone = (NodeImpl) d.cloneNode(true);
clone.ownerNode = ownerNode;
clone.isOwned(true);
clone.isSpecified(false);
nodes.insertElementAt(clone, i);
}
}
}
| private final org.w3c.dom.Node | remove(com.sun.org.apache.xerces.internal.dom.AttrImpl attr, int index, boolean addDefault)
CoreDocumentImpl ownerDocument = ownerNode.ownerDocument();
String name = attr.getNodeName();
if (attr.isIdAttribute()) {
ownerDocument.removeIdentifier(attr.getValue());
}
if (hasDefaults() && addDefault) {
// If there's a default, add it instead
NamedNodeMapImpl defaults =
((ElementImpl) ownerNode).getDefaultAttributes();
Node d;
if (defaults != null &&
(d = defaults.getNamedItem(name)) != null &&
findNamePoint(name, index+1) < 0) {
NodeImpl clone = (NodeImpl)d.cloneNode(true);
if (d.getLocalName() !=null){
// we must rely on the name to find a default attribute
// ("test:attr"), but while copying it from the DOCTYPE
// we should not loose namespace URI that was assigned
// to the attribute in the instance document.
((AttrNSImpl)clone).namespaceURI = attr.getNamespaceURI();
}
clone.ownerNode = ownerNode;
clone.isOwned(true);
clone.isSpecified(false);
nodes.setElementAt(clone, index);
if (attr.isIdAttribute()) {
ownerDocument.putIdentifier(clone.getNodeValue(),
(ElementImpl)ownerNode);
}
} else {
nodes.removeElementAt(index);
}
} else {
nodes.removeElementAt(index);
}
// changed(true);
// remove reference to owner
attr.ownerNode = ownerDocument;
attr.isOwned(false);
// make sure it won't be mistaken with defaults in case it's
// reused
attr.isSpecified(true);
attr.isIdAttribute(false);
// notify document
ownerDocument.removedAttrNode(attr, ownerNode, name);
return attr;
| protected org.w3c.dom.Node | removeItem(org.w3c.dom.Node item, boolean addDefault)NON-DOM: Remove the node object
NOTE: Specifically removes THIS NODE -- not the node with this
name, nor the node with these contents. If node does not belong to
this named node map, we throw a DOMException.
int index = -1;
if (nodes != null) {
for (int i = 0; i < nodes.size(); i++) {
if (nodes.elementAt(i) == item) {
index = i;
break;
}
}
}
if (index < 0) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_FOUND_ERR", null);
throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
}
return remove((AttrImpl)item, index, addDefault);
| public org.w3c.dom.Node | removeNamedItemNS(java.lang.String namespaceURI, java.lang.String name)Introduced in DOM Level 2.
Removes an attribute specified by local name and namespace URI.
return internalRemoveNamedItemNS(namespaceURI, name, true);
| org.w3c.dom.Node | safeRemoveNamedItem(java.lang.String name)/
public Node removeNamedItem(String name)
throws DOMException {
return internalRemoveNamedItem(name, true);
}
/**
Same as removeNamedItem except that it simply returns null if the
specified name is not found.
return internalRemoveNamedItem(name, false);
| org.w3c.dom.Node | safeRemoveNamedItemNS(java.lang.String namespaceURI, java.lang.String name)Same as removeNamedItem except that it simply returns null if the
specified local name and namespace URI is not found.
return internalRemoveNamedItemNS(namespaceURI, name, false);
| public org.w3c.dom.Node | setNamedItem(org.w3c.dom.Node arg)Adds an attribute using its nodeName attribute.
boolean errCheck = ownerNode.ownerDocument().errorChecking;
if (errCheck) {
if (isReadOnly()) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, msg);
}
if (arg.getOwnerDocument() != ownerNode.ownerDocument()) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "WRONG_DOCUMENT_ERR", null);
throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, msg);
}
if (arg.getNodeType() != Node.ATTRIBUTE_NODE) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "HIERARCHY_REQUEST_ERR", null);
throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, msg);
}
}
AttrImpl argn = (AttrImpl)arg;
if (argn.isOwned()){
if (errCheck && argn.getOwnerElement() != ownerNode) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "INUSE_ATTRIBUTE_ERR", null);
throw new DOMException(DOMException.INUSE_ATTRIBUTE_ERR, msg);
}
// replacing an Attribute with itself does nothing
return arg;
}
// set owner
argn.ownerNode = ownerNode;
argn.isOwned(true);
int i = findNamePoint(arg.getNodeName(),0);
AttrImpl previous = null;
if (i >= 0) {
previous = (AttrImpl) nodes.elementAt(i);
nodes.setElementAt(arg,i);
previous.ownerNode = ownerNode.ownerDocument();
previous.isOwned(false);
// make sure it won't be mistaken with defaults in case it's reused
previous.isSpecified(true);
} else {
i = -1 - i; // Insert point (may be end of list)
if (null == nodes) {
nodes = new Vector(5, 10);
}
nodes.insertElementAt(arg, i);
}
// notify document
ownerNode.ownerDocument().setAttrNode(argn, previous);
// If the new attribute is not normalized,
// the owning element is inherently not normalized.
if (!argn.isNormalized()) {
ownerNode.isNormalized(false);
}
return previous;
| public org.w3c.dom.Node | setNamedItemNS(org.w3c.dom.Node arg)Adds an attribute using its namespaceURI and localName.
boolean errCheck = ownerNode.ownerDocument().errorChecking;
if (errCheck) {
if (isReadOnly()) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, msg);
}
if(arg.getOwnerDocument() != ownerNode.ownerDocument()) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "WRONG_DOCUMENT_ERR", null);
throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, msg);
}
if (arg.getNodeType() != Node.ATTRIBUTE_NODE) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "HIERARCHY_REQUEST_ERR", null);
throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, msg);
}
}
AttrImpl argn = (AttrImpl)arg;
if (argn.isOwned()){
if (errCheck && argn.getOwnerElement() != ownerNode) {
String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "INUSE_ATTRIBUTE_ERR", null);
throw new DOMException(DOMException.INUSE_ATTRIBUTE_ERR, msg);
}
// replacing an Attribute with itself does nothing
return arg;
}
// set owner
argn.ownerNode = ownerNode;
argn.isOwned(true);
int i = findNamePoint(argn.getNamespaceURI(), argn.getLocalName());
AttrImpl previous = null;
if (i >= 0) {
previous = (AttrImpl) nodes.elementAt(i);
nodes.setElementAt(arg,i);
previous.ownerNode = ownerNode.ownerDocument();
previous.isOwned(false);
// make sure it won't be mistaken with defaults in case it's reused
previous.isSpecified(true);
} else {
// If we can't find by namespaceURI, localName, then we find by
// nodeName so we know where to insert.
i = findNamePoint(arg.getNodeName(),0);
if (i >=0) {
previous = (AttrImpl) nodes.elementAt(i);
nodes.insertElementAt(arg,i);
} else {
i = -1 - i; // Insert point (may be end of list)
if (null == nodes) {
nodes = new Vector(5, 10);
}
nodes.insertElementAt(arg, i);
}
}
// changed(true);
// notify document
ownerNode.ownerDocument().setAttrNode(argn, previous);
// If the new attribute is not normalized,
// the owning element is inherently not normalized.
if (!argn.isNormalized()) {
ownerNode.isNormalized(false);
}
return previous;
|
|