X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fdolda%2Fjsvc%2Fnext%2FDocBuffer.java;fp=src%2Fdolda%2Fjsvc%2Fnext%2FDocBuffer.java;h=432d8171ba7491844c1d855d004fc70454c0bd42;hb=816cbb00faa568491d867a28b9570f8018e088b1;hp=0000000000000000000000000000000000000000;hpb=bce78e9e695e185501a05474b4862fe30a45863f;p=jsvc.git diff --git a/src/dolda/jsvc/next/DocBuffer.java b/src/dolda/jsvc/next/DocBuffer.java new file mode 100644 index 0000000..432d817 --- /dev/null +++ b/src/dolda/jsvc/next/DocBuffer.java @@ -0,0 +1,73 @@ +package dolda.jsvc.next; + +import java.util.*; +import org.w3c.dom.*; + +public class DocBuffer { + public final Document doc; + private final Map cursors = new HashMap(); + public static final String ns = "jsvc:next:buffer"; + + public DocBuffer(String ns, String root, String doctype, String pubid, String sysid) { + doc = DomUtil.document(ns, root, doctype, pubid, sysid); + } + + public DocBuffer(String ns, String root) { + this(ns, root, null, null, null); + } + + private Node findcursor(Node c, String name) { + if(c instanceof Element) { + Element el = (Element)c; + if(el.getNamespaceURI().equals(ns) && el.getTagName().equals("cursor") && el.getAttributeNS(ns, "name").equals(name)) + return(c); + } + for(Node n = c.getFirstChild(); n != null; n = n.getNextSibling()) { + Node r = findcursor(n, name); + if(r != null) + return(r); + } + return(null); + } + + private Node cursor(String name) { + Node n; + if((n = cursors.get(name)) != null) { + return(n); + } + if((n = findcursor(doc, name)) == null) + return(null); + cursors.put(name, n); + return(n); + } + + public void insert(String cursor, Node n) { + Node c = cursor(cursor); + if(c == null) + throw(new RuntimeException("No such cursor: `" + cursor + "'")); + c.getParentNode().insertBefore(c, doc.importNode(n, true)); + } + + public Element makecursor(String name) { + Element el = doc.createElementNS(ns, "cursor"); + Attr a = doc.createAttributeNS(ns, "name"); + a.setValue(name); + el.setAttributeNodeNS(a); + return(el); + } + + public Element el(String ns, String nm, Node contents, String... attrs) { + Element el = doc.createElementNS(ns, nm); + if(contents != null) + el.appendChild(contents); + for(String attr : attrs) { + int p = attr.indexOf('='); + el.setAttribute(attr.substring(0, p), attr.substring(p + 1)); + } + return(el); + } + + public Text text(String text) { + return(doc.createTextNode(text)); + } +}