tmf.core: add exception logging to event requests
authorMatthew Khouzam <matthew.khouzam@ericsson.com>
Thu, 3 Mar 2016 21:13:14 +0000 (16:13 -0500)
committerMatthew Khouzam <matthew.khouzam@ericsson.com>
Fri, 13 May 2016 18:00:19 +0000 (14:00 -0400)
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 <matthew.khouzam@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/67774
Reviewed-by: Hudson CI
Reviewed-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
Tested-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/request/TmfCoalescedEventRequestTest.java
tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/request/TmfEventRequestTest.java
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/component/TmfEventThread.java
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/request/TmfCoalescedEventRequest.java
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/request/ITmfEventRequest.java
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/request/TmfEventRequest.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/commands/ExportToTextJob.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/commands/ExportToTextRequest.java

index e2f8395c8b669afff017bcff09766db92403ed5e..93da77d6a283f65a27dc0bb01b91493cd8796d65 100644 (file)
@@ -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]);
index 622dd35ca29a122fa478afea3ee2c95315306c24..6abb807b07c185696ef09f5ceca3ad6273f25564 100644 (file)
@@ -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]);
index c6cf46b57de696ebe6fdf661cbc394a44d388014..445e57a5d323ee488e52057c427efdb5a244679f 100644 (file)
@@ -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
index 467e005df898ef29a02aabe00007f2c59d7f87b3..30dc657d999f5ce60bc2350bb72ac48e1919d223 100644 (file)
@@ -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
index 7932801e61492b6aedfd2b71b10c743065a83418..68d3be8797ebe672f4187270caae89906ca5d669 100644 (file)
@@ -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
index 2663ed3265781b44273e50ec2752de7f6a35867f..ac040823fac7fb346ecdaa94751300f9f01b885b 100644 (file)
@@ -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;
  * <p>
  * Typical usage:
  *
- * <pre><code>
+ * <pre>
+ * <code>
  * 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);
- * </code></pre>
+ * </code>
+ * </pre>
  *
  *
  * 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();
     }
 
index a0ccbe9ca403c9fe32b638316992f2c58c845a0f..bb19bb14707ef10b8a05950bf5fca5a7b76ca2ec 100644 (file)
@@ -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;
index ffe6edf8805d69933fedec851da257f08698df9a..b0ba87f1ac0b5bafc8356bb1df5c6a1c04e853e9 100644 (file)
@@ -34,7 +34,6 @@ public class ExportToTextRequest extends TmfEventRequest {
     private final Writer fWriter;
     private final ITmfFilter fFilter;
     private final List<TmfEventTableColumn> 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);
         }
     }
 
This page took 0.032016 seconds and 5 git commands to generate.