package org.omg.lsae.notifications;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class HeartBeatEvent extends AnalysisEvent {

	public HeartBeatEvent() {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.omg.lsae.notifications.AnalysisEvent#isCompleted()
	 */
	@Override
	public boolean isCompleted() {
		// return false, because heartbeat implies that event is in queue or
		// running
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.omg.lsae.notifications.AnalysisEvent#toString()
	 */
	@Override
	public String toString() {
		return "HeartBeat Event - " + getMessage();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.omg.lsae.notifications.AnalysisEvent#toXMLString()
	 */
	@Override
	public String toXMLString() {

		Document doc = createDomDocument();

		Element root = doc.createElement("analysis_event");
		root.setAttribute("timestamp", getTimestamp());
		root.setAttribute("id", getQueryId());

		Element msg = doc.createElement("message");
		msg.setTextContent(getMessage());
		root.appendChild(msg);

		msg = doc.createElement("heartbeat_progress");
		root.appendChild(msg);

		ByteArrayOutputStream buf = new ByteArrayOutputStream();
		TransformerFactory tFactory = TransformerFactory.newInstance();
		Transformer transformer;
		StreamSource stylesource = new StreamSource(new ByteArrayInputStream(
				new String(XSLT).getBytes()));
		try {
			transformer = tFactory.newTransformer(stylesource);
			DOMSource source = new DOMSource(root);
			StreamResult result = new StreamResult(buf);
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,
					"yes");
			transformer.transform(source, result);
		} catch (TransformerConfigurationException e1) {
			System.err.println("Couldnt print out DOM "
					+ e1.getLocalizedMessage());
		} catch (TransformerException e) {
			System.err.println("Couldnt print out DOM "
					+ e.getLocalizedMessage());
		}
		return buf.toString();
	}

}
