From: Matthew Khouzam Date: Thu, 3 Mar 2016 21:13:14 +0000 (-0500) Subject: tmf.core: add exception logging to event requests X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=f3309c7ed97a6a394fa9b1bbadcd45afdbf4829e;p=deliverable%2Ftracecompass.git tmf.core: add exception logging to event requests This is the first step towards being able to properly show errors that occur during a trace read. The TmfEventThread already logs all Exceptions, now the request will get the said exception. It can then be accessed by "Request#getFailCause()" and the results can either be handled accordingly or displayed. Change-Id: I99242dbf6eed25c4138239dd465c16fee62bb752 Signed-off-by: Matthew Khouzam Reviewed-on: https://git.eclipse.org/r/67774 Reviewed-by: Hudson CI Reviewed-by: Bernd Hufmann Tested-by: Bernd Hufmann --- diff --git a/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/request/TmfCoalescedEventRequestTest.java b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/request/TmfCoalescedEventRequestTest.java index e2f8395c8b..93da77d6a2 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/request/TmfCoalescedEventRequestTest.java +++ b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/request/TmfCoalescedEventRequestTest.java @@ -15,12 +15,14 @@ package org.eclipse.tracecompass.tmf.core.tests.request; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; +import java.util.IllformedLocaleException; import java.util.Vector; import org.eclipse.core.runtime.FileLocator; @@ -287,11 +289,14 @@ public class TmfCoalescedEventRequestTest { request.addRequest(subRequest1); request.addRequest(subRequest2); - request.fail(); + request.fail(new IllformedLocaleException("Hi")); // Validate the coalescing request assertTrue("isCompleted", request.isCompleted()); assertTrue("isFailed", request.isFailed()); + final Throwable failCause = request.getFailureCause(); + assertNotNull("Cause of failure", failCause); + assertEquals("Cause of failure message", "Hi", failCause.getMessage()); assertFalse("isCancelled", request.isCancelled()); assertTrue("handleCompleted", crFlags[0]); diff --git a/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/request/TmfEventRequestTest.java b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/request/TmfEventRequestTest.java index 622dd35ca2..6abb807b07 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/request/TmfEventRequestTest.java +++ b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/request/TmfEventRequestTest.java @@ -15,6 +15,7 @@ package org.eclipse.tracecompass.tmf.core.tests.request; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; @@ -267,11 +268,14 @@ public class TmfEventRequestTest { public void testFail() { final boolean[] flags = new boolean[4]; TmfEventRequest request = setupTestRequest(flags); - request.fail(); + request.fail(new IllegalArgumentException("Bad argument")); + final Throwable failCause = request.getFailureCause(); assertTrue("isCompleted", request.isCompleted()); assertTrue("isFailed", request.isFailed()); assertFalse("isCancelled", request.isCancelled()); + assertNotNull("Cause of failure", failCause); + assertEquals("Cause of failure message", "Bad argument", failCause.getMessage()); assertTrue("handleCompleted", flags[0]); assertFalse("handleSuccess", flags[1]); diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/component/TmfEventThread.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/component/TmfEventThread.java index c6cf46b57d..445e57a5d3 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/component/TmfEventThread.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/component/TmfEventThread.java @@ -214,7 +214,7 @@ public class TmfEventThread implements Runnable { } catch (Exception e) { Activator.logError("Error in " + fProvider.getName() + " handling " + fRequest, e); //$NON-NLS-1$ //$NON-NLS-2$ isCompleted = true; - fRequest.fail(); + fRequest.fail(e); } // Cleanup diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/request/TmfCoalescedEventRequest.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/request/TmfCoalescedEventRequest.java index 467e005df8..30dc657d99 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/request/TmfCoalescedEventRequest.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/request/TmfCoalescedEventRequest.java @@ -264,11 +264,11 @@ public class TmfCoalescedEventRequest extends TmfEventRequest { } @Override - public void fail() { + public void fail(Exception e) { for (ITmfEventRequest request : fRequests) { - request.fail(); + request.fail(e); } - super.fail(); + super.fail(e); } @Override diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/request/ITmfEventRequest.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/request/ITmfEventRequest.java index 7932801e61..68d3be8797 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/request/ITmfEventRequest.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/request/ITmfEventRequest.java @@ -14,6 +14,7 @@ package org.eclipse.tracecompass.tmf.core.request; import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; import org.eclipse.tracecompass.tmf.core.filter.ITmfFilter; import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange; @@ -137,6 +138,12 @@ public interface ITmfEventRequest { */ boolean isCancelled(); + /** + * @return get the cause of failure, or null if not applicable + * @since 2.0 + */ + @Nullable Throwable getFailureCause(); + // ------------------------------------------------------------------------ // Data handling // ------------------------------------------------------------------------ @@ -203,8 +210,12 @@ public interface ITmfEventRequest { /** * Put the request in the failed completed state + * + * @param e + * the exception causing the failure, can be null + * @since 2.0 */ - void fail(); + void fail(Exception e); /** * Put the request in the cancelled completed state diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/request/TmfEventRequest.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/request/TmfEventRequest.java index 2663ed3265..ac040823fa 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/request/TmfEventRequest.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/request/TmfEventRequest.java @@ -15,6 +15,7 @@ package org.eclipse.tracecompass.tmf.core.request; import java.util.concurrent.CountDownLatch; +import org.eclipse.jdt.annotation.Nullable; import org.eclipse.tracecompass.internal.tmf.core.TmfCoreTracer; import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; import org.eclipse.tracecompass.tmf.core.filter.ITmfFilter; @@ -32,7 +33,8 @@ import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange; *

