/******************************************************************************* * Copyright (c) 2004, 2011 Tasktop Technologies and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Tasktop Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.context.tests.support; import java.io.IOException; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Locale; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.eclipse.mylyn.context.core.IInteractionContext; import org.eclipse.mylyn.internal.context.core.AggregateInteractionEvent; import org.eclipse.mylyn.internal.context.core.IInteractionContextWriter; import org.eclipse.mylyn.monitor.core.InteractionEvent; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * TODO: remove the explicit string references * * @author Mik Kersten */ public class DomContextWriter implements IInteractionContextWriter { private DocumentBuilderFactory dbf = null; private Document doc = null; private Element root = null; private OutputStream outputStream = null; private Result result = null; public DomContextWriter() throws Exception { dbf = DocumentBuilderFactory.newInstance(); doc = dbf.newDocumentBuilder().newDocument(); } public void writeContextToStream(IInteractionContext context) throws IOException { if (outputStream == null) { IOException ioe = new IOException("OutputStream not set"); throw ioe; } clearDocument(); root = doc.createElement("InteractionHistory"); root.setAttribute("Version", "1"); root.setAttribute("Id", context.getHandleIdentifier()); for (InteractionEvent ie : context.getInteractionHistory()) { writeInteractionEvent(ie); } doc.appendChild(root); writeDOMtoStream(doc); return; } private void writeDOMtoStream(Document document) { Source source = new DOMSource(document); result = new StreamResult(outputStream); Transformer xformer = null; try { xformer = TransformerFactory.newInstance().newTransformer(); xformer.transform(source, result); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerFactoryConfigurationError e) { e.printStackTrace(); } catch (TransformerException e1) { e1.printStackTrace(); } } @SuppressWarnings({ "deprecation" }) private void writeInteractionEvent(InteractionEvent e) { Element node = doc.createElement("InteractionEvent"); String f = "yyyy-MM-dd HH:mm:ss.S z"; SimpleDateFormat format = new SimpleDateFormat(f, Locale.ENGLISH); node.setAttribute("Kind", e.getKind().toString()); node.setAttribute("StartDate", format.format(e.getDate())); node.setAttribute("EndDate", format.format(e.getEndDate())); node.setAttribute("OriginId", org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getOriginId())); node.setAttribute("StructureKind", org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getStructureKind())); node.setAttribute("StructureHandle", org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getStructureHandle())); node.setAttribute("Navigation", org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getNavigation())); node.setAttribute("Delta", org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getDelta())); node.setAttribute("Interest", "" + e.getInterestContribution()); if (e instanceof AggregateInteractionEvent) { root.setAttribute("NumEvents", "" + ((AggregateInteractionEvent) e).getNumCollapsedEvents()); root.setAttribute("CreationCount", "" + ((AggregateInteractionEvent) e).getEventCountOnCreation()); } root.appendChild(node); } @SuppressWarnings({ "deprecation" }) public void writeEventToStream(InteractionEvent e) throws IOException { if (outputStream == null) { IOException ioe = new IOException("OutputStream not set"); throw ioe; } clearDocument(); root = doc.createElement("InteractionEvent"); String f = "yyyy-MM-dd HH:mm:ss.S z"; SimpleDateFormat format = new SimpleDateFormat(f, Locale.ENGLISH); root.setAttribute("Kind", e.getKind().toString()); root.setAttribute("StartDate", format.format(e.getDate())); root.setAttribute("EndDate", format.format(e.getEndDate())); root.setAttribute("OriginId", org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getOriginId())); root.setAttribute("StructureKind", org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getStructureKind())); root.setAttribute("StructureHandle", org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getStructureHandle())); root.setAttribute("Navigation", org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getNavigation())); root.setAttribute("Delta", org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getDelta())); root.setAttribute("Interest", "" + e.getInterestContribution()); if (e instanceof AggregateInteractionEvent) { root.setAttribute("NumEvents", "" + ((AggregateInteractionEvent) e).getNumCollapsedEvents()); root.setAttribute("CreationCount", "" + ((AggregateInteractionEvent) e).getEventCountOnCreation()); } writeDOMtoStream(doc); } private void clearDocument() { try { this.doc = dbf.newDocumentBuilder().newDocument(); } catch (ParserConfigurationException e) { throw new RuntimeException(e); } } public OutputStream getOutputStream() { return outputStream; } public void setOutputStream(OutputStream outputStream) { this.outputStream = outputStream; } }