Project: mylyn.context
/*******************************************************************************
 * Copyright (c) 2004, 2008 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; 
 
}