XMLUtils.java 2.92 KB
package ipipan.clarin.tei.impl.utils;

import ipipan.clarin.tei.api.exceptions.TEIException;

import java.util.Arrays;
import java.util.List;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

/**
 *
 * @author mlenart
 */
public class XMLUtils {
	public final static String TEI_NS = "http://www.tei-c.org/ns/1.0";
	public final static QName XML_ID_QNAME = new QName(
			"http://www.w3.org/XML/1998/namespace", "id", "xml");
	public final static String NKJP_NS = "http://www.nkjp.pl/ns/1.0";
	public final static List<QName> possibleParagraphNames = Arrays.asList(
			new QName(TEI_NS, "p"), new QName(TEI_NS, "div"), new QName(TEI_NS,
					"ab"), new QName(TEI_NS, "u"));

	public static String getXmlId(StartElement start) {
		Attribute attr = start.getAttributeByName(XML_ID_QNAME);
		return attr != null ? attr.getValue() : null;
	}

	public static String getAttrValue(StartElement start, String name) {
		Attribute attr = start.getAttributeByName(new QName(name));
		return attr != null ? attr.getValue() : null;
	}

	public static String getNKJPAttrValue(StartElement start, String name) {
		Attribute attr = start.getAttributeByName(new QName(NKJP_NS, name));
		return attr != null ? attr.getValue() : null;
	}

	public static StartElement advanceToStart(XMLEventReader xer, String name)
			throws TEIException, XMLStreamException {
		while (xer.hasNext() && !isStart(xer.peek(), name)) {
			xer.nextEvent();
		}
		if (isStart(xer.peek(), name))
			return xer.nextEvent().asStartElement();
		else
			throw new TEIException(
					"Expected body start tag, but found end of stream");
	}

	public static boolean isStart(XMLEvent event, String name) {
		return event.isStartElement()
				&& event.asStartElement().getName()
						.equals(new QName(TEI_NS, name));
	}

	public static void requireName(StartElement start, String name)
			throws XMLStreamException {
		require(String.format("start tag '%s'", name), start, start.getName()
				.equals(new QName(TEI_NS, name)));
	}

	protected static void require(String reqMsg, XMLEvent event, boolean cond)
			throws XMLStreamException {
		if (!cond) {
			fail(reqMsg, event);
		}
	}

	protected static void fail(String reqMsg, XMLEvent eventGot)
			throws XMLStreamException {
		String msg = String.format("Expected %s here, but got %s", reqMsg,
				eventGot.toString());
		throw new XMLStreamException(msg, eventGot.getLocation());
	}

	public static boolean isEnd(XMLEvent event, String name) {
		return event.isEndElement()
				&& event.asEndElement().getName()
						.equals(new QName(TEI_NS, name));
	}

	public static boolean getNKJPBooleanAttrValue(StartElement start,
			String name) {
		Attribute attr = start.getAttributeByName(new QName(NKJP_NS, name));
		return attr == null ? false : attr.getValue().equalsIgnoreCase("true");
	}
}