| 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); |
| } |
| } |
| } |