package gnu.xml.dom;
import java.util.HashSet;
import java.util.Set;
import javax.xml.XMLConstants;
import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.TypeInfo;
public class DomElement
extends DomNsNode
implements Element
{
Set userIdAttrs;
private DomNamedNodeMap attributes;
String xmlSpace = "";
protected DomElement(DomDocument owner, String namespaceURI, String name)
{
super(ELEMENT_NODE, owner, namespaceURI, name);
}
public NamedNodeMap getAttributes()
{
if (attributes == null)
{
attributes = new DomNamedNodeMap(this, Node.ATTRIBUTE_NODE);
}
return attributes;
}
public boolean hasAttributes()
{
return attributes != null && attributes.length != 0;
}
public Object clone()
{
DomElement node = (DomElement) super.clone();
if (attributes != null)
{
node.attributes = new DomNamedNodeMap(node, Node.ATTRIBUTE_NODE);
for (DomNode ctx = attributes.first; ctx != null; ctx = ctx.next)
{
node.attributes.setNamedItemNS(ctx.cloneNode(true));
}
}
return node;
}
void setOwner(DomDocument doc)
{
if (attributes != null)
{
for (DomNode ctx = attributes.first; ctx != null; ctx = ctx.next)
{
ctx.setOwner(doc);
}
}
super.setOwner(doc);
}
public void makeReadonly()
{
super.makeReadonly();
if (attributes != null)
{
attributes.makeReadonly();
}
}
final public String getTagName()
{
return getNodeName();
}
public String getAttribute(String name)
{
if ("xml:space" == name) {
return xmlSpace;
}
Attr attr = getAttributeNode(name);
return (attr == null) ? "" : attr.getValue();
}
public boolean hasAttribute(String name)
{
return getAttributeNode(name) != null;
}
public boolean hasAttributeNS(String namespaceURI, String local)
{
return getAttributeNodeNS(namespaceURI, local) != null;
}
public String getAttributeNS(String namespaceURI, String local)
{
Attr attr = getAttributeNodeNS(namespaceURI, local);
return (attr == null) ? "" : attr.getValue();
}
public Attr getAttributeNode(String name)
{
return (attributes == null) ? null :
(Attr) attributes.getNamedItem(name);
}
public Attr getAttributeNodeNS(String namespace, String localPart)
{
return (attributes == null) ? null :
(Attr) attributes.getNamedItemNS(namespace, localPart);
}
public void setAttribute(String name, String value)
{
Attr attr = getAttributeNode(name);
if (attr != null)
{
attr.setNodeValue(value);
((DomAttr) attr).setSpecified(true);
return;
}
attr = owner.createAttribute(name);
attr.setNodeValue(value);
setAttributeNode(attr);
}
public void setAttributeNS(String uri, String aname, String value)
{
if (("xmlns".equals (aname) || aname.startsWith ("xmlns:"))
&& !XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals (uri))
{
throw new DomDOMException(DOMException.NAMESPACE_ERR,
"setting xmlns attribute to illegal value", this, 0);
}
Attr attr = getAttributeNodeNS(uri, aname);
if (attr != null)
{
attr.setNodeValue(value);
return;
}
attr = owner.createAttributeNS(uri, aname);
attr.setNodeValue(value);
setAttributeNodeNS(attr);
}
public Attr setAttributeNode(Attr attr)
{
return (Attr) getAttributes().setNamedItem(attr);
}
public Attr setAttributeNodeNS(Attr attr)
{
return (Attr) getAttributes().setNamedItemNS(attr);
}
public void removeAttribute(String name)
{
if (attributes == null)
{
return;
}
try
{
attributes.removeNamedItem(name);
}
catch (DomDOMException e)
{
if (e.code != DOMException.NOT_FOUND_ERR)
{
throw e;
}
}
}
public Attr removeAttributeNode(Attr node)
{
if (attributes == null)
{
throw new DomDOMException(DOMException.NOT_FOUND_ERR, null, node, 0);
}
return (Attr) attributes.removeNamedItem(node.getNodeName());
}
public void removeAttributeNS(String namespace, String localPart)
{
if (attributes == null)
{
throw new DomDOMException(DOMException.NOT_FOUND_ERR, localPart, null, 0);
}
attributes.removeNamedItemNS (namespace, localPart);
}
public String lookupPrefix(String namespaceURI)
{
if (namespaceURI == null)
{
return null;
}
String namespace = getNamespaceURI();
if (namespace != null && namespace.equals(namespaceURI))
{
return getPrefix();
}
if (attributes != null)
{
for (DomNode ctx = attributes.first; ctx != null; ctx = ctx.next)
{
if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI
.equals(ctx.getNamespaceURI()))
{
String value = ctx.getNodeValue();
if (value.equals(namespaceURI))
{
return ctx.getLocalName();
}
}
}
}
return super.lookupPrefix(namespaceURI);
}
public boolean isDefaultNamespace(String namespaceURI)
{
String namespace = getNamespaceURI();
if (namespace != null && namespace.equals(namespaceURI))
{
return getPrefix() == null;
}
if (attributes != null)
{
for (DomNode ctx = attributes.first; ctx != null; ctx = ctx.next)
{
if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI
.equals(ctx.getNamespaceURI()))
{
String qName = ctx.getNodeName();
return (XMLConstants.XMLNS_ATTRIBUTE.equals(qName));
}
}
}
return super.isDefaultNamespace(namespaceURI);
}
public String lookupNamespaceURI(String prefix)
{
String namespace = getNamespaceURI();
if (namespace != null && equal(prefix, getPrefix()))
{
return namespace;
}
if (attributes != null)
{
for (DomNode ctx = attributes.first; ctx != null; ctx = ctx.next)
{
if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI
.equals(ctx.getNamespaceURI()))
{
if (prefix == null)
{
if (XMLConstants.XMLNS_ATTRIBUTE.equals(ctx.getNodeName()))
{
return ctx.getNodeValue();
}
}
else
{
if (prefix.equals(ctx.getLocalName()))
{
return ctx.getNodeValue();
}
}
}
}
}
return super.lookupNamespaceURI(prefix);
}
public String getBaseURI()
{
if (attributes != null)
{
Node xmlBase =
attributes.getNamedItemNS(XMLConstants.XML_NS_URI, "base");
if (xmlBase != null)
{
return xmlBase.getNodeValue();
}
}
return super.getBaseURI();
}
public TypeInfo getSchemaTypeInfo()
{
DomDoctype doctype = (DomDoctype) owner.getDoctype();
if (doctype != null)
{
return doctype.getElementTypeInfo(getNodeName());
}
return null;
}
public void setIdAttribute(String name, boolean isId)
{
NamedNodeMap attrs = getAttributes();
Attr attr = (Attr) attrs.getNamedItem(name);
setIdAttributeNode(attr, isId);
}
public void setIdAttributeNode(Attr attr, boolean isId)
{
if (readonly)
{
throw new DomDOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR);
}
if (attr == null || attr.getOwnerElement() != this)
{
throw new DomDOMException(DOMException.NOT_FOUND_ERR);
}
if (isId)
{
if (userIdAttrs == null)
{
userIdAttrs = new HashSet();
}
userIdAttrs.add(attr);
}
else if (userIdAttrs != null)
{
userIdAttrs.remove(attr);
if (userIdAttrs.isEmpty())
{
userIdAttrs = null;
}
}
}
public void setIdAttributeNS(String namespaceURI, String localName,
boolean isId)
{
NamedNodeMap attrs = getAttributes();
Attr attr = (Attr) attrs.getNamedItemNS(namespaceURI, localName);
setIdAttributeNode(attr, isId);
}
}