package org.jboss.xml;
import org.jboss.logging.Logger;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import javax.xml.namespace.QName;
public final class QNameBuilder
{
private static Logger log = Logger.getLogger(QNameBuilder.class);
public static QName buildQName(Element element, String combinedName)
{
if (combinedName == null)
return null;
int colonIndex = combinedName.indexOf(":");
if (colonIndex < 0)
return new QName(combinedName);
String prefix = combinedName.substring(0, colonIndex);
String localPart = combinedName.substring(colonIndex + 1);
Node currNode = element;
String namespaceURI = getNamespaceURI (currNode, prefix);
while (namespaceURI == null && currNode != null)
{
Node parentNode = currNode.getParentNode();
if (parentNode != null && parentNode != currNode)
namespaceURI = getNamespaceURI (parentNode, prefix);
if (parentNode == currNode)
break;
currNode = parentNode;
}
if (namespaceURI != null)
return new QName(namespaceURI, localPart);
log.warn ("Cannot find namespaceURI for name: " + combinedName);
return new QName(localPart);
}
private static String getNamespaceURI(Node node, String prefix)
{
String namespaceURI = null;
NamedNodeMap attrs = node.getAttributes();
if (attrs != null)
{
for (int i=0; namespaceURI == null && i < attrs.getLength(); i++)
{
Node attr = attrs.item(i);
if (prefix.equals(attr.getLocalName()))
namespaceURI = attr.getNodeValue();
}
}
return namespaceURI;
}
}