package com.swtworkbench.community.xswt.xmlparser; import java.util.ArrayList; import java.util.List; import com.swtworkbench.community.xswt.XSWT; public abstract class MinimalParser implements IMinimalParser { protected static class Element { String name; String text; Element[] children; Attribute[] attributes; private int line, column; public String uri() { return null; } public String toString() { String namestring = (uri() != null ? ":" : "") + name; String result = "<" + namestring; if (attributes != null) { for (int i = 0; i < attributes.length; i++) { result += " " + attributes[i].toString(); } } if (children != null && children.length > 0) { result += ">..." + children.length + " elements...</" + namestring + ">"; } else if (text != null) { result += ">" + text + "</" + namestring + ">"; } else { result +="/>"; } return result + " @ " + line + "," + column; } } private static class UriElement extends Element{ private String uri; public String uri() { return uri; } } private static class XswtElement extends Element{ public String uri() { return XSWT.XSWT_NS; } } protected Element createElement(String uri, String name) { Element element = null; if (uri == null || "".equals(uri)) { element = new Element(); } else if (XSWT.XSWT_NS.equals(uri)) { element = new XswtElement(); } else { element = new UriElement(); ((UriElement)element).uri = uri; } element.name = name; return element; } protected static class Attribute { String name; String value; public String uri() { return null; } public String toString() { return (uri() != null ? ":" : "") + name + "=" + value; } } private static class UriAttribute extends Attribute { private String uri; public String uri() { return uri; } } private static class XswtAttribute extends Attribute { public String uri() { return XSWT.XSWT_NS; } } protected Attribute createAttribute(String uri, String name) { Attribute attr = null; if (uri == null || "".equals(uri)) { attr = new Attribute(); } else if (XSWT.XSWT_NS.equals(uri)) { attr = new XswtAttribute(); } else { attr = new UriAttribute(); ((UriAttribute)attr).uri = uri; } attr.name = name; return attr ; } // methods from IMinimalParser public boolean isElement(Object element) { return element instanceof Element; } public String getElementName(Object element) { return ((Element)element).name; } public String getElementNamespace(Object element) { return ((Element)element).uri(); } public int getChildElementCount(Object element) { return ((Element)element).children.length; } public Object getChildElement(Object element, int i) { return ((Element)element).children[i]; } public int getAttributeCount(Object element) { return ((Element)element).attributes.length; } public String getAttributeName(Object element, int i) { return ((Element)element).attributes[i].name; } public String getAttributeNamespace(Object element, int i) { return ((Element)element).attributes[i].uri(); } public String getAttributeValue(Object element, int i) { return ((Element)element).attributes[i].value; } public String getElementText(Object element) { return ((Element)element).text; } // helper methods for building an Element tree private transient List elements; protected void startDocument() { elements = new ArrayList(); } protected Element startElement(String uri, String name) { Element element = createElement(uri, name); elements.add(element); return element; } private static Element[] EMPTY_ELEMENT_ARRAY = new Element[0]; protected Element endElement() { int size = elements.size(), count = 0; while (count < size) { Element element = (Element)elements.get(size - count - 1); if (element.children == null) { break; } count++; } Element[] children = (count == 0 ? EMPTY_ELEMENT_ARRAY : new Element[count]); for (; count > 0; count--) { children[count - 1] = (Element)elements.remove(elements.size() - 1);; } Element element = (Element)elements.get(elements.size() - 1); element.children = children; return element; } Object endDocument() { Element element = (Element)elements.get(0); elements = null; return element; } public void setPosition(Object element, int line, int column) { if (element instanceof Element) { ((Element)element).line = line; ((Element)element).column = column; } } }