NEW - bug 278857: StackOverflowError during "Generate Usage Data Upload Preview"
https://bugs.eclipse.org/bugs/show_bug.cgi?id=278857
diff --git a/plugins/org.eclipse.epp.usagedata.recording/src/org/eclipse/epp/usagedata/internal/recording/UsageDataRecorderUtils.java b/plugins/org.eclipse.epp.usagedata.recording/src/org/eclipse/epp/usagedata/internal/recording/UsageDataRecorderUtils.java
index 6c06f5e..cfc62ff 100644
--- a/plugins/org.eclipse.epp.usagedata.recording/src/org/eclipse/epp/usagedata/internal/recording/UsageDataRecorderUtils.java
+++ b/plugins/org.eclipse.epp.usagedata.recording/src/org/eclipse/epp/usagedata/internal/recording/UsageDataRecorderUtils.java
@@ -11,6 +11,8 @@
package org.eclipse.epp.usagedata.internal.recording;
import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
import java.io.Writer;
import java.util.List;
import java.util.regex.Matcher;
@@ -138,6 +140,9 @@
* <p>
* The value: "first,\"\"\"second\"\", third\",fourth" will be parsed into
* three strings: "first", "\"second\", third", and "fourth".
+ * <p>
+ * Note that callers can safely assume that all entries in the resulting
+ * array will be non-<code>null</code>.
*
* @param line
* a {@link String}. Must not be <code>null</code>.
@@ -146,18 +151,48 @@
*/
public static String[] splitLine(String line) {
List<String> strings = new java.util.ArrayList<String>();
- Matcher matcher = Pattern.compile("(\"([^\"]|\"\")*\"|[^,]*)(,|$)").matcher(line); //$NON-NLS-1$
- while (matcher.find()) {
- String string = matcher.group();
- // Remove leading commas.
- string = string.replaceAll(",$", ""); //$NON-NLS-1$ //$NON-NLS-2$
- // Remove optional leading and trailing double-quotes.
- string = string.replaceAll("^?\"(.*)\"$", "$1"); //$NON-NLS-1$ //$NON-NLS-2$
- // Replace double double-quotes with a single double-quote
- string = string.replaceAll("\"\"", "\""); //$NON-NLS-1$ //$NON-NLS-2$
-
- strings.add( string );
+ try {
+ splitLine(line, strings);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
return (String[]) strings.toArray(new String[strings.size()]);
}
+
+ private static void splitLine(String line, List<String> strings) throws IOException {
+ /*
+ * There is a potential issue with this implementation in the case
+ * where a quoted-wrapped field starts with an escaped quote. i.e.
+ * the string \"\"\"value\"\"\" will be read as escaped-quote, followed
+ * by quote rather than as quote followed by escaped-quote as is
+ * intended. The net result is the same (evidenced in the test cases).
+ */
+ Reader reader = new StringReader(line);
+ int next = 0;
+ StringBuilder builder = new StringBuilder();
+ boolean inQuote = false;
+ while ((next = reader.read()) != -1) {
+ if (next == '"') {
+ reader.mark(1);
+ if (reader.read() == '"') {
+ builder.append('"');
+ } else {
+ reader.reset();
+ inQuote = !inQuote;
+ }
+ } else if (next == ',') {
+ if (inQuote) {
+ builder.append(',');
+ } else {
+ strings.add(builder.toString());
+ builder = new StringBuilder();
+ }
+
+ } else {
+ builder.append((char)next);
+ }
+ }
+ strings.add(builder.toString());
+ }
}
diff --git a/plugins/org.eclipse.epp.usagedata.recording/src/org/eclipse/epp/usagedata/internal/recording/uploading/UsageDataFileReader.java b/plugins/org.eclipse.epp.usagedata.recording/src/org/eclipse/epp/usagedata/internal/recording/uploading/UsageDataFileReader.java
index 1b1063d..34eb5c2 100644
--- a/plugins/org.eclipse.epp.usagedata.recording/src/org/eclipse/epp/usagedata/internal/recording/uploading/UsageDataFileReader.java
+++ b/plugins/org.eclipse.epp.usagedata.recording/src/org/eclipse/epp/usagedata/internal/recording/uploading/UsageDataFileReader.java
@@ -60,9 +60,28 @@
reader = bufferedReader;
}
+ /**
+ * Curiously enough, this method creates and returns a
+ * {@link UsageDataEvent} object from the given {@link String}. If an error
+ * occurs while processing the string, <code>null</code> is returned
+ * instead.
+ *
+ * @param line
+ * A single line in CSV format representing a UDC event.
+ * @return An instance of {@link UsageDataEvent} containing the information
+ * found in the given string.
+ */
private UsageDataEvent createUsageDataEvent(String line) {
String[] tokens = UsageDataRecorderUtils.splitLine(line);
- UsageDataEvent usageDataEvent = new UsageDataEvent(tokens[0], tokens[1], tokens[4], tokens[2], tokens[3], Long.valueOf(tokens[5]));
+ if (tokens == null) return null;
+ if (tokens.length != 6) return null;
+ Long when;
+ try {
+ when = Long.valueOf(tokens[5].trim());
+ } catch (NumberFormatException e) {
+ return null; // How's that for error recovery?
+ }
+ UsageDataEvent usageDataEvent = new UsageDataEvent(tokens[0], tokens[1], tokens[4], tokens[2], tokens[3], when);
return usageDataEvent;
}
@@ -70,10 +89,36 @@
reader.close();
}
+ /**
+ * This method provides a mechanism for visiting the contents of
+ * a file containing UDC data.
+ *
+ * @see #iterate(IProgressMonitor, Iterator)
+ *
+ * @param iterator instance of {@link Iterator} to notify.
+ * @throws Exception
+ */
public void iterate(Iterator iterator) throws Exception {
iterate(new NullProgressMonitor(), iterator);
}
+ /**
+ * This method provides a mechanism for visiting the contents of
+ * a file containing UDC data. Essentially, it implements a visitor
+ * pattern (and in retrospect, we probably should have called this
+ * method "visit" or something equally clever). The
+ * {@link Iterator} is sent a separate message for the header, and
+ * then for each line in the file that we're processing.
+ *
+ * <p>Lines in the file that cause errors on parsing attempts
+ * are skipped.</p>
+ *
+ * @see #iterate(IProgressMonitor, Iterator)
+ *
+ * @param monitor a progress monitor
+ * @param iterator instance of {@link Iterator} to notify.
+ * @throws Exception
+ */
public void iterate(IProgressMonitor monitor, Iterator iterator) throws Exception {
monitor.beginTask("Iterate over usage data file", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
try {
@@ -84,7 +129,7 @@
String line = reader.readLine();
if (line == null) break;
UsageDataEvent event = createUsageDataEvent(line);
- iterator.event(line, event);
+ if (event != null) iterator.event(line, event);
}
} finally {
monitor.done();
diff --git a/test/org.eclipse.epp.usagedata.recording.tests/src/org/eclipse/epp/usagedata/internal/recording/UsageDataRecorderUtilsTests.java b/test/org.eclipse.epp.usagedata.recording.tests/src/org/eclipse/epp/usagedata/internal/recording/UsageDataRecorderUtilsTests.java
index bf75674..71859f6 100644
--- a/test/org.eclipse.epp.usagedata.recording.tests/src/org/eclipse/epp/usagedata/internal/recording/UsageDataRecorderUtilsTests.java
+++ b/test/org.eclipse.epp.usagedata.recording.tests/src/org/eclipse/epp/usagedata/internal/recording/UsageDataRecorderUtilsTests.java
@@ -45,6 +45,7 @@
@Test
public void testSplitLine() {
String[] strings = UsageDataRecorderUtils.splitLine("x,y,z");
+ assertEquals(3, strings.length);
assertEquals("x", strings[0]);
assertEquals("y", strings[1]);
assertEquals("z", strings[2]);
@@ -53,6 +54,7 @@
@Test
public void testSplitLineWithEscapedQuotes() {
String[] strings = UsageDataRecorderUtils.splitLine("x,\"\"\"y\"\"\",z");
+ assertEquals(3, strings.length);
assertEquals("x", strings[0]);
assertEquals("\"y\"", strings[1]);
assertEquals("z", strings[2]);
@@ -61,6 +63,7 @@
@Test
public void testSplitLineWithQuotesAndCommas() {
String[] strings = UsageDataRecorderUtils.splitLine("first,\"second, third\",fourth");
+ assertEquals(3, strings.length);
assertEquals("first", strings[0]);
assertEquals("second, third", strings[1]);
assertEquals("fourth", strings[2]);
@@ -69,9 +72,96 @@
@Test
public void testSplitLineWithEscapedQuotesAndCommas() {
String[] strings = UsageDataRecorderUtils.splitLine("first,\"\"\"second\"\", third\",fourth");
+ assertEquals(3, strings.length);
assertEquals("first", strings[0]);
assertEquals("\"second\", third", strings[1]);
assertEquals("fourth", strings[2]);
}
+ @Test
+ public void testSplitLineUnquotedEscapedQuote() throws Exception {
+ String[] strings = UsageDataRecorderUtils.splitLine("first,\"\"second");
+ assertEquals(2, strings.length);
+ assertEquals("first", strings[0]);
+ assertEquals("\"second", strings[1]);
+ }
+
+ /**
+ * A line, very much like the one listed here (names have been changed
+ * to protect the innocent) caused some grief with an older implementation
+ * of the splitLine method (bug 278857).
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testSplitLineTroublesomeLineFoundInField() throws Exception {
+ String[] strings = UsageDataRecorderUtils.splitLine("error,log,,,\"java.lang.NullPointerException\r\n\tat stuff.actions.StuffAction.selectionChanged(StuffAction.java:99)\r\n\tat org.eclipse.ui.internal.PluginAction.refreshEnablement(PluginAction.java:206)\r\n\tat org.eclipse.ui.internal.PluginAction.selectionChanged(PluginAction.java:277)\r\n\tat org.eclipse.ui.internal.ObjectPluginAction.partClosed(ObjectPluginAction.java:49)\r\n\tat org.eclipse.ui.internal.PartListenerList2$3.run(PartListenerList2.java:100)\r\n\tat org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)\r\n\tat org.eclipse.core.runtime.Platform.run(Platform.java:888)\r\n\tat org.eclipse.ui.internal.PartListenerList2.fireEvent(PartListenerList2.java:55)\r\n\tat org.eclipse.ui.internal.PartListenerList2.firePartClosed(PartListenerList2.java:98)\r\n\tat org.eclipse.ui.internal.PartService.firePartClosed(PartService.java:227)\r\n\tat org.eclipse.ui.internal.WorkbenchPagePartList.firePartClosed(WorkbenchPagePartList.java:39)\r\n\tat org.eclipse.ui.internal.PartList.partClosed(PartList.java:274)\r\n\tat org.eclipse.ui.internal.PartList.removePart(PartList.java:186)\r\n\tat org.eclipse.ui.internal.WorkbenchPage.disposePart(WorkbenchPage.java:1714)\r\n\tat org.eclipse.ui.internal.WorkbenchPage.handleDeferredEvents(WorkbenchPage.java:1422)\r\n\tat org.eclipse.ui.internal.WorkbenchPage.deferUpdates(WorkbenchPage.java:1406)\r\n\tat org.eclipse.ui.internal.WorkbenchPage.closeEditors(WorkbenchPage.java:1380)\r\n\tat org.eclipse.ui.internal.WorkbenchPage.closeEditor(WorkbenchPage.java:1444)\r\n\tat org.eclipse.ui.texteditor.AbstractTextEditor$23.run(AbstractTextEditor.java:4234)\r\n\tat org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)\r\n\tat org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134)\r\n\tat org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3855)\r\n\tat org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3476)\r\n\tat org.eclipse.jface.window.Window.runEventLoop(Window.java:825)\r\n\tat org.eclipse.jface.window.Window.open(Window.java:801)\r\n\tat org.eclipse.jface.dialogs.MessageDialog.open(MessageDialog.java:327)\r\n\tat org.eclipse.ui.internal.EditorManager.saveAll(EditorManager.java:1164)\r\n\tat org.eclipse.ui.internal.Workbench$17.run(Workbench.java:1005)\r\n\tat org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)\r\n\tat org.eclipse.ui.internal.Workbench.saveAllEditors(Workbench.java:954)\r\n\tat org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:872)\r\n\tat org.eclipse.ui.internal.Workbench.access$15(Workbench.java:856)\r\n\tat org.eclipse.ui.internal.Workbench$23.run(Workbench.java:1100)\r\n\tat org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)\r\n\tat org.eclipse.ui.internal.Workbench.close(Workbench.java:1098)\r\n\tat org.eclipse.ui.internal.Workbench.close(Workbench.java:1070)\r\n\tat org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:720)\r\n\tat org.eclipse.ui.internal.WorkbenchWindow.access$0(WorkbenchWindow.java:699)\r\n\tat org.eclipse.ui.internal.WorkbenchWindow$5.run(WorkbenchWindow.java:815)\r\n\tat org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)\r\n\tat org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:813)\r\n\tat org.eclipse.jface.window.Window.handleShellCloseEvent(Window.java:741)\r\n\tat org.eclipse.jface.window.Window$3.shellClosed(Window.java:687)\r\n\tat org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:92)\r\n\tat org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)\r\n\tat org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)\r\n\tat org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1027)\r\n\tat org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1012)\r\n\tat org.eclipse.swt.widgets.Decorations.closeWidget(Decorations.java:308)\r\n\tat org.eclipse.swt.widgets.Decorations.WM_CLOSE(Decorations.java:1645)\r\n\tat org.eclipse.swt.widgets.Control.windowProc(Control.java:3948)\r\n\tat org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:342)\r\n\tat org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1578)\r\n\tat org.eclipse.swt.widgets.Shell.windowProc(Shell.java:2010)\r\n\tat org.eclipse.swt.widgets.Display.windowProc(Display.java:4589)\r\n\tat org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)\r\n\tat org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2404)\r\n\tat org.eclipse.swt.widgets.Shell.callWindowProc(Shell.java:492)\r\n\tat org.eclipse.swt.widgets.Control.windowProc(Control.java:4036)\r\n\tat org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:342)\r\n\tat org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1578)\r\n\tat org.eclipse.swt.widgets.Shell.windowProc(Shell.java:2010)\r\n\tat org.eclipse.swt.widgets.Display.windowProc(Display.java:4589)\r\n\tat org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)\r\n\tat org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2404)\r\n\tat org.eclipse.swt.widgets.Shell.callWindowProc(Shell.java:492)\r\n\tat org.eclipse.swt.widgets.Control.windowProc(Control.java:4036)\r\n\tat org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:342)\r\n\tat org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1578)\r\n\tat org.eclipse.swt.widgets.Shell.windowProc(Shell.java:2010)\r\n\tat org.eclipse.swt.widgets.Display.windowProc(Display.java:4589)\r\n\tat org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)\r\n\tat org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2409)\r\n\tat org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3471)\r\n\tat org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2405)\r\n\tat org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2369)\r\n\tat org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2221)\r\n\tat org.eclipse.ui.internal.Workbench$5.run(Workbench.java:500)\r\n\tat org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)\r\n\tat org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:493)\r\n\tat org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)\r\n\tat org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113)\r\n\tat org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:194)\r\n\tat org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)\r\n\tat org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)\r\n\tat org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368)\r\n\tat org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)\r\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)\r\n\tat java.lang.reflect.Method.invoke(Unknown Source)\r\n\tat org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559)\r\n\tat org.eclipse.equinox.launcher.Main.basicRun(Main.java:514)\r\n\tat org.eclipse.equinox.launcher.Main.run(Main.java:1311)\r\n\",1243528984485");
+ assertEquals(6, strings.length);
+ assertEquals("error", strings[0]);
+ assertEquals("log", strings[1]);
+ assertEquals("1243528984485", strings[5]);
+ }
+
+ /**
+ * The input that splitLine expects is generated by UsageDataRecorderUtils
+ * and so should be of the correct format. But what if it isn't?
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testSplitLineMissingEndQuote() throws Exception {
+ String[] strings = UsageDataRecorderUtils.splitLine("first,\"second");
+ assertEquals(2, strings.length);
+ assertEquals("first", strings[0]);
+ assertEquals("second", strings[1]);
+ }
+
+ @Test
+ public void testSplitLineCommaAtEnd() throws Exception {
+ String[] strings = UsageDataRecorderUtils.splitLine("first,second,");
+ assertEquals(3, strings.length);
+ assertEquals("first", strings[0]);
+ assertEquals("second", strings[1]);
+ assertEquals("", strings[2]);
+ }
+
+ @Test
+ public void testSplitLineCommaAtBeginning() throws Exception {
+ String[] strings = UsageDataRecorderUtils.splitLine(",first,second");
+ assertEquals(3, strings.length);
+ assertEquals("", strings[0]);
+ assertEquals("first", strings[1]);
+ assertEquals("second", strings[2]);
+ }
+
+ @Test
+ public void testSplitLineEmptyMiddleField() throws Exception {
+ String[] strings = UsageDataRecorderUtils.splitLine("first,,second");
+ assertEquals(3, strings.length);
+ assertEquals("first", strings[0]);
+ assertEquals("", strings[1]);
+ assertEquals("second", strings[2]);
+ }
+
+ @Test
+ public void testSplitLineWithJustOneField() throws Exception {
+ String[] strings = UsageDataRecorderUtils.splitLine("first");
+ assertEquals(1, strings.length);
+ assertEquals("first", strings[0]);
+ }
+
+ @Test
+ public void testSplitLineWithEmptyInput() throws Exception {
+ String[] strings = UsageDataRecorderUtils.splitLine("");
+ assertEquals(1, strings.length);
+ assertEquals("", strings[0]);
+ }
+
+ @Test
+ public void testSplitLineWithWhitespaceOnly() throws Exception {
+ String[] strings = UsageDataRecorderUtils.splitLine(" ");
+ assertEquals(1, strings.length);
+ assertEquals(" ", strings[0]);
+ }
+
}
diff --git a/test/org.eclipse.epp.usagedata.recording.tests/src/org/eclipse/epp/usagedata/internal/recording/uploading/UsageDataFileReaderTests.java b/test/org.eclipse.epp.usagedata.recording.tests/src/org/eclipse/epp/usagedata/internal/recording/uploading/UsageDataFileReaderTests.java
index ccb36a0..131dcef 100644
--- a/test/org.eclipse.epp.usagedata.recording.tests/src/org/eclipse/epp/usagedata/internal/recording/uploading/UsageDataFileReaderTests.java
+++ b/test/org.eclipse.epp.usagedata.recording.tests/src/org/eclipse/epp/usagedata/internal/recording/uploading/UsageDataFileReaderTests.java
@@ -41,4 +41,72 @@
});
assertEquals(content, builder.toString());
}
+
+ @Test
+ public void testIterateSkipsRowsWithMissingFields() throws Exception {
+ String header = "what,kind,bundleId,bundleVersion,description,time\n";
+ String valid = "what,kind,bundleId,bundleVersion,description,123456\n";
+ String invalid = "what,kind,bundleId,bundleVersion,description\n";
+
+ final StringBuilder builder = new StringBuilder();
+
+ UsageDataFileReader reader = new UsageDataFileReader(new StringReader(header+valid+invalid));
+ reader.iterate(new UsageDataFileReader.Iterator() {
+
+ public void event(String line, UsageDataEvent event) {
+ builder.append(line);
+ builder.append("\n");
+ }
+
+ public void header(String header) {
+ builder.append(header);
+ builder.append("\n");
+ }
+ });
+ assertEquals(header+valid, builder.toString());
+ }
+
+ @Test
+ public void testIterateSkipsRowsWithIncorrectlyFormattedNumberFields() throws Exception {
+ String header = "what,kind,bundleId,bundleVersion,description,time\n";
+ String valid = "what,kind,bundleId,bundleVersion,description,123456\n";
+ String invalid = "what,kind,bundleId,bundleVersion,description,123bob\n";
+
+ final StringBuilder builder = new StringBuilder();
+
+ UsageDataFileReader reader = new UsageDataFileReader(new StringReader(header+valid+invalid));
+ reader.iterate(new UsageDataFileReader.Iterator() {
+
+ public void event(String line, UsageDataEvent event) {
+ builder.append(line);
+ builder.append("\n");
+ }
+
+ public void header(String header) {
+ builder.append(header);
+ builder.append("\n");
+ }
+ });
+ assertEquals(header+valid, builder.toString());
+ }
+
+
+ /**
+ * This test scans through a file containing real usage data events.
+ * We're happy if this test just runs without causing any exceptions.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testReadSingleFile() throws Exception {
+ UsageDataFileReader reader = new UsageDataFileReader(UsageDataFileReaderTests.class.getResourceAsStream("usagedata.csv"));
+ reader.iterate(new UsageDataFileReader.Iterator() {
+ public void event(String line, UsageDataEvent event) throws Exception {
+ }
+
+ public void header(String header) throws Exception {
+ }
+
+ });
+ }
}
diff --git a/test/org.eclipse.epp.usagedata.recording.tests/src/org/eclipse/epp/usagedata/internal/recording/uploading/usagedata.csv b/test/org.eclipse.epp.usagedata.recording.tests/src/org/eclipse/epp/usagedata/internal/recording/uploading/usagedata.csv
new file mode 100644
index 0000000..ac86055
--- /dev/null
+++ b/test/org.eclipse.epp.usagedata.recording.tests/src/org/eclipse/epp/usagedata/internal/recording/uploading/usagedata.csv
@@ -0,0 +1,263 @@
+what,kind,bundleId,bundleVersion,description,time
+started,bundle,org.eclipse.wst.ws.service.policy.ui,1.0.102.v200903070248,"org.eclipse.wst.ws.service.policy.ui",1243527604274
+os,sysinfo,,,"win32",1243527604274
+arch,sysinfo,,,"x86",1243527604274
+ws,sysinfo,,,"win32",1243527604274
+locale,sysinfo,,,"en_US",1243527604274
+processors,sysinfo,,,"4",1243527604274
+java.runtime.name,sysinfo,,,"Java(TM) SE Runtime Environment",1243527604274
+java.runtime.version,sysinfo,,,"1.6.0_13-b03",1243527604274
+java.specification.name,sysinfo,,,"Java Platform API Specification",1243527604274
+java.specification.vendor,sysinfo,,,"Sun Microsystems Inc.",1243527604274
+java.specification.version,sysinfo,,,"1.6",1243527604274
+java.vendor,sysinfo,,,"Sun Microsystems Inc.",1243527604274
+java.version,sysinfo,,,"1.6.0_13",1243527604274
+java.vm.info,sysinfo,,,"mixed mode",1243527604274
+java.vm.name,sysinfo,,,"Java HotSpot(TM) Client VM",1243527604274
+java.vm.specification.name,sysinfo,,,"Java Virtual Machine Specification",1243527604274
+java.vm.specification.vendor,sysinfo,,,"Sun Microsystems Inc.",1243527604274
+java.vm.specification.version,sysinfo,,,"1.0",1243527604274
+java.vm.vendor,sysinfo,,,"Sun Microsystems Inc.",1243527604274
+java.vm.version,sysinfo,,,"11.3-b02",1243527604274
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243527631701
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243527760416
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243527764087
+started,bundle,org.eclipse.debug.core,3.5.0.v20090513,"org.eclipse.debug.core",1243527828218
+started,bundle,org.eclipse.jdt.launching,3.5.0.v20090504,"org.eclipse.jdt.launching",1243527828218
+started,bundle,org.eclipse.pde.core,3.5.0.v20090512,"org.eclipse.pde.core",1243527828327
+started,bundle,org.eclipse.core.filesystem,1.2.0.v20090507,"org.eclipse.core.filesystem",1243527828530
+started,bundle,org.eclipse.wst.jsdt.core,1.0.200.v200904290346,"org.eclipse.wst.jsdt.core",1243527828593
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243527830467
+executed,command,org.eclipse.ui,3.5.0.I20090514-2000,"org.eclipse.ui.file.import",1243527830483
+executed,command,org.eclipse.ui,3.5.0.I20090514-2000,"org.eclipse.ui.file.import",1243527830483
+started,bundle,org.eclipse.epp.usagedata.ui,1.1.0.R200905190432,"org.eclipse.epp.usagedata.ui",1243527830514
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243527832310
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243527840572
+executed,command,org.eclipse.ui,3.5.0.I20090514-2000,"org.eclipse.ui.file.import",1243527840572
+executed,command,org.eclipse.ui,3.5.0.I20090514-2000,"org.eclipse.ui.file.import",1243527840572
+started,bundle,org.eclipse.team.cvs.ssh2,3.2.200.I20090508-2000,"org.eclipse.team.cvs.ssh2",1243527842650
+started,bundle,org.eclipse.ltk.core.refactoring,3.5.0.v20090513-2000,"org.eclipse.ltk.core.refactoring",1243527843353
+started,bundle,org.eclipse.ltk.ui.refactoring,3.4.100.v20090513-2000,"org.eclipse.ltk.ui.refactoring",1243527843353
+started,bundle,org.eclipse.compare,3.5.0.I20090514-0808,"org.eclipse.compare",1243527843540
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243527852037
+started,bundle,org.eclipse.wst.sse.core,1.1.400.v200905141750,"org.eclipse.wst.sse.core",1243527920932
+started,bundle,org.eclipse.wst.html.core,1.1.300.v200903120608,"org.eclipse.wst.html.core",1243527921510
+started,bundle,org.eclipse.jdt.apt.core,3.3.200.v20090429-1720,"org.eclipse.jdt.apt.core",1243527954887
+started,bundle,org.eclipse.jdt.apt.pluggable.core,1.0.200.v20090429-1720,"org.eclipse.jdt.apt.pluggable.core",1243527954903
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528071295
+executed,command,org.eclipse.ui,3.5.0.I20090514-2000,"org.eclipse.ui.edit.selectAll",1243528073872
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528077542
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528079667
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528079823
+error,log,,,"Error while processing resource deltas",1243528098222
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528267859
+activated,view,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.ui.views.ProblemView",1243528271326
+started,bundle,org.eclipse.jdt.junit,3.5.0.v20090513-2000,"org.eclipse.jdt.junit",1243528271357
+started,bundle,org.eclipse.compare.core,3.5.0.I20090430-0408,"org.eclipse.compare.core",1243528280088
+opened,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528280182
+activated,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528280432
+started,bundle,org.eclipse.core.variables,3.2.200.v20090506,"org.eclipse.core.variables",1243528281572
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528281916
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528284352
+executed,command,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.edit.text.java.organize.imports",1243528376863
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528376863
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528376941
+executed,command,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.jdt.ui.edit.text.java.correction.assist.proposals",1243528384579
+activated,view,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.PackageExplorer",1243528386656
+executed,command,org.eclipse.ui,3.5.0.I20090514-2000,"org.eclipse.ui.file.refresh",1243528387203
+executed,command,org.eclipse.ui,3.5.0.I20090514-2000,"org.eclipse.ui.edit.selectAll",1243528389545
+started,bundle,org.eclipse.wst.common.project.facet.core,1.4.0.v200904130324,"org.eclipse.wst.common.project.facet.core",1243528398433
+started,bundle,org.eclipse.wst.ws.service.policy,1.0.103.v200905151848,"org.eclipse.wst.ws.service.policy",1243528398479
+started,bundle,org.eclipse.wst.command.env,1.0.408.v200903110045,"org.eclipse.wst.command.env",1243528398558
+started,bundle,org.eclipse.wst.ws,1.1.103.v200903111822,"org.eclipse.wst.ws",1243528398558
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528400291
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528417831
+executed,command,org.eclipse.ui,3.5.0.I20090514-2000,"org.eclipse.ui.file.properties",1243528417894
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528438152
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528486820
+opened,view,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.ui.views.ProgressView",1243528489506
+activated,view,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.ui.views.ProgressView",1243528489522
+activated,view,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.ui.views.ProblemView",1243528494832
+activated,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528496004
+activated,view,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.ui.views.ProblemView",1243528501314
+opened,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528813036
+activated,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528813271
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528817238
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528819050
+activated,view,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.ui.views.ProblemView",1243528819081
+activated,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528819596
+executed,command,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.edit.text.java.open.editor",1243528822220
+activated,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528823314
+started,bundle,org.eclipse.mylyn.java.tasks,3.2.0.I20090520-2300-e3x,"org.eclipse.mylyn.java.tasks",1243528825172
+executed,command,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.jdt.ui.edit.text.java.correction.assist.proposals",1243528825813
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528827374
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528827562
+executed,command,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.jdt.ui.edit.text.java.correction.assist.proposals",1243528832451
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528834434
+executed,command,org.eclipse.ui.workbench.texteditor,3.5.0.v20090513-2000,"org.eclipse.ui.edit.text.showInformation",1243528834450
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528835106
+executed,command,org.eclipse.ui.workbench.texteditor,3.5.0.v20090513-2000,"org.eclipse.ui.edit.text.goto.textStart",1243528836027
+executed,command,org.eclipse.ui,3.5.0.I20090514-2000,"org.eclipse.ui.file.save",1243528841603
+executed,command,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.jdt.ui.edit.text.java.correction.assist.proposals",1243528846898
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528848148
+executed,command,org.eclipse.ui.workbench.texteditor,3.5.0.v20090513-2000,"org.eclipse.ui.edit.text.showInformation",1243528848163
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528848944
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528849991
+executed,command,org.eclipse.ui.workbench.texteditor,3.5.0.v20090513-2000,"org.eclipse.ui.edit.text.showInformation",1243528850006
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528852240
+executed,command,org.eclipse.ui.workbench.texteditor,3.5.0.v20090513-2000,"org.eclipse.ui.edit.text.delete.line",1243528855145
+executed,command,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.jdt.ui.edit.text.java.correction.assist.proposals",1243528858316
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528859440
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528859628
+executed,command,org.eclipse.ui,3.5.0.I20090514-2000,"org.eclipse.ui.file.save",1243528861955
+activated,view,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.ui.views.ProblemView",1243528865032
+opened,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528867812
+activated,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528868077
+executed,command,,,"AUTOGEN:::org.eclipse.jdt.internal.ui.CompilationUnitEditor.ruler.actions/org.eclipse.jdt.internal.ui.javaeditor.JavaSelectRulerAction",1243528872388
+activated,view,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.ui.views.ProblemView",1243528888038
+opened,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528895332
+activated,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528895535
+opened,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528897769
+activated,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528897909
+executed,command,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.edit.text.java.open.editor",1243528897972
+started,bundle,org.sf.easyexplore,1.0.4,"org.sf.easyexplore",1243528901252
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528901486
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528982220
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528982455
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528984423
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528984423
+closed,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243528984469
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528986063
+closed,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243528986203
+stopped,bundle,org.eclipse.mylyn.ide.ant,3.2.0.I20090520-2300-e3x,"org.eclipse.mylyn.ide.ant",1243528988624
+stopped,bundle,org.eclipse.birt.report.debug.ui,2.5.0.v20090423,"org.eclipse.birt.report.debug.ui",1243528988640
+stopped,bundle,org.eclipse.birt.chart.reportitem.ui,2.5.0.v20090429,"org.eclipse.birt.chart.reportitem.ui",1243528988640
+stopped,bundle,org.eclipse.birt.report.item.crosstab.ui,2.5.0.v20090430,"org.eclipse.birt.report.item.crosstab.ui",1243528988640
+stopped,bundle,org.eclipse.birt.report.designer.ui.ide,2.5.0.v20090423,"org.eclipse.birt.report.designer.ui.ide",1243528988655
+stopped,bundle,org.eclipse.datatools.connectivity.oda.template.ui,3.2.0.v200905021238,"org.eclipse.datatools.connectivity.oda.template.ui",1243528988671
+stopped,bundle,org.eclipse.pde.api.tools.ui,1.0.100.v20090511,"org.eclipse.pde.api.tools.ui",1243528988686
+activated,perspective,org.eclipse.jdt.ui,,"org.eclipse.jdt.ui.JavaPerspective",1243530475326
+started,bundle,org.eclipse.osgi,3.5.0.v20090513,"org.eclipse.osgi",1243530475357
+started,bundle,org.eclipse.equinox.simpleconfigurator,1.0.100.v20090514-1915,"org.eclipse.equinox.simpleconfigurator",1243530475357
+started,bundle,com.ibm.icu,4.0.1.v20090415,"com.ibm.icu",1243530475357
+started,bundle,org.eclipse.compare.core,3.5.0.I20090430-0408,"org.eclipse.compare.core",1243530475357
+started,bundle,org.eclipse.core.contenttype,3.4.0.v20090429-1800,"org.eclipse.core.contenttype",1243530475357
+started,bundle,org.eclipse.core.databinding.observable,1.2.0.I20090511-2000a,"org.eclipse.core.databinding.observable",1243530475373
+started,bundle,org.eclipse.core.expressions,3.4.100.v20090429-1800,"org.eclipse.core.expressions",1243530475373
+started,bundle,org.eclipse.core.filebuffers,3.5.0.v20090513-2000,"org.eclipse.core.filebuffers",1243530475373
+started,bundle,org.eclipse.core.filesystem,1.2.0.v20090507,"org.eclipse.core.filesystem",1243530475373
+started,bundle,org.eclipse.core.jobs,3.4.100.v20090429-1800,"org.eclipse.core.jobs",1243530475373
+started,bundle,org.eclipse.core.net,1.2.0.I20090514-0808,"org.eclipse.core.net",1243530475388
+started,bundle,org.eclipse.core.resources,3.5.0.v20090512,"org.eclipse.core.resources",1243530475451
+started,bundle,org.eclipse.core.runtime,3.5.0.v20090429-1800,"org.eclipse.core.runtime",1243530475467
+started,bundle,org.eclipse.core.runtime.compatibility,3.2.0.v20090413,"org.eclipse.core.runtime.compatibility",1243530475467
+started,bundle,org.eclipse.core.runtime.compatibility.auth,3.2.100.v20090413,"org.eclipse.core.runtime.compatibility.auth",1243530475482
+started,bundle,org.eclipse.debug.core,3.5.0.v20090513,"org.eclipse.debug.core",1243530475498
+started,bundle,org.eclipse.ecf,3.0.0.v20090513-0832,"org.eclipse.ecf",1243530475498
+started,bundle,org.eclipse.ecf.filetransfer,3.0.0.v20090513-0832,"org.eclipse.ecf.filetransfer",1243530475498
+started,bundle,org.eclipse.ecf.identity,3.0.0.v20090513-0832,"org.eclipse.ecf.identity",1243530475498
+started,bundle,org.eclipse.ecf.provider.filetransfer,3.0.0.v20090513-0832,"org.eclipse.ecf.provider.filetransfer",1243530475529
+started,bundle,org.eclipse.ecf.provider.filetransfer.httpclient,3.0.0.v20090513-0832,"org.eclipse.ecf.provider.filetransfer.httpclient",1243530475529
+started,bundle,org.eclipse.epp.usagedata.gathering,1.1.0.R200905190432,"org.eclipse.epp.usagedata.gathering",1243530475529
+started,bundle,org.eclipse.epp.usagedata.recording,1.1.0.R200905190432,"org.eclipse.epp.usagedata.recording",1243530475529
+started,bundle,org.eclipse.equinox.app,1.2.0.v20090513,"org.eclipse.equinox.app",1243530475529
+started,bundle,org.eclipse.equinox.common,3.5.0.v20090513,"org.eclipse.equinox.common",1243530475529
+started,bundle,org.eclipse.equinox.ds,1.1.0.v20090513,"org.eclipse.equinox.ds",1243530475529
+started,bundle,org.eclipse.equinox.p2.core,1.0.100.v20090513-1912,"org.eclipse.equinox.p2.core",1243530475529
+started,bundle,org.eclipse.equinox.p2.director,1.0.100.v20090513-1912,"org.eclipse.equinox.p2.director",1243530475529
+started,bundle,org.eclipse.equinox.p2.directorywatcher,1.0.100.v20090429-2126,"org.eclipse.equinox.p2.directorywatcher",1243530475545
+started,bundle,org.eclipse.equinox.p2.engine,1.0.100.v20090513-1912,"org.eclipse.equinox.p2.engine",1243530475545
+started,bundle,org.eclipse.equinox.p2.metadata.repository,1.0.100.v20090507-1950,"org.eclipse.equinox.p2.metadata.repository",1243530475545
+started,bundle,org.eclipse.equinox.p2.reconciler.dropins,1.0.100.v20090504-1937,"org.eclipse.equinox.p2.reconciler.dropins",1243530475545
+started,bundle,org.eclipse.equinox.p2.repository,1.0.0.v20090515,"org.eclipse.equinox.p2.repository",1243530475545
+started,bundle,org.eclipse.equinox.preferences,3.2.300.v20090513,"org.eclipse.equinox.preferences",1243530475545
+started,bundle,org.eclipse.equinox.registry,3.4.100.v20090429-1630,"org.eclipse.equinox.registry",1243530475545
+started,bundle,org.eclipse.equinox.security,1.0.100.v20090429-1630,"org.eclipse.equinox.security",1243530475576
+started,bundle,org.eclipse.equinox.util,1.0.100.v20090429-1630,"org.eclipse.equinox.util",1243530475592
+started,bundle,org.eclipse.help,3.4.0.v20090429_1800,"org.eclipse.help",1243530475592
+started,bundle,org.eclipse.jdt.core,3.5.0.v_959,"org.eclipse.jdt.core",1243530475592
+started,bundle,org.eclipse.jdt.core.manipulation,1.3.0.v20090513-2000,"org.eclipse.jdt.core.manipulation",1243530475592
+started,bundle,org.eclipse.jdt.junit,3.5.0.v20090513-2000,"org.eclipse.jdt.junit",1243530475623
+started,bundle,org.eclipse.jdt.launching,3.5.0.v20090504,"org.eclipse.jdt.launching",1243530475623
+started,bundle,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui",1243530475623
+started,bundle,org.eclipse.jface,3.5.0.I20090511-2000,"org.eclipse.jface",1243530475654
+started,bundle,org.eclipse.ltk.core.refactoring,3.5.0.v20090513-2000,"org.eclipse.ltk.core.refactoring",1243530475670
+started,bundle,org.eclipse.ltk.ui.refactoring,3.4.100.v20090513-2000,"org.eclipse.ltk.ui.refactoring",1243530475685
+started,bundle,org.eclipse.mylyn.context.core,3.2.0.I20090520-2300-e3x,"org.eclipse.mylyn.context.core",1243530475685
+started,bundle,org.eclipse.mylyn.context.ui,3.2.0.I20090520-2300-e3x,"org.eclipse.mylyn.context.ui",1243530475701
+started,bundle,org.eclipse.team.core,3.5.0.I20090514-0808,"org.eclipse.team.core",1243530475701
+started,bundle,org.eclipse.team.ui,3.5.0.I20090430-0408,"org.eclipse.team.ui",1243530475732
+started,bundle,org.eclipse.ui,3.5.0.I20090514-2000,"org.eclipse.ui",1243530475763
+started,bundle,org.eclipse.ui.editors,3.5.0.v20090513-2000,"org.eclipse.ui.editors",1243530475763
+started,bundle,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.ui.ide",1243530475763
+started,bundle,org.eclipse.ui.net,1.2.0.I20090430-0408,"org.eclipse.ui.net",1243530475763
+started,bundle,org.eclipse.ui.views,3.4.0.I20090505-2000,"org.eclipse.ui.views",1243530475763
+started,bundle,org.eclipse.ui.views.log,1.0.100.v20090429-1800,"org.eclipse.ui.views.log",1243530475763
+started,bundle,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"org.eclipse.ui.workbench",1243530475763
+started,bundle,org.eclipse.ui.workbench.texteditor,3.5.0.v20090513-2000,"org.eclipse.ui.workbench.texteditor",1243530475826
+started,bundle,org.eclipse.update.configurator,3.3.0.v20090312,"org.eclipse.update.configurator",1243530475826
+started,bundle,org.eclipse.pde.ui,3.5.0.v20090512,"org.eclipse.pde.ui",1243530475842
+os,sysinfo,,,"win32",1243530475842
+arch,sysinfo,,,"x86",1243530475842
+ws,sysinfo,,,"win32",1243530475842
+locale,sysinfo,,,"en_US",1243530475842
+processors,sysinfo,,,"4",1243530475842
+java.runtime.name,sysinfo,,,"Java(TM) SE Runtime Environment",1243530475842
+java.runtime.version,sysinfo,,,"1.6.0_13-b03",1243530475842
+java.specification.name,sysinfo,,,"Java Platform API Specification",1243530475842
+java.specification.vendor,sysinfo,,,"Sun Microsystems Inc.",1243530475842
+java.specification.version,sysinfo,,,"1.6",1243530475842
+java.vendor,sysinfo,,,"Sun Microsystems Inc.",1243530475842
+java.version,sysinfo,,,"1.6.0_13",1243530475842
+java.vm.info,sysinfo,,,"mixed mode",1243530475842
+java.vm.name,sysinfo,,,"Java HotSpot(TM) Client VM",1243530475842
+java.vm.specification.name,sysinfo,,,"Java Virtual Machine Specification",1243530475842
+java.vm.specification.vendor,sysinfo,,,"Sun Microsystems Inc.",1243530475842
+java.vm.specification.version,sysinfo,,,"1.0",1243530475842
+java.vm.vendor,sysinfo,,,"Sun Microsystems Inc.",1243530475842
+java.vm.version,sysinfo,,,"11.3-b02",1243530475842
+started,bundle,org.eclipse.equinox.frameworkadmin,1.0.100.v20090429-2126,"org.eclipse.equinox.frameworkadmin",1243530475889
+started,bundle,org.eclipse.equinox.frameworkadmin.equinox,1.0.100.v20090429-2126,"org.eclipse.equinox.frameworkadmin.equinox",1243530475904
+started,bundle,org.eclipse.equinox.simpleconfigurator.manipulator,1.0.100.v20090429-2126,"org.eclipse.equinox.simpleconfigurator.manipulator",1243530475935
+started,bundle,org.eclipse.equinox.p2.updatechecker,1.1.0.v20090429-2126,"org.eclipse.equinox.p2.updatechecker",1243530475982
+started,bundle,org.eclipse.jsch.core,1.1.100.I20090430-0408,"org.eclipse.jsch.core",1243530476029
+started,bundle,org.eclipse.team.cvs.core,3.3.200.I20090430-0408,"org.eclipse.team.cvs.core",1243530476045
+started,bundle,org.eclipse.equinox.p2.ui.sdk.scheduler,1.0.0.v20090511-1920,"org.eclipse.equinox.p2.ui.sdk.scheduler",1243530476076
+started,bundle,org.eclipse.ui.console,3.4.0.v20090513,"org.eclipse.ui.console",1243530476514
+started,bundle,org.eclipse.mylyn.commons.net,3.2.0.I20090520-2300-e3x,"org.eclipse.mylyn.commons.net",1243530476623
+started,bundle,org.eclipse.team.cvs.ui,3.3.200.I20090430-0408,"org.eclipse.team.cvs.ui",1243530476654
+started,bundle,org.eclipse.jdt.apt.core,3.3.200.v20090429-1720,"org.eclipse.jdt.apt.core",1243530476951
+started,bundle,org.eclipse.mylyn.commons.ui,3.2.0.I20090520-2300-e3x,"org.eclipse.mylyn.commons.ui",1243530476982
+started,bundle,org.eclipse.jdt.apt.pluggable.core,1.0.200.v20090429-1720,"org.eclipse.jdt.apt.pluggable.core",1243530476982
+started,bundle,org.eclipse.core.variables,3.2.200.v20090506,"org.eclipse.core.variables",1243530477186
+started,bundle,org.eclipse.mylyn.bugzilla.core,3.2.0.I20090520-2300-e3x,"org.eclipse.mylyn.bugzilla.core",1243530477311
+started,bundle,org.eclipse.mylyn.bugzilla.ui,3.2.0.I20090520-2300-e3x,"org.eclipse.mylyn.bugzilla.ui",1243530477436
+started,bundle,org.eclipse.ui.forms,3.4.0.v20090514,"org.eclipse.ui.forms",1243530477576
+started,bundle,org.eclipse.mylyn.tasks.ui,3.2.0.I20090520-2300-e3x,"org.eclipse.mylyn.tasks.ui",1243530477686
+started,bundle,org.eclipse.mylyn.team.ui,3.2.0.I20090520-2300-e3x,"org.eclipse.mylyn.team.ui",1243530477733
+started,bundle,org.eclipse.update.scheduler,3.2.200.v20081127,"org.eclipse.update.scheduler",1243530477764
+started,bundle,org.eclipse.mylyn.monitor.ui,3.2.0.I20090520-2300-e3x,"org.eclipse.mylyn.monitor.ui",1243530477873
+started,bundle,org.eclipse.update.core,3.2.300.v20090429-1625,"org.eclipse.update.core",1243530477936
+started,bundle,org.eclipse.wst.ws.service.policy.ui,1.0.102.v200903070248,"org.eclipse.wst.ws.service.policy.ui",1243530477983
+started,bundle,org.eclipse.wst.sse.core,1.1.400.v200905141750,"org.eclipse.wst.sse.core",1243530485750
+started,bundle,org.eclipse.wst.html.core,1.1.300.v200903120608,"org.eclipse.wst.html.core",1243530485875
+activated,view,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.ui.views.ProblemView",1243530544417
+opened,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243530544776
+activated,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243530545042
+started,bundle,org.eclipse.compare,3.5.0.I20090514-0808,"org.eclipse.compare",1243530545886
+opened,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243530549777
+activated,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243530550012
+executed,command,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.edit.text.java.open.editor",1243530550152
+started,bundle,org.sf.easyexplore,1.0.4,"org.sf.easyexplore",1243530552200
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243530552700
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243530579673
+deactivated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243530579767
+activated,workbench,org.eclipse.ui.workbench,3.5.0.I20090514-2000,"",1243530581439
+activated,view,org.eclipse.ui.views,3.4.0.I20090505-2000,"org.eclipse.ui.views.ContentOutline",1243530582674
+activated,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243530587394
+opened,view,org.eclipse.ui.views.log,1.0.100.v20090429-1800,"org.eclipse.pde.runtime.LogView",1243530591176
+activated,view,org.eclipse.ui.views.log,1.0.100.v20090429-1800,"org.eclipse.pde.runtime.LogView",1243530591191
+activated,editor,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.CompilationUnitEditor",1243530593223
+closed,view,org.eclipse.ui.views.log,1.0.100.v20090429-1800,"org.eclipse.pde.runtime.LogView",1243530593238
+activated,view,org.eclipse.ui.ide,3.5.0.I20090513-2000,"org.eclipse.ui.views.ProblemView",1243530594832
+activated,view,org.eclipse.jdt.ui,3.5.0.v20090514-2000,"org.eclipse.jdt.ui.PackageExplorer",1243530599036