package gnu.xml.transform;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.StringTokenizer;
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
final class LiteralNode
extends TemplateNode
{
final Node source;
final Collection elementExcludeResultPrefixes;
LiteralNode(TemplateNode children, TemplateNode next, Node source)
{
super(children, next);
this.source = source;
if (source.getNodeType() == Node.ELEMENT_NODE)
{
NamedNodeMap attrs = source.getAttributes();
Node attr = attrs.getNamedItemNS(Stylesheet.XSL_NS,
"exclude-result-prefixes");
if (attr != null)
{
elementExcludeResultPrefixes = new HashSet();
StringTokenizer st = new StringTokenizer(attr.getNodeValue());
while (st.hasMoreTokens())
{
elementExcludeResultPrefixes.add(st.nextToken());
}
}
else
{
elementExcludeResultPrefixes = Collections.EMPTY_SET;
}
}
else
{
elementExcludeResultPrefixes = null;
}
}
TemplateNode clone(Stylesheet stylesheet)
{
return new LiteralNode((children == null) ? null :
children.clone(stylesheet),
(next == null) ? null :
next.clone(stylesheet),
source);
}
void doApply(Stylesheet stylesheet, QName mode,
Node context, int pos, int len,
Node parent, Node nextSibling)
throws TransformerException
{
Node result = null;
Document doc = (parent instanceof Document) ? (Document) parent :
parent.getOwnerDocument();
short nodeType = source.getNodeType();
if (nodeType == Node.ATTRIBUTE_NODE &&
parent.getFirstChild() != null)
{
}
else
{
if (nodeType == Node.ELEMENT_NODE)
{
String prefix = source.getPrefix();
if (prefix == null)
{
prefix = "#default";
}
String resultPrefix =
(String) stylesheet.namespaceAliases.get(prefix);
if (resultPrefix != null)
{
if ("#default".equals(resultPrefix))
{
resultPrefix = null;
}
String uri = source.lookupNamespaceURI(resultPrefix);
String name = source.getNodeName();
result = doc.createElementNS(uri, name);
NamedNodeMap srcAttrs = source.getAttributes();
NamedNodeMap dstAttrs = result.getAttributes();
int l = srcAttrs.getLength();
for (int i = 0; i < l; i++)
{
Node attr = srcAttrs.item(i);
if (!Stylesheet.XSL_NS.equals(attr.getNamespaceURI()))
{
attr = attr.cloneNode(true);
attr = doc.adoptNode(attr);
dstAttrs.setNamedItemNS(attr);
}
}
}
}
if (result == null)
{
result = source.cloneNode(false);
NamedNodeMap attrs = result.getAttributes();
if (attrs != null)
{
int l = attrs.getLength();
for (int i = 0; i < l; i++)
{
Node attr = attrs.item(i);
if (Stylesheet.XSL_NS.equals(attr.getNamespaceURI()))
{
attrs.removeNamedItem(attr.getNodeName());
i--;
l--;
}
}
}
result = doc.adoptNode(result);
if (result == null)
{
String msg = "Error adopting node to result tree";
DOMSourceLocator l = new DOMSourceLocator(context);
throw new TransformerException(msg, l);
}
}
if (nextSibling != null)
{
parent.insertBefore(result, nextSibling);
}
else
{
parent.appendChild(result);
}
if (nodeType == Node.ELEMENT_NODE)
{
stylesheet.addNamespaceNodes(source, result, doc,
elementExcludeResultPrefixes);
}
if (children != null)
{
children.apply(stylesheet, mode,
context, pos, len,
result, null);
}
}
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
}
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
buf.append('[');
buf.append("source=");
buf.append(source);
buf.append(']');
return buf.toString();
}
}