package com.revolsys.geometry.test.util; import org.jdom.DefaultJDOMFactory; import org.jdom.Element; import org.jdom.JDOMFactory; import org.jdom.Namespace; import org.jdom.input.SAXBuilder; import org.jdom.input.SAXHandler; import org.xml.sax.Attributes; import org.xml.sax.Locator; import org.xml.sax.SAXException; /** * This builder works in parallell with {@link LineNumberElement} * to provide each element with information on its beginning and * ending line number in the corresponding source. * This only works for SAX parsers that supply that information, and * since this is optional, there are no guarantees. * <p> * Note that this builder always creates its own for each * build, thereby cancelling any previous call to setFactory. * <p> * All elements created are instances of {@link LineNumberElement}. * No other construct currently receive line number information. * * @author Per Norrman * */ public class LineNumberSAXBuilder extends SAXBuilder { private class MyFactory extends DefaultJDOMFactory { @Override public Element element(final String name) { return new LineNumberElement(name); } @Override public Element element(final String name, final Namespace namespace) { return new LineNumberElement(name, namespace); } @Override public Element element(final String name, final String uri) { return new LineNumberElement(name, uri); } @Override public Element element(final String name, final String prefix, final String uri) { return new LineNumberElement(name, prefix, uri); } } private class MySAXHandler extends SAXHandler { public MySAXHandler(final JDOMFactory f) { super(f); } /** override */ @Override public void endElement(final String arg0, final String arg1, final String arg2) throws SAXException { final Locator l = getDocumentLocator(); if (l != null) { ((LineNumberElement)getCurrentElement()).setEndLine(l.getLineNumber()); } super.endElement(arg0, arg1, arg2); } /** override */ @Override public void startElement(final String arg0, final String arg1, final String arg2, final Attributes arg3) throws SAXException { super.startElement(arg0, arg1, arg2, arg3); final Locator l = getDocumentLocator(); if (l != null) { ((LineNumberElement)getCurrentElement()).setStartLine(l.getLineNumber()); } } } @Override protected SAXHandler createContentHandler() { return new MySAXHandler(new MyFactory()); } }