blob: 61c82f0d8caf8d51a4af56fc811272eb72827032 [file] [log] [blame]
/*******************************************************************************
* 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.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.zip.ZipInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.eclipse.mylyn.context.core.ContextCore;
import org.eclipse.mylyn.internal.context.core.AggregateInteractionEvent;
import org.eclipse.mylyn.internal.context.core.IInteractionContextReader;
import org.eclipse.mylyn.internal.context.core.InteractionContext;
import org.eclipse.mylyn.monitor.core.InteractionEvent;
import org.eclipse.mylyn.monitor.core.InteractionEvent.Kind;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* @author Mik Kersten
*
* TODO: merge into a single externalizer
*/
public class DomContextReader implements IInteractionContextReader {
public InteractionContext readContext(String handle, File file) {
if (!file.exists()) {
return null;
}
try {
Document doc = openAsDOM(file);
Element root = doc.getDocumentElement();
// readVersion = Integer.parseInt(root.getAttribute("Version"));
// String id = root.getAttribute("Id");
InteractionContext t = new InteractionContext(handle, ContextCore.getCommonContextScaling());
NodeList list = root.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node child = list.item(i);
InteractionEvent ie = readInteractionEvent(child);
if (ie != null) {
t.parseEvent(ie);
}
}
return t;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public Document openAsDOM(File inputFile) throws IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
Document document = null;
ZipInputStream zipInputStream = null;
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(inputFile);
zipInputStream = new ZipInputStream(fileInputStream);
zipInputStream.getNextEntry();
builder = factory.newDocumentBuilder();
document = builder.parse(zipInputStream);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
closeStream(zipInputStream);
closeStream(fileInputStream);
}
return document;
}
@SuppressWarnings( { "deprecation" })
public InteractionEvent readInteractionEvent(Node n) {
try {
Element e = (Element) n;
String kind = e.getAttribute("Kind");
String startDate = e.getAttribute("StartDate");
String endDate = e.getAttribute("EndDate");
String originId = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(e.getAttribute("OriginId"));
String structureKind = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(e.getAttribute("StructureKind"));
String structureHandle = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(e.getAttribute("StructureHandle"));
String navigation = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(e.getAttribute("Navigation"));
String delta = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(e.getAttribute("Delta"));
String interest = e.getAttribute("Interest");
String numEventsString = e.getAttribute("NumEvents");
int numEvents = 1;
if (numEventsString != null && numEventsString.length() != 0) {
try {
numEvents = Integer.parseInt(numEventsString);
} catch (NumberFormatException nfe) {
//ignore.
}
}
String eventCountOnCreationString = e.getAttribute("CreationCount");
int eventCountOnCreation = -1;
if (eventCountOnCreationString != null && eventCountOnCreationString.length() != 0) {
try {
eventCountOnCreation = Integer.parseInt(eventCountOnCreationString);
} catch (NumberFormatException nfe) {
//ignore.
}
}
String formatString = "yyyy-MM-dd HH:mm:ss.S z";
SimpleDateFormat format = new SimpleDateFormat(formatString, Locale.ENGLISH);
InteractionEvent ie = null;
if (numEventsString == null || eventCountOnCreationString == null) {
// if we don't have the values for the collapsed event, it must be one that is uncollapsed
ie = new InteractionEvent(Kind.fromString(kind), structureKind, structureHandle, originId, navigation,
delta, Float.parseFloat(interest), format.parse(startDate), format.parse(endDate));
} else {
ie = new AggregateInteractionEvent(Kind.fromString(kind), structureKind, structureHandle, originId,
navigation, delta, Float.parseFloat(interest), format.parse(startDate), format.parse(endDate),
numEvents, eventCountOnCreation);
}
return ie;
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
private static final void closeStream(Closeable closeable) {
if (closeable != null) {
try {
closeable.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}