// 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 null
	 * @param resolver
	 *            SAX entity resolver implementation or null. 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("");
			}

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

 

Ads help maintain this website.