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 &quot;visit&quot; 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