DomNamedNodeMap.java [plain text]
package gnu.xml.dom;
import org.w3c.dom.DOMException;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
public class DomNamedNodeMap
implements NamedNodeMap
{
final DomNode owner;
final short type;
DomNode first;
int length;
boolean readonly;
DomNamedNodeMap(DomNode owner, short type)
{
this.owner = owner;
this.type = type;
}
public final boolean isReadonly()
{
return readonly;
}
public void makeReadonly()
{
readonly = true;
for (DomNode ctx = first; ctx != null; ctx = ctx.next)
{
ctx.makeReadonly();
}
}
public Node getNamedItem(String name)
{
for (DomNode ctx = first; ctx != null; ctx = ctx.next)
{
if (ctx.getNodeName().equals(name))
{
return ctx;
}
}
return null;
}
public Node getNamedItemNS(String namespaceURI, String localName)
{
if ("".equals(namespaceURI))
{
namespaceURI = null;
}
for (DomNode ctx = first; ctx != null; ctx = ctx.next)
{
String name = ctx.getLocalName();
if ((localName == null && name == null) ||
(localName != null && localName.equals(name)))
{
String uri = ctx.getNamespaceURI();
if ("".equals(uri))
{
uri = null;
}
if ((namespaceURI == null && uri == null) ||
(namespaceURI != null && namespaceURI.equals(uri)))
{
return ctx;
}
}
}
return null;
}
public Node setNamedItem(Node arg)
{
return setNamedItem(arg, false);
}
public Node setNamedItemNS(Node arg)
{
return setNamedItem(arg, true);
}
Node setNamedItem(Node arg, boolean ns)
{
if (readonly)
{
throw new DomDOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR);
}
DomNode node = (DomNode) arg;
if (node.owner != owner.owner)
{
throw new DomDOMException(DOMException.WRONG_DOCUMENT_ERR);
}
if (node.nodeType != type)
{
throw new DomDOMException(DOMException.HIERARCHY_REQUEST_ERR);
}
if (node.nodeType == Node.ATTRIBUTE_NODE)
{
DomNode element = node.parent;
if (element != null && element != owner)
{
throw new DomDOMException(DOMException.INUSE_ATTRIBUTE_ERR);
}
node.parent = owner;
node.depth = owner.depth + 1;
}
String nodeName = node.getNodeName();
String localName = ns ? node.getLocalName() : null;
String namespaceURI = ns ? node.getNamespaceURI() : null;
if ("".equals(namespaceURI))
{
namespaceURI = null;
}
DomNode last = null;
for (DomNode ctx = first; ctx != null; ctx = ctx.next)
{
boolean test = false;
if (ns)
{
String tln = ctx.getLocalName();
if (tln.equals(localName))
{
String tu = ctx.getNamespaceURI();
if ((tu == null && namespaceURI == null) ||
(tu != null && tu.equals(namespaceURI)))
{
test = true;
}
}
}
else
{
test = ctx.getNodeName().equals(nodeName);
}
if (test)
{
node.previous = ctx.previous;
node.next = ctx.next;
if (ctx.previous != null)
{
ctx.previous.next = node;
}
if (ctx.next != null)
{
ctx.next.previous = node;
}
if (first == ctx)
{
first = node;
}
reparent(node, nodeName, ctx.index);
ctx.parent = null;
ctx.next = null;
ctx.previous = null;
ctx.setDepth(0);
ctx.index = 0;
return ctx;
}
last = ctx;
}
if (last != null)
{
last.next = node;
node.previous = last;
}
else
{
first = node;
}
length++;
reparent(node, nodeName, 0);
return null;
}
void reparent(DomNode node, String nodeName, int i)
{
node.parent = owner;
node.setDepth(owner.depth + 1);
for (DomNode ctx = node; ctx != null; ctx = ctx.next)
{
ctx.index = i++;
}
boolean xmlSpace = "xml:space".equals(nodeName);
if (xmlSpace && owner instanceof DomElement)
{
((DomElement) owner).xmlSpace = node.getNodeValue();
}
}
public Node removeNamedItem(String name)
{
return removeNamedItem(null, name, false);
}
public Node removeNamedItemNS(String namespaceURI, String localName)
{
return removeNamedItem(namespaceURI, localName, true);
}
Node removeNamedItem(String uri, String name, boolean ns)
{
if (readonly)
{
throw new DomDOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR);
}
for (DomNode ctx = first; ctx != null; ctx = ctx.next)
{
boolean test = false;
String nodeName = ctx.getNodeName();
if (ns)
{
String tln = ctx.getLocalName();
if (tln.equals(name))
{
String tu = ctx.getNamespaceURI();
if ((tu == null && uri == null) ||
(tu != null && tu.equals(uri)))
{
test = true;
}
}
}
else
{
test = nodeName.equals(name);
}
if (test)
{
boolean xmlSpace = "xml:space".equals(nodeName);
if (xmlSpace && owner instanceof DomElement)
{
((DomElement) owner).xmlSpace = "";
}
if (ctx.nodeType == Node.ATTRIBUTE_NODE)
{
String def = getDefaultValue(ctx.getNodeName());
if (def != null)
{
ctx.setNodeValue(def);
((DomAttr) ctx).setSpecified(false);
return null;
}
}
if (ctx == first)
{
first = ctx.next;
}
if (ctx.previous != null)
{
ctx.previous.next = ctx.next;
}
if (ctx.next != null)
{
ctx.next.previous = ctx.previous;
}
length--;
ctx.previous = null;
ctx.next = null;
ctx.parent = null;
ctx.setDepth(0);
ctx.index = 0;
return ctx;
}
}
throw new DomDOMException(DOMException.NOT_FOUND_ERR);
}
String getDefaultValue(String name)
{
DomDoctype doctype = (DomDoctype) owner.owner.getDoctype();
if (doctype == null)
{
return null;
}
DTDAttributeTypeInfo info =
doctype.getAttributeTypeInfo(owner.getNodeName(), name);
if (info == null)
{
return null;
}
return info.value;
}
public Node item(int index)
{
DomNode ctx = first;
int count = 0;
while (ctx != null && count < index)
{
ctx = ctx.next;
count++;
}
return ctx;
}
public int getLength()
{
return length;
}
}