// Copyright FreeHEP, 2007. package hep.aida.ref.xml; import hep.aida.ref.xml.binary.AidaWBXML; import hep.aida.ref.xml.binary.AidaWBXMLLookup; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Stack; import org.freehep.wbxml.Attributes; import org.freehep.wbxml.ContentHandler; import org.freehep.wbxml.WBXMLParser; import org.xml.sax.SAXException; /** * This class reads Binary XML. * * @author Mark Donszelmann * @version $Id$ */ public class AidaWBXMLParser implements ContentHandler { private StringBuffer buffer; private AidaBinaryHandler handler; private Stack context; /** * Creates a parser instance. * * @param handler * handler interface implementation (never <code>null</code> * @param resolver * SAX entity resolver implementation or <code>null</code>. It * is recommended that it could be able to resolve at least the * DTD. */ public AidaWBXMLParser(final AidaBinaryHandler handler) { this.handler = handler; buffer = new StringBuffer(111); context = new Stack(); } public void startDocument() throws SAXException { } public void endDocument() throws SAXException { } public void startElement(int tagID, Attributes attrs, boolean empty) throws SAXException { dispatch(true); // FIXME: maybe a copy context.push(new Object[] { new Integer(tagID), attrs }); switch (tagID) { case AidaWBXML.ITEM: handler.handle_item(attrs); break; case AidaWBXML.ENTRIES_1D: handler.start_entries1d(attrs); break; case AidaWBXML.ARGUMENT: handler.start_argument(attrs); break; case AidaWBXML.DATA_1D: handler.start_data1d(attrs); break; case AidaWBXML.BIN_1D: handler.handle_bin1d(attrs); break; case AidaWBXML.ENTRY_ITUPLE: handler.start_entryITuple(attrs); break; case AidaWBXML.COLUMN: handler.handle_column(attrs); break; case AidaWBXML.TUPLE: handler.start_tuple(attrs); break; case AidaWBXML.FUNCTION: handler.start_function(attrs); break; case AidaWBXML.COLUMNS: handler.start_columns(attrs); break; case AidaWBXML.DATA_POINT_SET: handler.start_dataPointSet(attrs); break; case AidaWBXML.DATA_POINT: handler.start_dataPoint(attrs); break; case AidaWBXML.IMPLEMENTATION: handler.handle_implementation(attrs); break; case AidaWBXML.ENTRY_1D: handler.handle_entry1d(attrs); break; case AidaWBXML.CLOUD_1D: handler.start_cloud1d(attrs); break; case AidaWBXML.ROW: handler.start_row(attrs); break; case AidaWBXML.ANNOTATION: handler.start_annotation(attrs); break; case AidaWBXML.ENTRY_3D: handler.handle_entry3d(attrs); break; case AidaWBXML.HISTOGRAM_3D: handler.start_histogram3d(attrs); break; case AidaWBXML.AIDA: handler.start_aida(attrs); break; case AidaWBXML.ENTRY: handler.handle_entry(attrs); break; case AidaWBXML.DATA_2D: handler.start_data2d(attrs); break; case AidaWBXML.BIN_3D: handler.handle_bin3d(attrs); break; case AidaWBXML.PARAMETER: handler.handle_parameter(attrs); break; case AidaWBXML.ARGUMENTS: handler.start_arguments(attrs); break; case AidaWBXML.PARAMETERS: handler.start_parameters(attrs); break; case AidaWBXML.ROWS: handler.start_rows(attrs); break; case AidaWBXML.HISTOGRAM_1D: handler.start_histogram1d(attrs); break; case AidaWBXML.AXIS: handler.start_axis(attrs); break; case AidaWBXML.CLOUD_3D: handler.start_cloud3d(attrs); break; case AidaWBXML.BIN_BORDER: handler.handle_binBorder(attrs); break; case AidaWBXML.RANGE: handler.handle_range(attrs); break; case AidaWBXML.MEASUREMENT: handler.handle_measurement(attrs); break; case AidaWBXML.DATA_3D: handler.start_data3d(attrs); break; case AidaWBXML.ENTRY_2D: handler.handle_entry2d(attrs); break; case AidaWBXML.PROFILE_1D: handler.start_profile1d(attrs); break; case AidaWBXML.ENTRIES_2D: handler.start_entries2d(attrs); break; case AidaWBXML.ENTRIES_3D: handler.start_entries3d(attrs); break; case AidaWBXML.BIN_2D: handler.handle_bin2d(attrs); break; case AidaWBXML.STATISTICS: handler.start_statistics(attrs); break; case AidaWBXML.PROFILE_2D: handler.start_profile2d(attrs); break; case AidaWBXML.CLOUD_2D: handler.start_cloud2d(attrs); break; case AidaWBXML.STATISTIC: handler.handle_statistic(attrs); break; case AidaWBXML.HISTOGRAM_2D: handler.start_histogram2d(attrs); break; } if (empty) { dispatch(false); context.pop(); } } /** * This SAX interface method is implemented by the parser. * */ public void endElement(int tagID) throws SAXException { dispatch(false); context.pop(); switch (tagID) { case AidaWBXML.ENTRIES_1D: handler.end_entries1d(); break; case AidaWBXML.ARGUMENT: handler.end_argument(); break; case AidaWBXML.DATA_1D: handler.end_data1d(); break; case AidaWBXML.ENTRY_ITUPLE: handler.end_entryITuple(); break; case AidaWBXML.TUPLE: handler.end_tuple(); break; case AidaWBXML.FUNCTION: handler.end_function(); break; case AidaWBXML.COLUMNS: handler.end_columns(); break; case AidaWBXML.DATA_POINT_SET: handler.end_dataPointSet(); break; case AidaWBXML.DATA_POINT: handler.end_dataPoint(); break; case AidaWBXML.CLOUD_1D: handler.end_cloud1d(); break; case AidaWBXML.ROW: handler.end_row(); break; case AidaWBXML.ANNOTATION: handler.end_annotation(); break; case AidaWBXML.HISTOGRAM_3D: handler.end_histogram3d(); break; case AidaWBXML.AIDA: handler.end_aida(); break; case AidaWBXML.DATA_2D: handler.end_data2d(); break; case AidaWBXML.ARGUMENTS: handler.end_arguments(); break; case AidaWBXML.PARAMETERS: handler.end_parameters(); break; case AidaWBXML.ROWS: handler.end_rows(); break; case AidaWBXML.HISTOGRAM_1D: handler.end_histogram1d(); break; case AidaWBXML.AXIS: handler.end_axis(); break; case AidaWBXML.CLOUD_3D: handler.end_cloud3d(); break; case AidaWBXML.DATA_3D: handler.end_data3d(); break; case AidaWBXML.PROFILE_1D: handler.end_profile1d(); break; case AidaWBXML.ENTRIES_2D: handler.end_entries2d(); break; case AidaWBXML.ENTRIES_3D: handler.end_entries3d(); break; case AidaWBXML.STATISTICS: handler.end_statistics(); break; case AidaWBXML.PROFILE_2D: handler.end_profile2d(); break; case AidaWBXML.CLOUD_2D: handler.end_cloud2d(); break; case AidaWBXML.HISTOGRAM_2D: handler.end_histogram2d(); break; } } public void characters(char[] chars, int start, int len) throws SAXException { buffer.append(chars, start, len); } /* * public final void ignorableWhitespace(char[] chars, int start, int len) * throws SAXException { } * * public final void processingInstruction(java.lang.String target, * java.lang.String data) throws SAXException { } * * public final void skippedEntity(java.lang.String name) throws * SAXException { } */ private void dispatch(final boolean fireOnlyIfMixed) throws SAXException { if (fireOnlyIfMixed && buffer.length() == 0) return; // skip it Object[] ctx = (Object[]) context.peek(); int here = ((Integer) ctx[0]).intValue(); Attributes attrs = (Attributes) ctx[1]; if (AidaWBXML.CODELET == here) { if (fireOnlyIfMixed) throw new IllegalStateException( "Unexpected characters() event!"); handler.handle_codelet(buffer.length() == 0 ? null : buffer .toString(), attrs); } else { // do not care } buffer.delete(0, buffer.length()); } public void parse(InputStream in) throws SAXException, IOException { WBXMLParser p = new WBXMLParser(this); p.parse(in); } public static void main(String[] args) throws Exception { if (args.length < 1) { System.err.println("Usage: AidaWBXMLParser filename"); System.exit(1); } AidaWBXMLParser handler = new AidaWBXMLParser(null) { public void characters(char[] chars, int start, int len) throws SAXException { System.err.print("'" + String.valueOf(chars) + "'"); } public void endDocument() throws SAXException { System.err.println("END DOCUMENT"); } public void endElement(int tagID) throws SAXException { System.err.println("</" + AidaWBXMLLookup.getTagName(tagID) + ">"); } public void startDocument() throws SAXException { System.err.println("START DOCUMENT"); } public void startElement(int tagID, Attributes attr, boolean empty) throws SAXException { System.err.println("<" + AidaWBXMLLookup.getTagName(tagID)); int[] tags = attr.getTags(); for (int i = 0; i < tags.length; i++) { switch (attr.getType(tags[i])) { case Attributes.BOOLEAN: System.err.println(" " + AidaWBXMLLookup.getAttributeName(tags[i]) + "=" + attr.getBooleanValue(tags[i])); break; case Attributes.BYTE: System.err.println(" " + AidaWBXMLLookup.getAttributeName(tags[i]) + "=" + attr.getByteValue(tags[i])); break; case Attributes.CHAR: System.err.println(" " + AidaWBXMLLookup.getAttributeName(tags[i]) + "=" + attr.getCharValue(tags[i])); break; case Attributes.DOUBLE: System.err.println(" " + AidaWBXMLLookup.getAttributeName(tags[i]) + "=" + attr.getDoubleValue(tags[i])); break; case Attributes.FLOAT: System.err.println(" " + AidaWBXMLLookup.getAttributeName(tags[i]) + "=" + attr.getFloatValue(tags[i])); break; case Attributes.INT: System.err.println(" " + AidaWBXMLLookup.getAttributeName(tags[i]) + "=" + attr.getIntValue(tags[i])); break; case Attributes.LONG: System.err.println(" " + AidaWBXMLLookup.getAttributeName(tags[i]) + "=" + attr.getLongValue(tags[i])); break; case Attributes.SHORT: System.err.println(" " + AidaWBXMLLookup.getAttributeName(tags[i]) + "=" + attr.getShortValue(tags[i])); break; case Attributes.STRING: System.err.println(" " + AidaWBXMLLookup.getAttributeName(tags[i]) + "=\"" + attr.getStringValue(tags[i]) + "\""); break; default: System.err.println("Unhandled attribute type: " + attr.getType(tags[i])); break; } } if (empty) System.err.print("/"); System.err.println(">"); } }; WBXMLParser p = new WBXMLParser(handler); p.parse(new FileInputStream(args[0])); } }