blob: 4d1a39d09c6f53ad3e29c39a5e661894babcdbbf [file] [log] [blame]
package org.intellij.plugins.xsltDebugger.rt.engine.local.xalan;
import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMIterator;
import org.apache.xml.dtm.ref.DTMNodeIterator;
import org.apache.xml.serializer.ToXMLStream;
import org.apache.xpath.objects.XNodeSet;
import org.apache.xpath.objects.XObject;
import org.apache.xpath.objects.XRTreeFrag;
import org.intellij.plugins.xsltDebugger.rt.engine.Value;
import javax.xml.transform.SourceLocator;
import javax.xml.transform.TransformerException;
import java.io.StringWriter;
import java.util.ArrayList;
class XObjectValue implements Value {
private String myTypeString;
private Object myValue;
public XObjectValue(XObject value) {
try {
if (value != null) {
myTypeString = value.getTypeString().replaceAll("#", "");
} else {
myTypeString = "undefined";
}
if (value instanceof XNodeSet) {
final ArrayList<Node> nodes = new ArrayList<Node>();
final DTMIterator v = value.mutableNodeset();
for (int i = 0; i < v.getLength(); i++) {
final int p = v.item(i);
final DTM dtm = v.getDTM(p);
if (dtm == null) continue;
final SourceLocator loc = dtm.getSourceLocatorFor(p);
nodes.add(new Node(loc != null ? loc.getSystemId() : null, loc != null ? loc.getLineNumber() : -1, XalanSupport.getPath(dtm, p),
dtm.getStringValue(p).toString()));
}
myValue = new NodeSet(value.str(), nodes);
} else if (value instanceof XRTreeFrag) {
final org.w3c.dom.Node node = ((DTMNodeIterator)value.object()).nextNode();
if (node == null) {
myValue = "";
} else {
try {
final ToXMLStream stream = new ToXMLStream();
final StringWriter writer = new StringWriter();
stream.setWriter(writer);
stream.setOmitXMLDeclaration(true);
stream.serialize(node);
myValue = writer.toString();
} catch (Exception e) {
e.printStackTrace();
myValue = "???";
}
}
} else if (value != null) {
myValue = value.object();
}
} catch (TransformerException e) {
myTypeString = "UNKNOWN";
}
}
public Object getValue() {
return myValue;
}
public Type getType() {
try {
return XPathType.valueOf(myTypeString.toUpperCase());
} catch (IllegalArgumentException e) {
return new ObjectType(myTypeString);
}
}
}