* Typical usage: * - *


+ * 
+ * 
  * TmfEventRequest request = new TmfEventRequest(DataType.class, range, startIndex, nbEvents, priority) {
  *
  *     public void handleData(ITmfEvent event) {
@@ -54,7 +56,8 @@ import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
  * };
  *
  * eventProvider.sendRequest(request);
- * 
+ *
+ *
* * * TODO: Implement request failures (codes, etc...) @@ -103,6 +106,8 @@ public abstract class TmfEventRequest implements ITmfEventRequest { private int fDependencyLevel; + private @Nullable Throwable fFailureCause; + // ------------------------------------------------------------------------ // Constructors // ------------------------------------------------------------------------ @@ -296,6 +301,14 @@ public abstract class TmfEventRequest implements ITmfEventRequest { return fDependencyLevel; } + /** + * @since 2.0 + */ + @Override + public @Nullable Throwable getFailureCause() { + return fFailureCause; + } + // ------------------------------------------------------------------------ // Setters // ------------------------------------------------------------------------ @@ -419,11 +432,15 @@ public abstract class TmfEventRequest implements ITmfEventRequest { } } + /** + * @since 2.0 + */ @Override - public void fail() { + public void fail(Exception e) { synchronized (this) { fRequestFailed = true; } + fFailureCause = e; done(); } diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/commands/ExportToTextJob.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/commands/ExportToTextJob.java index a0ccbe9ca4..bb19bb1470 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/commands/ExportToTextJob.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/commands/ExportToTextJob.java @@ -121,7 +121,7 @@ public class ExportToTextJob extends Job { if (request.isFailed()) { Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, MessageFormat.format(Messages.ExportToTextJob_Unable_to_export_trace, destination), - request.getIOException()); + request.getFailureCause()); return status; } return Status.OK_STATUS; diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/commands/ExportToTextRequest.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/commands/ExportToTextRequest.java index ffe6edf880..b0ba87f1ac 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/commands/ExportToTextRequest.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/commands/ExportToTextRequest.java @@ -34,7 +34,6 @@ public class ExportToTextRequest extends TmfEventRequest { private final Writer fWriter; private final ITmfFilter fFilter; private final List fColumns; - private IOException fIOException; /** * Constructor @@ -52,14 +51,6 @@ public class ExportToTextRequest extends TmfEventRequest { this.fColumns = columns; } - /** - * Gets the IOException thrown by this export request, if any. - * @return the fIoException - */ - public IOException getIOException() { - return fIOException; - } - @Override public void handleData(final ITmfEvent event) { super.handleData(event); @@ -91,8 +82,7 @@ public class ExportToTextRequest extends TmfEventRequest { fWriter.write('\n'); } } catch (IOException ex) { - fIOException = ex; - fail(); + fail(ex); } }