OutWrapper.java 4.48 KB
package ipipan.clarin.tei.impl.io.write;

import ipipan.clarin.tei.impl.utils.XMLConst;

import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

/**
 * 
 * @author mlenart
 */
class OutWrapper {
	private final static String defaultNS = XMLConst.TEI_NS;
	private final static Map<String, String> nsMap;
	private final static XMLOutputFactory factory = XMLOutputFactory
			.newInstance();
	private final XMLStreamWriter xsw;
	private int lastEventType;
	private int depth = 0;
	static {
		nsMap = new HashMap<String, String>();
		nsMap.put("nkjp", XMLConst.NKJP_NS);
		nsMap.put("xi", XMLConst.XINCLUDE_NS);
	}

	OutWrapper(Writer writer) throws XMLStreamException {
		this.xsw = factory.createXMLStreamWriter(writer);
	}

	void rootStart(String string) throws XMLStreamException {
		xsw.writeStartDocument();
		xsw.writeCharacters("\n");
		xsw.writeStartElement("teiCorpus");
		xsw.writeDefaultNamespace(defaultNS);
		for (String prefix : nsMap.keySet())
			xsw.writeNamespace(prefix, nsMap.get(prefix));
		lastEventType = XMLStreamConstants.START_ELEMENT;
	}

	public void start(String name) throws XMLStreamException {
		spaceBeforeStart();
		xsw.writeStartElement(defaultNS, name);
		lastEventType = XMLStreamConstants.START_ELEMENT;
	}

	public void start(String prefix, String name) throws XMLStreamException {
		spaceBeforeStart();
		xsw.writeStartElement(nsMap.get(prefix), name);
		lastEventType = XMLStreamConstants.START_ELEMENT;
	}

	public void startEmpty(String prefix, String name)
			throws XMLStreamException {
		spaceBeforeStart();
		xsw.writeEmptyElement(nsMap.get(prefix), name);
		lastEventType = XMLStreamConstants.END_ELEMENT;
	}

	public void startEmpty(String name) throws XMLStreamException {
		spaceBeforeStart();
		xsw.writeEmptyElement(defaultNS, name);
		lastEventType = XMLStreamConstants.END_ELEMENT;
	}

	public void end() throws XMLStreamException {
		spaceBeforeEnd();
		xsw.writeEndElement();
		lastEventType = XMLStreamConstants.END_ELEMENT;
	}

	public void xmlIdAttr(String value) throws XMLStreamException {
		xsw.writeAttribute("xml", XMLConst.XML_NS, "id", value);
	}

	public void attr(String name, String value) throws XMLStreamException {
		xsw.writeAttribute(name, value);
	}

	void attr(String prefix, String name, String value)
			throws XMLStreamException {
		xsw.writeAttribute(prefix, nsMap.get(prefix), name, value);
	}

	void comment(String text) throws XMLStreamException {
		writeSpace();
		xsw.writeComment(" " + text.replace("--", "\\-\\-") + " ");
	}

	public void fSymbol(String name, String value) throws XMLStreamException {
		fSymbol(null, name, value);
		lastEventType = XMLStreamConstants.END_ELEMENT;
	}

	public void fSymbol(String xmlId, String name, String value)
			throws XMLStreamException {
		start("f");
		attr("name", name);
		startEmpty("symbol");
		if (xmlId != null)
			xmlIdAttr(xmlId);
		attr("value", value);
		// end(); // symbol
		end(); // f
	}

	public void fString(String name, String string) throws XMLStreamException {
		start("f");
		attr("name", name);
		start("string");
		text(string);
		end(); // string
		end(); // f
	}

	public void fSymbolsList(String name, Map<String, String> id2Value)
			throws XMLStreamException {
		start("f");
		attr("name", name);
		if (id2Value.size() > 1) {
			start("vAlt");
		}
		for (Map.Entry<String, String> entry : id2Value.entrySet()) {
			startEmpty("symbol");
			xmlIdAttr(entry.getKey());
			attr("value", entry.getValue());
		}
		if (id2Value.size() > 1) {
			end(); // vAlt
		}
		end(); // f
	}

	void close() throws XMLStreamException {
		xsw.close();
	}

	void text(String text) throws XMLStreamException {
		xsw.writeCharacters(text);
		lastEventType = XMLStreamConstants.CHARACTERS;
	}

	private void spaceBeforeStart() throws XMLStreamException {
		if (lastEventType == XMLStreamConstants.START_ELEMENT) {
			depth++;
			writeSpace();
		} else if (lastEventType == XMLStreamConstants.END_ELEMENT)
			writeSpace();
	}

	private void spaceBeforeEnd() throws XMLStreamException {
		if (lastEventType == XMLStreamConstants.END_ELEMENT) {
			depth--;
			writeSpace();
		}
	}

	private void writeSpace() throws XMLStreamException {
		xsw.writeCharacters("\n");
		for (int i = 0; i < depth; i++)
			xsw.writeCharacters("  ");
	}

	void xIncludeHeader(String headerFilename) throws XMLStreamException {
		startEmpty("xi", "include");
		attr("href", headerFilename);
	}
}