From e31e01e80839acbe43fc68438d5252daf2644752 Mon Sep 17 00:00:00 2001 From: Francois Chouinard Date: Wed, 24 Feb 2010 20:30:17 +0000 Subject: [PATCH] [Bug 303523] LTTng/TMF udpates: 1. Improved on TmfComponent - Augmented the interface and the base class - Introduced ITmfContext - Renamed TmfTransform to TmfProvider (interface and base class) - Generalized TmfProvider 2. Improvement on Tmftimestamp - Added ZERO constant 3. Improved on TmfExperiment - Added an experiment specific context - Fixed a number of issues with the generalized indexing 4. Improved TmfDataRequest - Made the base class more generic (i.e. event independant) - Added a TmfEventRequest as an extendion of TmfDataRequest 5. Improved on TmfTrace - Re-designed the trace specific context (removed timestamp) - Fixed a number of issues with the generalized indexing 6. Adapted the widgets and views to the updated interfaces 7. Adapted and augmented the unit tests 8. Adjusted LTTng classes and unit tests --- .../linuxtools/lttng/jni/JniEvent.java | 11 +- .../linuxtools/lttng/jni/JniMarker.java | 9 - .../linuxtools/lttng/jni/JniMarkerField.java | 7 - .../linuxtools/lttng/jni/JniTracefile.java | 1 - .../build.properties | 1 - .../tests/event/LttngEventContentTest.java | 19 +- .../tests/event/LttngEventFieldTest.java | 7 +- .../tests/event/LttngEventReferenceTest.java | 2 +- .../lttng/tests/event/LttngEventTest.java | 4 +- .../lttng/tests/event/LttngEventTypeTest.java | 2 +- .../lttng/tests/event/LttngTimestampTest.java | 2 +- .../lttng/tests/state/TestStateManager.java | 5 +- .../lttng/tests/trace/LTTngTextTraceTest.java | 38 +- .../trange/TimeRangeResourceFactory.java | 30 +- .../lttng/ui/views/events/EventsView.java | 19 +- .../lttng/ui/views/project/ProjectView.java | 16 +- .../project/dialogs/ImportTraceWizard.java | 3 +- .../project/dialogs/NewExperimentDialog.java | 7 +- .../ui/views/timeframe/TimeFrameView.java | 16 +- .../lttng/stubs/LTTngEventParserStub.java | 6 +- .../lttng/stubs/LTTngTraceStub.java | 19 +- .../linuxtools/lttng/event/LttngEvent.java | 13 +- .../lttng/event/LttngEventContent.java | 15 +- .../lttng/state/StateDataRequest.java | 16 +- .../linuxtools/lttng/state/StateManager.java | 22 +- .../lttng/state/StateStacksHandler.java | 7 +- .../state/StateUpdateHandlers.java | 19 +- .../experiment/StateExperimentManager.java | 14 +- .../state/experiment/StateManagerFactory.java | 4 +- .../lttng/state/model/LttngTrapState.java | 12 +- .../lttng/trace/LTTngTextTrace.java | 237 +----- .../linuxtools/lttng/trace/LTTngTrace.java | 39 +- .../META-INF/MANIFEST.MF | 2 +- .../component/TmfProviderManagerTest.java | 277 ++++--- .../tmf/tests/request/AllTests.java | 1 + .../tmf/tests/request/TmfDataRequestTest.java | 67 +- .../tests/request/TmfEventRequestTest.java | 278 +------ .../linuxtools/tmf/tests/trace/AllTests.java | 4 +- .../tmf/tests/trace/TmfExperimentTest.java | 104 ++- .../tmf/tests/trace/TmfTraceTest.java | 120 +-- .../tmf/component/TmfProviderStub.java | 70 ++ .../tmf/request/TmfRequestHandlerStub.java | 94 --- .../tmf/trace/TmfEventParserStub.java | 19 +- .../linuxtools/tmf/trace/TmfTraceStub.java | 53 +- .../widgets/TmfTimeStatesCtrl.java | 1 - .../tmf/ui/views/TmfEventsView.java | 136 ++-- .../linuxtools/tmf/ui/views/TmfView.java | 47 +- .../META-INF/MANIFEST.MF | 2 + .../eclipse/linuxtools/tmf/TmfCorePlugin.java | 12 +- .../tmf/component/ITmfComponent.java | 24 +- .../{TmfTransform.java => ITmfContext.java} | 9 +- .../tmf/component/ITmfTransform.java | 26 - .../tmf/component/TmfComponent.java | 35 +- .../linuxtools/tmf/component/TmfProvider.java | 170 +++++ .../tmf/component/TmfProviderManager.java | 48 +- .../linuxtools/tmf/event/TmfTimestamp.java | 1 + .../tmf/experiment/TmfExperiment.java | 689 ++++++++---------- .../experiment/TmfExperimentCheckpoint.java | 28 +- .../tmf/experiment/TmfExperimentContext.java | 103 +-- .../TmfExperimentSelectedSignal.java | 9 +- .../TmfExperimentUpdatedSignal.java | 10 +- .../tmf/parser/ITmfEventParser.java | 4 +- .../tmf/request/ITmfRequestHandler.java | 11 +- .../tmf/request/TmfDataRequest.java | 159 ++-- .../tmf/request/TmfEventRequest.java | 35 +- .../tmf/signal/TmfSignalManager.java | 15 +- .../linuxtools/tmf/trace/ITmfEventParser.java | 31 - .../linuxtools/tmf/trace/ITmfTrace.java | 8 + .../linuxtools/tmf/trace/TmfExperiment.java | 623 ---------------- .../linuxtools/tmf/trace/TmfTrace.java | 399 +++++----- .../tmf/trace/TmfTraceCheckpoint.java | 18 +- .../linuxtools/tmf/trace/TmfTraceContext.java | 105 +-- 72 files changed, 1720 insertions(+), 2749 deletions(-) create mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfProviderStub.java delete mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/request/TmfRequestHandlerStub.java rename org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/{TmfTransform.java => ITmfContext.java} (75%) delete mode 100644 org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/ITmfTransform.java create mode 100644 org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfProvider.java rename org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/{trace => experiment}/TmfExperimentSelectedSignal.java (79%) rename org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/{trace => experiment}/TmfExperimentUpdatedSignal.java (74%) delete mode 100644 org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfEventParser.java delete mode 100644 org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfExperiment.java diff --git a/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniEvent.java b/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniEvent.java index d5699cffed..70020ada35 100644 --- a/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniEvent.java +++ b/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniEvent.java @@ -63,24 +63,16 @@ public abstract class JniEvent extends Jni_C_Common implements Comparable diff --git a/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniMarker.java b/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniMarker.java index 8c9f3b2f42..d9785e20b4 100644 --- a/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniMarker.java +++ b/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniMarker.java @@ -51,22 +51,14 @@ public abstract class JniMarker extends Jni_C_Common // Native access method protected native String ltt_getName(long markerPtr); protected native String ltt_getFormatOverview(long markerPtr); - @SuppressWarnings("unused") protected native long ltt_getSize(long markerPtr); - @SuppressWarnings("unused") protected native short ltt_getLargestAlign(long markerPtr); - @SuppressWarnings("unused") protected native short ltt_getIntSize(long markerPtr); - @SuppressWarnings("unused") protected native short ltt_getLongSize(long markerPtr); - @SuppressWarnings("unused") protected native short ltt_getPointerSize(long markerPtr); - @SuppressWarnings("unused") protected native short ltt_getSize_tSize(long markerPtr); protected native void ltt_getAllMarkerFields(long tracePtr); - @SuppressWarnings("unused") protected native short ltt_getAlignement(long markerPtr); - @SuppressWarnings("unused") protected native long ltt_getNextMarkerPtr(long markerPtr); // Debug native function, ask LTT to print marker structure @@ -81,7 +73,6 @@ public abstract class JniMarker extends Jni_C_Common /* * Default constructor is forbidden */ - @SuppressWarnings("unused") protected JniMarker() { } diff --git a/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniMarkerField.java b/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniMarkerField.java index ff31305a32..45608e2b2e 100644 --- a/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniMarkerField.java +++ b/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniMarkerField.java @@ -27,17 +27,11 @@ public abstract class JniMarkerField extends Jni_C_Common // Native access method protected native String ltt_getField(long markerFieldPtr); - @SuppressWarnings("unused") protected native int ltt_getType(long markerFieldPtr); - @SuppressWarnings("unused") protected native long ltt_getOffset(long markerFieldPtr); - @SuppressWarnings("unused") protected native long ltt_getSize(long markerFieldPtr); - @SuppressWarnings("unused") protected native long ltt_getAlignment(long markerFieldPtr); - @SuppressWarnings("unused") protected native long ltt_getAttributes(long markerFieldPtr); - @SuppressWarnings("unused") protected native int ltt_getStatic_offset(long markerFieldPtr); protected native String ltt_getFormat(long markerFieldPtr); @@ -53,7 +47,6 @@ public abstract class JniMarkerField extends Jni_C_Common /* * Default constructor is forbidden */ - @SuppressWarnings("unused") protected JniMarkerField() { } diff --git a/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniTracefile.java b/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniTracefile.java index d6f86daaa6..4f064921cc 100644 --- a/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniTracefile.java +++ b/org.eclipse.linuxtools.lttng.jni/src/org/eclipse/linuxtools/lttng/jni/JniTracefile.java @@ -123,7 +123,6 @@ public abstract class JniTracefile extends Jni_C_Common { /* * Default constructor is forbidden */ - @SuppressWarnings("unused") protected JniTracefile() { } diff --git a/org.eclipse.linuxtools.lttng.tests/build.properties b/org.eclipse.linuxtools.lttng.tests/build.properties index 341bdbfa2e..d9271d71bb 100644 --- a/org.eclipse.linuxtools.lttng.tests/build.properties +++ b/org.eclipse.linuxtools.lttng.tests/build.properties @@ -3,6 +3,5 @@ output.. = bin/ bin.includes = META-INF/,\ .,\ plugin.properties,\ - test2.xml,\ traceset/,\ test.xml diff --git a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventContentTest.java b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventContentTest.java index 1c4da03553..62185c3965 100644 --- a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventContentTest.java +++ b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventContentTest.java @@ -5,9 +5,14 @@ import java.net.URL; import java.util.HashMap; import junit.framework.TestCase; + import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; -import org.eclipse.linuxtools.lttng.event.*; +import org.eclipse.linuxtools.lttng.event.LttngEvent; +import org.eclipse.linuxtools.lttng.event.LttngEventContent; +import org.eclipse.linuxtools.lttng.event.LttngEventField; +import org.eclipse.linuxtools.lttng.event.LttngEventType; +import org.eclipse.linuxtools.lttng.event.LttngTimestamp; import org.eclipse.linuxtools.lttng.tests.LTTngCoreTestPlugin; import org.eclipse.linuxtools.lttng.trace.LTTngTextTrace; import org.eclipse.linuxtools.tmf.trace.TmfTraceContext; @@ -38,7 +43,7 @@ import org.eclipse.linuxtools.tmf.trace.TmfTraceContext; public class LttngEventContentTest extends TestCase { private final static String tracepath1="traceset/trace-15316events_nolost_newformat.txt"; - private final static boolean skipIndexing=true; +// private final static boolean skipIndexing=true; private final static String firstEventContentFirstField = "alignment:0"; private final static String firstEventContentFirstFieldName = "alignment"; @@ -80,7 +85,7 @@ public class LttngEventContentTest extends TestCase { try { testStream = null; LTTngTextTrace tmpStream = initializeEventStream(); - tmpEventContent = (LttngEventContent)tmpStream.getNextEvent( new TmfTraceContext(0L, new LttngTimestamp(0L), 0) ).getContent(); + tmpEventContent = (LttngEventContent)tmpStream.getNextEvent( new TmfTraceContext(0L, 0) ).getContent(); } catch (Exception e) { fail("ERROR : Failed to get content!"); @@ -142,7 +147,7 @@ public class LttngEventContentTest extends TestCase { // Require an event tmpStream = initializeEventStream(); - tmpContext = new TmfTraceContext(0L, new LttngTimestamp(0L), 0); + tmpContext = new TmfTraceContext(0L, 0); tmpEvent = (LttngEvent)tmpStream.getNextEvent(tmpContext); testContent = prepareToTest(); // getFieldS() @@ -168,7 +173,7 @@ public class LttngEventContentTest extends TestCase { //*** To test getFields with a fields number >0, we need to move to an event that have some more tmpStream = initializeEventStream(); - tmpContext = new TmfTraceContext(0L, new LttngTimestamp(0L), 0); + tmpContext = new TmfTraceContext(0L, 0); // Skip first events and seek to event pass metadata tmpContext= tmpStream.seekEvent(new LttngTimestamp(timestampAfterMetadata) ); // Skip first one @@ -205,7 +210,7 @@ public class LttngEventContentTest extends TestCase { // Require an event tmpStream = initializeEventStream(); - tmpContext = new TmfTraceContext(0L, new LttngTimestamp(0L), 0); + tmpContext = new TmfTraceContext(0L, 0); tmpEvent = (LttngEvent)tmpStream.getNextEvent(tmpContext); LttngEventContent tmpContent = prepareToTest(); @@ -234,7 +239,7 @@ public class LttngEventContentTest extends TestCase { // Require an event tmpStream = initializeEventStream(); - tmpContext = new TmfTraceContext(0L, new LttngTimestamp(0L), 0); + tmpContext = new TmfTraceContext(0L, 0); tmpEvent = (LttngEvent)tmpStream.getNextEvent(tmpContext); // Get the content testContent = tmpEvent.getContent(); diff --git a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventFieldTest.java b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventFieldTest.java index 5094955a79..324f212c0c 100644 --- a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventFieldTest.java +++ b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventFieldTest.java @@ -11,7 +11,6 @@ import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; import org.eclipse.linuxtools.lttng.event.LttngEventContent; import org.eclipse.linuxtools.lttng.event.LttngEventField; -import org.eclipse.linuxtools.lttng.event.LttngTimestamp; import org.eclipse.linuxtools.lttng.tests.LTTngCoreTestPlugin; import org.eclipse.linuxtools.lttng.trace.LTTngTextTrace; import org.eclipse.linuxtools.tmf.trace.TmfTraceContext; @@ -29,7 +28,7 @@ public class LttngEventFieldTest extends TestCase { private final static String tracepath1="traceset/trace-15316events_nolost_newformat.txt"; private final static boolean skipIndexing=true; - private final static String firstEventName = "alignment"; +// private final static String firstEventName = "alignment"; private final static String firstEventValue = "0"; private static LTTngTextTrace testStream = null; @@ -59,7 +58,7 @@ public class LttngEventFieldTest extends TestCase { // This trace should be valid try { LTTngTextTrace tmpStream = initializeEventStream(); - tmpField = (LttngEventField)tmpStream.getNextEvent( new TmfTraceContext(0, new LttngTimestamp(0L), 0) ).getContent().getField(0); + tmpField = (LttngEventField)tmpStream.getNextEvent( new TmfTraceContext(0L, 0) ).getContent().getField(0); } catch (Exception e) { fail("ERROR : Failed to get field!"); @@ -98,7 +97,7 @@ public class LttngEventFieldTest extends TestCase { // *** To "really" test the field, we will get a real field from LTTngTrace LTTngTextTrace tmpStream = initializeEventStream(); - LttngEventField testField = (LttngEventField)tmpStream.getNextEvent( new TmfTraceContext(0, new LttngTimestamp(0L), 0) ).getContent().getField(0); + LttngEventField testField = (LttngEventField)tmpStream.getNextEvent( new TmfTraceContext(0L, 0) ).getContent().getField(0); assertNotSame("getField is null!",null,testField); // *** FIXME *** diff --git a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventReferenceTest.java b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventReferenceTest.java index 303f970138..4e774697a5 100644 --- a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventReferenceTest.java +++ b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventReferenceTest.java @@ -59,7 +59,7 @@ public class LttngEventReferenceTest extends TestCase { // This trace should be valid try { LTTngTextTrace tmpStream = initializeEventStream(); - tmpEventRef = (LttngEventReference)tmpStream.getNextEvent(new TmfTraceContext(null, null, 0) ).getReference(); + tmpEventRef = (LttngEventReference)tmpStream.getNextEvent(new TmfTraceContext(null, 0) ).getReference(); } catch (Exception e) { fail("ERROR : Failed to get reference!"); diff --git a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventTest.java b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventTest.java index 71c668b317..ad40ec6b5f 100644 --- a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventTest.java +++ b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventTest.java @@ -48,7 +48,7 @@ public class LttngEventTest extends TestCase { private final static String eventChannel = "metadata"; private final static long eventCpu = 0; private final static String eventMarker = "core_marker_id"; - private final static String eventContent = "alignment:0 size_t:4 int:4 name:vm_map pointer:4 event_id:0 long:4 channel:vm_state "; +// private final static String eventContent = "alignment:0 size_t:4 int:4 name:vm_map pointer:4 event_id:0 long:4 channel:vm_state "; private final static String eventReference = eventChannel + "_" + eventCpu; @@ -78,7 +78,7 @@ public class LttngEventTest extends TestCase { try { LTTngTextTrace tmpStream = initializeEventStream(); - tmpEvent = (LttngEvent)tmpStream.getNextEvent(new TmfTraceContext(0, new LttngTimestamp(0L), 0) ); + tmpEvent = (LttngEvent)tmpStream.getNextEvent(new TmfTraceContext(0L, 0) ); } catch (Exception e) { System.out.println("ERROR : Could not open " + tracepath1); diff --git a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventTypeTest.java b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventTypeTest.java index b1ed838d91..cfe70f702e 100644 --- a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventTypeTest.java +++ b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngEventTypeTest.java @@ -59,7 +59,7 @@ public class LttngEventTypeTest extends TestCase { // This trace should be valid try { LTTngTextTrace tmpStream = initializeEventStream(); - tmpEventType = (LttngEventType)tmpStream.getNextEvent( new TmfTraceContext(null, null, 0) ).getType(); + tmpEventType = (LttngEventType)tmpStream.getNextEvent( new TmfTraceContext(null, 0) ).getType(); } catch (Exception e) { fail("ERROR : Failed to get reference!"); diff --git a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngTimestampTest.java b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngTimestampTest.java index b3849d3226..601c46e17b 100644 --- a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngTimestampTest.java +++ b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/event/LttngTimestampTest.java @@ -57,7 +57,7 @@ public class LttngTimestampTest extends TestCase { // This trace should be valid try { LTTngTextTrace tmpStream = initializeEventStream(); - tmpTime = (LttngTimestamp)tmpStream.getNextEvent( new TmfTraceContext(null, null, 0) ).getTimestamp(); + tmpTime = (LttngTimestamp)tmpStream.getNextEvent( new TmfTraceContext(null, 0) ).getTimestamp(); } catch (Exception e) { fail("ERROR : Failed to get reference!"); diff --git a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/state/TestStateManager.java b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/state/TestStateManager.java index a1cfc7c9fd..fe1fac453c 100644 --- a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/state/TestStateManager.java +++ b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/state/TestStateManager.java @@ -17,9 +17,10 @@ import java.util.Set; import junit.framework.TestCase; import org.eclipse.linuxtools.lttng.TraceDebug; +import org.eclipse.linuxtools.lttng.event.LttngEvent; import org.eclipse.linuxtools.lttng.state.StateManager; import org.eclipse.linuxtools.lttng.trace.LTTngTrace; -import org.eclipse.linuxtools.tmf.trace.TmfExperiment; +import org.eclipse.linuxtools.tmf.experiment.TmfExperiment; /** * @author alvaro @@ -40,7 +41,7 @@ public class TestStateManager extends TestCase { if (testStream != null) { LTTngTrace[] streamList = new LTTngTrace[1]; streamList[0] = testStream; - TmfExperiment newExp = new TmfExperiment(logName, streamList); + TmfExperiment newExp = new TmfExperiment(LttngEvent.class, logName, streamList); //Get the Test StateManager StateManager manager = StateManagerFactoryTestSupport.getManager(newExp.getExperimentId()); diff --git a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/trace/LTTngTextTraceTest.java b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/trace/LTTngTextTraceTest.java index bf7fba9302..7cbd686c05 100644 --- a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/trace/LTTngTextTraceTest.java +++ b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/trace/LTTngTextTraceTest.java @@ -113,7 +113,7 @@ public class LTTngTextTraceTest extends TestCase { TmfEvent tmpEvent = null; LTTngTextTrace testStream1 = prepareStreamToTest(); - TmfTraceContext tmpContext = new TmfTraceContext(null, null, 0); + TmfTraceContext tmpContext = new TmfTraceContext(null, 0); // We should be at the beginning of the trace, so we will just read the first event now tmpEvent = testStream1.getNextEvent(tmpContext ); assertNotSame("tmpEvent is null after first getNextEvent()",null,tmpEvent ); @@ -129,7 +129,7 @@ public class LTTngTextTraceTest extends TestCase { TmfEvent tmpEvent = null; LTTngTextTrace testStream1 = prepareStreamToTest(); - TmfTraceContext tmpContext = new TmfTraceContext(null, null, 0); + TmfTraceContext tmpContext = new TmfTraceContext(null, 0); // We should be at the beginning of the trace, so we will just parse the first event now tmpEvent = testStream1.parseEvent(tmpContext ); assertNotSame("tmpEvent is null after first parseEvent()",null,tmpEvent ); @@ -143,44 +143,44 @@ public class LTTngTextTraceTest extends TestCase { public void testSeekEventTimestamp() { TmfEvent tmpEvent = null; - TmfTraceContext tmpContext = new TmfTraceContext(null, null, 0); + TmfTraceContext tmpContext = new TmfTraceContext(null, 0); LTTngTextTrace testStream1 = prepareStreamToTest(); // We should be at the beginning of the trace, we will seek at a certain timestamp - tmpContext = testStream1.seekEvent(new TmfTimestamp(timestampToSeekTest1)); + tmpContext = testStream1.seekEvent(new TmfTimestamp(timestampToSeekTest1, (byte) -9, 0)); tmpEvent = testStream1.getNextEvent(tmpContext); assertNotSame("tmpContext is null after first seekEvent()",null,tmpContext ); - assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterSeekTest1,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() ); + assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterSeekTest1,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() ); assertNotSame("tmpEvent is null after first seekEvent()",null,tmpEvent ); assertTrue("tmpEvent has wrong reference after first seekEvent()", ((String)tmpEvent.getReference().getReference()).contains(seek1EventReference) ); // Seek to the last timestamp - tmpContext = testStream1.seekEvent(new TmfTimestamp(timestampToSeekLast)); + tmpContext = testStream1.seekEvent(new TmfTimestamp(timestampToSeekLast, (byte) -9, 0)); tmpEvent = testStream1.getNextEvent(tmpContext); assertNotSame("tmpContext is null after seekEvent() to last",null,tmpContext ); - assertEquals("tmpContext has wrong timestamp after seekEvent() to last",contextValueAfterSeekLast,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() ); + assertEquals("tmpContext has wrong timestamp after seekEvent() to last",contextValueAfterSeekLast,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() ); assertNotSame("tmpEvent is null after seekEvent() to last ",null,tmpEvent ); assertTrue("tmpEvent has wrong reference after seekEvent() to last",((String)tmpEvent.getReference().getReference()).contains(seekLastEventReference) ); // Seek to the first timestamp (startTime) - tmpContext = testStream1.seekEvent(new TmfTimestamp(firstEventTimestamp)); + tmpContext = testStream1.seekEvent(new TmfTimestamp(firstEventTimestamp, (byte) -9, 0)); tmpEvent = testStream1.getNextEvent(tmpContext); assertNotSame("tmpEvent is null after seekEvent() to start ",null,tmpEvent ); assertTrue("tmpEvent has wrong reference after seekEvent() to start",((String)tmpEvent.getReference().getReference()).contains(firstEventReference) ); assertNotSame("tmpContext is null after seekEvent() to first",null,tmpContext ); - assertEquals("tmpContext has wrong timestamp after seekEvent() to first",contextValueAfterFirstEvent,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() ); + assertEquals("tmpContext has wrong timestamp after seekEvent() to first",contextValueAfterFirstEvent,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() ); } public void testSeekEventIndex() { TmfEvent tmpEvent = null; - TmfTraceContext tmpContext = new TmfTraceContext(null, null, 0); + TmfTraceContext tmpContext = new TmfTraceContext(null, 0); LTTngTextTrace testStream1 = prepareStreamToTest(); // We should be at the beginning of the trace, we will seek at a certain timestamp tmpContext = testStream1.seekEvent(indexToSeekTest1); tmpEvent = testStream1.getNextEvent(tmpContext); assertNotSame("tmpContext is null after first seekEvent()",null,tmpContext ); - assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterSeekTest1,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() ); + assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterSeekTest1,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() ); assertNotSame("tmpEvent is null after first seekEvent()",null,tmpEvent ); assertTrue("tmpEvent has wrong reference after first seekEvent()", ((String)tmpEvent.getReference().getReference()).contains(seek1EventReference) ); @@ -188,7 +188,7 @@ public class LTTngTextTraceTest extends TestCase { tmpContext = testStream1.seekEvent(indexToSeekLast); tmpEvent = testStream1.getNextEvent(tmpContext); assertNotSame("tmpContext is null after first seekEvent()",null,tmpContext ); - assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterSeekLast,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() ); + assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterSeekLast,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() ); assertNotSame("tmpEvent is null after seekEvent() to last ",null,tmpEvent ); assertTrue("tmpEvent has wrong reference after seekEvent() to last",((String)tmpEvent.getReference().getReference()).contains(seekLastEventReference) ); @@ -196,21 +196,21 @@ public class LTTngTextTraceTest extends TestCase { tmpContext = testStream1.seekEvent(indexToSeekFirst); tmpEvent = testStream1.getNextEvent(tmpContext); assertNotSame("tmpContext is null after first seekEvent()",null,tmpContext ); - assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterFirstEvent,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() ); + assertEquals("tmpContext has wrong timestamp after first seekEvent()",contextValueAfterFirstEvent,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() ); assertNotSame("tmpEvent is null after seekEvent() to start ",null,tmpEvent ); assertTrue("tmpEvent has wrong reference after seekEvent() to start",((String)tmpEvent.getReference().getReference()).contains(firstEventReference) ); } public void testSeekLocation() { TmfEvent tmpEvent = null; - TmfTraceContext tmpContext = new TmfTraceContext(null, null, 0); + TmfTraceContext tmpContext = new TmfTraceContext(null, 0); LTTngTextTrace testStream1 = prepareStreamToTest(); // We should be at the beginning of the trace, we will seek at a certain timestamp tmpContext = testStream1.seekLocation(locationToSeekTest1); tmpEvent = testStream1.getNextEvent(tmpContext); assertNotSame("tmpContext is null after first seekLocation()",null,tmpContext ); - assertEquals("tmpContext has wrong timestamp after first seekLocation()",contextValueAfterSeekTest1,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() ); + assertEquals("tmpContext has wrong timestamp after first seekLocation()",contextValueAfterSeekTest1,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() ); assertNotSame("tmpEvent is null after first seekLocation()",null,tmpEvent ); assertTrue("tmpEvent has wrong reference after first seekLocation()", ((String)tmpEvent.getReference().getReference()).contains(seek1EventReference) ); @@ -218,7 +218,7 @@ public class LTTngTextTraceTest extends TestCase { tmpContext = testStream1.seekLocation(locationToSeekLast); tmpEvent = testStream1.getNextEvent(tmpContext); assertNotSame("tmpContext is null after first seekLocation()",null,tmpContext ); - assertEquals("tmpContext has wrong timestamp after first seekLocation()",contextValueAfterSeekLast,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() ); + assertEquals("tmpContext has wrong timestamp after first seekLocation()",contextValueAfterSeekLast,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() ); assertNotSame("tmpEvent is null after seekLocation() to last ",null,tmpEvent ); assertTrue("tmpEvent has wrong reference after seekLocation() to last",((String)tmpEvent.getReference().getReference()).contains(seekLastEventReference) ); @@ -226,7 +226,7 @@ public class LTTngTextTraceTest extends TestCase { tmpContext = testStream1.seekLocation(locationToSeekFirst); tmpEvent = testStream1.getNextEvent(tmpContext); assertNotSame("tmpContext is null after first seekLocation()",null,tmpContext ); - assertEquals("tmpContext has wrong timestamp after first seekLocation()",contextValueAfterFirstEvent,(long)((TmfTimestamp)tmpContext.getTimestamp()).getValue() ); + assertEquals("tmpContext has wrong timestamp after first seekLocation()",contextValueAfterFirstEvent,(long)((TmfTimestamp)tmpEvent.getTimestamp()).getValue() ); assertNotSame("tmpEvent is null after seekLocation() to start ",null,tmpEvent ); assertTrue("tmpEvent has wrong reference after seekLocation() to start",((String)tmpEvent.getReference().getReference()).contains(firstEventReference) ); } @@ -236,7 +236,7 @@ public class LTTngTextTraceTest extends TestCase { LTTngTextTrace testStream1 = prepareStreamToTest(); // Move to the first event to have something to play with - tmpEvent = testStream1.parseEvent( new TmfTraceContext(null, null, 0)); + tmpEvent = testStream1.parseEvent( new TmfTraceContext(null, 0)); // Test current event assertNotSame("tmpEvent is null after first event",null,tmpEvent ); @@ -252,7 +252,7 @@ public class LTTngTextTraceTest extends TestCase { LTTngTextTrace testStream1 = prepareStreamToTest(); // Move to the first event to have something to play with - testStream1.parseEvent( new TmfTraceContext(null, null, 0) ); + testStream1.parseEvent( new TmfTraceContext(null, 0) ); // Just make sure toString() does not return null or the java reference assertNotSame("toString returned null",null, testStream1.toString() ); diff --git a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/model/trange/TimeRangeResourceFactory.java b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/model/trange/TimeRangeResourceFactory.java index 6c95c518c4..94f2340f44 100644 --- a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/model/trange/TimeRangeResourceFactory.java +++ b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/model/trange/TimeRangeResourceFactory.java @@ -11,9 +11,11 @@ *******************************************************************************/ package org.eclipse.linuxtools.lttng.ui.model.trange; + import org.eclipse.linuxtools.lttng.state.StateStrings; import org.eclipse.linuxtools.lttng.state.model.LttngIRQState; import org.eclipse.linuxtools.lttng.state.model.LttngTraceState; +import org.eclipse.linuxtools.lttng.state.model.LttngTrapState; import org.eclipse.linuxtools.lttng.ui.model.trange.TimeRangeEventResource.ResourceTypes; /** @@ -130,17 +132,27 @@ public class TimeRangeResourceFactory { @Override public String getStateMode(LttngTraceState traceSt) { // Determine the trap state. - long trapState = traceSt.getTrap_states().get(getResourceId()) - .getRunning().longValue(); String trapStateMode = ""; - if (trapState == 0) { - trapStateMode = StateStrings.TrapMode.LTTV_TRAP_IDLE - .getInName(); - } else { - trapStateMode = StateStrings.TrapMode.LTTV_TRAP_BUSY - .getInName(); + LttngTrapState ts = traceSt.getTrap_states().get(getResourceId()); + + // *** Note : + // Ts might not have been created yet. + // This is because the state system will be updated next to this before hook + // It should be correct to create it here as Busy + // (traps are created with running++ so it wont be idle) + if ( ts != null ) { + Long trapState = ts.getRunning(); + + if (trapState == 0) { + trapStateMode = StateStrings.TrapMode.LTTV_TRAP_IDLE.getInName(); + } else { + trapStateMode = StateStrings.TrapMode.LTTV_TRAP_BUSY.getInName(); + } } - + else { + trapStateMode = StateStrings.TrapMode.LTTV_TRAP_BUSY.getInName(); + } + return trapStateMode; } }; diff --git a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/events/EventsView.java b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/events/EventsView.java index cfea3f645e..306adfe059 100644 --- a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/events/EventsView.java +++ b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/events/EventsView.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -30,9 +30,9 @@ public class EventsView extends TmfEventsView { public static final String ID = "org.eclipse.linuxtools.lttng.ui.views.events"; - // ======================================================================== + // ------------------------------------------------------------------------ // Table data - // ======================================================================== + // ------------------------------------------------------------------------ // Table column names private final String TIMESTAMP_COLUMN = "Timestamp"; @@ -62,18 +62,19 @@ public class EventsView extends TmfEventsView { }; private ColumnData[] columnData = new ColumnData[] { - new ColumnData(columnProperties[0], 100, SWT.LEFT), + new ColumnData(columnProperties[0], 125, SWT.LEFT), new ColumnData(columnProperties[1], 100, SWT.LEFT), - new ColumnData(columnProperties[2], 100, SWT.LEFT), - new ColumnData(columnProperties[3], 100, SWT.LEFT), + new ColumnData(columnProperties[2], 200, SWT.LEFT), + new ColumnData(columnProperties[3], 200, SWT.LEFT), new ColumnData(columnProperties[4], 100, SWT.LEFT) }; - // ======================================================================== + // ------------------------------------------------------------------------ // Constructor - // ======================================================================== + // ------------------------------------------------------------------------ public EventsView() { + super(1); } /** @@ -82,7 +83,7 @@ public class EventsView extends TmfEventsView { * FIXME: Add support for column selection */ @Override - protected void setColumnHeaders(Table table) { + protected void createColumnHeaders(Table table) { for (int i = 0; i < columnData.length; i++) { final TableColumn column = new TableColumn(table, columnData[i].alignment, i); column.setText(columnData[i].header); diff --git a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/project/ProjectView.java b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/project/ProjectView.java index e7ff2f8153..979ba0502c 100644 --- a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/project/ProjectView.java +++ b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/project/ProjectView.java @@ -24,12 +24,13 @@ import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.linuxtools.lttng.event.LttngEvent; import org.eclipse.linuxtools.lttng.trace.LTTngTrace; import org.eclipse.linuxtools.lttng.ui.views.project.model.LTTngExperimentEntry; import org.eclipse.linuxtools.lttng.ui.views.project.model.LTTngTraceEntry; +import org.eclipse.linuxtools.tmf.experiment.TmfExperiment; +import org.eclipse.linuxtools.tmf.experiment.TmfExperimentSelectedSignal; import org.eclipse.linuxtools.tmf.trace.ITmfTrace; -import org.eclipse.linuxtools.tmf.trace.TmfExperiment; -import org.eclipse.linuxtools.tmf.trace.TmfExperimentSelectedSignal; import org.eclipse.linuxtools.tmf.ui.views.TmfView; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; @@ -55,7 +56,7 @@ public class ProjectView extends TmfView { private final IWorkspace fWorkspace; private final IResourceChangeListener fResourceChangeListener; private TreeViewer fViewer; - private TmfExperiment fExperiment = null; + private TmfExperiment fExperiment = null; // private Object fSelection = null; // To perform updates on the UI thread @@ -148,7 +149,7 @@ public class ProjectView extends TmfView { private void selectExperiment(LTTngExperimentEntry experiment) { String expId = experiment.getName(); if (fExperiment != null) - fExperiment.dispose(); + fExperiment.deregister(); try { LTTngTraceEntry[] traceEntries = experiment.getTraces(); int nbTraces = traceEntries.length; @@ -159,8 +160,9 @@ public class ProjectView extends TmfView { ITmfTrace trace = new LTTngTrace(location, waitForCompletion); traces[i] = trace; } - fExperiment = new TmfExperiment(expId, traces, waitForCompletion); - broadcastSignal(new TmfExperimentSelectedSignal(this, fExperiment)); + fExperiment = new TmfExperiment(LttngEvent.class, expId, traces); + fExperiment.indexExperiment(waitForCompletion); + broadcast(new TmfExperimentSelectedSignal(this, fExperiment)); } catch (FileNotFoundException e) { // TODO: Why not tell the user? He would appreciate... // e.printStackTrace(); @@ -209,4 +211,4 @@ public class ProjectView extends TmfView { return "[ProjectView]"; } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/project/dialogs/ImportTraceWizard.java b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/project/dialogs/ImportTraceWizard.java index 2126212587..a5d89f0de8 100644 --- a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/project/dialogs/ImportTraceWizard.java +++ b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/project/dialogs/ImportTraceWizard.java @@ -63,7 +63,6 @@ public class ImportTraceWizard extends Wizard implements IImportWizard { /* (non-Javadoc) * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection) */ - @SuppressWarnings("unchecked") public void init(IWorkbench workbench, IStructuredSelection selection) { fWorkbench = workbench; fSelection = selection; @@ -86,4 +85,4 @@ public class ImportTraceWizard extends Wizard implements IImportWizard { return fMainPage.finish(); } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/project/dialogs/NewExperimentDialog.java b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/project/dialogs/NewExperimentDialog.java index 8bfee691f2..16f33a54d2 100644 --- a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/project/dialogs/NewExperimentDialog.java +++ b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/project/dialogs/NewExperimentDialog.java @@ -112,6 +112,11 @@ public class NewExperimentDialog extends SelectionStatusDialog { public String getValue() { return folderNameField.getText(); } + + public IResource getResource() { + // TODO Auto-generated method stub + return null; + } }); } @@ -326,4 +331,4 @@ public class NewExperimentDialog extends SelectionStatusDialog { super.okPressed(); } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/timeframe/TimeFrameView.java b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/timeframe/TimeFrameView.java index fb0a72ef23..8fb8679000 100644 --- a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/timeframe/TimeFrameView.java +++ b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/timeframe/TimeFrameView.java @@ -12,13 +12,14 @@ package org.eclipse.linuxtools.lttng.ui.views.timeframe; +import org.eclipse.linuxtools.lttng.event.LttngEvent; import org.eclipse.linuxtools.tmf.event.TmfTimeRange; import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.experiment.TmfExperiment; +import org.eclipse.linuxtools.tmf.experiment.TmfExperimentSelectedSignal; +import org.eclipse.linuxtools.tmf.experiment.TmfExperimentUpdatedSignal; import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler; import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal; -import org.eclipse.linuxtools.tmf.trace.TmfExperiment; -import org.eclipse.linuxtools.tmf.trace.TmfExperimentSelectedSignal; -import org.eclipse.linuxtools.tmf.trace.TmfExperimentUpdatedSignal; import org.eclipse.linuxtools.tmf.ui.views.TmfView; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; @@ -87,7 +88,7 @@ public class TimeFrameView extends TmfView { private Slider fSlider; // The current experiment - TmfExperiment fExperiment = null; + TmfExperiment fExperiment = null; /** * Constructor @@ -178,7 +179,7 @@ public class TimeFrameView extends TmfView { // Notify other views if (!fCurrentTime.equals(currentTime)) { fCurrentTime = currentTime; - broadcastSignal(new TmfTimeSynchSignal(this, currentTime)); + broadcast(new TmfTimeSynchSignal(this, currentTime)); } } @@ -251,14 +252,15 @@ public class TimeFrameView extends TmfView { // TMF Signal Handling // ======================================================================== - /** + @SuppressWarnings("unchecked") + /** * @param signal */ @TmfSignalHandler public void experimentSelected(TmfExperimentSelectedSignal signal) { // Update the trace reference - fExperiment = signal.getExperiment(); + fExperiment = (TmfExperiment) signal.getExperiment(); // Update the time frame fTraceTimeRange = fExperiment.getTimeRange(); diff --git a/org.eclipse.linuxtools.lttng.ui/stubs/org/eclipse/linuxtools/lttng/stubs/LTTngEventParserStub.java b/org.eclipse.linuxtools.lttng.ui/stubs/org/eclipse/linuxtools/lttng/stubs/LTTngEventParserStub.java index 6902bbdc12..480fd4b23b 100644 --- a/org.eclipse.linuxtools.lttng.ui/stubs/org/eclipse/linuxtools/lttng/stubs/LTTngEventParserStub.java +++ b/org.eclipse.linuxtools.lttng.ui/stubs/org/eclipse/linuxtools/lttng/stubs/LTTngEventParserStub.java @@ -7,7 +7,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Francois Chouinard (fchouinard@gmail.com) - Initial API and implementation + * Francois Chouinard - Initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.lttng.stubs; @@ -15,7 +15,7 @@ package org.eclipse.linuxtools.lttng.stubs; import java.io.IOException; import org.eclipse.linuxtools.tmf.event.TmfEvent; -import org.eclipse.linuxtools.tmf.trace.ITmfEventParser; +import org.eclipse.linuxtools.tmf.parser.ITmfEventParser; import org.eclipse.linuxtools.tmf.trace.ITmfTrace; import org.eclipse.linuxtools.tmf.trace.TmfTraceContext; @@ -136,4 +136,4 @@ public class LTTngEventParserStub implements ITmfEventParser { // return null; // } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.lttng.ui/stubs/org/eclipse/linuxtools/lttng/stubs/LTTngTraceStub.java b/org.eclipse.linuxtools.lttng.ui/stubs/org/eclipse/linuxtools/lttng/stubs/LTTngTraceStub.java index e9cf908507..ebe6b20184 100644 --- a/org.eclipse.linuxtools.lttng.ui/stubs/org/eclipse/linuxtools/lttng/stubs/LTTngTraceStub.java +++ b/org.eclipse.linuxtools.lttng.ui/stubs/org/eclipse/linuxtools/lttng/stubs/LTTngTraceStub.java @@ -16,8 +16,9 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; +import org.eclipse.linuxtools.lttng.event.LttngEvent; import org.eclipse.linuxtools.tmf.event.TmfEvent; -import org.eclipse.linuxtools.tmf.trace.ITmfEventParser; +import org.eclipse.linuxtools.tmf.parser.ITmfEventParser; import org.eclipse.linuxtools.tmf.trace.TmfTrace; import org.eclipse.linuxtools.tmf.trace.TmfTraceContext; @@ -26,7 +27,7 @@ import org.eclipse.linuxtools.tmf.trace.TmfTraceContext; *

* Dummy test trace. Use in conjunction with LTTngEventParserStub. */ -public class LTTngTraceStub extends TmfTrace { +public class LTTngTraceStub extends TmfTrace { // ======================================================================== // Attributes @@ -58,10 +59,10 @@ public class LTTngTraceStub extends TmfTrace { * @throws FileNotFoundException */ public LTTngTraceStub(String filename, int cacheSize) throws FileNotFoundException { - super(filename, cacheSize, false); + super(LttngEvent.class, filename, cacheSize); fTrace = new RandomAccessFile(filename, "r"); fParser = new LTTngEventParserStub(); - indexStream(); + indexTrace(true); } // ======================================================================== @@ -84,10 +85,10 @@ public class LTTngTraceStub extends TmfTrace { try { synchronized(fTrace) { fTrace.seek((location != null) ? (Long) location : 0); - context = new TmfTraceContext(getCurrentLocation(), null, 0); - TmfTraceContext context2 = new TmfTraceContext(getCurrentLocation(), null, 0); - TmfEvent event = parseEvent(context2); - context.setTimestamp(event.getTimestamp()); + context = new TmfTraceContext(getCurrentLocation(), 0); +// TmfTraceContext context2 = new TmfTraceContext(getCurrentLocation(), 0); +// TmfEvent event = parseEvent(context2); +// context.setTimestamp(event.getTimestamp()); } } catch (IOException e) { // TODO Auto-generated catch block @@ -149,4 +150,4 @@ public class LTTngTraceStub extends TmfTrace { // return null; // } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/event/LttngEvent.java b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/event/LttngEvent.java index 81a6f2f32b..0bba58db78 100644 --- a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/event/LttngEvent.java +++ b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/event/LttngEvent.java @@ -134,12 +134,13 @@ public class LttngEvent extends TmfEvent { // We don't want to send away events that are outdated as their informations could be invalid // If the timestamp between the event and the trace are not coherent we will not perform the conversion - if ( jniEventReference.getParentTracefile().getParentTrace().getCurrentEventTimestamp().getTime() == getTimestamp().getValue() ) { - tmpEvent = jniEventReference; - } - else { - System.out.println("convertEventTmfToJni() failed: Unsynced Timestamp > TMF:" + getTimestamp().getValue() + " <--> JNI:" + jniEventReference.getParentTracefile().getParentTrace().getCurrentEventTimestamp().getTime()); - } +// if ( jniEventReference.getParentTracefile().getParentTrace().getCurrentEventTimestamp().getTime() == getTimestamp().getValue() ) { +// tmpEvent = jniEventReference; +// } +// else { +// System.out.println("convertEventTmfToJni() failed: Unsynced Timestamp > TMF:" + getTimestamp().getValue() + " <--> JNI:" + jniEventReference.getParentTracefile().getParentTrace().getCurrentEventTimestamp().getTime()); +// } + tmpEvent = jniEventReference; return tmpEvent; } diff --git a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/event/LttngEventContent.java b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/event/LttngEventContent.java index 92ee00dc3c..96a1e1e5ce 100644 --- a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/event/LttngEventContent.java +++ b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/event/LttngEventContent.java @@ -14,6 +14,7 @@ package org.eclipse.linuxtools.lttng.event; import java.util.HashMap; +import org.eclipse.linuxtools.lttng.jni.JniEvent; import org.eclipse.linuxtools.tmf.event.TmfEventContent; /** @@ -161,7 +162,12 @@ public class LttngEventContent extends TmfEventContent { for ( int pos=0; pos { +public class StateDataRequest extends TmfEventRequest { + // ======================================================================== // Data // ======================================================================= @@ -36,6 +37,7 @@ public class StateDataRequest extends TmfDataRequest { private long numOfEvents = 0; private boolean broadcast = false; private boolean clearDataInd = false; + // ======================================================================== // Constructors // ======================================================================= @@ -50,7 +52,7 @@ public class StateDataRequest extends TmfDataRequest { int maxBlockSize, IStateDataRequestListener listener, StateManager manager) { - super(range, nbEvents, maxBlockSize); + super(LttngEvent.class, range, nbEvents, maxBlockSize); //super(0, nbEvents, maxBlockSize); this.manager = manager; if (listener != null && !listeners.contains(listener)) { @@ -87,7 +89,7 @@ public class StateDataRequest extends TmfDataRequest { * @param broadcast * true: All views, false: only to registered listeners */ - public void startRequestInd(TmfExperiment experiment, boolean broadcast, + public void startRequestInd(TmfExperiment experiment, boolean broadcast, boolean waitForCompletion) { if (broadcast) { // Notify all state views. @@ -185,4 +187,4 @@ public class StateDataRequest extends TmfDataRequest { public boolean isclearDataInd() { return clearDataInd; } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/StateManager.java b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/StateManager.java index bfa4bf25e8..c8334c3de2 100644 --- a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/StateManager.java +++ b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/StateManager.java @@ -20,6 +20,7 @@ import java.util.Set; import java.util.Vector; import org.eclipse.linuxtools.lttng.TraceDebug; +import org.eclipse.linuxtools.lttng.event.LttngEvent; import org.eclipse.linuxtools.lttng.event.LttngTimestamp; import org.eclipse.linuxtools.lttng.state.evProcessor.AbsEventProcessorFactory; import org.eclipse.linuxtools.lttng.state.evProcessor.EventProcessorProxy; @@ -30,8 +31,8 @@ import org.eclipse.linuxtools.lttng.state.model.StateModelFactory; import org.eclipse.linuxtools.tmf.event.TmfEvent; import org.eclipse.linuxtools.tmf.event.TmfTimeRange; import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.experiment.TmfExperiment; import org.eclipse.linuxtools.tmf.request.TmfDataRequest; -import org.eclipse.linuxtools.tmf.trace.TmfExperiment; import org.eclipse.linuxtools.tmf.trace.TmfTrace; import org.eclipse.linuxtools.tmf.trace.TmfTraceCheckpoint; @@ -51,8 +52,8 @@ public class StateManager extends Observable { // ======================================================================== // Data // ======================================================================= - private TmfExperiment fExperiment = null; - private TmfTrace fEventLog = null; + private TmfExperiment fExperiment = null; + private TmfTrace fEventLog = null; private StateStacksHandler stateIn = null; private Long eventCount = 0L; @@ -111,12 +112,13 @@ public class StateManager extends Observable { * @param experiment * @param clearPreviousData */ - public void setTraceSelection(TmfExperiment experiment, + @SuppressWarnings("unchecked") + public void setTraceSelection(TmfExperiment experiment, boolean clearPreviousData) { // New log in use, read all events and build state transition stack if (experiment != null) { if (fExperiment != null && fExperiment != experiment) { - this.fExperiment.dispose(); + this.fExperiment.deregister(); } this.fExperiment = experiment; @@ -125,7 +127,7 @@ public class StateManager extends Observable { // this.fEventLog.dispose(); // } - this.fEventLog = (TmfTrace)experiment.getTraces()[0]; + this.fEventLog = (TmfTrace) experiment.getTraces()[0]; try { stateIn.init(fEventLog); } catch (LttngStateException e) { @@ -216,7 +218,7 @@ public class StateManager extends Observable { * * @return */ - public TmfTrace getEventLog() { + public TmfTrace getEventLog() { return fEventLog; } @@ -427,7 +429,7 @@ public class StateManager extends Observable { // Create the new request and override the handlePartialResult function StateDataRequest request = new StateDataRequest(timeWindow, - DEFAULT_OFFSET, TmfDataRequest.ALL_EVENTS, DEFAULT_CHUNK, + DEFAULT_OFFSET, TmfDataRequest.ALL_DATA, DEFAULT_CHUNK, listener, this) { @Override public void handleData() { @@ -471,7 +473,7 @@ public class StateManager extends Observable { // Create the new request and override the handlePartialResult function StateDataRequest request = new StateDataRequest(timeWindow, - DEFAULT_OFFSET, TmfDataRequest.ALL_EVENTS, DEFAULT_CHUNK, + DEFAULT_OFFSET, TmfDataRequest.ALL_DATA, DEFAULT_CHUNK, requestListener, this) { @Override @@ -584,4 +586,4 @@ public class StateManager extends Observable { } } } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/StateStacksHandler.java b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/StateStacksHandler.java index 81ad12f298..ce64ab2b5d 100644 --- a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/StateStacksHandler.java +++ b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/StateStacksHandler.java @@ -66,6 +66,7 @@ public class StateStacksHandler { } +// static int nbEvents = 0; protected void processEvent(TmfEvent tmfEvent) /* throws LttngStateException */{ if (tmfEvent == null) { return; @@ -74,8 +75,11 @@ public class StateStacksHandler { if (!(tmfEvent instanceof LttngEvent)) { TraceDebug .debug("The event received is not an instance of LttngEvent and can not be processed"); + return; } +// System.out.println("Event: " + nbEvents++ + ", timestamp: " + tmfEvent.getTimestamp()); + LttngEvent trcEvent = (LttngEvent) tmfEvent; // LttngEventField[] fields = ((LttngEventContent)trcEvent.getContent()).getFields(); @@ -98,7 +102,6 @@ public class StateStacksHandler { // Notify the before Handlers Set handlerRegister = EventProcessorProxy .getInstance().getProcessingFactories(); - // Notify the state BEFORE update handlers for (Iterator iterator = handlerRegister .iterator(); iterator.hasNext();) { @@ -112,7 +115,7 @@ public class StateStacksHandler { } } - + // Notify the STATE UPDATE handlers // Only one state update expected for (Iterator iterator = handlerRegister diff --git a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/evProcessor/state/StateUpdateHandlers.java b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/evProcessor/state/StateUpdateHandlers.java index 48292b86b6..897005732e 100644 --- a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/evProcessor/state/StateUpdateHandlers.java +++ b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/evProcessor/state/StateUpdateHandlers.java @@ -165,11 +165,22 @@ class StateUpdateHandlers { LTTngCPUState cpust = traceSt.getCpu_states().get(cpu); cpu_push_mode(cpust, StateStrings.CpuMode.LTTV_CPU_TRAP); cpust.pushToTrapStack(trap); /* update trap status */ - + // update Trap State - LttngTrapState trap_state = traceSt.getTrap_states().get(trap); - trap_state.incrementRunning(); - + LttngTrapState trap_state = null; + trap_state = traceSt.getTrap_states().get(trap); + + // If the trape_state exists, just increment it's counter, + // otherwise, create it + if ( trap_state == null ) { + trap_state = new LttngTrapState(); + trap_state.incrementRunning(); + traceSt.getTrap_states().put(trap, trap_state); + } + else { + trap_state.incrementRunning(); + } + return false; } diff --git a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/experiment/StateExperimentManager.java b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/experiment/StateExperimentManager.java index 716e22449d..6c1866bc1b 100644 --- a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/experiment/StateExperimentManager.java +++ b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/experiment/StateExperimentManager.java @@ -14,13 +14,14 @@ package org.eclipse.linuxtools.lttng.state.experiment; import java.util.HashMap; import java.util.Map; +import org.eclipse.linuxtools.lttng.event.LttngEvent; import org.eclipse.linuxtools.lttng.state.IStateDataRequestListener; import org.eclipse.linuxtools.lttng.state.StateManager; import org.eclipse.linuxtools.tmf.component.TmfComponent; import org.eclipse.linuxtools.tmf.event.TmfTimeRange; +import org.eclipse.linuxtools.tmf.experiment.TmfExperiment; +import org.eclipse.linuxtools.tmf.experiment.TmfExperimentSelectedSignal; import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler; -import org.eclipse.linuxtools.tmf.trace.TmfExperiment; -import org.eclipse.linuxtools.tmf.trace.TmfExperimentSelectedSignal; /** * @author alvaro @@ -33,7 +34,7 @@ public class StateExperimentManager extends TmfComponent { // ======================================================================= private final Map managersByID = new HashMap(); - private TmfExperiment fExperiment = null; // one experiment supported + private TmfExperiment fExperiment = null; // one experiment supported // ======================================================================== // Constructors @@ -110,6 +111,7 @@ public class StateExperimentManager extends TmfComponent { * org.eclipse.linuxtools.tmf.eventlog.ITmfEventLogEventListener#handleEvent * (org.eclipse.linuxtools.tmf.eventlog.ITmfEventLogEvent) */ + @SuppressWarnings("unchecked") @TmfSignalHandler public void experimentSelected(TmfExperimentSelectedSignal signal) { // TmfExperiment experiment = signal.getExperiment(); @@ -118,7 +120,7 @@ public class StateExperimentManager extends TmfComponent { // // } if (signal != null) { - fExperiment = signal.getExperiment(); + fExperiment = (TmfExperiment) signal.getExperiment(); traceSelected(fExperiment); } } @@ -129,7 +131,7 @@ public class StateExperimentManager extends TmfComponent { * * @param experiment */ - private void traceSelected(TmfExperiment experiment) { + private void traceSelected(TmfExperiment experiment) { // TODO: Re-factor when multiple traces are supported // traceId, as well as when the request can be specified at the trace // level @@ -154,4 +156,4 @@ public class StateExperimentManager extends TmfComponent { return timeRangeResult; } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/experiment/StateManagerFactory.java b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/experiment/StateManagerFactory.java index b196ae4a7b..0d6a52d8df 100644 --- a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/experiment/StateManagerFactory.java +++ b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/experiment/StateManagerFactory.java @@ -98,9 +98,9 @@ public class StateManagerFactory { */ public static void dispose() { if (experimentManager != null) { - experimentManager.dispose(); + experimentManager.deregister(); experimentManager = null; instanceBook = null; } } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/model/LttngTrapState.java b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/model/LttngTrapState.java index d1c3394a36..c61ec5b8e8 100644 --- a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/model/LttngTrapState.java +++ b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/model/LttngTrapState.java @@ -23,11 +23,16 @@ public class LttngTrapState implements Cloneable { // Data // ======================================================================= private Long running; - + // ======================================================================== // Constructor // ======================================================================= + + public LttngTrapState() { + this.running = 0L; + } + public LttngTrapState(Long running) { this.running = running; } @@ -72,4 +77,9 @@ public class LttngTrapState implements Cloneable { running--; } } + + public String toString() { + return "running : " + running; + } + } \ No newline at end of file diff --git a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/trace/LTTngTextTrace.java b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/trace/LTTngTextTrace.java index 61612f81c6..e011f04e57 100644 --- a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/trace/LTTngTextTrace.java +++ b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/trace/LTTngTextTrace.java @@ -15,7 +15,6 @@ package org.eclipse.linuxtools.lttng.trace; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; -import java.util.Collections; import java.util.HashMap; import org.eclipse.linuxtools.lttng.event.LttngEvent; @@ -26,16 +25,15 @@ import org.eclipse.linuxtools.lttng.event.LttngEventSource; import org.eclipse.linuxtools.lttng.event.LttngEventType; import org.eclipse.linuxtools.lttng.event.LttngTimestamp; import org.eclipse.linuxtools.lttng.jni.JniEvent; -import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.component.ITmfContext; import org.eclipse.linuxtools.tmf.event.TmfTimeRange; -import org.eclipse.linuxtools.tmf.event.TmfTimestamp; -import org.eclipse.linuxtools.tmf.request.ITmfRequestHandler; +import org.eclipse.linuxtools.tmf.request.TmfDataRequest; import org.eclipse.linuxtools.tmf.trace.ITmfTrace; import org.eclipse.linuxtools.tmf.trace.TmfTrace; import org.eclipse.linuxtools.tmf.trace.TmfTraceCheckpoint; import org.eclipse.linuxtools.tmf.trace.TmfTraceContext; -public class LTTngTextTrace extends TmfTrace implements ITmfTrace, ITmfRequestHandler { +public class LTTngTextTrace extends TmfTrace implements ITmfTrace { private LttngTimestamp eventTimestamp = null; private LttngEventSource eventSource = null; private LttngEventType eventType = null; @@ -53,14 +51,14 @@ public class LTTngTextTrace extends TmfTrace implements ITmfTrace, ITmfRequestHa private int cpuNumber = -1; - private boolean showDebug = false; + private boolean showDebug = true; public LTTngTextTrace(String path) throws Exception { this(path, false); } public LTTngTextTrace(String path, boolean skipIndexing) throws Exception { - super(path, 1, true); + super(LttngEvent.class, path, 1); tracepath = path; traceTypes = new HashMap(); @@ -85,13 +83,13 @@ public class LTTngTextTrace extends TmfTrace implements ITmfTrace, ITmfRequestHa fCheckpoints.add(new TmfTraceCheckpoint(new LttngTimestamp(0L), 0L)); } else { - indexStream(); + indexTrace(true); } Long endTime = currentLttngEvent.getTimestamp().getValue(); positionToFirstEvent(); - getNextEvent(new TmfTraceContext(null, null, 0)); + getNextEvent(new TmfTraceContext(null, 0)); Long starTime = currentLttngEvent.getTimestamp().getValue(); positionToFirstEvent(); @@ -103,59 +101,10 @@ public class LTTngTextTrace extends TmfTrace implements ITmfTrace, ITmfRequestHa private LTTngTextTrace(LTTngTrace oldStream) throws Exception { - super(null); + super(LttngEvent.class, null); throw new Exception("Copy constructor should never be use with a LTTngTrace!"); } - @Override - public void indexStream() { - // Position the trace at the beginning - TmfTraceContext context = seekLocation(null); - - long nbEvents=1L; - fCheckpoints.add(new TmfTraceCheckpoint(new LttngTimestamp(0L), 0L)); - - LttngTimestamp startTime = null; - LttngTimestamp lastTime = new LttngTimestamp(); - LttngTimestamp timestamp = null; - Long previousCharRead = 0L; - - TextLttngEvent tmpEvent = (TextLttngEvent)getNextEvent(context); - - while ( tmpEvent != null) { - timestamp = (LttngTimestamp)context.getTimestamp(); - previousCharRead = nbCharRead; - - if ( startTime == null ) { - startTime = new LttngTimestamp(timestamp.getValue()); - } - - if ((++nbEvents % fCacheSize) == 0) { - fCheckpoints.add(new TmfTraceCheckpoint(new LttngTimestamp(timestamp.getValue()), previousCharRead)); - } - - tmpEvent = (TextLttngEvent)getNextEvent(context); - } - - if (timestamp != null) { - lastTime.setValue(timestamp.getValue()); - - setTimeRange( new TmfTimeRange(startTime, lastTime) ); - notifyListeners(getTimeRange()); - } - - fNbEvents = nbEvents; - - if ( showDebug == true ) { - for ( int pos=0; pos < fCheckpoints.size(); pos++) { - System.out.print(pos + ": " + "\t"); - System.out.print( fCheckpoints.get(pos).getTimestamp() + "\t" ); - System.out.println( fCheckpoints.get(pos).getLocation() ); - } - } - - } - private boolean positionToFirstEvent() { boolean isSuccessful = true; @@ -185,6 +134,10 @@ public class LTTngTextTrace extends TmfTrace implements ITmfTrace, ITmfRequestHa private void skipToPosition(Long skipPosition) { try { + if ( skipPosition < 0 ) { + skipPosition = 0L; + } + if ( showDebug == true ) { System.out.println("skipToPosition(Long skipPosition)"); System.out.println("\tSkipping to : " + skipPosition); @@ -201,133 +154,21 @@ public class LTTngTextTrace extends TmfTrace implements ITmfTrace, ITmfRequestHa } public TmfTraceContext seekLocation(Object location) { + if (location == null) { location = 0L; } - - TmfTraceContext tmpTraceContext = new TmfTraceContext(nbCharRead, (LttngTimestamp)currentLttngEvent.getTimestamp(), 0L); - Long previousCharRead = nbCharRead; - Long previousTimestamp = currentLttngEvent.getTimestamp().getValue(); - Long tmploc = (Long)location; - - if ( showDebug == true ) { - System.out.println("seekLocation(Object location)"); - System.out.println("\ttimestamp: " + (LttngTimestamp)currentLttngEvent.getTimestamp()); - System.out.println("\tnbCharRead:" + nbCharRead); - System.out.println("\tlocation: " + location); - System.out.println(); - } - - if ( tmploc < nbCharRead ) { - skipToPosition(tmploc); - } - - if ( tmploc > nbCharRead ) { - while ( tmploc > nbCharRead ) { - previousCharRead = nbCharRead; - previousTimestamp = currentLttngEvent.getTimestamp().getValue(); - getNextEvent(tmpTraceContext); - } - } - - tmpTraceContext.setTimestamp(new LttngTimestamp(previousTimestamp)); - tmpTraceContext.setLocation(previousCharRead); - - return tmpTraceContext; - } - - - @Override - public TmfTraceContext seekEvent(TmfTimestamp timestamp) { - if (timestamp == null) { - timestamp = getStartTime(); + if (!((Long) location).equals(nbCharRead)) { + skipToPosition((Long) location); } - - int index = Collections.binarySearch(fCheckpoints, new TmfTraceCheckpoint(timestamp, 0)); - - if (index < 0) { - index = 0; - } - - Object location = (index < fCheckpoints.size()) ? fCheckpoints.elementAt(index).getLocation() : null; - - if ( showDebug == true ) { - System.out.println("seekEvent(TmfTimestamp timestamp)"); - System.out.println("\ttimestamp: " + timestamp.getValue()); - System.out.println("\tindex: " + index); - System.out.println("\tlocation: " + location); - System.out.println(); - } - - // *** HACK *** - // We only know the timestamp AFTER we read the actual event - // For this reason, we save the current "position" in byte (nbCharRead) and we seek back 1 event after we find our event - TmfTraceContext currentEventContext = seekLocation(location); - - Long previousCharRead = nbCharRead; - Long previousTimestamp = currentLttngEvent.getTimestamp().getValue(); - TmfEvent event = getNextEvent(currentEventContext); - - while ( (event != null) && (event.getTimestamp().getValue() < timestamp.getValue()) ) { - previousCharRead = nbCharRead; - previousTimestamp = currentLttngEvent.getTimestamp().getValue(); - event = getNextEvent(currentEventContext); - } - - if ( event != null ) { - skipToPosition(previousCharRead); - currentEventContext.setLocation(previousCharRead); - currentEventContext.setTimestamp(new LttngTimestamp(previousTimestamp)); - } - - return currentEventContext; - } - - @Override - public TmfTraceContext seekEvent(long position) { + + TmfTraceContext tmpTraceContext = new TmfTraceContext(location, 0L); - int checkPointPos = ((int)position / fCacheSize); - - Object location; - location = ( checkPointPos < fCheckpoints.size()) ? fCheckpoints.elementAt(checkPointPos).getLocation() : null; - - long index = ((position / fCacheSize)*fCacheSize)-1; - - if ( index < 0) { - index = 0; - } - - if ( showDebug == true ) { - System.out.println("seekEvent(long position)"); - System.out.println("\tposition: " + position); - System.out.println("\tindex: " + index); - System.out.println("\tlocation: " + location); - System.out.println(); - } - TmfTraceContext currentEventContext = seekLocation(location); - Long previousCharRead = (Long)currentEventContext.getLocation(); - Long previousTimestamp = currentEventContext.getTimestamp().getValue(); - - TmfEvent event = null; - while (index < position) { - event = getNextEvent(currentEventContext); - previousCharRead = nbCharRead; - previousTimestamp = currentLttngEvent.getTimestamp().getValue(); - index++; - } - - if ( event != null ) { - skipToPosition(previousCharRead); - currentEventContext.setLocation(previousCharRead); - currentEventContext.setTimestamp(new LttngTimestamp(previousTimestamp)); - } - - return currentEventContext; + return tmpTraceContext; } - @Override - public TmfEvent getNextEvent(TmfTraceContext context) { + private LttngEvent parseMyNextEvent(TmfTraceContext context) { // All parsing variables declared here so to be able to print them into the catch if needed String tmpContent = null; @@ -372,14 +213,14 @@ public class LTTngTextTrace extends TmfTrace implements ITmfTrace, ITmfRequestHa // *** HACK *** // Evil exit case here : the two last line of the text dump does not contain "." - // We should check in a better way (string comparaison and such) but it make the whole process to weight a lot more + // We should check in a better way (string comparison and such) but it make the whole process to weight a lot more // Conclusion : this is ugly but fast. if ( tmpCurIndex < 0 ) { if ( showDebug == true ) { System.out.println("END OF FILE."); System.out.println(); } - return returnedEvent; + return null; } tracefile = tmpContent.substring(tmpPrevIndex, tmpCurIndex ).trim(); @@ -530,9 +371,6 @@ public class LTTngTextTrace extends TmfTrace implements ITmfTrace, ITmfRequestHa currentLttngEvent.setContent(eventContent); currentLttngEvent.setType(traceTypes.get(tmpTypeKey)); - context.setTimestamp(eventTimestamp); - context.setLocation(nbCharRead); - returnedEvent = currentLttngEvent; } else if ( showDebug == true ) { @@ -560,32 +398,23 @@ public class LTTngTextTrace extends TmfTrace implements ITmfTrace, ITmfRequestHa return nbCharRead; } - @Override + @Override public LttngEvent parseEvent(TmfTraceContext context) { - Long location = null; - LttngEvent returnedEvent = null; + seekLocation(context.getLocation()); + return parseMyNextEvent(context); - if ( (currentLttngEvent!= null) && (! currentLttngEvent.getTimestamp().equals(context.getTimestamp()) ) ) { - seekEvent(context.getTimestamp()); - getNextEvent(context); - } - - if ( currentLttngEvent != null ) { - returnedEvent = currentLttngEvent; - } - - location = (Long)getCurrentLocation(); - - context.setLocation(location); - context.setTimestamp(currentLttngEvent.getTimestamp()); - context.incrIndex(); - - return returnedEvent; } - public int getCpuNumber() { + public int getCpuNumber() { return cpuNumber; } + + @Override + public ITmfContext setContext(TmfDataRequest request) { + // TODO Auto-generated method stub + return null; + } + } @@ -665,4 +494,4 @@ class TextLttngEventContent extends LttngEventContent { return returnedField; } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/trace/LTTngTrace.java b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/trace/LTTngTrace.java index e92be4f865..61b4e1d707 100644 --- a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/trace/LTTngTrace.java +++ b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/trace/LTTngTrace.java @@ -49,7 +49,7 @@ class LTTngTraceException extends LttngException { * LTTng trace implementation. It accesses the C trace handling library * (seeking, reading and parsing) through the JNI component. */ -public class LTTngTrace extends TmfTrace { +public class LTTngTrace extends TmfTrace { private final static boolean SHOW_LTT_DEBUG_DEFAULT = false; private final static boolean IS_PARSING_NEEDED_DEFAULT = false; private final static int CHECKPOINT_PAGE_SIZE = 1; @@ -109,7 +109,7 @@ public class LTTngTrace extends TmfTrace { * */ public LTTngTrace(String path, boolean waitForCompletion, boolean bypassIndexing) throws Exception { - super(path, CHECKPOINT_PAGE_SIZE, true); + super(LttngEvent.class, path, CHECKPOINT_PAGE_SIZE); try { currentJniTrace = JniTraceFactory.getJniTrace(path, SHOW_LTT_DEBUG_DEFAULT); } @@ -123,6 +123,9 @@ public class LTTngTrace extends TmfTrace { ) ); + //System.out.println("START :" + currentJniTrace.getStartTime().getTime()); + //System.out.println("END :" + currentJniTrace.getEndTime().getTime()); + // Export all the event types from the JNI side traceTypes = new HashMap(); traceTypeNames = new Vector(); @@ -144,7 +147,7 @@ public class LTTngTrace extends TmfTrace { // Bypass indexing if asked if ( bypassIndexing == false ) { - indexStream(); + indexTrace(true); } } @@ -156,7 +159,7 @@ public class LTTngTrace extends TmfTrace { * For this reason, copy constructor should NEVER be used. */ private LTTngTrace(LTTngTrace oldStream) throws Exception { - super(null); + super(LttngEvent.class, null); throw new Exception("Copy constructor should never be use with a LTTngTrace!"); } @@ -226,6 +229,7 @@ public class LTTngTrace extends TmfTrace { LttngEvent returnedEvent = null; synchronized (currentJniTrace) { + // Seek to the context's location seekLocation(context.getLocation()); @@ -242,8 +246,8 @@ public class LTTngTrace extends TmfTrace { timestamp = (LttngTimestamp) getCurrentLocation(); } context.setLocation(timestamp); - context.setTimestamp(timestamp); - context.incrIndex(); +// context.setTimestamp(timestamp); +// context.incrRank(); return returnedEvent; } @@ -327,14 +331,25 @@ public class LTTngTrace extends TmfTrace { // If location is null, interpret this as a request to get back to the beginning of the trace // in that case, just change the location, the seek will happen below if (location == null) { - location = getStartTime(); + // *** FIXME *** + // Corrupted StartTime in TMF!!! + //location = getStartTime(); + location = new LttngTimestamp(currentJniTrace.getStartTime().getTime()); } if (location instanceof TmfTimestamp) { long value = ((TmfTimestamp) location).getValue(); + if (value != currentJniTrace.getCurrentEventTimestamp().getTime()) { + /* + System.out.println("\nLOCATION IS : " + ((TmfTimestamp) location).getValue()); + System.out.println("JNI IS : " + currentJniTrace.getCurrentEventTimestamp().getTime()); + System.out.println("SEEKING"); + */ + synchronized (currentJniTrace) { - currentJniTrace.seekToTime(new JniTime(value)); + //currentJniTrace.seekToTime(new JniTime(value)); + currentJniTrace.seekAndRead(new JniTime(value)); timestamp = (LttngTimestamp) getCurrentLocation(); } } @@ -343,10 +358,7 @@ public class LTTngTrace extends TmfTrace { System.out.println("ERROR : Location not instance of TmfTimestamp"); } - // FIXME: LTTng hack - start - // return new TmfTraceContext(timestamp, timestamp, 0); // Original - return new TmfTraceContext(timestamp, timestamp, -1); // Hacked - // FIXME: LTTng hack - end + return new TmfTraceContext(timestamp, 0); // Original } /** @@ -456,6 +468,7 @@ public class LTTngTrace extends TmfTrace { return returnedData; } + } /* @@ -481,4 +494,4 @@ class EventTypeKey { return key; } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/META-INF/MANIFEST.MF b/org.eclipse.linuxtools.tmf.tests/META-INF/MANIFEST.MF index 3cd0a7753e..71deded112 100644 --- a/org.eclipse.linuxtools.tmf.tests/META-INF/MANIFEST.MF +++ b/org.eclipse.linuxtools.tmf.tests/META-INF/MANIFEST.MF @@ -5,7 +5,7 @@ Bundle-SymbolicName: org.eclipse.linuxtools.tmf.tests Bundle-Version: 0.2.0.qualifier Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-Vendor: %Bundle-Vendor -Require-Bundle: org.junit, +Require-Bundle: org.junit;bundle-version="3.8.2", org.eclipse.linuxtools.tmf;bundle-version="0.2.0", org.eclipse.core.runtime;bundle-version="3.5.0" Bundle-Localization: plugin diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/TmfProviderManagerTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/TmfProviderManagerTest.java index 1b9e7e2c0c..cf8ab886fc 100644 --- a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/TmfProviderManagerTest.java +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/TmfProviderManagerTest.java @@ -14,23 +14,19 @@ package org.eclipse.linuxtools.tmf.tests.component; import junit.framework.TestCase; -import org.eclipse.linuxtools.tmf.component.TmfDataProvider; +import org.eclipse.linuxtools.tmf.component.ITmfContext; +import org.eclipse.linuxtools.tmf.component.TmfProvider; import org.eclipse.linuxtools.tmf.component.TmfProviderManager; import org.eclipse.linuxtools.tmf.event.TmfEvent; -import org.eclipse.linuxtools.tmf.request.ITmfDataRequest; -import org.eclipse.linuxtools.tmf.trace.ITmfContext; +import org.eclipse.linuxtools.tmf.request.TmfDataRequest; /** * TmfProviderManagerTest *

- * Test suite for the TmfProviderManager class. + * TODO: Implement me. Please. */ public class TmfProviderManagerTest extends TestCase { - public TmfProviderManagerTest(String name) { - super(name); - } - @Override protected void setUp() throws Exception { super.setUp(); @@ -45,12 +41,12 @@ public class TmfProviderManagerTest extends TestCase { // Dummy Providers // ------------------------------------------------------------------------ - public class TestProvider1 extends TmfDataProvider { + public class TestProvider1 extends TmfProvider { public TestProvider1(Class type) { - super("TestProvider1", type); + super(type); } @Override - public ITmfContext armRequest(ITmfDataRequest request) { + public ITmfContext setContext(TmfDataRequest request) { return null; } @Override @@ -58,17 +54,17 @@ public class TmfProviderManagerTest extends TestCase { return null; } @Override - public boolean isCompleted(ITmfDataRequest request, TmfEvent data, int nbRead) { + public boolean isCompleted(TmfDataRequest request, TmfEvent data) { return false; } } - public class TestProvider2 extends TmfDataProvider { + public class TestProvider2 extends TmfProvider { public TestProvider2(Class type) { - super("TestProvider2", type); + super(type); } @Override - public ITmfContext armRequest(ITmfDataRequest request) { + public ITmfContext setContext(TmfDataRequest request) { return null; } @Override @@ -76,7 +72,7 @@ public class TmfProviderManagerTest extends TestCase { return null; } @Override - public boolean isCompleted(ITmfDataRequest request, TmfEvent data, int nbRead) { + public boolean isCompleted(TmfDataRequest request, TmfEvent data) { return false; } } @@ -87,12 +83,12 @@ public class TmfProviderManagerTest extends TestCase { } } - public class TestProvider3 extends TmfDataProvider { + public class TestProvider3 extends TmfProvider { public TestProvider3(Class type) { - super("TestProvider3", type); + super(type); } @Override - public ITmfContext armRequest(ITmfDataRequest request) { + public ITmfContext setContext(TmfDataRequest request) { return null; } @Override @@ -100,22 +96,42 @@ public class TmfProviderManagerTest extends TestCase { return null; } @Override - public boolean isCompleted(ITmfDataRequest request, TmfEvent3 data, int nbRead) { + public boolean isCompleted(TmfDataRequest request, TmfEvent3 data) { return false; } } +// For multiple data types +// public class TestProvider4 extends TmfProvider { +// public TestProvider4(Class type) { +// super(type); +// TmfProviderManager.register(TmfEvent3.class, this); +// } +// @Override +// public ITmfContext setContext(TmfDataRequest request) { +// return null; +// } +// @Override +// public TmfEvent getNext(ITmfContext context) { +// return null; +// } +// @Override +// public boolean isCompleted(TmfDataRequest request, TmfEvent data) { +// return false; +// } +// } + // ------------------------------------------------------------------------ - // register/dispose + // register() // ------------------------------------------------------------------------ @SuppressWarnings("unchecked") public void testRegister_0() { - TmfDataProvider[] providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); - assertEquals("getProviders", 0, providers.length); + TmfProvider[] providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertTrue(providers.length == 0); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); - assertEquals("getProviders", 0, providers.length); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertTrue(providers.length == 0); } @SuppressWarnings("unchecked") @@ -124,22 +140,22 @@ public class TmfProviderManagerTest extends TestCase { // Register a single provider TestProvider1 testProvider1 = new TestProvider1(TmfEvent.class); - TmfDataProvider[] providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); - assertEquals("getProviders", 1, providers.length); - assertEquals("getProviders", testProvider1, providers[0]); + TmfProvider[] providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertTrue(providers.length == 1); + assertTrue(providers[0] == testProvider1); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); - assertEquals("getProviders", 1, providers.length); - assertEquals("getProviders", testProvider1, providers[0]); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertTrue(providers.length == 1); + assertTrue(providers[0] == testProvider1); // Unregister it - testProvider1.dispose(); + testProvider1.deregister(); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); - assertEquals("getProviders", 0, providers.length); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertTrue(providers.length == 0); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); - assertEquals("getProviders", 0, providers.length); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertTrue(providers.length == 0); } @SuppressWarnings("unchecked") @@ -149,50 +165,49 @@ public class TmfProviderManagerTest extends TestCase { TestProvider1 testProvider1 = new TestProvider1(TmfEvent.class); TestProvider2 testProvider2 = new TestProvider2(TmfEvent.class); - TmfDataProvider[] providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); - assertEquals("getProviders", 2, providers.length); + TmfProvider[] providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class); assertTrue(providers.length == 2); if (providers[0] == testProvider1) { - assertEquals("getProviders", testProvider2, providers[1]); + assertTrue(providers[1] == testProvider2); } else { - assertEquals("getProviders", testProvider2, providers[0]); - assertEquals("getProviders", testProvider1, providers[1]); + assertTrue(providers[1] == testProvider1); + assertTrue(providers[0] == testProvider2); } - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); - assertEquals("getProviders", 1, providers.length); - assertEquals("getProviders", testProvider1, providers[0]); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertTrue(providers.length == 1); + assertTrue(providers[0] == testProvider1); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); - assertEquals("getProviders", 1, providers.length); - assertEquals("getProviders", testProvider2, providers[0]); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertTrue(providers.length == 1); + assertTrue(providers[0] == testProvider2); // Remove one - testProvider1.dispose(); + testProvider1.deregister(); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); - assertEquals("getProviders", 1, providers.length); - assertEquals("getProviders", testProvider2, providers[0]); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertTrue(providers.length == 1); + assertTrue(providers[0] == testProvider2); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); - assertEquals("getProviders", 0, providers.length); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertTrue(providers.length == 0); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); - assertEquals("getProviders", 1, providers.length); - assertEquals("getProviders", testProvider2, providers[0]); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertTrue(providers.length == 1); + assertTrue(providers[0] == testProvider2); // Remove the other - testProvider2.dispose(); + testProvider2.deregister(); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); - assertEquals("getProviders", 0, providers.length); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertTrue(providers.length == 0); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); - assertEquals("getProviders", 0, providers.length); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertTrue(providers.length == 0); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); - assertEquals("getProviders", 0, providers.length); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertTrue(providers.length == 0); } @SuppressWarnings("unchecked") @@ -203,119 +218,91 @@ public class TmfProviderManagerTest extends TestCase { TestProvider2 testProvider2 = new TestProvider2(TmfEvent.class); TestProvider3 testProvider3 = new TestProvider3(TmfEvent3.class); - TmfDataProvider[] providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); - assertEquals("getProviders", 2, providers.length); + TmfProvider[] providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertTrue(providers.length == 2); if (providers[0] == testProvider1) { - assertEquals("getProviders", testProvider2, providers[1]); + assertTrue(providers[1] == testProvider2); } else { - assertEquals("getProviders", testProvider2, providers[0]); - assertEquals("getProviders", testProvider1, providers[1]); + assertTrue(providers[1] == testProvider1); + assertTrue(providers[0] == testProvider2); } - TmfDataProvider[] providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class); - assertEquals("getProviders", 1, providers3.length); - assertEquals("getProviders", testProvider3, providers3[0]); + TmfProvider[] providers3 = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent3.class); + assertTrue(providers3.length == 1); + assertTrue(providers3[0] == testProvider3); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); - assertEquals("getProviders", 1, providers.length); - assertEquals("getProviders", testProvider1, providers[0]); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertTrue(providers.length == 1); + assertTrue(providers[0] == testProvider1); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); - assertEquals("getProviders", 1, providers.length); - assertEquals("getProviders", testProvider2, providers[0]); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertTrue(providers.length == 1); + assertTrue(providers[0] == testProvider2); - providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class); - assertEquals("getProviders", 1, providers3.length); - assertEquals("getProviders", testProvider3, providers3[0]); + providers3 = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class); + assertTrue(providers3.length == 1); + assertTrue(providers3[0] == testProvider3); // Remove one - testProvider1.dispose(); + testProvider1.deregister(); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); - assertEquals("getProviders", 1, providers.length); - assertEquals("getProviders", testProvider2, providers[0]); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertTrue(providers.length == 1); + assertTrue(providers[0] == testProvider2); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); - assertEquals("getProviders", 0, providers.length); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertTrue(providers.length == 0); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); - assertEquals("getProviders", 1, providers.length); - assertEquals("getProviders", testProvider2, providers[0]); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertTrue(providers.length == 1); + assertTrue(providers[0] == testProvider2); - providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class); - assertEquals("getProviders", 1, providers3.length); - assertEquals("getProviders", testProvider3, providers3[0]); + providers3 = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent3.class); + assertTrue(providers3.length == 1); + assertTrue(providers3[0] == testProvider3); - providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class); - assertEquals("getProviders", 1, providers3.length); - assertEquals("getProviders", testProvider3, providers3[0]); + providers3 = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class); + assertTrue(providers3.length == 1); + assertTrue(providers3[0] == testProvider3); // Remove another one - testProvider2.dispose(); + testProvider2.deregister(); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); - assertEquals("getProviders", 0, providers.length); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertTrue(providers.length == 0); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); - assertEquals("getProviders", 0, providers.length); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertTrue(providers.length == 0); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); - assertEquals("getProviders", 0, providers.length); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertTrue(providers.length == 0); - providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class); + providers3 = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent3.class); assertTrue(providers3.length == 1); assertTrue(providers3[0] == testProvider3); - providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class); - assertEquals("getProviders", 1, providers3.length); - assertEquals("getProviders", testProvider3, providers3[0]); + providers3 = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class); + assertTrue(providers3.length == 1); + assertTrue(providers3[0] == testProvider3); // Remove the last one - testProvider3.dispose(); - - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); - assertEquals("getProviders", 0, providers.length); + testProvider3.deregister(); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); - assertEquals("getProviders", 0, providers.length); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertTrue(providers.length == 0); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); - assertEquals("getProviders", 0, providers.length); + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertTrue(providers.length == 0); - providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class); - assertEquals("getProviders", 0, providers.length); - - providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class); - assertEquals("getProviders", 0, providers.length); - } - - @SuppressWarnings("unchecked") - public void testGetProvider() { - - // Register 3 providers, mixed data types - TestProvider1 testProvider1 = new TestProvider1(TmfEvent.class); - TestProvider2 testProvider2 = new TestProvider2(TmfEvent.class); - TestProvider3 testProvider3 = new TestProvider3(TmfEvent3.class); - - TmfDataProvider[] providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, null); - assertEquals("getProviders", 2, providers.length); - if (providers[0] == testProvider1) { - assertEquals("getProviders", testProvider2, providers[1]); - } - else { - assertEquals("getProviders", testProvider2, providers[0]); - assertEquals("getProviders", testProvider1, providers[1]); - } + providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertTrue(providers.length == 0); - providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, null); - assertEquals("getProviders", 1, providers.length); - assertEquals("getProviders", testProvider3, providers[0]); + providers3 = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent3.class); + assertTrue(providers3.length == 0); - // Remove the providers - testProvider1.dispose(); - testProvider2.dispose(); - testProvider3.dispose(); + providers3 = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class); + assertTrue(providers3.length == 0); } } \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/AllTests.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/AllTests.java index 65f4b1400f..c00b5d51bf 100644 --- a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/AllTests.java +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/AllTests.java @@ -11,6 +11,7 @@ public class AllTests { TestSuite suite = new TestSuite("Test suite for " + TmfCorePlugin.PLUGIN_ID + ".request"); //$NON-NLS-1$); //$JUnit-BEGIN$ suite.addTestSuite(TmfDataRequestTest.class); + suite.addTestSuite(TmfEventRequestTest.class); //$JUnit-END$ return suite; } diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfDataRequestTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfDataRequestTest.java index a3de1d54ae..491a9bda5f 100644 --- a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfDataRequestTest.java +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfDataRequestTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -15,8 +15,6 @@ package org.eclipse.linuxtools.tmf.tests.request; import junit.framework.TestCase; import org.eclipse.linuxtools.tmf.event.TmfEvent; -import org.eclipse.linuxtools.tmf.event.TmfTimeRange; -import org.eclipse.linuxtools.tmf.event.TmfTimestamp; import org.eclipse.linuxtools.tmf.request.TmfDataRequest; /** @@ -26,9 +24,9 @@ import org.eclipse.linuxtools.tmf.request.TmfDataRequest; */ public class TmfDataRequestTest extends TestCase { - // ======================================================================== + // ------------------------------------------------------------------------ // Housekeeping - // ======================================================================== + // ------------------------------------------------------------------------ public TmfDataRequestTest(String name) { super(name); @@ -44,59 +42,40 @@ public class TmfDataRequestTest extends TestCase { super.tearDown(); } - // ======================================================================== + // ------------------------------------------------------------------------ // Constructors - // ======================================================================== + // ------------------------------------------------------------------------ - public void testTmfDataRequestIndexNbEvents() { - TmfDataRequest request = new TmfDataRequest(10, 100); + public void testTmfDataRequest() { + TmfDataRequest request = new TmfDataRequest(TmfEvent.class); - assertEquals("getRange", null, request.getRange()); - assertEquals("getIndex", 10, request.getIndex()); - assertEquals("getNbRequestedEvents", 100, request.getNbRequestedEvents()); + assertEquals("getIndex", 0, request.getIndex()); + assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested()); assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); } - public void testTmfDataRequestIndexNbEventsBlocksize() { - TmfDataRequest request = new TmfDataRequest(10, 100, 200); - - assertEquals("getRange", null, request.getRange()); - assertEquals("getIndex", 10, request.getIndex()); - assertEquals("getNbRequestedEvents", 100, request.getNbRequestedEvents()); - assertEquals("getBlockize", 200, request.getBlockize()); - } + public void testTmfDataRequestIndex() { + TmfDataRequest request = new TmfDataRequest(TmfEvent.class, 10); - public void testTmfDataRequestTimeRange() { - TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); - TmfDataRequest request = new TmfDataRequest(range); - - assertEquals("StartTime", TmfTimestamp.BigBang, request.getRange().getStartTime()); - assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime()); - assertEquals("getIndex", 0, request.getIndex()); - assertEquals("getNbRequestedEvents", -1, request.getNbRequestedEvents()); + assertEquals("getIndex", 10, request.getIndex()); + assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested()); assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); } - public void testTmfDataRequestTimeRangeNbEvents() { - TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); - TmfDataRequest request = new TmfDataRequest(range, 10); + public void testTmfDataRequestIndexNbRequested() { + TmfDataRequest request = new TmfDataRequest(TmfEvent.class, 10, 100); - assertEquals("StartTime", TmfTimestamp.BigBang, request.getRange().getStartTime()); - assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime()); - assertEquals("getIndex", 0, request.getIndex()); - assertEquals("getNbRequestedEvents", 10, request.getNbRequestedEvents()); + assertEquals("getIndex", 10, request.getIndex()); + assertEquals("getNbRequestedEvents", 100, request.getNbRequested()); assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); } - public void testTmfDataRequestTimeRangeNbEventsBlockSize() { - TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); - TmfDataRequest request = new TmfDataRequest(range, 10, 100); + public void testTmfDataRequestIndexNbEventsBlocksize() { + TmfDataRequest request = new TmfDataRequest(TmfEvent.class, 10, 100, 200); - assertEquals("StartTime", TmfTimestamp.BigBang, request.getRange().getStartTime()); - assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime()); - assertEquals("getIndex", 0, request.getIndex()); - assertEquals("getNbRequestedEvents", 10, request.getNbRequestedEvents()); - assertEquals("getBlockize", 100, request.getBlockize()); + assertEquals("getIndex", 10, request.getIndex()); + assertEquals("getNbRequestedEvents", 100, request.getNbRequested()); + assertEquals("getBlockize", 200, request.getBlockize()); } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfEventRequestTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfEventRequestTest.java index 189bd32ad5..6116c95c28 100644 --- a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfEventRequestTest.java +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfEventRequestTest.java @@ -15,38 +15,18 @@ package org.eclipse.linuxtools.tmf.tests.request; import junit.framework.TestCase; import org.eclipse.linuxtools.tmf.event.TmfEvent; -import org.eclipse.linuxtools.tmf.event.TmfEventReference; -import org.eclipse.linuxtools.tmf.event.TmfEventSource; -import org.eclipse.linuxtools.tmf.event.TmfEventType; import org.eclipse.linuxtools.tmf.event.TmfTimeRange; import org.eclipse.linuxtools.tmf.event.TmfTimestamp; import org.eclipse.linuxtools.tmf.request.TmfDataRequest; import org.eclipse.linuxtools.tmf.request.TmfEventRequest; -import org.eclipse.linuxtools.tmf.request.TmfEventRequestStub; /** * TmfEventRequestTest *

- * Test suite for the TmfEventRequest class. + * TODO: Implement me. Please. */ public class TmfEventRequestTest extends TestCase { - // ------------------------------------------------------------------------ - // Variables - // ------------------------------------------------------------------------ - - private static TmfTimeRange range1 = new TmfTimeRange(TmfTimeRange.Eternity); - private static TmfTimeRange range2 = new TmfTimeRange(new TmfTimestamp(), TmfTimestamp.BigCrunch); - - private static TmfEventRequest fRequest1; - private static TmfEventRequest fRequest1b; - private static TmfEventRequest fRequest1c; - private static TmfEventRequest fRequest2; - private static TmfEventRequest fRequest3; - private static TmfEventRequest fRequest4; - - private static int fRequestCount; - // ------------------------------------------------------------------------ // Housekeeping // ------------------------------------------------------------------------ @@ -58,14 +38,6 @@ public class TmfEventRequestTest extends TestCase { @Override protected void setUp() throws Exception { super.setUp(); - TmfDataRequest.reset(); - fRequest1 = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); - fRequest2 = new TmfEventRequestStub(TmfEvent.class, range2, 100, 200); - fRequest3 = new TmfEventRequestStub(TmfEvent.class, range2, 200, 200); - fRequest4 = new TmfEventRequestStub(TmfEvent.class, range2, 200, 300); - fRequest1b = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); - fRequest1c = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); - fRequestCount = fRequest1c.getRequestId() + 1; } @Override @@ -73,265 +45,55 @@ public class TmfEventRequestTest extends TestCase { super.tearDown(); } - private TmfEventRequest setupTestRequest(final boolean[] flags) { - - TmfEventRequest request = new TmfEventRequestStub(TmfEvent.class, new TmfTimeRange(TmfTimeRange.Eternity), 100, 200) { - @Override - public void handleCompleted() { - super.handleCompleted(); - flags[0] = true; - } - @Override - public void handleSuccess() { - super.handleSuccess(); - flags[1] = true; - } - @Override - public void handleFailure() { - super.handleFailure(); - flags[2] = true; - } - @Override - public void handleCancel() { - super.handleCancel(); - flags[3] = true; - } - }; - return request; - } - // ------------------------------------------------------------------------ // Constructors // ------------------------------------------------------------------------ - public void testTmfEventRequest() { - TmfEventRequest request = new TmfEventRequestStub(TmfEvent.class); - - assertEquals("getRequestId", fRequestCount++, request.getRequestId()); - assertEquals("getDataType", TmfEvent.class, request.getDataType()); + public void testTmfDataRequest() { + TmfEventRequest request = new TmfEventRequest(TmfEvent.class); assertEquals("StartTime", TmfTimestamp.BigBang, request.getRange().getStartTime()); assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime()); - assertEquals("getIndex", 0, request.getIndex()); + assertEquals("getIndex", 0, request.getIndex()); assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested()); assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); - - assertFalse("isCompleted", request.isCompleted()); - assertFalse("isFailed", request.isFailed()); - assertFalse("isCancelled", request.isCancelled()); - - assertEquals("getNbRead", 0, request.getNbRead()); } - public void testTmfEventRequestTimeRange() { + public void testTmfDataRequestTimeRange() { TmfTimeRange range = new TmfTimeRange(new TmfTimestamp(), TmfTimestamp.BigCrunch); - TmfEventRequest request = new TmfEventRequestStub(TmfEvent.class, range); + TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range); - assertEquals("getRequestId", fRequestCount++, request.getRequestId()); - assertEquals("getDataType", TmfEvent.class, request.getDataType()); - - assertEquals("StartTime", new TmfTimestamp(), request.getRange().getStartTime()); - assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime()); + assertEquals("StartTime", range.getStartTime(), request.getRange().getStartTime()); + assertEquals("EndTime", range.getEndTime(), request.getRange().getEndTime()); - assertEquals("getIndex", 0, request.getIndex()); + assertEquals("getIndex", 0, request.getIndex()); assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested()); assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); - - assertFalse("isCompleted", request.isCompleted()); - assertFalse("isFailed", request.isFailed()); - assertFalse("isCancelled", request.isCancelled()); - - assertEquals("getNbRead", 0, request.getNbRead()); } - public void testTmfEventRequestTimeRangeNbRequested() { + public void testTmfDataRequestTimeRangeNbRequested() { TmfTimeRange range = new TmfTimeRange(new TmfTimestamp(), TmfTimestamp.BigCrunch); - TmfEventRequest request = new TmfEventRequestStub(TmfEvent.class, range, 100); + TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, 100); - assertEquals("getRequestId", fRequestCount++, request.getRequestId()); - assertEquals("getDataType", TmfEvent.class, request.getDataType()); + assertEquals("StartTime", range.getStartTime(), request.getRange().getStartTime()); + assertEquals("EndTime", range.getEndTime(), request.getRange().getEndTime()); - assertEquals("StartTime", new TmfTimestamp(), request.getRange().getStartTime()); - assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime()); - - assertEquals("getIndex", 0, request.getIndex()); + assertEquals("getIndex", 0, request.getIndex()); assertEquals("getNbRequestedEvents", 100, request.getNbRequested()); assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); - - assertFalse("isCompleted", request.isCompleted()); - assertFalse("isFailed", request.isFailed()); - assertFalse("isCancelled", request.isCancelled()); - - assertEquals("getNbRead", 0, request.getNbRead()); } - public void testTmfEventRequestTimeRangeNbRequestedBlocksize() { + public void testTmfDataRequestTimeRangeNbRequestedBlocksize() { TmfTimeRange range = new TmfTimeRange(new TmfTimestamp(), TmfTimestamp.BigCrunch); - TmfEventRequest request = new TmfEventRequestStub(TmfEvent.class, range, 100, 200); - - assertEquals("getRequestId", fRequestCount++, request.getRequestId()); - assertEquals("getDataType", TmfEvent.class, request.getDataType()); + TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, 100, 200); - assertEquals("StartTime", new TmfTimestamp(), request.getRange().getStartTime()); - assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime()); + assertEquals("StartTime", range.getStartTime(), request.getRange().getStartTime()); + assertEquals("EndTime", range.getEndTime(), request.getRange().getEndTime()); - assertEquals("getIndex", 0, request.getIndex()); + assertEquals("getIndex", 0, request.getIndex()); assertEquals("getNbRequestedEvents", 100, request.getNbRequested()); - assertEquals("getBlockize", 200, request.getBlockize()); - - assertFalse("isCompleted", request.isCompleted()); - assertFalse("isFailed", request.isFailed()); - assertFalse("isCancelled", request.isCancelled()); - - assertEquals("getNbRead", 0, request.getNbRead()); - } - - // ------------------------------------------------------------------------ - // equals - // ------------------------------------------------------------------------ - - public void testEqualsReflexivity() throws Exception { - assertTrue("equals", fRequest1.equals(fRequest1)); - assertTrue("equals", fRequest2.equals(fRequest2)); - - assertFalse("equals", fRequest1.equals(fRequest2)); - assertFalse("equals", fRequest2.equals(fRequest1)); - } - - public void testEqualsSymmetry() throws Exception { - assertTrue("equals", fRequest1.equals(fRequest1b)); - assertTrue("equals", fRequest1b.equals(fRequest1)); - - assertFalse("equals", fRequest1.equals(fRequest3)); - assertFalse("equals", fRequest2.equals(fRequest3)); - assertFalse("equals", fRequest3.equals(fRequest1)); - assertFalse("equals", fRequest3.equals(fRequest2)); - } - - public void testEqualsTransivity() throws Exception { - assertTrue("equals", fRequest1.equals(fRequest1b)); - assertTrue("equals", fRequest1b.equals(fRequest1c)); - assertTrue("equals", fRequest1.equals(fRequest1c)); - } - - public void testEqualsNull() throws Exception { - assertFalse("equals", fRequest1.equals(null)); - assertFalse("equals", fRequest2.equals(null)); - } - - // ------------------------------------------------------------------------ - // hashCode - // ------------------------------------------------------------------------ - - public void testHashCode() throws Exception { - assertTrue("hashCode", fRequest1.hashCode() == fRequest1.hashCode()); - assertTrue("hashCode", fRequest2.hashCode() == fRequest2.hashCode()); - assertTrue("hashCode", fRequest1.hashCode() != fRequest2.hashCode()); - } - - // ------------------------------------------------------------------------ - // toString - // ------------------------------------------------------------------------ - - public void testToString() { - String expected1 = "[TmfEventRequest(0,TmfEvent," + range1 + ",100,200)]"; - String expected2 = "[TmfEventRequest(1,TmfEvent," + range2 + ",100,200)]"; - String expected3 = "[TmfEventRequest(2,TmfEvent," + range2 + ",200,200)]"; - String expected4 = "[TmfEventRequest(3,TmfEvent," + range2 + ",200,300)]"; - - assertEquals("toString", expected1, fRequest1.toString()); - assertEquals("toString", expected2, fRequest2.toString()); - assertEquals("toString", expected3, fRequest3.toString()); - assertEquals("toString", expected4, fRequest4.toString()); - } - - // ------------------------------------------------------------------------ - // setData/getData - // ------------------------------------------------------------------------ - - public void testSetData() { - // Initialize the data - int nbEvents = 10; - TmfEvent[] events = new TmfEvent[nbEvents]; - for (int i = 0; i < nbEvents; i++) { - events[i] = new TmfEvent(new TmfTimestamp(i), new TmfEventSource(), - new TmfEventType(), new TmfEventReference()); - } - - fRequest1.setData(events); - assertEquals("setData", nbEvents, fRequest1.getNbRead()); - - TmfEvent[] eventsRead = fRequest1.getData(); - assertEquals("getData", nbEvents, eventsRead.length); - - for (int i = 0; i < nbEvents; i++) { - assertEquals("getData", i, eventsRead[i].getTimestamp().getValue()); - } - } - - // ------------------------------------------------------------------------ - // done - // ------------------------------------------------------------------------ - - public void testDone() { - - final boolean[] flags = new boolean[4]; - TmfEventRequest request = setupTestRequest(flags); - request.done(); - - assertTrue ("isCompleted", request.isCompleted()); - assertFalse("isFailed", request.isFailed()); - assertFalse("isCancelled", request.isCancelled()); - - assertTrue ("handleCompleted", flags[0]); - assertTrue ("handleSuccess", flags[1]); - assertFalse("handleFailure", flags[2]); - assertFalse("handleCancel", flags[3]); + assertEquals("getBlockize", 200, request.getBlockize()); } - // ------------------------------------------------------------------------ - // fail - // ------------------------------------------------------------------------ - - public void testFail() { - - final boolean[] flags = new boolean[4]; - TmfEventRequest request = setupTestRequest(flags); - request.fail(); - - assertTrue ("isCompleted", request.isCompleted()); - assertTrue ("isFailed", request.isFailed()); - assertFalse("isCancelled", request.isCancelled()); - - assertTrue ("handleCompleted", flags[0]); - assertFalse("handleSuccess", flags[1]); - assertTrue ("handleFailure", flags[2]); - assertFalse("handleCancel", flags[3]); - } - - // ------------------------------------------------------------------------ - // cancel - // ------------------------------------------------------------------------ - - public void testCancel() { - - final boolean[] flags = new boolean[4]; - TmfEventRequest request = setupTestRequest(flags); - request.cancel(); - - assertTrue ("isCompleted", request.isCompleted()); - assertFalse("isFailed", request.isFailed()); - assertTrue ("isCancelled", request.isCancelled()); - - assertTrue ("handleCompleted", flags[0]); - assertFalse("handleSuccess", flags[1]); - assertFalse("handleFailure", flags[2]); - assertTrue ("handleCancel", flags[3]); - } - - // ------------------------------------------------------------------------ - // waitForCompletion - // ------------------------------------------------------------------------ - } \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/AllTests.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/AllTests.java index 68d0387669..f67f69f1b1 100644 --- a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/AllTests.java +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/AllTests.java @@ -11,9 +11,9 @@ public class AllTests { TestSuite suite = new TestSuite("Test suite for " + TmfCorePlugin.PLUGIN_ID + ".trace"); //$NON-NLS-1$); //$JUnit-BEGIN$ suite.addTestSuite(TmfTraceTest.class); -// suite.addTestSuite(TmfExperimentTest.class); + suite.addTestSuite(TmfExperimentTest.class); //$JUnit-END$ return suite; } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfExperimentTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfExperimentTest.java index 6b7508c163..cf2782486b 100644 --- a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfExperimentTest.java +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfExperimentTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -13,18 +13,24 @@ package org.eclipse.linuxtools.tmf.tests.trace; import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; import java.util.Vector; +import junit.framework.TestCase; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.Path; import org.eclipse.linuxtools.tmf.event.TmfEvent; import org.eclipse.linuxtools.tmf.event.TmfTimeRange; import org.eclipse.linuxtools.tmf.event.TmfTimestamp; -import org.eclipse.linuxtools.tmf.request.TmfDataRequest; +import org.eclipse.linuxtools.tmf.experiment.TmfExperiment; +import org.eclipse.linuxtools.tmf.request.TmfEventRequest; +import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin; import org.eclipse.linuxtools.tmf.trace.ITmfTrace; -import org.eclipse.linuxtools.tmf.trace.TmfExperiment; import org.eclipse.linuxtools.tmf.trace.TmfTraceStub; -import junit.framework.TestCase; - /** * TmfExperimentTest *

@@ -35,29 +41,48 @@ public class TmfExperimentTest extends TestCase { private static final String DIRECTORY = "testfiles"; private static final String TEST_STREAM = "M-Test-10K"; private static final String EXPERIMENT = "MyExperiment"; - private static String testfile; - private static int NB_EVENTS = 10000; - private static int fDefaultBlockSize = 1000; + private static int NB_EVENTS = 10000; + private static int fDefaultBlockSize = 1000; - private static ITmfTrace fStream; - private static TmfExperiment fExperiment; + private static ITmfTrace fTrace; + private static TmfExperiment fExperiment; - // ======================================================================== + // ------------------------------------------------------------------------ // Housekeeping - // ======================================================================== + // ------------------------------------------------------------------------ + + private ITmfTrace setupTrace(String path) { + if (fTrace == null) { + try { + URL location = FileLocator.find(TmfCoreTestPlugin.getPlugin().getBundle(), new Path(path), null); + File test = new File(FileLocator.toFileURL(location).toURI()); + TmfTraceStub trace = new TmfTraceStub(test.getPath(), true); + fTrace = trace; + } catch (URISyntaxException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return fTrace; + } + + private void setupExperiment() { + if (fExperiment == null) { + fExperiment = new TmfExperiment(TmfEvent.class, EXPERIMENT, new ITmfTrace[] { fTrace }); + fExperiment.indexExperiment(true); + } + } public TmfExperimentTest(String name) throws Exception { super(name); - String directory = new File(".").getCanonicalPath() + File.separator + DIRECTORY; - testfile = directory + File.separator + TEST_STREAM; - - fStream = new TmfTraceStub(testfile); - fExperiment = new TmfExperiment(EXPERIMENT, new ITmfTrace[] { fStream }, true); } @Override protected void setUp() throws Exception { super.setUp(); + setupTrace(DIRECTORY + File.separator + TEST_STREAM); + setupExperiment(); } @Override @@ -65,31 +90,31 @@ public class TmfExperimentTest extends TestCase { super.tearDown(); } - // ======================================================================== + // ------------------------------------------------------------------------ // Constructor - // ======================================================================== + // ------------------------------------------------------------------------ public void testBasicTmfTrace() { assertEquals("GetId", EXPERIMENT, fExperiment.getExperimentId()); - assertEquals("GetEpoch", TmfTimestamp.BigBang, fExperiment.getEpoch()); + assertEquals("GetEpoch", TmfTimestamp.Zero, fExperiment.getEpoch()); assertEquals("GetNbEvents", NB_EVENTS, fExperiment.getNbEvents()); TmfTimeRange timeRange = fExperiment.getTimeRange(); - assertEquals("GetTimeRange-start", 1, timeRange.getStartTime().getValue()); - assertEquals("GetTimeRange-end", NB_EVENTS, timeRange.getEndTime().getValue()); + assertEquals("getStartTime", 1, timeRange.getStartTime().getValue()); + assertEquals("getEndTime", NB_EVENTS, timeRange.getEndTime().getValue()); } - // ======================================================================== + // ------------------------------------------------------------------------ // processRequest - // ======================================================================== + // ------------------------------------------------------------------------ public void testProcessRequestForNbEvents() throws Exception { final int blockSize = 100; - final int nbEvents = 1000; + final int nbEvents = 1000; final Vector requestedEvents = new Vector(); TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); - final TmfDataRequest request = new TmfDataRequest(range, nbEvents, blockSize) { + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { @Override public void handleData() { TmfEvent[] events = getData(); @@ -117,7 +142,7 @@ public class TmfExperimentTest extends TestCase { final Vector requestedEvents = new Vector(); TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); - final TmfDataRequest request = new TmfDataRequest(range, nbEvents, blockSize) { + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { @Override public void handleData() { TmfEvent[] events = getData(); @@ -140,13 +165,13 @@ public class TmfExperimentTest extends TestCase { } public void testProcessRequestForAllEvents() throws Exception { - final int nbEvents = -1; + final int nbEvents = TmfEventRequest.ALL_DATA; final int blockSize = 1; final Vector requestedEvents = new Vector(); int nbExpectedEvents = fExperiment.getNbEvents(); TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); - final TmfDataRequest request = new TmfDataRequest(range, nbEvents, blockSize) { + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { @Override public void handleData() { TmfEvent[] events = getData(); @@ -168,9 +193,9 @@ public class TmfExperimentTest extends TestCase { } } - // ======================================================================== + // ------------------------------------------------------------------------ // cancel - // ======================================================================== + // ------------------------------------------------------------------------ public void testCancel() throws Exception { final int nbEvents = NB_EVENTS; @@ -178,7 +203,7 @@ public class TmfExperimentTest extends TestCase { final Vector requestedEvents = new Vector(); TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); - final TmfDataRequest request = new TmfDataRequest(range, nbEvents, blockSize) { + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { @Override public void handleData() { TmfEvent[] events = getData(); @@ -195,4 +220,17 @@ public class TmfExperimentTest extends TestCase { assertTrue("isCompleted", request.isCompleted()); assertTrue("isCancelled", request.isCancelled()); } -} + + // ------------------------------------------------------------------------ + // getRank + // ------------------------------------------------------------------------ + + public void testGetRank() throws Exception { + assertEquals("getRank", 0, fExperiment.getRank(new TmfTimestamp())); + assertEquals("getRank", 0, fExperiment.getRank(new TmfTimestamp( 1, (byte) -3))); + assertEquals("getRank", 10, fExperiment.getRank(new TmfTimestamp( 11, (byte) -3))); + assertEquals("getRank", 100, fExperiment.getRank(new TmfTimestamp( 101, (byte) -3))); + assertEquals("getRank", 1000, fExperiment.getRank(new TmfTimestamp(1001, (byte) -3))); + } + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfTraceTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfTraceTest.java index 118be7ee3c..e18cad56a1 100644 --- a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfTraceTest.java +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfTraceTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -22,10 +22,12 @@ import junit.framework.TestCase; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; +import org.eclipse.linuxtools.tmf.component.TmfProvider; +import org.eclipse.linuxtools.tmf.component.TmfProviderManager; import org.eclipse.linuxtools.tmf.event.TmfEvent; import org.eclipse.linuxtools.tmf.event.TmfTimeRange; import org.eclipse.linuxtools.tmf.event.TmfTimestamp; -import org.eclipse.linuxtools.tmf.request.TmfDataRequest; +import org.eclipse.linuxtools.tmf.request.TmfEventRequest; import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin; import org.eclipse.linuxtools.tmf.trace.TmfTraceContext; import org.eclipse.linuxtools.tmf.trace.TmfTraceStub; @@ -39,14 +41,14 @@ public class TmfTraceTest extends TestCase { private static final String DIRECTORY = "testfiles"; private static final String TEST_STREAM = "M-Test-10K"; - private static final int NB_EVENTS = 10000; - private static TmfTraceStub fTrace = null; + private static final int NB_EVENTS = 10000; + private static TmfTraceStub fTrace = null; private static byte SCALE = (byte) -3; - // ======================================================================== + // ------------------------------------------------------------------------ // Housekeeping - // ======================================================================== + // ------------------------------------------------------------------------ private TmfTraceStub setupTrace(String path) { if (fTrace == null) { @@ -79,9 +81,9 @@ public class TmfTraceTest extends TestCase { super.tearDown(); } - // ======================================================================== + // ------------------------------------------------------------------------ // Constructors - // ======================================================================== + // ------------------------------------------------------------------------ public void testTmfTraceDefault() throws Exception { TmfTraceStub trace = null; @@ -94,55 +96,63 @@ public class TmfTraceTest extends TestCase { } catch (IOException e) { e.printStackTrace(); } - assertTrue("Oen Trace", trace != null); - + assertTrue("Opened trace", trace != null); assertEquals("getCacheSize", TmfTraceStub.DEFAULT_CACHE_SIZE, trace.getCacheSize()); - assertEquals("getTraceSize", 0, trace.getNbEvents()); - assertEquals("getRange-start", 0, trace.getTimeRange().getStartTime().getValue()); - assertEquals("getRange-end", 0, trace.getTimeRange().getEndTime().getValue()); + assertEquals("getTraceSize", NB_EVENTS, trace.getNbEvents()); } public void testTmfTrace() throws Exception { - assertEquals("getCacheSize", 500, fTrace.getCacheSize()); - assertEquals("getTraceSize", 0, fTrace.getNbEvents()); - assertEquals("getRange-start", 0, fTrace.getTimeRange().getStartTime().getValue()); - assertEquals("getRange-end", 0, fTrace.getTimeRange().getEndTime().getValue()); + assertEquals("getCacheSize", 500, fTrace.getCacheSize()); + assertEquals("getTraceSize", NB_EVENTS, fTrace.getNbEvents()); + assertEquals("getRange-start", 1, fTrace.getTimeRange().getStartTime().getValue()); + assertEquals("getRange-end", NB_EVENTS, fTrace.getTimeRange().getEndTime().getValue()); } - // ======================================================================== + // ------------------------------------------------------------------------ // seek - // ======================================================================== + // ------------------------------------------------------------------------ public void testSeekOnCacheBoundary() throws Exception { TmfTraceContext context = fTrace.seekLocation(null); - context = fTrace.seekEvent(new TmfTimestamp(0, SCALE, 0)); + context = fTrace.seekEvent(new TmfTimestamp(1, SCALE, 0)); TmfEvent event = fTrace.getNextEvent(context); assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); - context = fTrace.seekEvent(new TmfTimestamp(1000, SCALE, 0)); + context = fTrace.seekEvent(new TmfTimestamp(1001, SCALE, 0)); event = fTrace.getNextEvent(context); - assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); - context = fTrace.seekEvent(new TmfTimestamp(4000, SCALE, 0)); + context = fTrace.seekEvent(new TmfTimestamp(4001, SCALE, 0)); event = fTrace.getNextEvent(context); - assertEquals("Event timestamp", 4000, event.getTimestamp().getValue()); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4001, context.getRank()); } public void testSeekNotOnCacheBoundary() throws Exception { TmfTraceContext context = fTrace.seekLocation(null); - context = fTrace.seekEvent(new TmfTimestamp(1, SCALE, 0)); + context = fTrace.seekEvent(new TmfTimestamp(10, SCALE, 0)); TmfEvent event = fTrace.getNextEvent(context); - assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 10, context.getRank()); context = fTrace.seekEvent(new TmfTimestamp(999, SCALE, 0)); event = fTrace.getNextEvent(context); assertEquals("Event timestamp", 999, event.getTimestamp().getValue()); + assertEquals("Event rank", 999, context.getRank()); + + context = fTrace.seekEvent(new TmfTimestamp(1001, SCALE, 0)); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); context = fTrace.seekEvent(new TmfTimestamp(4499, SCALE, 0)); event = fTrace.getNextEvent(context); assertEquals("Event timestamp", 4499, event.getTimestamp().getValue()); + assertEquals("Event rank", 4499, context.getRank()); } public void testSeekForEventOutOfBounds() throws Exception { @@ -159,9 +169,28 @@ public class TmfTraceTest extends TestCase { assertEquals("Event timestamp", null, event); } - // ======================================================================== + public void testSeekOnIndex() throws Exception { + TmfTraceContext context = fTrace.seekLocation(null); + + // On lower bound, returns the first event (ts = 1) + context = fTrace.seekEvent(0); + TmfEvent event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + // On higher bound + context = fTrace.seekEvent(NB_EVENTS - 1); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", NB_EVENTS, event.getTimestamp().getValue()); + + // Above high bound + context = fTrace.seekEvent(NB_EVENTS); + event = fTrace.getNextEvent(context); + assertEquals("Event", null, event); + } + + // ------------------------------------------------------------------------ // getNextEvent - // ======================================================================== + // ------------------------------------------------------------------------ public void testGetNextEvent() throws Exception { TmfTraceContext context = fTrace.seekLocation(null); @@ -177,17 +206,18 @@ public class TmfTraceTest extends TestCase { } } - // ======================================================================== + // ------------------------------------------------------------------------ // processRequest - // ======================================================================== + // ------------------------------------------------------------------------ - public void testProcessRequestForNbEvents() throws Exception { + @SuppressWarnings("unchecked") + public void testProcessRequestForNbEvents() throws Exception { final int BLOCK_SIZE = 100; final int NB_EVENTS = 1000; final Vector requestedEvents = new Vector(); TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); - final TmfDataRequest request = new TmfDataRequest(range, NB_EVENTS, BLOCK_SIZE) { + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) { @Override public void handleData() { TmfEvent[] events = getData(); @@ -196,7 +226,8 @@ public class TmfTraceTest extends TestCase { } } }; - fTrace.processRequest(request, true); + TmfProvider[] providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class); + providers[0].processRequest(request, true); assertEquals("nbEvents", NB_EVENTS, requestedEvents.size()); assertTrue("isCompleted", request.isCompleted()); @@ -209,13 +240,14 @@ public class TmfTraceTest extends TestCase { } } - public void testProcessRequestForAllEvents() throws Exception { + @SuppressWarnings("unchecked") + public void testProcessRequestForAllEvents() throws Exception { final int BLOCK_SIZE = 1; final Vector requestedEvents = new Vector(); // long nbExpectedEvents = NB_EVENTS; TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); - final TmfDataRequest request = new TmfDataRequest(range, NB_EVENTS, BLOCK_SIZE) { + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) { @Override public void handleData() { TmfEvent[] events = getData(); @@ -224,7 +256,8 @@ public class TmfTraceTest extends TestCase { } } }; - fTrace.processRequest(request, true); + TmfProvider[] providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class); + providers[0].processRequest(request, true); assertEquals("nbEvents", NB_EVENTS, requestedEvents.size()); assertTrue("isCompleted", request.isCompleted()); @@ -237,15 +270,16 @@ public class TmfTraceTest extends TestCase { } } - // ======================================================================== + // ------------------------------------------------------------------------ // cancel - // ======================================================================== + // ------------------------------------------------------------------------ - public void testCancel() throws Exception { + @SuppressWarnings("unchecked") + public void testCancel() throws Exception { final Vector requestedEvents = new Vector(); TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); - final TmfDataRequest request = new TmfDataRequest(range, NB_EVENTS, NB_EVENTS) { + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, NB_EVENTS) { @Override public void handleData() { TmfEvent[] events = getData(); @@ -256,10 +290,12 @@ public class TmfTraceTest extends TestCase { cancel(); } }; - fTrace.processRequest(request, true); + TmfProvider[] providers = (TmfProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class); + providers[0].processRequest(request, true); assertEquals("nbEvents", NB_EVENTS, requestedEvents.size()); assertTrue("isCompleted", request.isCompleted()); assertTrue("isCancelled", request.isCancelled()); } -} + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfProviderStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfProviderStub.java new file mode 100644 index 0000000000..b0131cd475 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfProviderStub.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.component; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.Path; +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.request.TmfDataRequest; +import org.eclipse.linuxtools.tmf.request.TmfEventRequest; +import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin; +import org.eclipse.linuxtools.tmf.trace.TmfTraceContext; +import org.eclipse.linuxtools.tmf.trace.TmfTraceStub; + +/** + * TmfProviderStub + *

+ * TODO: Implement me. Please. + */ +public class TmfProviderStub extends TmfProvider { + + private TmfTraceStub fTrace; + + public TmfProviderStub(String path) throws IOException { + super(TmfEvent.class); + URL location = FileLocator.find(TmfCoreTestPlugin.getPlugin().getBundle(), new Path(path), null); + try { + File test = new File(FileLocator.toFileURL(location).toURI()); + fTrace = new TmfTraceStub(test.getPath(), true); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + } + + @Override + public ITmfContext setContext(TmfDataRequest request) { + if (request instanceof TmfEventRequest) { + TmfTraceContext context = fTrace.seekEvent(((TmfEventRequest) request).getRange().getStartTime()); + return context; + } + return null; + } + + @Override + public TmfEvent getNext(ITmfContext context) { + return fTrace.getNext(context); + } + + @Override + public boolean isCompleted(TmfDataRequest request, TmfEvent event) { + TmfTimestamp endTime = ((TmfEventRequest) request).getRange().getEndTime(); + return event.getTimestamp().compareTo(endTime, false) <= 0; + } + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/request/TmfRequestHandlerStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/request/TmfRequestHandlerStub.java deleted file mode 100644 index 2d56c1fae9..0000000000 --- a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/request/TmfRequestHandlerStub.java +++ /dev/null @@ -1,94 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009 Ericsson - * - * All rights reserved. This program and the accompanying materials are - * made available under the terms of the Eclipse Public License v1.0 which - * accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Francois Chouinard - Initial API and implementation - *******************************************************************************/ - -package org.eclipse.linuxtools.tmf.request; - -import java.io.File; -import java.io.IOException; -import java.util.Vector; - -import org.eclipse.linuxtools.tmf.event.TmfEvent; -import org.eclipse.linuxtools.tmf.event.TmfTimestamp; -import org.eclipse.linuxtools.tmf.trace.TmfTraceContext; -import org.eclipse.linuxtools.tmf.trace.TmfTraceStub; - -/** - * TmfRequestHandlerStub - *

- * TODO: Implement me. Please. - */ -public class TmfRequestHandlerStub implements ITmfRequestHandler { - - // The test file - private static final String TEST_STREAM = "M-Test-100K"; - - // A constant to limit the number of events for the tests - public static final int MAX_GENERATED_EVENTS = 1000; - - private TmfTraceStub fTrace; - - public TmfRequestHandlerStub() throws IOException { - String directory = new File(".").getCanonicalPath() + File.separator + "testfiles"; - String filename = directory + File.separator + TEST_STREAM; - fTrace = new TmfTraceStub(filename); - } - - /* (non-Javadoc) - * @see org.eclipse.linuxtools.tmf.eventlog.ITmfRequestHandler#processRequest(org.eclipse.linuxtools.tmf.eventlog.TmfEventRequest, boolean) - */ - public void processRequest(final TmfDataRequest request, boolean waitForCompletion) { - - Thread thread = new Thread() { - @Override - public void run() { - TmfTimestamp startTime = request.getRange().getStartTime(); - TmfTimestamp endTime = request.getRange().getEndTime(); - int blockSize = request.getBlockize(); - - int nbRequestedEvents = request.getNbRequestedEvents(); - if (nbRequestedEvents <= 0) { - nbRequestedEvents = MAX_GENERATED_EVENTS; - } - - Vector events = new Vector(); - int nbEvents = 0; - TmfTraceContext context = fTrace.seekEvent(startTime); - TmfEvent event = fTrace.getNextEvent(context); - while (!request.isCancelled() && nbEvents < nbRequestedEvents && - event != null && event.getTimestamp().compareTo(endTime, false) <= 0 ) - { - events.add(event); - if (++nbEvents % blockSize == 0) { - TmfEvent[] result = new TmfEvent[events.size()]; - events.toArray(result); - request.setData(result); - request.handleData(); - events.removeAllElements(); - } - event = fTrace.getNextEvent(context); - } - TmfEvent[] result = new TmfEvent[events.size()]; - events.toArray(result); - - request.setData(result); - request.handleData(); - request.done(); - } - }; - thread.start(); - - if (waitForCompletion) { - request.waitForCompletion(); - } - } - -} diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfEventParserStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfEventParserStub.java index 0196766d3f..0370b5bcdb 100644 --- a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfEventParserStub.java +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfEventParserStub.java @@ -23,6 +23,7 @@ import org.eclipse.linuxtools.tmf.event.TmfEventReference; import org.eclipse.linuxtools.tmf.event.TmfEventSource; import org.eclipse.linuxtools.tmf.event.TmfEventType; import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.parser.ITmfEventParser; /** * TmfEventParserStub @@ -31,16 +32,16 @@ import org.eclipse.linuxtools.tmf.event.TmfTimestamp; */ public class TmfEventParserStub implements ITmfEventParser { - // ======================================================================== + // ------------------------------------------------------------------------ // Attributes - // ======================================================================== + // ------------------------------------------------------------------------ private final int NB_TYPES = 10; private final TmfEventType[] fTypes; - // ======================================================================== + // ------------------------------------------------------------------------ // Constructors - // ======================================================================== + // ------------------------------------------------------------------------ public TmfEventParserStub() { fTypes = new TmfEventType[NB_TYPES]; @@ -54,9 +55,9 @@ public class TmfEventParserStub implements ITmfEventParser { } } - // ======================================================================== + // ------------------------------------------------------------------------ // Operators - // ======================================================================== + // ------------------------------------------------------------------------ static final String typePrefix = "Type-"; public TmfEvent parseNextEvent(ITmfTrace eventStream, TmfTraceContext context) throws IOException { @@ -88,10 +89,6 @@ public class TmfEventParserStub implements ITmfEventParser { fields[i] = stream.readUTF(); } - // Update the context - context.setLocation(stream.getFilePointer()); - context.incrIndex(); - String content = "["; if (typeIndex > 0) { content += fields[0]; @@ -115,4 +112,4 @@ public class TmfEventParserStub implements ITmfEventParser { return null; } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfTraceStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfTraceStub.java index 3ec8f15af0..f391fea8dd 100644 --- a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfTraceStub.java +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfTraceStub.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -17,17 +17,18 @@ import java.io.IOException; import java.io.RandomAccessFile; import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.parser.ITmfEventParser; /** * TmfTraceStub *

* Dummy test trace. Use in conjunction with TmfEventParserStub. */ -public class TmfTraceStub extends TmfTrace { +public class TmfTraceStub extends TmfTrace { - // ======================================================================== + // ------------------------------------------------------------------------ // Attributes - // ======================================================================== + // ------------------------------------------------------------------------ // The actual stream private final RandomAccessFile fTrace; @@ -35,9 +36,9 @@ public class TmfTraceStub extends TmfTrace { // The associated event parser private final ITmfEventParser fParser; - // ======================================================================== + // ------------------------------------------------------------------------ // Constructors - // ======================================================================== + // ------------------------------------------------------------------------ /** * @param filename @@ -49,19 +50,19 @@ public class TmfTraceStub extends TmfTrace { /** * @param filename + * @param cacheSize * @throws FileNotFoundException */ - public TmfTraceStub(String filename, boolean waitForCompletion) throws FileNotFoundException { - this(filename, DEFAULT_CACHE_SIZE, waitForCompletion); + public TmfTraceStub(String filename, int cacheSize) throws FileNotFoundException { + this(filename, cacheSize, false); } /** * @param filename - * @param cacheSize * @throws FileNotFoundException */ - public TmfTraceStub(String filename, int cacheSize) throws FileNotFoundException { - this(filename, cacheSize, false); + public TmfTraceStub(String filename, boolean waitForCompletion) throws FileNotFoundException { + this(filename, DEFAULT_CACHE_SIZE, waitForCompletion); } /** @@ -70,39 +71,40 @@ public class TmfTraceStub extends TmfTrace { * @throws FileNotFoundException */ public TmfTraceStub(String filename, int cacheSize, boolean waitForCompletion) throws FileNotFoundException { - super(filename, cacheSize, waitForCompletion); + super(TmfEvent.class, filename, cacheSize); fTrace = new RandomAccessFile(filename, "r"); fParser = new TmfEventParserStub(); - indexStream(); + indexTrace(waitForCompletion); } - // ======================================================================== + // ------------------------------------------------------------------------ // Accessors - // ======================================================================== + // ------------------------------------------------------------------------ public RandomAccessFile getStream() { return fTrace; } - // ======================================================================== + // ------------------------------------------------------------------------ // Operators - // ======================================================================== + // ------------------------------------------------------------------------ /* (non-Javadoc) * @see org.eclipse.linuxtools.tmf.eventlog.ITmfStreamLocator#seekLocation(java.lang.Object) */ public TmfTraceContext seekLocation(Object location) { - TmfTraceContext context = null; try { synchronized(fTrace) { + // Position the trace, read the event (to obtain its timestamp) + // and then re-position the trace (not great...) fTrace.seek((location != null) ? (Long) location : 0); - context = new TmfTraceContext(getCurrentLocation(), null, 0); + TmfTraceContext context = new TmfTraceContext(getCurrentLocation()); + return context; } } catch (IOException e) { - // TODO Auto-generated catch block e.printStackTrace(); } - return context; + return null; } /* (non-Javadoc) @@ -127,9 +129,6 @@ public class TmfTraceStub extends TmfTrace { try { // paserNextEvent updates the context TmfEvent event = fParser.parseNextEvent(this, context); - if (event != null) { - context.setTimestamp(event.getTimestamp()); - } return event; } catch (IOException e) { @@ -138,8 +137,4 @@ public class TmfTraceStub extends TmfTrace { return null; } - // ======================================================================== - // Helper functions - // ======================================================================== - -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/timeAnalysis/widgets/TmfTimeStatesCtrl.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/timeAnalysis/widgets/TmfTimeStatesCtrl.java index cf148e96ba..c15e49ff33 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/timeAnalysis/widgets/TmfTimeStatesCtrl.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/timeAnalysis/widgets/TmfTimeStatesCtrl.java @@ -16,7 +16,6 @@ package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/TmfEventsView.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/TmfEventsView.java index 3ef8ac325f..53d7e0ca84 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/TmfEventsView.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/TmfEventsView.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -14,15 +14,15 @@ package org.eclipse.linuxtools.tmf.ui.views; import org.eclipse.linuxtools.tmf.event.TmfEvent; import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.experiment.TmfExperiment; +import org.eclipse.linuxtools.tmf.experiment.TmfExperimentSelectedSignal; +import org.eclipse.linuxtools.tmf.experiment.TmfExperimentUpdatedSignal; import org.eclipse.linuxtools.tmf.request.TmfDataRequest; import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler; import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal; -import org.eclipse.linuxtools.tmf.trace.TmfExperiment; -import org.eclipse.linuxtools.tmf.trace.TmfExperimentSelectedSignal; -import org.eclipse.linuxtools.tmf.trace.TmfExperimentUpdatedSignal; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; @@ -41,14 +41,14 @@ import org.eclipse.swt.widgets.TableItem; */ public class TmfEventsView extends TmfView { - public static final String ID = "org.eclipse.linuxtools.tmf.ui.viewer.events"; + public static final String ID = "org.eclipse.linuxtools.tmf.ui.views.events"; - private TmfExperiment fExperiment; + private TmfExperiment fExperiment; private String fTitlePrefix; - // ======================================================================== + // ------------------------------------------------------------------------ // Table data - // ======================================================================== + // ------------------------------------------------------------------------ private Table fTable; @@ -59,7 +59,7 @@ public class TmfEventsView extends TmfView { private final String REFERENCE_COLUMN = "File"; private final String CONTENT_COLUMN = "Content"; private final String[] columnProperties = new String[] { - TIMESTAMP_COLUMN, + TIMESTAMP_COLUMN, SOURCE_COLUMN, TYPE_COLUMN, REFERENCE_COLUMN, @@ -87,18 +87,35 @@ public class TmfEventsView extends TmfView { new ColumnData(columnProperties[4], 100, SWT.LEFT) }; - // ======================================================================== + // ------------------------------------------------------------------------ + // Event cache + // ------------------------------------------------------------------------ + + private static final int DEFAULT_CACHE_SIZE = 1000; + private final int fCacheSize; + private TmfEvent[] cache = new TmfEvent[1]; + private int cacheStartIndex = 0; + private int cacheEndIndex = 0; + + // ------------------------------------------------------------------------ // Constructor - // ======================================================================== + // ------------------------------------------------------------------------ - public TmfEventsView() { + public TmfEventsView(int cacheSize) { super(); + fCacheSize = cacheSize; } - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) - */ - @Override + public TmfEventsView() { + this(DEFAULT_CACHE_SIZE); + } + + // ------------------------------------------------------------------------ + // ViewPart + // ------------------------------------------------------------------------ + + @SuppressWarnings("unchecked") + @Override public void createPartControl(Composite parent) { // Create a virtual table @@ -108,7 +125,6 @@ public class TmfEventsView extends TmfView { // Set the table layout GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true); - layoutData.horizontalSpan= columnData.length; fTable.setLayoutData(layoutData); // Some cosmetic enhancements @@ -116,59 +132,49 @@ public class TmfEventsView extends TmfView { fTable.setLinesVisible(true); // Set the columns - setColumnHeaders(fTable); + createColumnHeaders(fTable); // Handle the table item requests - fTable.addSelectionListener(new SelectionListener() { + fTable.addSelectionListener(new SelectionAdapter() { - public void widgetDefaultSelected(SelectionEvent e) { - // TODO Auto-generated method stub - } - - public void widgetSelected(SelectionEvent e) { - TmfTimestamp ts = extractTimestamp(fTable.getSelection()[0].getText()); - broadcastSignal(new TmfTimeSynchSignal(fTable, ts)); + public void widgetSelected(SelectionEvent e) { + TmfTimestamp ts = (TmfTimestamp) fTable.getSelection()[0].getData(); + broadcast(new TmfTimeSynchSignal(fTable, ts)); } }); // Handle the table item requests fTable.addListener(SWT.SetData, new Listener() { + public void handleEvent(Event event) { - TableItem item = (TableItem) event.item; + + TableItem item = (TableItem) event.item; final int index = fTable.indexOf(item); + // Note: this works because handleEvent() is called once for each row, in sequence if ((index >= cacheStartIndex ) && (index < cacheEndIndex)) { - item.setText(extractItemFields(cache[index - cacheStartIndex])); + int i = index - cacheStartIndex; + item.setText(extractItemFields(cache[i])); + item.setData(new TmfTimestamp(cache[i].getTimestamp())); return; } - - // *** TODO *** - // This is broken! - // - // This one fails to return any result : - // TmfDataRequest request = new TmfDataRequest(fExperiment.getTimeRange(), index, 1) { - // All these will return THE SAME RESULT! - // TmfDataRequest request = new TmfDataRequest(index, 1) { - // TmfDataRequest request = new TmfDataRequest(index+10, 1) { - // TmfDataRequest request = new TmfDataRequest(null, 1) { - // - // THIS IS ONLY A TEMPORARY FIX! - - TmfDataRequest request = new TmfDataRequest(index, 1) { + + TmfDataRequest request = new TmfDataRequest(TmfEvent.class, index, fCacheSize) { @Override public void handleData() { TmfEvent[] tmpEvent = getData(); if ( (tmpEvent != null) && (tmpEvent.length > 0) ) { cache = tmpEvent; + cacheStartIndex = index; + cacheEndIndex = index + cache.length; } -// cacheStartIndex = index; -// cacheEndIndex = index + cache.length; } }; fExperiment.processRequest(request, true); - if (cache[0] != null) { + if (cache[0] != null && cacheStartIndex == index) { item.setText(extractItemFields(cache[0])); + item.setData(new TmfTimestamp(cache[0].getTimestamp())); } } @@ -178,41 +184,18 @@ public class TmfEventsView extends TmfView { fTitlePrefix = getTitle(); // If an experiment is already selected, update the table - fExperiment = TmfExperiment.getCurrentExperiment(); + fExperiment = (TmfExperiment) TmfExperiment.getCurrentExperiment(); if (fExperiment != null) { experimentSelected(new TmfExperimentSelectedSignal(fTable, fExperiment)); } } - // Events cache - temporary stuff -// private final int CACHE_SIZE = 1; - private TmfEvent[] cache; - private int cacheStartIndex = 0; - private int cacheEndIndex = 0; - - - private TmfTimestamp extractTimestamp(String entry) { - TmfTimestamp ts = null; - - int pos = entry.indexOf('.'); - if (pos > 0) { - String integer = entry.substring(0, pos); - String fraction = entry.substring(pos + 1); - - byte exponent = (byte) -fraction.length(); - String value = integer + fraction; - ts = new TmfTimestamp(new Long(value), exponent); - } - - return ts; - } - /** * @param table * * FIXME: Add support for column selection */ - protected void setColumnHeaders(Table table) { + protected void createColumnHeaders(Table table) { for (int i = 0; i < columnData.length; i++) { TableColumn column = new TableColumn(table, columnData[i].alignment, i); column.setText(columnData[i].header); @@ -255,14 +238,15 @@ public class TmfEventsView extends TmfView { return "[TmfEventsView]"; } - // ======================================================================== + // ------------------------------------------------------------------------ // Signal handlers - // ======================================================================== + // ------------------------------------------------------------------------ + @SuppressWarnings("unchecked") @TmfSignalHandler public void experimentSelected(TmfExperimentSelectedSignal signal) { // Update the trace reference - fExperiment = signal.getExperiment(); + fExperiment = (TmfExperiment) signal.getExperiment(); setPartName(fTitlePrefix + " - " + fExperiment.getExperimentId()); // Perform the updates on the UI thread @@ -291,7 +275,7 @@ public class TmfEventsView extends TmfView { @TmfSignalHandler public void currentTimeUpdated(TmfTimeSynchSignal signal) { if (signal.getSource() != fTable && fExperiment != null) { - final int index = (int) fExperiment.getIndex(signal.getCurrentTime()); + final int index = (int) fExperiment.getRank(signal.getCurrentTime()); // Perform the updates on the UI thread fTable.getDisplay().asyncExec(new Runnable() { public void run() { @@ -311,4 +295,4 @@ public class TmfEventsView extends TmfView { } } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/TmfView.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/TmfView.java index ed8101d520..a11f9a799f 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/TmfView.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/TmfView.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -19,48 +19,49 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.part.ViewPart; /** - * TmfViewer + * TmfView *

* TODO: Implement me. Please. */ public abstract class TmfView extends ViewPart implements ITmfComponent { - /** - * Constructor - */ + // ------------------------------------------------------------------------ + // Constructor + // ------------------------------------------------------------------------ + public TmfView() { - TmfSignalManager.addListener(this); + super(); + register(); } - /** - * Destructor - */ - @Override - public void dispose() { - TmfSignalManager.removeListener(this); + // ------------------------------------------------------------------------ + // ITmfComponent + // ------------------------------------------------------------------------ + + public void register() { + TmfSignalManager.register(this); + } + + public void deregister() { + TmfSignalManager.deregister(this); } - /** - * broadcastSignal - */ - public void broadcastSignal(TmfSignal signal) { + public void broadcast(TmfSignal signal) { TmfSignalManager.dispatchSignal(signal); } - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) - */ + // ------------------------------------------------------------------------ + // ViewPart + // ------------------------------------------------------------------------ + @Override public void createPartControl(Composite parent) { // TODO Auto-generated method stub } - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#setFocus() - */ @Override public void setFocus() { // TODO Auto-generated method stub } -} +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf/META-INF/MANIFEST.MF b/org.eclipse.linuxtools.tmf/META-INF/MANIFEST.MF index 5b3079a97a..2ea69c6057 100644 --- a/org.eclipse.linuxtools.tmf/META-INF/MANIFEST.MF +++ b/org.eclipse.linuxtools.tmf/META-INF/MANIFEST.MF @@ -11,6 +11,8 @@ Bundle-ActivationPolicy: lazy Export-Package: org.eclipse.linuxtools.tmf, org.eclipse.linuxtools.tmf.component, org.eclipse.linuxtools.tmf.event, + org.eclipse.linuxtools.tmf.experiment, + org.eclipse.linuxtools.tmf.parser, org.eclipse.linuxtools.tmf.request, org.eclipse.linuxtools.tmf.signal, org.eclipse.linuxtools.tmf.trace diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/TmfCorePlugin.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/TmfCorePlugin.java index be83eb4a7f..dbed10b9b4 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/TmfCorePlugin.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/TmfCorePlugin.java @@ -21,9 +21,9 @@ import org.eclipse.core.runtime.Plugin; */ public class TmfCorePlugin extends Plugin { - // ======================================================================== + // ------------------------------------------------------------------------ // Attributes - // ======================================================================== + // ------------------------------------------------------------------------ // The plug-in ID public static final String PLUGIN_ID = "org.eclipse.linuxtools.tmf"; @@ -31,9 +31,9 @@ public class TmfCorePlugin extends Plugin { // The shared instance private static TmfCorePlugin plugin; - // ======================================================================== + // ------------------------------------------------------------------------ // Constructors - // ======================================================================== + // ------------------------------------------------------------------------ /** * The constructor @@ -42,9 +42,9 @@ public class TmfCorePlugin extends Plugin { plugin = this; } - // ======================================================================== + // ------------------------------------------------------------------------ // Accessors - // ======================================================================== + // ------------------------------------------------------------------------ /** * @return the shared instance diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/ITmfComponent.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/ITmfComponent.java index 3a0555b2df..ad20d0b47c 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/ITmfComponent.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/ITmfComponent.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -17,11 +17,27 @@ import org.eclipse.linuxtools.tmf.signal.TmfSignal; /** * ITmfComponent *

- * TODO: Implement me. Please. + * This is the basic interface of all the TMF components. + *

+ * Currently, it only addresses the inter-component signaling. */ public interface ITmfComponent { - public void dispose(); + /** + * Register to the signal manager + */ + public void register(); + + /** + * De-register from the signal manager + */ + public void deregister(); + + /** + * Broadcast a signal to all the interested listeners. + * + * @param signal + */ + public void broadcast(TmfSignal signal); - public void broadcastSignal(TmfSignal signal); } diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfTransform.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/ITmfContext.java similarity index 75% rename from org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfTransform.java rename to org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/ITmfContext.java index a666aaf5fc..142b0d42b1 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfTransform.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/ITmfContext.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -13,10 +13,11 @@ package org.eclipse.linuxtools.tmf.component; /** - * TmfTransform + * ITmfContext *

- * TODO: Implement me. Please. + * This is a place-holder for the context objects. */ -public abstract class TmfTransform extends TmfComponent implements ITmfTransform { +public interface ITmfContext { + public ITmfContext clone(); } diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/ITmfTransform.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/ITmfTransform.java deleted file mode 100644 index 07cc70a64f..0000000000 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/ITmfTransform.java +++ /dev/null @@ -1,26 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009 Ericsson - * - * All rights reserved. This program and the accompanying materials are - * made available under the terms of the Eclipse Public License v1.0 which - * accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Francois Chouinard - Initial API and implementation - *******************************************************************************/ - -package org.eclipse.linuxtools.tmf.component; - -/** - * ITmfTransform - *

- * TODO: Implement me. Please. - */ -public interface ITmfTransform extends ITmfComponent { - - /** - * - */ - public void transformData(); -} diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfComponent.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfComponent.java index a9e9aab593..fbedd776f1 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfComponent.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfComponent.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -18,18 +18,43 @@ import org.eclipse.linuxtools.tmf.signal.TmfSignalManager; /** * TmfComponent *

+ * This is the base class of the TMF components. + *

+ * Currently, it only addresses the inter-component signaling. */ public abstract class TmfComponent implements ITmfComponent { + // ------------------------------------------------------------------------ + // Constructor + // ------------------------------------------------------------------------ + public TmfComponent() { - TmfSignalManager.addListener(this); + register(); + } + + // ------------------------------------------------------------------------ + // ITmfComponent + // ------------------------------------------------------------------------ + + /* (non-Javadoc) + * @see org.eclipse.linuxtools.tmf.component.ITmfComponent#register() + */ + public void register() { + TmfSignalManager.register(this); } - public void dispose() { - TmfSignalManager.removeListener(this); + /* (non-Javadoc) + * @see org.eclipse.linuxtools.tmf.component.ITmfComponent#deregister() + */ + public void deregister() { + TmfSignalManager.deregister(this); } - public void broadcastSignal(TmfSignal signal) { + /* (non-Javadoc) + * @see org.eclipse.linuxtools.tmf.component.ITmfComponent#broadcast(org.eclipse.linuxtools.tmf.signal.TmfSignal) + */ + public void broadcast(TmfSignal signal) { TmfSignalManager.dispatchSignal(signal); } + } diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfProvider.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfProvider.java new file mode 100644 index 0000000000..9f868a8028 --- /dev/null +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfProvider.java @@ -0,0 +1,170 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.component; + +import java.lang.reflect.Array; +import java.util.Vector; + +import org.eclipse.linuxtools.tmf.event.TmfData; +import org.eclipse.linuxtools.tmf.request.ITmfRequestHandler; +import org.eclipse.linuxtools.tmf.request.TmfDataRequest; + +/** + * TmfProvider + *

+ * The TmfProvider is a provider for a data of type . + *

+ * This abstract class implements the housekeeking methods to register/ + * deregister the event provider and to handle generically the event requests. + *

+ * The concrete class can either re-implement processRequest() entirely or + * just implement the hooks (initializeContext() and getNext()). + *

+ * TODO: Add support for providing multiple data types. + */ +public abstract class TmfProvider extends TmfComponent implements ITmfRequestHandler { + + private Class fType; + + // ------------------------------------------------------------------------ + // Constructors (enforce that a type be supplied) + // ------------------------------------------------------------------------ + + @SuppressWarnings("unused") + private TmfProvider() { + } + + @SuppressWarnings("unused") + private TmfProvider(TmfProvider other) { + } + + protected TmfProvider(Class type) { + fType = type; + register(); + } + + @Override + public void register() { + super.register(); + TmfProviderManager.register(fType, this); + } + + @Override + public void deregister() { + TmfProviderManager.deregister(fType, this); + super.deregister(); + } + + // ------------------------------------------------------------------------ + // ITmfRequestHandler + // ------------------------------------------------------------------------ + + // TODO: Request coalescing, filtering, result dispatching + + public void processRequest(final TmfDataRequest request, boolean waitForCompletion) { + + //Process the request + processDataRequest(request); + + // Wait for completion if needed + if (waitForCompletion) { + request.waitForCompletion(); + } + } + + protected void processDataRequest(final TmfDataRequest request) { + + // Process the request + Thread thread = new Thread() { + + @Override + public void run() { + + // Extract the generic information + int blockSize = request.getBlockize(); + int nbRequested = request.getNbRequested(); + + // Create the result buffer + Vector result = new Vector(); + int nbRead = 0; + + // Initialize the execution + ITmfContext context = setContext(request); + + // Get the ordered events + T data = getNext(context); + while (data != null && !request.isCancelled() && nbRead < nbRequested && !isCompleted(request, data)) + { + result.add(data); + if (++nbRead % blockSize == 0) { + pushData(request, result); + } + // To avoid an unnecessary read passed the last data requested + if (nbRead < nbRequested) + data = getNext(context); + } + pushData(request, result); + request.done(); + } + }; + thread.start(); + } + + /** + * Format the result data and forwards it to the requester. + * Note: after handling, the data is *removed*. + * + * @param request + * @param data + */ + @SuppressWarnings("unchecked") + private void pushData(TmfDataRequest request, Vector data) { + synchronized(request) { + if (!request.isCompleted()) { + T[] result = (T[]) Array.newInstance(fType, data.size()); + data.toArray(result); + request.setData(result); + request.handleData(); + data.removeAllElements(); + } + } + } + + /** + * Initialize the provider based on the request. The context is + * application specific and will be updated by getNext(). + * + * @param request + * @return + */ + public abstract ITmfContext setContext(TmfDataRequest request); + + /** + * Return the next piece of data based on the context supplied. The context + * would typically be updated for the subsequent read. + * + * @param context + * @return + */ + public abstract T getNext(ITmfContext context); + + /** + * Checks if the data meets the request completion criteria. + * + * @param request + * @param data + * @return + */ + public abstract boolean isCompleted(TmfDataRequest request, T data); + +} diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfProviderManager.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfProviderManager.java index 0b71a53a36..936545530d 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfProviderManager.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfProviderManager.java @@ -26,18 +26,12 @@ import org.eclipse.linuxtools.tmf.event.TmfData; */ public class TmfProviderManager { - // ------------------------------------------------------------------------ - // No constructor - // ------------------------------------------------------------------------ - - private TmfProviderManager() {} - // ------------------------------------------------------------------------ // Keeps track of the providers for each event type // ------------------------------------------------------------------------ - private static Map, List>> fProviders = - new HashMap, List>>(); + private static Map, List>> fProviders = + new HashMap, List>>(); /** * Registers [provider] as a provider of [eventType] @@ -45,39 +39,40 @@ public class TmfProviderManager { * @param eventType * @param provider */ - public static void register(Class eventType, TmfDataProvider provider) { + public static void register(Class eventType, TmfProvider provider) { if (fProviders.get(eventType) == null) - fProviders.put(eventType, new ArrayList>()); + fProviders.put(eventType, new ArrayList>()); + assert(fProviders.get(eventType) != null); fProviders.get(eventType).add(provider); } /** * Re-registers [provider] as a provider of [eventType] * - * @param dataClass + * @param eventType * @param provider */ - public static void deregister(Class dataClass, TmfDataProvider provider) { - List> list = fProviders.get(dataClass); + public static void deregister(Class eventType, TmfProvider provider) { + List> list = fProviders.get(eventType); if (list != null) { list.remove(provider); if (list.size() == 0) - fProviders.remove(dataClass); + fProviders.remove(eventType); } } /** * Returns the list of components that provide [eventType] * - * @param dataClass + * @param eventType * @return */ @SuppressWarnings("unchecked") - public static TmfDataProvider[] getProviders(Class dataClass) { - List> list = fProviders.get(dataClass); + public static TmfProvider[] getProviders(Class eventType) { + List> list = fProviders.get(eventType); if (list == null) - list = new ArrayList>(); - TmfDataProvider[] result = new TmfDataProvider[list.size()]; + list = new ArrayList>(); + TmfProvider[] result = new TmfProvider[list.size()]; return list.toArray(result); } @@ -89,20 +84,17 @@ public class TmfProviderManager { * @return */ @SuppressWarnings("unchecked") - public static TmfDataProvider[] getProviders(Class dataClass, Class> providerClass) { - if (providerClass == null) { - return getProviders(dataClass); - } - TmfDataProvider[] list = getProviders(dataClass); - List> result = new ArrayList>(); + public static TmfProvider[] getProviders(Class eventType, Class> providerType) { + TmfProvider[] list = getProviders(eventType); + List> result = new ArrayList>(); if (list != null) { - for (TmfDataProvider provider : list) { - if (provider.getClass() == providerClass) { + for (TmfProvider provider : list) { + if (provider.getClass() == providerType) { result.add(provider); } } } - TmfDataProvider[] array = new TmfDataProvider[result.size()]; + TmfProvider[] array = new TmfProvider[result.size()]; return result.toArray(array); } diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/event/TmfTimestamp.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/event/TmfTimestamp.java index cefc7a5714..9172a5eeb9 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/event/TmfTimestamp.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/event/TmfTimestamp.java @@ -53,6 +53,7 @@ public class TmfTimestamp implements Cloneable { // The beginning and end of time public static final TmfTimestamp BigBang = new TmfTimestamp(Long.MIN_VALUE, Byte.MAX_VALUE, 0); public static final TmfTimestamp BigCrunch = new TmfTimestamp(Long.MAX_VALUE, Byte.MAX_VALUE, 0); + public static final TmfTimestamp Zero = new TmfTimestamp(0, (byte) 0, 0); // ======================================================================== // Constructors diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperiment.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperiment.java index cfeed550c6..62f5e777e5 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperiment.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperiment.java @@ -12,27 +12,23 @@ package org.eclipse.linuxtools.tmf.experiment; -import java.util.Collections; import java.util.Vector; -import org.eclipse.linuxtools.tmf.component.TmfEventProvider; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.linuxtools.tmf.component.ITmfContext; +import org.eclipse.linuxtools.tmf.component.TmfProvider; import org.eclipse.linuxtools.tmf.event.TmfEvent; import org.eclipse.linuxtools.tmf.event.TmfTimeRange; import org.eclipse.linuxtools.tmf.event.TmfTimestamp; -import org.eclipse.linuxtools.tmf.request.ITmfDataRequest; -import org.eclipse.linuxtools.tmf.request.ITmfEventRequest; import org.eclipse.linuxtools.tmf.request.TmfDataRequest; import org.eclipse.linuxtools.tmf.request.TmfEventRequest; -import org.eclipse.linuxtools.tmf.signal.TmfExperimentSelectedSignal; -import org.eclipse.linuxtools.tmf.signal.TmfExperimentUpdatedSignal; import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler; -import org.eclipse.linuxtools.tmf.signal.TmfSignalManager; -import org.eclipse.linuxtools.tmf.signal.TmfTraceUpdatedSignal; -import org.eclipse.linuxtools.tmf.trace.ITmfContext; -import org.eclipse.linuxtools.tmf.trace.ITmfLocation; import org.eclipse.linuxtools.tmf.trace.ITmfTrace; -import org.eclipse.linuxtools.tmf.trace.TmfCheckpoint; -import org.eclipse.linuxtools.tmf.trace.TmfContext; +import org.eclipse.linuxtools.tmf.trace.TmfTraceContext; +import org.eclipse.linuxtools.tmf.trace.TmfTraceUpdatedSignal; /** * TmfExperiment @@ -41,20 +37,28 @@ import org.eclipse.linuxtools.tmf.trace.TmfContext; * that are part of a tracing experiment. *

*/ -public class TmfExperiment extends TmfEventProvider implements ITmfTrace { +public class TmfExperiment extends TmfProvider { + +// TODO: Complete multi-trace experiment +// TODO: Add support for dynamic addition/removal of traces +// TODO: Add support for live streaming (notifications, incremental indexing, ...) +// TODO: Implement indexing-on-demand // ------------------------------------------------------------------------ // Attributes // ------------------------------------------------------------------------ // The currently selected experiment - private static TmfExperiment fCurrentExperiment = null; + private static TmfExperiment fCurrentExperiment; + + // The experiment ID + private String fExperimentId; - // The set of traces that constitute the experiment - private ITmfTrace[] fTraces; + // The set of trace sthat constitute the experiment + private Vector fTraces; // The total number of events - private long fNbEvents; + private int fNbEvents; // The experiment time range private TmfTimeRange fTimeRange; @@ -62,9 +66,6 @@ public class TmfExperiment extends TmfEventProvider imple // The experiment reference timestamp (default: BigBang) private TmfTimestamp fEpoch; - // The experiment index - private Vector fCheckpoints = new Vector(); - // ------------------------------------------------------------------------ // Constructors // ------------------------------------------------------------------------ @@ -77,16 +78,19 @@ public class TmfExperiment extends TmfEventProvider imple * @param indexPageSize */ public TmfExperiment(Class type, String id, ITmfTrace[] traces, TmfTimestamp epoch, int indexPageSize) { - super(id, type); + super(type); - fTraces = traces; + fExperimentId = id; + fTraces = new Vector(); + for (ITmfTrace trace : traces) { + fTraces.add(trace); + } fEpoch = epoch; fIndexPageSize = indexPageSize; - fClone = createTraceCopy(); updateNbEvents(); updateTimeRange(); - } + } /** * @param type @@ -106,103 +110,57 @@ public class TmfExperiment extends TmfEventProvider imple public TmfExperiment(Class type, String id, ITmfTrace[] traces, int indexPageSize) { this(type, id, traces, TmfTimestamp.Zero, indexPageSize); } - - public TmfExperiment(TmfExperiment other) { - super(other.getName() + "(clone)", other.fType); - - fEpoch = other.fEpoch; - fIndexPageSize = other.fIndexPageSize; - - fTraces = new ITmfTrace[other.fTraces.length]; - for (int trace = 0; trace < other.fTraces.length; trace++) { - fTraces[trace] = other.fTraces[trace].createTraceCopy(); - } - - fNbEvents = other.fNbEvents; - fTimeRange = other.fTimeRange; - fClone = null; - } - - public TmfExperiment createTraceCopy() { - TmfExperiment experiment = new TmfExperiment(this); - TmfSignalManager.deregister(experiment); - return experiment; - } - + /** - * Clears the experiment + * */ @Override - public void dispose() { - for (ITmfTrace trace : fTraces) { - trace.dispose(); - } - fTraces = null; - fCheckpoints.clear(); - super.dispose(); - } - - private static void setCurrentExperiment(TmfExperiment experiment) { - fCurrentExperiment = experiment; + public void deregister() { + fTraces.clear(); + fCurrentExperiment= null; + super.deregister(); } // ------------------------------------------------------------------------ - // ITmfTrace + // Accessors // ------------------------------------------------------------------------ - public String getPath() { - return null; - } - - public long getNbEvents() { - return fNbEvents; - } - - public int getCacheSize() { - return fIndexPageSize; + public static TmfExperiment getCurrentExperiment() { + return fCurrentExperiment; } - public TmfTimeRange getTimeRange() { - return fTimeRange; - } - - public TmfTimestamp getStartTime() { - return fTimeRange.getStartTime(); - } - - public TmfTimestamp getEndTime() { - return fTimeRange.getEndTime(); - } - - public Vector getCheckpoints() { - return fCheckpoints; + public String getExperimentId() { + return fExperimentId; } - // ------------------------------------------------------------------------ - // Accessors - // ------------------------------------------------------------------------ - - public static TmfExperiment getCurrentExperiment() { - return fCurrentExperiment; + public ITmfTrace[] getTraces() { + ITmfTrace[] result = new ITmfTrace[fTraces.size()]; + return fTraces.toArray(result); } public TmfTimestamp getEpoch() { return fEpoch; } - public ITmfTrace[] getTraces() { - return fTraces; + public TmfTimeRange getTimeRange() { + return fTimeRange; + } + + public int getNbEvents() { + return fNbEvents; } /** * Returns the rank of the first event with the requested timestamp. * If none, returns the index of the next event (if any). * - * @param timestamp + * @param ts * @return */ - public long getRank(TmfTimestamp timestamp) { - TmfExperimentContext context = seekEvent(timestamp); + public long getRank(TmfTimestamp ts) { + // FIXME: Go over all the traces + ITmfTrace trace = fTraces.firstElement(); + TmfTraceContext context = trace.seekEvent(ts); return context.getRank(); } @@ -214,15 +172,31 @@ public class TmfExperiment extends TmfEventProvider imple * @return */ public TmfTimestamp getTimestamp(int index) { - TmfExperimentContext context = seekEvent(index); - TmfEvent event = getNextEvent(context); - return (event != null) ? event.getTimestamp() : null; + // FIXME: Go over all the traces + ITmfTrace trace = fTraces.firstElement(); + TmfTraceContext context = trace.seekEvent(index); + TmfEvent event = trace.getNextEvent(context); + TmfTimestamp ts = (event != null) ? event.getTimestamp() : null; + return ts; } // ------------------------------------------------------------------------ // Operators // ------------------------------------------------------------------------ + /** + * Add a trace to the experiment trace set + * + * @param trace + */ + public void addTrace(ITmfTrace trace) { + fTraces.add(trace); + synchronized(this) { + updateNbEvents(); + updateTimeRange(); + } + } + /** * Update the total number of events */ @@ -242,15 +216,13 @@ public class TmfExperiment extends TmfEventProvider imple TmfTimestamp endTime = fTimeRange != null ? fTimeRange.getEndTime() : TmfTimestamp.BigBang; for (ITmfTrace trace : fTraces) { - if (trace.getNbEvents() > 0) { - TmfTimestamp traceStartTime = trace.getStartTime(); - if (traceStartTime.compareTo(startTime, true) < 0) - startTime = traceStartTime; - - TmfTimestamp traceEndTime = trace.getEndTime(); - if (traceEndTime.compareTo(endTime, true) > 0) - endTime = traceEndTime; - } + TmfTimestamp traceStartTime = trace.getStartTime(); + if (traceStartTime.compareTo(startTime, true) < 0) + startTime = traceStartTime; + + TmfTimestamp traceEndTime = trace.getEndTime(); + if (traceEndTime.compareTo(endTime, true) > 0) + endTime = traceEndTime; } fTimeRange = new TmfTimeRange(startTime, endTime); } @@ -260,11 +232,9 @@ public class TmfExperiment extends TmfEventProvider imple // ------------------------------------------------------------------------ @Override - public ITmfContext armRequest(ITmfDataRequest request) { - TmfTimestamp timestamp = (request instanceof ITmfEventRequest) ? - ((ITmfEventRequest) request).getRange().getStartTime() : null; - TmfExperimentContext context = (timestamp != null) ? - seekEvent(timestamp) : seekEvent(request.getIndex()); + public ITmfContext setContext(TmfDataRequest request) { + TmfExperimentContext context = new TmfExperimentContext(fTraces); + positionTraces(request.getIndex(), context); return context; } @@ -277,132 +247,56 @@ public class TmfExperiment extends TmfEventProvider imple return null; } - // ------------------------------------------------------------------------ - // ITmfTrace trace positioning - // ------------------------------------------------------------------------ - - // Returns a brand new context based on the location provided - // and initializes the event queues - public TmfExperimentContext seekLocation(ITmfLocation location) { - - // Validate the location - if (location != null && !(location instanceof TmfExperimentLocation)) { - return null; // Throw an exception? - } - - // Instantiate the location - TmfExperimentLocation expLocation = (location == null) - ? new TmfExperimentLocation(new ITmfLocation[fTraces.length], new long[fTraces.length]) - : (TmfExperimentLocation) location.clone(); - - // Create and populate the context's traces contexts - TmfExperimentContext context = new TmfExperimentContext(fTraces, new TmfContext[fTraces.length]); - long rank = 0; - for (int i = 0; i < fTraces.length; i++) { - // Get the relevant trace attributes - ITmfLocation traceLocation = expLocation.getLocation()[i]; - long traceRank = expLocation.getRanks()[i]; - - // Set the corresponding sub-context - context.getContexts()[i] = fTraces[i].seekLocation(traceLocation); - context.getContexts()[i].setRank(traceRank); - rank += traceRank; - - // Set the trace location and read the corresponding event - expLocation.getLocation()[i] = context.getContexts()[i].getLocation(); - context.getEvents()[i] = fTraces[i].getNextEvent(context.getContexts()[i]); + @Override + public boolean isCompleted(TmfDataRequest request, T data) { + if (request instanceof TmfEventRequest && data != null) { + return data.getTimestamp().compareTo(((TmfEventRequest) request).getRange().getEndTime(), false) > 0; } - - // Finalize context - context.setLocation(expLocation); - context.setRank(rank); - context.setLastTrace(TmfExperimentContext.NO_TRACE); - return context; + return false; } - /* (non-Javadoc) - * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#seekEvent(org.eclipse.linuxtools.tmf.event.TmfTimestamp) + /** + * Given an experiment event index, position the set of traces so a call + * to getNextEvent() will retrieve the corresponding event. + * + * @param index + * @param context */ - public TmfExperimentContext seekEvent(TmfTimestamp timestamp) { + private synchronized void positionTraces(long index, TmfExperimentContext context) { - if (timestamp == null) { - timestamp = TmfTimestamp.BigBang; - } + // Extract the relevant information + ITmfTrace[] traces = context.getTraces(); + TmfEvent[] events = context.getEvents(); + TmfTraceContext[] contexts = context.getContexts(); - // First, find the right checkpoint - int index = Collections.binarySearch(fCheckpoints, new TmfCheckpoint(timestamp, null)); - - // In the very likely case that the checkpoint was not found, bsearch - // returns its negated would-be location (not an offset...). From that - // index, we can then position the stream and get the event. - if (index < 0) { - index = Math.max(0, -(index + 2)); - } - - // Position the experiment at the checkpoint - ITmfLocation location; - synchronized (fCheckpoints) { - if (fCheckpoints.size() > 0) { - if (index >= fCheckpoints.size()) { - index = fCheckpoints.size() - 1; - } - location = fCheckpoints.elementAt(index).getLocation(); - } - else { - location = null; - } - } - - TmfExperimentContext context = seekLocation(location); - context.setRank((long) index * fIndexPageSize); - - // And locate the event - TmfExperimentContext nextEventContext = new TmfExperimentContext(context); - TmfEvent event = getNextEvent(nextEventContext); - while (event != null && event.getTimestamp().compareTo(timestamp, false) < 0) { - context = new TmfExperimentContext(nextEventContext); - event = getNextEvent(nextEventContext); - } - context.setLastTrace(TmfExperimentContext.NO_TRACE); - - return context; - } + int page = 0; // The checkpoint page + int current = 0; // The current event index (rank) - /* (non-Javadoc) - * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#seekEvent(long) - */ - public TmfExperimentContext seekEvent(long rank) { - - // Position the stream at the previous checkpoint - int index = (int) rank / fIndexPageSize; - ITmfLocation location; - synchronized (fCheckpoints) { - if (fCheckpoints.size() == 0) { - location = null; - } - else { - if (index >= fCheckpoints.size()) { - index = fCheckpoints.size() - 1; - } - location = fCheckpoints.elementAt(index).getLocation(); - } - } - - TmfExperimentContext context = seekLocation(location); - long pos = (long) index * fIndexPageSize; - context.setRank(pos); - - // And locate the event - TmfExperimentContext nextEventContext = new TmfExperimentContext(context); - TmfEvent event = getNextEvent(nextEventContext); - while (event != null && pos++ < rank) { - event = getNextEvent(nextEventContext); - context = new TmfExperimentContext(nextEventContext); - if (event != null) context.updateRank(-1); - } - context.setLastTrace(TmfExperimentContext.NO_TRACE); - - return context; + // If there is no checkpoint created yet, start from the beginning + if (fExperimentIndex.size() == 0) { + for (int i = 0; i < contexts.length; i++) { + contexts[i] = traces[i].seekLocation(null).clone(); + events[i] = traces[i].parseEvent(contexts[i]); + } + } + else { + page = (int) index / fIndexPageSize; + if (page >= fExperimentIndex.size()) { + page = fExperimentIndex.size() - 1; + } + + TmfTraceContext[] checkpoint = fExperimentIndex.elementAt(page).getContexts(); + for (int i = 0; i < contexts.length; i++) { + contexts[i] = checkpoint[i].clone(); + events[i] = traces[i].parseEvent(contexts[i]); + } + current = page * fIndexPageSize; + } + + // Position the traces at the requested index + while (current++ < index) { + getNextEvent(context); + } } /** @@ -412,103 +306,51 @@ public class TmfExperiment extends TmfEventProvider imple * @param context * @return */ - public synchronized TmfEvent getNextEvent(TmfContext context) { - - // Validate the context - if (!(context instanceof TmfExperimentContext)) { - return null; // Throw an exception? - } - - TmfExperimentContext expContext = (TmfExperimentContext) context; - - // If an event was consumed previously, get the next one from that trace - int lastTrace = expContext.getLastTrace(); - if (lastTrace != TmfExperimentContext.NO_TRACE) { - TmfContext traceContext = expContext.getContexts()[lastTrace]; - expContext.getEvents()[lastTrace] = expContext.getTraces()[lastTrace].getNextEvent(traceContext); - } - - // Scan the candidate events and identify the "next" trace to read from - int trace = TmfExperimentContext.NO_TRACE; + private TmfEvent getNextEvent(TmfExperimentContext context) { + // TODO: Consider the time adjustment + int trace = 0; TmfTimestamp timestamp = TmfTimestamp.BigCrunch; - for (int i = 0; i < expContext.getTraces().length; i++) { - TmfEvent event = expContext.getEvents()[i]; - if (event != null && event.getTimestamp() != null) { - TmfTimestamp otherTS = event.getTimestamp(); + if (context.getEvents()[trace] != null) { + timestamp = context.getEvents()[trace].getTimestamp(); + } + for (int i = 1; i < context.getTraces().length; i++) { + if (context.getEvents()[i].getTimestamp() != null) { + TmfTimestamp otherTS = context.getEvents()[i].getTimestamp(); if (otherTS.compareTo(timestamp, true) < 0) { trace = i; timestamp = otherTS; } } } - - // Update the experiment context and set the "next" event - TmfEvent event = null; - if (trace >= 0) { - long savedRank = expContext.getRank(); - expContext.setLastTrace(trace); - expContext.updateRank(1); - TmfExperimentLocation expLocation = (TmfExperimentLocation) expContext.getLocation(); - TmfContext traceContext = expContext.getContexts()[trace]; - expLocation.getLocation()[trace] = traceContext.getLocation().clone(); - expLocation.getRanks()[trace] = traceContext.getRank(); - event = expContext.getEvents()[trace]; - updateIndex(expContext, savedRank, timestamp); - } - + TmfEvent event = context.getTraces()[trace].getNextEvent(context.getContexts()[trace]); + context.getEvents()[trace] = context.getTraces()[trace].parseEvent(context.getContexts()[trace]); return event; } - public synchronized void updateIndex(ITmfContext context, long rank, TmfTimestamp timestamp) { - // Build the index as we go along - if (context.isValidRank() && (rank % fIndexPageSize) == 0) { - // Determine the table position - long position = context.getRank() / fIndexPageSize; - // Add new entry at proper location (if empty) - if (fCheckpoints.size() == position) { - ITmfLocation location = context.getLocation().clone(); - fCheckpoints.add(new TmfCheckpoint(timestamp, location)); -// System.out.println(this + "[" + (fCheckpoints.size() - 1) + "] " + timestamp + ", " + location.toString()); - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#parseEvent(org.eclipse.linuxtools.tmf.trace.TmfContext) + /** + * Scan the next events from all traces and return the next one + * in chronological order. + * + * @param context + * @return */ - public TmfEvent parseEvent(TmfContext context) { - - if (context instanceof TmfExperimentContext) { - TmfExperimentContext expContext = (TmfExperimentContext) context; - int lastTrace = expContext.getLastTrace(); - if (lastTrace != -1) { - TmfContext traceContext = expContext.getContexts()[lastTrace]; - expContext.getEvents()[lastTrace] = expContext.getTraces()[lastTrace].getNextEvent(traceContext); - expContext.updateRank(1); - TmfExperimentLocation expLocation = (TmfExperimentLocation) expContext.getLocation(); - expLocation.getLocation()[lastTrace] = traceContext.getLocation().clone(); - } - - int trace = -1; - TmfTimestamp timestamp = TmfTimestamp.BigCrunch; - for (int i = 0; i < expContext.getTraces().length; i++) { - if (expContext.getEvents()[i] != null) { - if (expContext.getEvents()[i].getTimestamp() != null) { - TmfTimestamp otherTS = expContext.getEvents()[i].getTimestamp(); - if (otherTS.compareTo(timestamp, true) < 0) { - trace = i; - timestamp = otherTS; - } - } + private TmfTimestamp getNextEventTimestamp(TmfExperimentContext context) { + // TODO: Consider the time adjustment + int trace = 0; + TmfTimestamp timestamp = TmfTimestamp.BigCrunch; + if (context.getEvents()[trace] != null) { + timestamp = context.getEvents()[trace].getTimestamp(); + } + for (int i = 1; i < context.getTraces().length; i++) { + if (context.getEvents()[i].getTimestamp() != null) { + TmfTimestamp otherTS = context.getEvents()[i].getTimestamp(); + if (otherTS.compareTo(timestamp, true) < 0) { + trace = i; + timestamp = otherTS; } } - if (trace >= 0) { - expContext.setLastTrace(TmfExperimentContext.NO_TRACE); - return expContext.getEvents()[trace]; - } } - - return null; + return timestamp; } /* (non-Javadoc) @@ -516,7 +358,7 @@ public class TmfExperiment extends TmfEventProvider imple */ @Override public String toString() { - return "[TmfExperiment (" + getName() + ")]"; + return "[TmfExperiment (" + fExperimentId + ")]"; } // ------------------------------------------------------------------------ @@ -526,7 +368,7 @@ public class TmfExperiment extends TmfEventProvider imple /* * The experiment holds the globally ordered events of its set of traces. * It is expected to provide access to each individual event by index i.e. - * it must be possible to request the Nth event of the experiment. + * it must be possible to request the nth event of the experiment. * * The purpose of the index is to keep the information needed to rapidly * restore the traces contexts at regular intervals (every INDEX_PAGE_SIZE @@ -535,95 +377,162 @@ public class TmfExperiment extends TmfEventProvider imple // The index page size private static final int DEFAULT_INDEX_PAGE_SIZE = 1000; - private final int fIndexPageSize; + private final int fIndexPageSize; - @SuppressWarnings("unchecked") - public void indexExperiment() { - - final TmfExperiment experiment = getCurrentExperiment(); - fCheckpoints.clear(); - - ITmfEventRequest request = new TmfEventRequest(TmfEvent.class, TmfTimeRange.Eternity, TmfDataRequest.ALL_DATA, 1) { - - long indexingStart = System.nanoTime(); - - TmfTimestamp startTime = null; - TmfTimestamp lastTime = null; - int nbEvents = 0; - - @Override - public void handleData() { - TmfEvent[] events = getData(); - if (events.length > 0) { - nbEvents++; - TmfTimestamp ts = events[0].getTimestamp(); - if (startTime == null) - startTime = new TmfTimestamp(ts); - lastTime = new TmfTimestamp(ts); - - if ((nbEvents % DEFAULT_INDEX_PAGE_SIZE) == 0) { - updateExperiment(); - } - } - } + // The experiment index + private Vector fExperimentIndex = new Vector(); - @Override - public void handleSuccess() { - long indexingEnd = System.nanoTime(); - - updateExperiment(); -// experiment.fCheckpoints = new Vector(); -// for (int i = 0; i < fCheckpoints.size(); i++) { -// TmfCheckpoint checkpoint = fCheckpoints.get(i).clone(); -// experiment.fCheckpoints.add(checkpoint); -// System.out.println("fCheckpoints[" + i + "] " + checkpoint.getTimestamp() + ", " + checkpoint.getLocation().toString()); -// } - -// clone.dispose(); -// if (Tracer.INTERNALS) Tracer.trace(getName() + ": nbEvents=" + nbEvents + " (" + ((indexingEnd-indexingStart)/nbEvents)+ " ns/evt), start=" + startTime + ", end=" + lastTime); - - System.out.println(getName() + ": start=" + startTime + ", end=" + lastTime + ", elapsed=" + (indexingEnd*1.0 - indexingStart) / 1000000000); - System.out.println(getName() + ": nbEvents=" + fNbEvents + " (" + ((indexingEnd-indexingStart)/nbEvents)+ " ns/evt)"); -// for (int i = 0; i < experiment.fCheckpoints.size(); i++) { -// TmfCheckpoint checkpoint = experiment.fCheckpoints.get(i); -// System.out.println("fCheckpoints[" + i + "] " + checkpoint.getTimestamp() + ", " + checkpoint.getLocation().toString()); -// } - } + // Indicates that an indexing job is already running + private Boolean fIndexing = false; + private Boolean fIndexed = false; - private void updateExperiment() { - if (experiment == fCurrentExperiment) - experiment.fTimeRange = new TmfTimeRange(startTime, new TmfTimestamp(lastTime)); - experiment.fNbEvents = nbEvents; - experiment.fCheckpoints = ((TmfExperiment) fClone).fCheckpoints; - notifyListeners(); + // The indexing job + private IndexingJob job; + + /** + * indexExperiment + * + * Creates the experiment index. + */ + public void indexExperiment(boolean waitForCompletion) { + + synchronized(fIndexing) { + if (fIndexed || fIndexing) { + // An indexing job is already running but a new request came + // in (probably due to a change in the trace set). The index + // being currently built is therefore already invalid. + // TODO: Cancel and restart the job + // TODO: Add support for dynamically adding/removing traces + return; } - }; + fIndexing = true; + } - sendRequest((ITmfDataRequest) request, ExecutionType.LONG); - } - - protected void notifyListeners() { - broadcast(new TmfExperimentUpdatedSignal(this, this, null)); + job = new IndexingJob(fExperimentId); + job.schedule(); + + if (waitForCompletion) { + try { + job.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } } - + + private class IndexingJob extends Job { + + public IndexingJob(String name) { + super(name); + } + + /* (non-Javadoc) + * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + protected IStatus run(IProgressMonitor monitor) { + + // Minimal check + if (fTraces.size() == 0) { + fIndexing = false; + return Status.OK_STATUS; + } + + monitor.beginTask("Indexing " + fExperimentId, IProgressMonitor.UNKNOWN); + + int nbEvents = 0; + TmfTimestamp startTime = null; + TmfTimestamp lastTime = null; + + fExperimentIndex = new Vector(); + + try { + // Reset the traces + TmfExperimentContext context = new TmfExperimentContext(fTraces); + positionTraces(0, context); + TmfTraceContext[] traces = context.cloneContexts(); + + TmfTimestamp timestamp = getNextEventTimestamp(context); + startTime = new TmfTimestamp(timestamp); + lastTime = new TmfTimestamp(timestamp); + TmfEvent event = getNextEvent(context); + while (event != null) { + if ((nbEvents++ % fIndexPageSize) == 0) { + fExperimentIndex.add(new TmfExperimentCheckpoint(lastTime, traces)); + fNbEvents = nbEvents; + fTimeRange = new TmfTimeRange(startTime, lastTime); + + monitor.worked(1); + + // Check monitor *after* fCheckpoints has been updated + if (monitor.isCanceled()) { + monitor.done(); + return Status.CANCEL_STATUS; + } + } + + // We will need the contexts at the next iteration + if ((nbEvents % fIndexPageSize) == 0) { + traces = context.cloneContexts(); + lastTime = new TmfTimestamp(event.getTimestamp()); + } + + event = getNextEvent(context); + } + + } + finally { + synchronized(this) { + fNbEvents = nbEvents; + fTimeRange = new TmfTimeRange(startTime, lastTime); + fIndexing = false; + fIndexed = true; + } + monitor.done(); + } + +// dumpExperimentCheckpoints(); + + return Status.OK_STATUS; + } + } + +// // ------------------------------------------------------------------------ +// // Toubleshooting code +// // ------------------------------------------------------------------------ +// +// private void dumpExperimentCheckpoints() { +// System.out.println("-----"); +// System.out.println("Checkpoints of " + fExperimentId); +// for (int i = 0; i < fExperimentIndex.size(); i++) { +// System.out.println("Entry:" + i); +// TmfExperimentCheckpoint checkpoint = fExperimentIndex.get(i); +// TmfTraceContext[] contexts = checkpoint.getContexts(); +// for (int j = 0; j < contexts.length; j++) { +// ITmfTrace trace = fTraces.get(j); +// TmfTraceContext context = trace.seekLocation(contexts[j].getLocation()); +// TmfEvent event = fTraces.get(j).getNextEvent(new TmfTraceContext(context)); +// System.out.println(" [" + trace.getName() + "] rank: " + context.getRank() + ", timestamp: " + event.getTimestamp()); +// assert (checkpoint.getTimestamp().compareTo(event.getTimestamp(), false) == 0); +// } +// } +// } + // ------------------------------------------------------------------------ // Signal handlers // ------------------------------------------------------------------------ @TmfSignalHandler - public void experimentSelected(TmfExperimentSelectedSignal signal) { - TmfExperiment experiment = signal.getExperiment(); - if (experiment == this) { - setCurrentExperiment(experiment); - indexExperiment(); - } - else { - dispose(); - } + public void experimentSelected(TmfExperimentSelectedSignal signal) { + fCurrentExperiment = signal.getExperiment(); +// if (signal.getExperiment() == this) { +// indexExperiment(true); +// } } @TmfSignalHandler public void experimentUpdated(TmfExperimentUpdatedSignal signal) { +// indexExperiment(true); } @TmfSignalHandler diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperimentCheckpoint.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperimentCheckpoint.java index f93ccb4f19..5d52e65799 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperimentCheckpoint.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperimentCheckpoint.java @@ -13,7 +13,7 @@ package org.eclipse.linuxtools.tmf.experiment; import org.eclipse.linuxtools.tmf.event.TmfTimestamp; -import org.eclipse.linuxtools.tmf.trace.TmfContext; +import org.eclipse.linuxtools.tmf.trace.TmfTraceContext; /** * TmfExperimentCheckpoint @@ -27,7 +27,7 @@ public class TmfExperimentCheckpoint implements ComparableTmfExperimentContext *

- * The experiment keeps track of the next event from each of its traces so - * it can pick the next one in chronological order. - *

- * This implies that the "next" event from each trace has already been - * read and that we at least know its timestamp. This doesn't imply that a - * full parse of the event content was performed (read: LTTng works like - * this). - *

- * The last trace refers to the trace from which the last event was - * "consumed" at the experiment level. + * Implement me. Please. */ -public class TmfExperimentContext extends TmfContext { - - // ------------------------------------------------------------------------ - // Constants - // ------------------------------------------------------------------------ - - public static final int NO_TRACE = -1; - - // ------------------------------------------------------------------------ - // Attributes - // ------------------------------------------------------------------------ - - private ITmfTrace[] fTraces = new ITmfTrace[0]; - private TmfContext[] fContexts; - private TmfEvent[] fEvents; - private int lastTrace; +public class TmfExperimentContext implements ITmfContext, Cloneable { - // ------------------------------------------------------------------------ - // Constructors - // ------------------------------------------------------------------------ + private ITmfTrace[] fTraces = new ITmfTrace[0]; // The set of traces + private TmfTraceContext[] fContexts; // The set of trace contexts + private TmfEvent[] fEvents; - public TmfExperimentContext(ITmfTrace[] traces, TmfContext[] contexts) { - super(); - fTraces = traces; - fContexts = contexts; + public TmfExperimentContext(Vector traces) { + fTraces = traces.toArray(fTraces); + fContexts = new TmfTraceContext[fTraces.length]; fEvents = new TmfEvent[fTraces.length]; + } - ITmfLocation[] locations = new ITmfLocation[fTraces.length]; - long[] ranks = new long[fTraces.length]; - long rank = 0; - for (int i = 0; i < fTraces.length; i++) { - if (contexts[i] != null) { - locations[i] = contexts[i].getLocation(); - ranks[i] = contexts[i].getRank(); - rank += contexts[i].getRank(); - } + public TmfExperimentContext clone() { + try { + return (TmfExperimentContext) super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); } - - setLocation(new TmfExperimentLocation(locations, ranks)); - setRank(rank); - lastTrace = NO_TRACE; + return null; } - public TmfExperimentContext(ITmfTrace[] traces) { - this(traces, new TmfContext[traces.length]); + public ITmfTrace[] getTraces() { + return fTraces; } - public TmfExperimentContext(TmfExperimentContext other) { - this(other.fTraces, other.cloneContexts()); - fEvents = other.fEvents; - setLocation(other.getLocation().clone()); - setRank(other.getRank()); - setLastTrace(other.lastTrace); + public TmfTraceContext[] getContexts() { + return fContexts; } - private TmfContext[] cloneContexts() { - TmfContext[] contexts = new TmfContext[fContexts.length]; + public TmfTraceContext[] cloneContexts() { + TmfTraceContext[] contexts = new TmfTraceContext[fContexts.length]; for (int i = 0; i < fContexts.length; i++) contexts[i] = fContexts[i].clone(); return contexts; } - // ------------------------------------------------------------------------ - // Accessors - // ------------------------------------------------------------------------ - - public ITmfTrace[] getTraces() { - return fTraces; - } - - public TmfContext[] getContexts() { - return fContexts; - } - public TmfEvent[] getEvents() { return fEvents; } - public int getLastTrace() { - return lastTrace; - } - - public void setLastTrace(int newIndex) { - lastTrace = newIndex; - } - } diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfExperimentSelectedSignal.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperimentSelectedSignal.java similarity index 79% rename from org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfExperimentSelectedSignal.java rename to org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperimentSelectedSignal.java index bff74ddb35..3917bae5e8 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfExperimentSelectedSignal.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperimentSelectedSignal.java @@ -10,8 +10,9 @@ * Francois Chouinard - Initial API and implementation *******************************************************************************/ -package org.eclipse.linuxtools.tmf.trace; +package org.eclipse.linuxtools.tmf.experiment; +import org.eclipse.linuxtools.tmf.event.TmfEvent; import org.eclipse.linuxtools.tmf.signal.TmfSignal; /** @@ -21,14 +22,14 @@ import org.eclipse.linuxtools.tmf.signal.TmfSignal; */ public class TmfExperimentSelectedSignal extends TmfSignal { - private final TmfExperiment fExperiment; + private final TmfExperiment fExperiment; - public TmfExperimentSelectedSignal(Object source, TmfExperiment experiment) { + public TmfExperimentSelectedSignal(Object source, TmfExperiment experiment) { super(source); fExperiment = experiment; } - public TmfExperiment getExperiment() { + public TmfExperiment getExperiment() { return fExperiment; } diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfExperimentUpdatedSignal.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperimentUpdatedSignal.java similarity index 74% rename from org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfExperimentUpdatedSignal.java rename to org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperimentUpdatedSignal.java index 559ce94746..d01bddd1ec 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfExperimentUpdatedSignal.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperimentUpdatedSignal.java @@ -10,9 +10,11 @@ * Francois Chouinard - Initial API and implementation *******************************************************************************/ -package org.eclipse.linuxtools.tmf.trace; +package org.eclipse.linuxtools.tmf.experiment; +import org.eclipse.linuxtools.tmf.event.TmfEvent; import org.eclipse.linuxtools.tmf.signal.TmfSignal; +import org.eclipse.linuxtools.tmf.trace.ITmfTrace; /** * TmfExperimentUpdatedSignal @@ -21,16 +23,16 @@ import org.eclipse.linuxtools.tmf.signal.TmfSignal; */ public class TmfExperimentUpdatedSignal extends TmfSignal { - private final TmfExperiment fExperiment; + private final TmfExperiment fExperiment; private final ITmfTrace fTrace; - public TmfExperimentUpdatedSignal(Object source, TmfExperiment experiment, ITmfTrace trace) { + public TmfExperimentUpdatedSignal(Object source, TmfExperiment experiment, ITmfTrace trace) { super(source); fExperiment = experiment; fTrace = trace; } - public TmfExperiment getExperiment() { + public TmfExperiment getExperiment() { return fExperiment; } diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/parser/ITmfEventParser.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/parser/ITmfEventParser.java index fc6e699f90..23d407780f 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/parser/ITmfEventParser.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/parser/ITmfEventParser.java @@ -16,7 +16,7 @@ import java.io.IOException; import org.eclipse.linuxtools.tmf.event.TmfEvent; import org.eclipse.linuxtools.tmf.trace.ITmfTrace; -import org.eclipse.linuxtools.tmf.trace.TmfContext; +import org.eclipse.linuxtools.tmf.trace.TmfTraceContext; /** * ITmfEventParser @@ -29,5 +29,5 @@ public interface ITmfEventParser { * @return * @throws IOException */ - public TmfEvent parseNextEvent(ITmfTrace stream, TmfContext context) throws IOException; + public TmfEvent parseNextEvent(ITmfTrace stream, TmfTraceContext context) throws IOException; } \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/ITmfRequestHandler.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/ITmfRequestHandler.java index 2121336f4f..be1b4167ff 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/ITmfRequestHandler.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/ITmfRequestHandler.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -12,13 +12,15 @@ package org.eclipse.linuxtools.tmf.request; +import org.eclipse.linuxtools.tmf.event.TmfData; + /** * ITmfRequestHandler *

* TODO: Implement me. Please. * @param */ -public interface ITmfRequestHandler { +public interface ITmfRequestHandler { /** * Process the request. The client thread can be suspended until the @@ -27,6 +29,5 @@ public interface ITmfRequestHandler { * * @param waitForCompletion Suspend the client thread until the request completes */ - public void processRequest(TmfDataRequest request, boolean waitForCompletion); - -} \ No newline at end of file + public void processRequest(TmfDataRequest request, boolean waitForCompletion); +} diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/TmfDataRequest.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/TmfDataRequest.java index 7ad4083dcd..86a64ab4e2 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/TmfDataRequest.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/TmfDataRequest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -12,32 +12,29 @@ package org.eclipse.linuxtools.tmf.request; -import org.eclipse.linuxtools.tmf.event.TmfTimeRange; +import org.eclipse.linuxtools.tmf.event.TmfData; /** * TmfDataRequest *

* TmfDataRequests are used to obtain blocks of contiguous data from a data - * provider, either all the data within a given time window or n elements - * starting at a specific timestamp. Open ranges can be used, especially for - * continuous streaming. + * provider. Open ranges can be used, especially for continuous streaming. *

- * The request is processed asynchronously by an ITmfRequestProcessor and, - * as blocks of data become available, the callback handleData() is - * invoked, synchronously, for each block. When returning from the callback, - * the data instances go out of scope and become eligible for gc. It is - * is thus the responsibility of the requester to either copy or keep a - * reference to the data it wishes to track specifically. + * The request is processed asynchronously by a TmfProvider and, as blocks + * of data become available, handleData() is invoked synchronously for each + * block. Upon return, the data instances go out of scope and become eligible + * for gc. It is is thus the responsibility of the requester to either clone + * or keep a reference to the data it wishes to track specifically. *

- * This data block approach is necessary to avoid busting the heap for very - * large trace files. The block size is configurable. + * This data block approach is used to avoid busting the heap for very + * large trace files. The block size is configurable. *

- * The ITmfRequestProcessor indicates that the request is completed by - * calling done(). The request can be canceled at any time with cancel(). + * The TmfProvider indicates that the request is completed by calling done(). + * The request can be canceled at any time with cancel(). *

* Typical usage: *

TmfTimeWindow range = new TmfTimewindow(...);
- *TmfDataRequest<DataType[]> request = new TmfDataRequest<DataType[]>(range, 0, NB_EVENTS, BLOCK_SIZE) {
+ *TmfDataRequest<DataType[]> request = new TmfDataRequest<DataType[]>(DataType.class, 0, NB_EVENTS, BLOCK_SIZE) {
  *    public void handleData() {
  *         DataType[] data = request.getData();
  *         for (DataType e : data) {
@@ -60,98 +57,86 @@ import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
  *fProcessor.process(request, true);
  *
* - * TODO: Consider extending DataRequestMonitor from DSF concurrency plugin. - * The main issue is the slicing of the result in blocks and continuous - * streams. This would require using a thread executor and to carefully - * look at setData() and getData(). + * TODO: Consider decoupling from "time range", "rank", etc and for the more + * generic notion of "criteria". This would allow to extend for "time range", etc + * instead of providing specialized constructors. This also means removing the + * criteria info from the data structure (with the possible exception of fNbRequested). + * The nice thing about it is that it would prepare us well for the coming generation + * of analysis tools. * * TODO: Implement request failures (codes, etc...) */ -public class TmfDataRequest { +public class TmfDataRequest { - // ======================================================================== + // ------------------------------------------------------------------------ // Constants - // ======================================================================== + // ------------------------------------------------------------------------ // The default maximum number of events per chunk public static final int DEFAULT_BLOCK_SIZE = 1000; // The request count for all the events - public static final int ALL_EVENTS = -1; + public static final int ALL_DATA = Integer.MAX_VALUE; - // ======================================================================== + // ------------------------------------------------------------------------ // Attributes - // ======================================================================== + // ------------------------------------------------------------------------ - private final int fIndex; // The index (order) of the requested event - private final TmfTimeRange fRange; // The requested events time range - private final int fNbRequestedEvents; // The number of events to read (-1 == all in the range) - private final int fBlockSize; // The maximum number of events per chunk - private int fNbEvents; // The number of events read so far + private final Class fDataType; + private final int fIndex; // The index (rank) of the requested event + private final int fNbRequested; // The number of requested events (ALL_DATA for all) + private final int fBlockSize; // The maximum number of events per chunk + private int fNbRead; // The number of reads so far - private Object lock = new Object(); + private Object lock = new Object(); private boolean fRequestCompleted = false; private boolean fRequestFailed = false; private boolean fRequestCanceled = false; - private V[] fData; // Data object + private T[] fData; // Data object - // ======================================================================== + // ------------------------------------------------------------------------ // Constructors - // ======================================================================== + // ------------------------------------------------------------------------ /** - * @param index - * @param nbEvents + * Default constructor */ - public TmfDataRequest(int index, int nbEvents) { - this(null, index, nbEvents, DEFAULT_BLOCK_SIZE); + public TmfDataRequest(Class dataType) { + this(dataType, 0, ALL_DATA, DEFAULT_BLOCK_SIZE); } - public TmfDataRequest(int index, int nbEvents, int blockSize) { - this(null, index, nbEvents, blockSize); - } - /** - * @param range + * @param nbRequested */ - public TmfDataRequest(TmfTimeRange range) { - this(range, 0, ALL_EVENTS, DEFAULT_BLOCK_SIZE); + public TmfDataRequest(Class dataType, int index) { + this(dataType, index, ALL_DATA, DEFAULT_BLOCK_SIZE); } /** - * @param range - * @param nbEvents - */ - public TmfDataRequest(TmfTimeRange range, int nbEvents) { - this(range, 0, nbEvents, DEFAULT_BLOCK_SIZE); - } - /** - * @param range - * @param nbEvents - * @param blockSize Size of the largest blocks expected + * @param index + * @param nbRequested */ - public TmfDataRequest(TmfTimeRange range, int nbEvents, int blockSize) { - this(range, 0, nbEvents, blockSize); + public TmfDataRequest(Class dataType, int index, int nbRequested) { + this(dataType, index, nbRequested, DEFAULT_BLOCK_SIZE); } /** - * @param range * @param index - * @param nbEvents - * @param blockSize Size of the largest blocks expected + * @param nbRequested + * @param blockSize */ - private TmfDataRequest(TmfTimeRange range, int index, int nbEvents, int blockSize) { - fIndex = index; - fRange = range; - fNbRequestedEvents = nbEvents; - fBlockSize = blockSize; - fNbEvents = 0; + public TmfDataRequest(Class dataType, int index, int nbRequested, int blockSize) { + fDataType = dataType; + fIndex = index; + fNbRequested = nbRequested; + fBlockSize = blockSize; + fNbRead = 0; } - - // ======================================================================== + + // ------------------------------------------------------------------------ // Accessors - // ======================================================================== + // ------------------------------------------------------------------------ /** * @return the index @@ -161,17 +146,10 @@ public class TmfDataRequest { } /** - * @return the requested time range + * @return the number of requested events (ALL_DATA = all) */ - public TmfTimeRange getRange() { - return fRange; - } - - /** - * @return the number of requested events (-1 = all) - */ - public int getNbRequestedEvents() { - return fNbRequestedEvents; + public int getNbRequested() { + return fNbRequested; } /** @@ -184,8 +162,8 @@ public class TmfDataRequest { /** * @return the number of events read so far */ - public int getNbEvents() { - return fNbEvents; + public int getNbRead() { + return fNbRead; } /** @@ -209,24 +187,31 @@ public class TmfDataRequest { return fRequestCanceled; } - // ======================================================================== + /** + * @return the requested data type + */ + public Class getDataType() { + return fDataType; + } + + // ------------------------------------------------------------------------ // Operators - // ======================================================================== + // ------------------------------------------------------------------------ /** * Sets the data object to specified value. To be called by the * asynchronous method implementor. * @param data Data value to set. */ - public synchronized void setData(V[] data) { - fNbEvents += data.length; + public synchronized void setData(T[] data) { + fNbRead += data.length; fData = data; } /** * Returns the data value, null if not set. */ - public synchronized V[] getData() { + public synchronized T[] getData() { return fData; } diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/TmfEventRequest.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/TmfEventRequest.java index 9a83500908..678125cf36 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/TmfEventRequest.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/TmfEventRequest.java @@ -20,7 +20,7 @@ import org.eclipse.linuxtools.tmf.event.TmfTimeRange; *

* Implement me. Please. */ -public abstract class TmfEventRequest extends TmfDataRequest implements ITmfEventRequest { +public class TmfEventRequest extends TmfDataRequest { // ------------------------------------------------------------------------ // Attributes @@ -35,14 +35,14 @@ public abstract class TmfEventRequest extends TmfDataRequest /** * @param range */ - public TmfEventRequest(Class dataType) { + public TmfEventRequest(Class dataType) { this(dataType, TmfTimeRange.Eternity, ALL_DATA, DEFAULT_BLOCK_SIZE); } /** * @param range */ - public TmfEventRequest(Class dataType, TmfTimeRange range) { + public TmfEventRequest(Class dataType, TmfTimeRange range) { this(dataType, range, ALL_DATA, DEFAULT_BLOCK_SIZE); } @@ -50,7 +50,7 @@ public abstract class TmfEventRequest extends TmfDataRequest * @param range * @param nbRequested */ - public TmfEventRequest(Class dataType, TmfTimeRange range, int nbRequested) { + public TmfEventRequest(Class dataType, TmfTimeRange range, int nbRequested) { this(dataType, range, nbRequested, DEFAULT_BLOCK_SIZE); } @@ -59,7 +59,7 @@ public abstract class TmfEventRequest extends TmfDataRequest * @param nbRequested * @param blockSize Size of the largest blocks expected */ - public TmfEventRequest(Class dataType, TmfTimeRange range, int nbRequested, int blockSize) { + public TmfEventRequest(Class dataType, TmfTimeRange range, int nbRequested, int blockSize) { super(dataType, 0, nbRequested, blockSize); fRange = range; } @@ -75,29 +75,4 @@ public abstract class TmfEventRequest extends TmfDataRequest return fRange; } - // ------------------------------------------------------------------------ - // Object - // ------------------------------------------------------------------------ - - @Override - // All requests have a unique id - public int hashCode() { - return getRequestId(); - } - - @Override - public boolean equals(Object other) { - if (other instanceof TmfEventRequest) { - TmfEventRequest request = (TmfEventRequest) other; - return super.equals(other) && request.fRange.equals(fRange); - } - return false; - } - - @Override - public String toString() { - return "[TmfEventRequest(" + getRequestId() + "," + getDataType().getSimpleName() - + "," + getRange() + "," + getNbRequested() + "," + getBlockize() + ")]"; - } - } diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/signal/TmfSignalManager.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/signal/TmfSignalManager.java index eed39d9a46..c77e22fac1 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/signal/TmfSignalManager.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/signal/TmfSignalManager.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -31,27 +31,28 @@ public class TmfSignalManager { // The set of event listeners and their corresponding handler methods. // Note: listeners could be restricted to ITmfComponents but there is no - // harm in letting anyone use this + // harm in letting anyone use this since it is not tied to anything but + // the signal data type. static private Map fListeners = new HashMap(); // If requested, add universal signal tracer - // TODO: to be revisited... + // TODO: Temporary solution: should be enabled/disabled dynamically private static boolean fTraceIsActive = false; private static TmfSignalTracer fSignalTracer; static { if (fTraceIsActive) { fSignalTracer = TmfSignalTracer.getInstance(); - addListener(fSignalTracer); + register(fSignalTracer); } } - public static synchronized void addListener(Object listener) { + public static synchronized void register(Object listener) { Method[] methods = getSignalHandlerMethods(listener); if (methods.length > 0) fListeners.put(listener, methods); } - public static synchronized void removeListener(Object listener) { + public static synchronized void deregister(Object listener) { fListeners.remove(listener); } @@ -101,7 +102,7 @@ public class TmfSignalManager { } } - // Call the signal handlers + // Call the signal handlers for (Map.Entry> entry : listeners.entrySet()) { for (Method method : entry.getValue()) { try { diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfEventParser.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfEventParser.java deleted file mode 100644 index 3f3b094827..0000000000 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfEventParser.java +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009 Ericsson - * - * All rights reserved. This program and the accompanying materials are - * made available under the terms of the Eclipse Public License v1.0 which - * accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Francois Chouinard - Initial API and implementation - *******************************************************************************/ - -package org.eclipse.linuxtools.tmf.trace; - -import java.io.IOException; - -import org.eclipse.linuxtools.tmf.event.TmfEvent; - -/** - * ITmfEventParser - *

- * TODO: Implement me. Please. - */ -public interface ITmfEventParser { - - /** - * @return - * @throws IOException - */ - public TmfEvent parseNextEvent(ITmfTrace stream, TmfTraceContext context) throws IOException; -} diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfTrace.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfTrace.java index 6a2a0174cf..bf4d9fb7c0 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfTrace.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfTrace.java @@ -66,4 +66,12 @@ public interface ITmfTrace { */ public TmfEvent getNextEvent(TmfTraceContext context); + /** + * Return the event pointed by the supplied context (or null if + * no event left) and *does not* update the context. + * + * @return the next event in the stream + */ + public TmfEvent parseEvent(TmfTraceContext context); + } diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfExperiment.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfExperiment.java deleted file mode 100644 index a36caa0fb6..0000000000 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfExperiment.java +++ /dev/null @@ -1,623 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009 Ericsson - * - * All rights reserved. This program and the accompanying materials are - * made available under the terms of the Eclipse Public License v1.0 which - * accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Francois Chouinard - Initial API and implementation - *******************************************************************************/ - -package org.eclipse.linuxtools.tmf.trace; - -import java.util.Vector; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.linuxtools.tmf.component.TmfComponent; -import org.eclipse.linuxtools.tmf.event.TmfEvent; -import org.eclipse.linuxtools.tmf.event.TmfTimeRange; -import org.eclipse.linuxtools.tmf.event.TmfTimestamp; -import org.eclipse.linuxtools.tmf.request.ITmfRequestHandler; -import org.eclipse.linuxtools.tmf.request.TmfDataRequest; -import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler; - -/** - * TmfExperiment - *

- * TmfExperiment presents a time-ordered, unified view of a set of TmfTraces - * that are part of a tracing experiment. - *

- */ -public class TmfExperiment extends TmfComponent implements ITmfRequestHandler { - -// TODO: Complete multi-trace experiment -// TODO: Add support for dynamic addition/removal of traces -// TODO: Add support for live streaming (notifications, incremental indexing, ...) - - // ======================================================================== - // Attributes - // ======================================================================== - - // The currently selected experiment - private static TmfExperiment fCurrentExperiment; - - // The experiment ID - private String fExperimentId; - - // The set of trace sthat constitute the experiment - private Vector fTraces; - - // The total number of events - private int fNbEvents; - - // The experiment time range - private TmfTimeRange fTimeRange; - - // The experiment reference timestamp (default: BigBang) - private TmfTimestamp fEpoch; - -// // Indicates if the stream should be indexed synchronously (default: false) -// private final boolean fWaitForIndexCompletion; - - // ======================================================================== - // Constructors/Destructor - // ======================================================================== - - /** - * @param id - * @param traces - */ - public TmfExperiment(String id, ITmfTrace[] traces) { - this(id, traces, TmfTimestamp.BigBang, DEFAULT_INDEX_PAGE_SIZE, false); - } - - /** - * @param id - * @param traces - * @param waitForIndexCompletion - */ - public TmfExperiment(String id, ITmfTrace[] traces, boolean waitForIndexCompletion) { - this(id, traces, TmfTimestamp.BigBang, DEFAULT_INDEX_PAGE_SIZE, waitForIndexCompletion); - } - - /** - * @param id - * @param traces - * @param epoch - * @param waitForIndexCompletion - */ - public TmfExperiment(String id, ITmfTrace[] traces, TmfTimestamp epoch, int indexPageSize, boolean waitForIndexCompletion) { - super(); - - fExperimentId = id; - fTraces = new Vector(); - for (ITmfTrace trace : traces) { - fTraces.add(trace); - } - fEpoch = epoch; - fIndexPageSize = indexPageSize; -// fWaitForIndexCompletion = waitForIndexCompletion; - - updateNbEvents(); - updateTimeRange(); -// indexExperiment(); - } - - /** - * - */ - @Override - public void dispose() { - super.dispose(); - fTraces.clear(); - fCurrentExperiment= null; - } - - // ======================================================================== - // Accessors - // ======================================================================== - - public static TmfExperiment getCurrentExperiment() { - return fCurrentExperiment; - } - - public String getExperimentId() { - return fExperimentId; - } - - public ITmfTrace[] getTraces() { - ITmfTrace[] result = new ITmfTrace[fTraces.size()]; - return fTraces.toArray(result); - } - - public TmfTimestamp getEpoch() { - return fEpoch; - } - - public TmfTimeRange getTimeRange() { - return fTimeRange; - } - - public int getNbEvents() { - return fNbEvents; - } - - /** - * Returns the index of the first event with the requested timestamp. - * If none, returns the index of the next event (if any). - * - * @param ts - * @return - */ - public long getIndex(TmfTimestamp ts) { - // TODO: Go over all the traces - ITmfTrace trace = fTraces.firstElement(); - TmfTraceContext context = trace.seekEvent(ts); - return context.getIndex(); - } - - /** - * Returns the timestamp of the event at the requested index. - * If none, returns null. - * - * @param index - * @return - */ - public TmfTimestamp getTimestamp(int index) { - // TODO: Go over all the traces - ITmfTrace trace = fTraces.firstElement(); - TmfTraceContext context = trace.seekEvent(index); - return context.getTimestamp(); - } - - // ======================================================================== - // Operators - // ======================================================================== - - /** - * Add a trace to the experiment trace set - * - * @param trace - */ - public void addTrace(ITmfTrace trace) { - fTraces.add(trace); - synchronized(this) { - updateNbEvents(); - updateTimeRange(); - } - } - - /** - * Update the total number of events - */ - private void updateNbEvents() { - int nbEvents = 0; - for (ITmfTrace trace : fTraces) { - nbEvents += trace.getNbEvents(); - } - fNbEvents = nbEvents; - } - - /** - * Update the global time range - */ - private void updateTimeRange() { - TmfTimestamp startTime = fTimeRange != null ? fTimeRange.getStartTime() : TmfTimestamp.BigCrunch; - TmfTimestamp endTime = fTimeRange != null ? fTimeRange.getEndTime() : TmfTimestamp.BigBang; - - for (ITmfTrace trace : fTraces) { - TmfTimestamp traceStartTime = trace.getTimeRange().getStartTime(); - if (traceStartTime.compareTo(startTime, true) < 0) - startTime = traceStartTime; - - TmfTimestamp traceEndTime = trace.getTimeRange().getEndTime(); - if (traceEndTime.compareTo(endTime, true) > 0) - endTime = traceEndTime; - } - fTimeRange = new TmfTimeRange(startTime, endTime); - } - - // ======================================================================== - // ITmfRequestHandler - // ======================================================================== - - /* (non-Javadoc) - * @see org.eclipse.linuxtools.tmf.request.ITmfRequestHandler#processRequest(org.eclipse.linuxtools.tmf.request.TmfDataRequest, boolean) - */ - public void processRequest(TmfDataRequest request, boolean waitForCompletion) { - - // Process the request - processDataRequest(request); - - // Wait for completion if needed - if (waitForCompletion) { - request.waitForCompletion(); - } - } - - /** - * Process a data request - * - * @param request - */ - private void processDataRequest(final TmfDataRequest request) { - - // General request parameters - final TmfTimestamp endTime; - final long index; - - // Initialize request params depending on request type - if (request.getRange() != null) { - index = getIndex(request.getRange().getStartTime()); - endTime = request.getRange().getEndTime(); - } else { - index = request.getIndex(); - endTime = TmfTimestamp.BigCrunch; - } - - // Process the request - Thread thread = new Thread() { - - @Override - public void run() { - - // Key variables - ITmfTrace[] traces = new ITmfTrace[0]; // The set of traces - TmfTraceContext[] contexts; // The set of trace contexts - - // Extract the general request information - int blockSize = request.getBlockize(); - int nbRequestedEvents = request.getNbRequestedEvents(); - if (nbRequestedEvents == -1) { - nbRequestedEvents = Integer.MAX_VALUE; - } - - // Create the result buffer - Vector events = new Vector(); - int nbEvents = 0; - - // Initialize the traces array and position the traces - // at the first requested event - traces = fTraces.toArray(traces); - contexts = new TmfTraceContext[traces.length]; - positionTraces(index, traces, contexts); - - // Get the ordered events - TmfEvent event = getNextEvent(traces, contexts); - while (!request.isCancelled() && nbEvents < nbRequestedEvents && event != null - && event.getTimestamp().compareTo(endTime, false) < 0) - { - events.add(event); - if (++nbEvents % blockSize == 0) { - pushData(request, events); - } - // Avoid an unnecessary read passed the last event requested - if (nbEvents < nbRequestedEvents) - event = getNextEvent(traces, contexts); - } - - if (!request.isCancelled() && !request.isFailed()) { - pushData(request, events); - request.done(); - } - } - }; - thread.start(); - } - - /** - * Given an experiment event index, position the set of traces so a call - * to getNextEvent() will retrieve the corresponding event. - * - * @param index - * @param traces - * @param contexts - * @param nextEvents - */ - private synchronized void positionTraces(long index, ITmfTrace[] traces, TmfTraceContext[] contexts) { - - // Compute the index page and corresponding index - int page = (int) index / fIndexPageSize; - int current = page * fIndexPageSize; - - // Retrieve the checkpoint and set the contexts (make copies) - TmfTraceContext[] saveContexts = new TmfTraceContext[contexts.length]; - if (page < fExperimentIndex.size()) { - saveContexts = fExperimentIndex.elementAt(page); - for (int i = 0; i < contexts.length; i++) { - contexts[i] = new TmfTraceContext(saveContexts[i]); - } - } else { - // If the page entry doesn't exist (e.g. indexing not completed), - // set contexts at the the last entry (if it exists) - page = fExperimentIndex.size() - 1; - if (page >= 0) { - saveContexts = fExperimentIndex.elementAt(page); - for (int i = 0; i < contexts.length; i++) { - contexts[i] = new TmfTraceContext(saveContexts[i]); - } - current = page * fIndexPageSize; - } - // Index is empty... position traces at their beginning - else { - for (int i = 0; i < contexts.length; i++) { - contexts[i] = new TmfTraceContext(traces[i].seekLocation(null)); - } - current = 0; - } - } - - // Position the traces at the requested index - while (current++ < index) { - getNextEvent(traces, contexts); - } - } - - /** - * Scan the next events from all traces and return the next one - * in chronological order. - * - * @param traces - * @param contexts - * @param nextEvents - * @return - */ - private TmfEvent getNextEvent(ITmfTrace[] traces, TmfTraceContext[] contexts) { - // TODO: Consider the time adjustment - int trace = 0; - TmfTimestamp timestamp = contexts[trace].getTimestamp(); - if (timestamp == null) { - timestamp = TmfTimestamp.BigCrunch; - } - for (int i = 1; i < traces.length; i++) { - if (contexts[i].getTimestamp() != null) { - TmfTimestamp otherTS = contexts[i].getTimestamp(); - if (otherTS.compareTo(timestamp, true) < 0) { - trace = i; - timestamp = otherTS; - } - } - } - TmfEvent event = traces[trace].getNextEvent(contexts[trace]); - return event; - } - - /** - * Format the result data and notify the requester. - * Note: after handling, the data is *removed*. - * - * @param request - * @param events - */ - private void pushData(TmfDataRequest request, Vector events) { - TmfEvent[] result = new TmfEvent[events.size()]; - events.toArray(result); - request.setData(result); - request.handleData(); - events.removeAllElements(); - } - - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "[TmfExperiment (" + fExperimentId + ")]"; - } - - // ======================================================================== - // Indexing - // ======================================================================== - - /* - * The experiment holds the globally ordered events of its set of traces. - * It is expected to provide access to each individual event by index i.e. - * it must be possible to request the Nth event of the experiment. - * - * The purpose of the index is to keep the information needed to rapidly - * restore the traces contexts at regular intervals (every INDEX_PAGE_SIZE - * event). - */ - - // The index page size - private static final int DEFAULT_INDEX_PAGE_SIZE = 1000; - private final int fIndexPageSize; - - // The experiment index - private Vector fExperimentIndex = new Vector(); - - // Indicates that an indexing job is already running - private Boolean fIndexing = false; - - // The indexing job - private IndexingJob job; - - /** - * indexExperiment - * - * Creates the experiment index. - */ - private void indexExperiment() { - - synchronized(fIndexing) { - if (fIndexing) { - // An indexing job is already running but a new request came - // in (probably due to a change in the trace set). The index - // being currently built is therefore already invalid. - // TODO: Cancel and restart the job - // TODO: Add support for dynamically adding/removing traces - return; - } - fIndexing = true; - } - - job = new IndexingJob(fExperimentId); - job.schedule(); - try { - job.join(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } -// if (fWaitForIndexCompletion) { -// ProgressMonitorDialog dialog = new ProgressMonitorDialog(null); -// try { -// // TODO: Handle cancel! -// dialog.run(true, true, new IRunnableWithProgress() { -// public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { -// monitor.beginTask("Indexing " + fExperimentId, IProgressMonitor.UNKNOWN); -// job.join(); -// monitor.done(); -// } -// }); -// } catch (InvocationTargetException e) { -// e.printStackTrace(); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// } - } - - private class IndexingJob extends Job { - - public IndexingJob(String name) { - super(name); - } - - /* (non-Javadoc) - * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) - */ - @Override - protected IStatus run(IProgressMonitor monitor) { - - Vector indices = new Vector(); - - // Minimal check - if (fTraces.size() == 0) { - fIndexing = false; - return Status.OK_STATUS; - } - - monitor.beginTask("Indexing " + fExperimentId, IProgressMonitor.UNKNOWN); - - ITmfTrace[] traces = new ITmfTrace[0]; - TmfTraceContext[] contexts; - int nbTraces = fTraces.size(); - - // Initialize the traces and contexts arrays - traces = fTraces.toArray(traces); - contexts = new TmfTraceContext[nbTraces]; - TmfTraceContext[] savedContexts = new TmfTraceContext[nbTraces]; - int nullEvents = 0; - for (int i = 0; i < nbTraces; i++) { - // Context of the first event of the trace - contexts[i] = traces[i].seekLocation(null); - savedContexts[i] = new TmfTraceContext(contexts[i].getLocation(), contexts[i].getTimestamp(), 0); - if (contexts[i].getTimestamp() == null) - nullEvents++; - } - // Check if there is anything to index - if (nullEvents >= nbTraces) { - fIndexing = false; - return Status.OK_STATUS; - } - // FIXME: LTTng hack - start -// indices.add(savedContexts); // TMF - // FIXME: LTTng hack - end - - // Get the ordered events and populate the indices - // FIXME: LTTng hack - start -// int nbEvents = 0; // TMF - int nbEvents = -1; // LTTng - // FIXME: LTTng hack - end - while ((getNextEvent(traces, contexts)) != null) - { - if (++nbEvents % fIndexPageSize == 0) { - // Special case: if the total number of events is a multiple of the - // DEFAULT_PAGE_SIZE then all the pending events are null. In that - // case, we don't store an additional entry in the index array. - nullEvents = 0; - savedContexts = new TmfTraceContext[nbTraces]; - for (int i = 0; i < nbTraces; i++) { - savedContexts[i] = new TmfTraceContext(contexts[i]); - if (contexts[i].getTimestamp() == null) - nullEvents++; - } - if (nullEvents < nbTraces) { - indices.add(savedContexts); - } - } - - monitor.worked(1); - if (monitor.isCanceled()) { - monitor.done(); - return Status.CANCEL_STATUS; - } - } - - monitor.done(); - fExperimentIndex = indices; - -// dumpIndex(); - - fIndexing = false; - return Status.OK_STATUS; - } - } - -// /** -// * Dump the experiment index -// */ -// private void dumpIndex() { -// System.out.println("-----"); -// System.out.println("Index of " + fExperimentId); -// for (int i = 0; i < fExperimentIndex.size(); i++) { -// System.out.println("Entry:" + i); -// TmfTraceContext[] contexts = fExperimentIndex.get(i); -// int nbEvents = 0; -// for (int j = 0; j < contexts.length; j++) { -// ITmfTrace trace = fTraces.get(j); -// TmfTraceContext context = trace.seekLocation(contexts[j].getLocation()); -// TmfEvent event = fTraces.get(j).getNextEvent(new TmfTraceContext(context)); -// nbEvents += contexts[j].getIndex(); -// System.out.println(" [" + trace.getName() + "]" -// + " index: " + contexts[j].getIndex() -// + ", timestamp: " + contexts[j].getTimestamp() -// + ", event: " + event.getTimestamp()); -// assert (contexts[j].getTimestamp().compareTo(event.getTimestamp(), false) == 0); -// } -// assert ((i+1) * fIndexPageSize == nbEvents); -// -// } -// } - - // ======================================================================== - // Signal handlers - // ======================================================================== - - @TmfSignalHandler - public void experimentSelected(TmfExperimentSelectedSignal signal) { - fCurrentExperiment = this; - indexExperiment(); - } - - @TmfSignalHandler - public void experimentUpdated(TmfExperimentUpdatedSignal signal) { -// indexExperiment(); - } - - @TmfSignalHandler - public void traceUpdated(TmfTraceUpdatedSignal signal) { - // TODO: Incremental index update - synchronized(this) { - updateNbEvents(); - updateTimeRange(); - } - broadcastSignal(new TmfExperimentUpdatedSignal(this, this, signal.getTrace())); - } -} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfTrace.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfTrace.java index 39f52af9e4..d76a847a41 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfTrace.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfTrace.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -21,12 +21,13 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.linuxtools.tmf.component.TmfComponent; +import org.eclipse.linuxtools.tmf.component.ITmfContext; +import org.eclipse.linuxtools.tmf.component.TmfProvider; import org.eclipse.linuxtools.tmf.event.TmfEvent; import org.eclipse.linuxtools.tmf.event.TmfTimeRange; import org.eclipse.linuxtools.tmf.event.TmfTimestamp; -import org.eclipse.linuxtools.tmf.request.ITmfRequestHandler; import org.eclipse.linuxtools.tmf.request.TmfDataRequest; +import org.eclipse.linuxtools.tmf.request.TmfEventRequest; /** * TmfTrace @@ -38,18 +39,19 @@ import org.eclipse.linuxtools.tmf.request.TmfDataRequest; * * TODO: Add support for live streaming (notifications, incremental indexing, ...) */ -public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRequestHandler { +public abstract class TmfTrace extends TmfProvider implements ITmfTrace { - // ======================================================================== + // ------------------------------------------------------------------------ // Constants - // ======================================================================== + // ------------------------------------------------------------------------ // The default number of events to cache + // TODO: Make the DEFAULT_CACHE_SIZE a preference public static final int DEFAULT_CACHE_SIZE = 1000; - // ======================================================================== + // ------------------------------------------------------------------------ // Attributes - // ======================================================================== + // ------------------------------------------------------------------------ // The trace path private final String fPath; @@ -60,9 +62,6 @@ public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRe // The cache page size AND checkpoints interval protected int fCacheSize; - // Indicate if the stream should be pre-indexed - private final boolean fWaitForIndexCompletion; - // The set of event stream checkpoints (for random access) protected Vector fCheckpoints = new Vector(); @@ -72,54 +71,34 @@ public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRe // The time span of the event stream private TmfTimeRange fTimeRange = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigBang); - // ======================================================================== + // ------------------------------------------------------------------------ // Constructors - // ======================================================================== + // ------------------------------------------------------------------------ /** - * @param name - * @param pageSize - * @param data.index + * @param path + * @param cacheSize * @throws FileNotFoundException */ - protected TmfTrace(String path, int pageSize, boolean waitForIndexCompletion) throws FileNotFoundException { - super(); + protected TmfTrace(Class type, String path, int cacheSize) throws FileNotFoundException { + super(type); int sep = path.lastIndexOf(File.separator); fName = (sep >= 0) ? path.substring(sep + 1) : path; fPath = path; - fCacheSize = (pageSize > 0) ? pageSize : DEFAULT_CACHE_SIZE; - fWaitForIndexCompletion = waitForIndexCompletion; - } - - /** - * @param name - * @param cacheSize - * @throws FileNotFoundException - */ - protected TmfTrace(String name, boolean waitForIndexCompletion) throws FileNotFoundException { - this(name, DEFAULT_CACHE_SIZE, waitForIndexCompletion); - } - - /** - * @param name - * @param cacheSize - * @throws FileNotFoundException - */ - protected TmfTrace(String name, int pageSize) throws FileNotFoundException { - this(name, pageSize, false); + fCacheSize = (cacheSize > 0) ? cacheSize : DEFAULT_CACHE_SIZE; } /** - * @param name + * @param path * @throws FileNotFoundException */ - protected TmfTrace(String name) throws FileNotFoundException { - this(name, DEFAULT_CACHE_SIZE, false); + protected TmfTrace(Class type, String path) throws FileNotFoundException { + this(type, path, DEFAULT_CACHE_SIZE); } - // ======================================================================== + // ------------------------------------------------------------------------ // Accessors - // ======================================================================== + // ------------------------------------------------------------------------ /** * @return the trace path @@ -156,27 +135,44 @@ public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRe return fTimeRange; } + /* (non-Javadoc) + * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#getStartTime() + */ public TmfTimestamp getStartTime() { return fTimeRange.getStartTime(); } + /* (non-Javadoc) + * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#getEndTime() + */ public TmfTimestamp getEndTime() { return fTimeRange.getEndTime(); } - protected long getIndex(TmfTimestamp timestamp) { - TmfTraceContext context = seekEvent(timestamp); - return context.getIndex(); - } - - protected TmfTimestamp getTimestamp(int index) { - TmfTraceContext context = seekEvent(index); - return context.getTimestamp(); - } - - // ======================================================================== +// /** +// * Return the event rank based on its timestamp +// * +// * @param timestamp +// * @return +// */ +// protected long getIndex(TmfTimestamp timestamp) { +// TmfTraceContext context = seekEvent(timestamp); +// return context.getIndex(); +// } + +// /** +// * Return the event timestamp based on its rank +// * @param index +// * @return +// */ +// protected TmfTimestamp getTimestamp(int index) { +// TmfTraceContext context = seekEvent(index); +// return context.getTimestamp(); +// } + + // ------------------------------------------------------------------------ // Operators - // ======================================================================== + // ------------------------------------------------------------------------ protected void setTimeRange(TmfTimeRange range) { fTimeRange = range; @@ -190,6 +186,47 @@ public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRe fTimeRange = new TmfTimeRange(fTimeRange.getStartTime(), endTime); } + // ------------------------------------------------------------------------ + // TmfProvider + // ------------------------------------------------------------------------ + + @Override + public ITmfContext setContext(TmfDataRequest request) { + if (request instanceof TmfEventRequest) { + return seekEvent(((TmfEventRequest) request).getRange().getStartTime()); + } + return null; + } + + /** + * Return the next piece of data based on the context supplied. The context + * would typically be updated for the subsequent read. + * + * @param context + * @return + */ + @SuppressWarnings("unchecked") + @Override + public T getNext(ITmfContext context) { + if (context instanceof TmfTraceContext) { + return (T) getNextEvent((TmfTraceContext) context); + } + return null; + } + + @Override + public boolean isCompleted(TmfDataRequest request, T data) { + if (request instanceof TmfEventRequest && data != null) { + return data.getTimestamp().compareTo(((TmfEventRequest) request).getRange().getEndTime(), false) > 0; + } + return true; + } + + + // ------------------------------------------------------------------------ + // ITmfTrace + // ------------------------------------------------------------------------ + /* (non-Javadoc) * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#seekEvent(org.eclipse.linuxtools.tmf.event.TmfTimestamp) */ @@ -211,22 +248,29 @@ public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRe // Position the stream at the checkpoint Object location; - synchronized (fCheckpoints) { //Just in case we are re-indexing - location = (index < fCheckpoints.size()) ? fCheckpoints.elementAt(index).getLocation() : null; + synchronized (fCheckpoints) { + if (fCheckpoints.size() > 0) { + if (index >= fCheckpoints.size()) { + index = fCheckpoints.size() - 1; + } + location = fCheckpoints.elementAt(index).getLocation(); + } + else { + location = null; + } } TmfTraceContext nextEventContext = seekLocation(location); - nextEventContext.setIndex(index * fCacheSize); + nextEventContext.setRank(index * fCacheSize); TmfTraceContext currentEventContext = new TmfTraceContext(nextEventContext); // And get the event TmfEvent event = getNextEvent(nextEventContext); while (event != null && event.getTimestamp().compareTo(timestamp, false) < 0) { currentEventContext.setLocation(nextEventContext.getLocation()); - currentEventContext.incrIndex(); + currentEventContext.incrRank(); event = getNextEvent(nextEventContext); } - currentEventContext.setTimestamp((event != null) ? event.getTimestamp() : null); return currentEventContext; } @@ -238,135 +282,64 @@ public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRe // Position the stream at the previous checkpoint int index = (int) position / fCacheSize; Object location; - synchronized (fCheckpoints) { //Just in case we are re-indexing - location = (index < fCheckpoints.size()) ? fCheckpoints.elementAt(index).getLocation() : null; + synchronized (fCheckpoints) { + if (fCheckpoints.size() > 0) { + if (index >= fCheckpoints.size()) { + index = fCheckpoints.size() - 1; + } + location = fCheckpoints.elementAt(index).getLocation(); + } + else { + location = null; + } } - TmfTraceContext nextEventContext = seekLocation(location); - nextEventContext.setIndex(index * fCacheSize); - TmfTraceContext currentEventContext = new TmfTraceContext(nextEventContext); - - // And locate the event (if it exists) - TmfEvent event = getNextEvent(nextEventContext); - while (event != null && currentEventContext.getIndex() < position) { - currentEventContext.setLocation(nextEventContext.getLocation()); - currentEventContext.setTimestamp(event.getTimestamp()); - currentEventContext.incrIndex(); - event = getNextEvent(nextEventContext); + TmfTraceContext context = seekLocation(location); + long rank = index * fCacheSize; + context.setRank(rank); + + if (rank < position) { + TmfEvent event = getNextEvent(context); + while (event != null && ++rank < position) { + event = getNextEvent(context); + } } - return currentEventContext; + return new TmfTraceContext(context.getLocation(), context.getRank()); } /* (non-Javadoc) * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#getNextEvent(org.eclipse.linuxtools.tmf.trace.ITmfTrace.TraceContext) */ - public TmfEvent getNextEvent(TmfTraceContext context) { - // parseEvent updates the context + public synchronized TmfEvent getNextEvent(TmfTraceContext context) { + // parseEvent() does not update the context TmfEvent event = parseEvent(context); + context.setLocation(getCurrentLocation()); if (event != null) { + context.incrRank(); processEvent(event); } return event; } /** - * To be implemented by the subclass. - */ - public abstract Object getCurrentLocation(); - public abstract TmfEvent parseEvent(TmfTraceContext context); - - /** - * Hook for "special" processing by the extending class + * Hook for "special" processing by the concrete class + * (called by getNextEvent()) + * * @param event */ public void processEvent(TmfEvent event) { // Do nothing by default } - - // ======================================================================== - // ITmfRequestHandler - // ======================================================================== - /* (non-Javadoc) - * @see org.eclipse.linuxtools.tmf.eventlog.ITmfRequestHandler#processRequest(org.eclipse.linuxtools.tmf.eventlog.TmfDataRequest, boolean) + /** + * To be implemented by the concrete class */ - public void processRequest(TmfDataRequest request, boolean waitForCompletion) { - - // Process the request - processDataRequest(request); - - // Wait for completion if needed - if (waitForCompletion) { - request.waitForCompletion(); - } - } - - /** - * Process a data request - * - * @param request - */ - private void processDataRequest(final TmfDataRequest request) { - - // Initialize the trace context - final TmfTraceContext context = (request.getRange() != null) ? - seekEvent(request.getRange().getStartTime()) : - seekEvent(request.getIndex()); - - final TmfTimestamp endTime = (request.getRange() != null) ? - request.getRange().getEndTime() : - TmfTimestamp.BigCrunch; - - // Process the request - Thread thread = new Thread() { - - @Override - public void run() { - // Extract the general request information - int blockSize = request.getBlockize(); - int nbRequestedEvents = request.getNbRequestedEvents(); - if (nbRequestedEvents == -1) { - nbRequestedEvents = Integer.MAX_VALUE; - } - - // Create the result buffer - Vector events = new Vector(); - int nbEvents = 0; - - // Get the ordered events - TmfEvent event = getNextEvent(context); - while (!request.isCancelled() && nbEvents < nbRequestedEvents && event != null - && event.getTimestamp().compareTo(endTime, false) <= 0) - { - events.add(event); - if (++nbEvents % blockSize == 0) { - pushData(request, events); - } - // To avoid an unnecessary read passed the last event requested - if (nbEvents < nbRequestedEvents) - event = getNextEvent(context); - } - pushData(request, events); - request.done(); - } - }; - thread.start(); - } + public abstract Object getCurrentLocation(); + public abstract TmfEvent parseEvent(TmfTraceContext context); - /** - * Format the result data and notify the requester. - * Note: after handling, the data is *removed*. - * - * @param request - * @param events - */ - private void pushData(TmfDataRequest request, Vector events) { - TmfEvent[] result = new TmfEvent[events.size()]; - events.toArray(result); - request.setData(result); - request.handleData(); - events.removeAllElements(); - } + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ /* (non-Javadoc) * @see java.lang.Object#toString() @@ -376,14 +349,21 @@ public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRe return "[TmfTrace (" + fName + "]"; } - // ======================================================================== - // Trace indexing. Essentially, parse the stream asynchronously and build - // the checkpoints index. This index is used to quickly find an event based - // on a timestamp or an index. - // ======================================================================== + // ------------------------------------------------------------------------ + // Indexing + // ------------------------------------------------------------------------ + /* + * The purpose of the index is to keep the information needed to rapidly + * access a trace event based on its timestamp or rank. + * + * NOTE: As it is, doesn't work for streaming traces. + */ + + private IndexingJob job; private Boolean fIndexing = false; - public void indexStream() { + + public void indexTrace(boolean waitForCompletion) { synchronized (fIndexing) { if (fIndexing) { return; @@ -391,14 +371,13 @@ public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRe fIndexing = true; } - final IndexingJob job = new IndexingJob("Indexing " + fName); + job = new IndexingJob("Indexing " + fName); job.schedule(); - if (fWaitForIndexCompletion) { + if (waitForCompletion) { try { job.join(); } catch (InterruptedException e) { - // TODO Auto-generated catch block e.printStackTrace(); } } @@ -416,37 +395,28 @@ public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRe @Override protected IStatus run(IProgressMonitor monitor) { - int nbEvents = 0; - TmfTimestamp startTime = new TmfTimestamp(); - TmfTimestamp lastTime = new TmfTimestamp(); - monitor.beginTask("Indexing " + fName, IProgressMonitor.UNKNOWN); + int nbEvents = 0; + TmfTimestamp startTime = null; + TmfTimestamp lastTime = null; + + fCheckpoints = new Vector(); + try { // Position the trace at the beginning TmfTraceContext context = seekLocation(null); - if (context.getTimestamp() == null) { - return Status.OK_STATUS; - } - // FIXME: LTTng hack - start -// fCheckpoints.add(new TmfTraceCheckpoint(context.getTimestamp(), context.getLocation())); // TMF - // FIXME: LTTng hack - end - - TmfEvent event; - startTime = context.getTimestamp(); - lastTime = context.getTimestamp(); - while ((event = getNextEvent(context)) != null) { - TmfTimestamp timestamp = context.getTimestamp(); - if (timestamp != null) { - lastTime = timestamp; - } - // FIXME: LTTng hack - start -// if (((++nbEvents % fCacheSize) == 0) && (timestamp != null)) { // TMF - if (((nbEvents++ % fCacheSize) == 0) && (timestamp != null)) { // LTTng - // FIXME: LTTng hack - end - fCheckpoints.add(new TmfTraceCheckpoint(timestamp, context.getLocation())); - fNbEvents = nbEvents - 1; - lastTime = context.getTimestamp(); + Object location = context.getLocation(); + + TmfEvent event = getNextEvent(context); + startTime = new TmfTimestamp(event.getTimestamp()); + lastTime = new TmfTimestamp(startTime); + while (event != null) { + lastTime = event.getTimestamp(); + if ((nbEvents++ % fCacheSize) == 0) { + lastTime = new TmfTimestamp(event.getTimestamp()); + fCheckpoints.add(new TmfTraceCheckpoint(lastTime, location)); + fNbEvents = nbEvents; fTimeRange = new TmfTimeRange(startTime, lastTime); notifyListeners(new TmfTimeRange(startTime, lastTime)); @@ -459,8 +429,12 @@ public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRe } } - // Do whatever - processEvent(event); + // We will need this location at the next iteration + if ((nbEvents % fCacheSize) == 0) { + location = context.getLocation(); + } + + event = getNextEvent(context); } } finally { @@ -471,30 +445,30 @@ public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRe } notifyListeners(new TmfTimeRange(startTime, lastTime)); monitor.done(); - } // createOffsetsFile(); -// dumpCheckpoints(); +// dumpTraceCheckpoints(); return Status.OK_STATUS; } } protected void notifyListeners(TmfTimeRange range) { - broadcastSignal(new TmfTraceUpdatedSignal( (TmfTrace)this, (TmfTrace)this, range)); + broadcast(new TmfTraceUpdatedSignal(this, this, range)); } -// /** -// * Dump the trace checkpoints -// */ -// private void dumpCheckpoints() { +// // ------------------------------------------------------------------------ +// // Toubleshooting code +// // ------------------------------------------------------------------------ +// +// private void dumpTraceCheckpoints() { // System.out.println("-----"); // System.out.println("Checkpoints of " + fName); // for (int i = 0; i < fCheckpoints.size(); i++) { // TmfTraceCheckpoint checkpoint = fCheckpoints.get(i); // TmfTraceContext context = new TmfTraceContext(checkpoint.getLocation()); -// TmfEvent event = getNextEvent(context); +// TmfEvent event = getNext(context); // System.out.println(" Entry: " + i + " timestamp: " + checkpoint.getTimestamp() + ", event: " + event.getTimestamp()); // assert((checkpoint.getTimestamp().compareTo(event.getTimestamp(), false) == 0)); // } @@ -504,7 +478,8 @@ public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRe // private void createOffsetsFile() { // // try { -// ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("LTTngOffsets.dat"))); +// // The trace context validation file is read by TmfTraceContext +// ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("TmfTraceContext.dat"))); // // TmfTraceContext context = null; // context = seekLocation(null); @@ -525,7 +500,7 @@ public abstract class TmfTrace extends TmfComponent implements ITmfTrace, ITmfRe // e.printStackTrace(); // } // } - +// // private void createOffsetsFile() { // // try { diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfTraceCheckpoint.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfTraceCheckpoint.java index 60a8d44688..998b72e0a7 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfTraceCheckpoint.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfTraceCheckpoint.java @@ -21,16 +21,16 @@ import org.eclipse.linuxtools.tmf.event.TmfTimestamp; */ public class TmfTraceCheckpoint implements Comparable { - // ======================================================================== + // ------------------------------------------------------------------------ // Attributes - // ======================================================================== + // ------------------------------------------------------------------------ private final TmfTimestamp fTimestamp; private final Object fLocation; - // ======================================================================== + // ------------------------------------------------------------------------ // Constructors - // ======================================================================== + // ------------------------------------------------------------------------ /** * @param ts @@ -41,9 +41,9 @@ public class TmfTraceCheckpoint implements Comparable { fLocation = location; } - // ======================================================================== + // ------------------------------------------------------------------------ // Accessors - // ======================================================================== + // ------------------------------------------------------------------------ /** * @return the checkpoint event timestamp @@ -59,9 +59,9 @@ public class TmfTraceCheckpoint implements Comparable { return fLocation; } - // ======================================================================== - // Operators - // ======================================================================== + // ------------------------------------------------------------------------ + // Comparable + // ------------------------------------------------------------------------ public int compareTo(TmfTraceCheckpoint other) { return fTimestamp.compareTo(other.fTimestamp, false); diff --git a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfTraceContext.java b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfTraceContext.java index c389a3866b..78cced43b7 100644 --- a/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfTraceContext.java +++ b/org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfTraceContext.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson + * Copyright (c) 2009, 2010 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -12,89 +12,112 @@ package org.eclipse.linuxtools.tmf.trace; -import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.component.ITmfContext; /** * TmfTraceContext *

- * Trace context keeper. It ties a trace location to an event index and - * timestamp. The context should be enough to restore the trace state - * so the corresponding event can be read. - * + * Trace context structure. It ties a trace location to an event index and + * timestamp. The context should be enough to restore the trace state so the + * corresponding event can be read. + *

* Used to handle conflicting, concurrent accesses to the trace. */ -public class TmfTraceContext { +public class TmfTraceContext implements ITmfContext, Cloneable { private Object location; - private TmfTimestamp timestamp; - private long index; +// private TmfTimestamp timestamp; + private long rank; - public TmfTraceContext(Object loc, TmfTimestamp ts, long ind) { +// public TmfTraceContext(Object loc, TmfTimestamp ts, long ind) { +// location = loc; +// timestamp = ts; +// index = ind; +// } + + public TmfTraceContext(Object loc, long ind) { +// this(loc, null, 0); location = loc; - timestamp = ts; - index = ind; + rank = ind; } public TmfTraceContext(Object loc) { - this(loc, null, 0); + this(loc, 0); } public TmfTraceContext(TmfTraceContext other) { - this(other.location, other.timestamp, other.index); +// this(other.location, other.timestamp, other.index); + this(other.location, other.rank); + } + + public TmfTraceContext clone() { + try { + return (TmfTraceContext) super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + } + return null; } public Object getLocation() { -// validateLocation(location); return location; } -// The FW expects the trace events to be ordered in time. -// If this is not the case, this invalidates the Trace index (at least) -// TODO: Throw an exception -// private TmfTimestamp previous = TmfTimestamp.BigBang; public void setLocation(Object loc) { -// if (loc instanceof TmfTimestamp) { -// TmfTimestamp ts = (TmfTimestamp) loc; -// if (ts.compareTo(previous, false) < 0) { -// System.out.println("Going back in time from " + previous + " to " + ts); -// } -// previous = ts; -// } -// validateLocation(loc); location = loc; } - public TmfTimestamp getTimestamp() { - return timestamp; - } +// public TmfTimestamp getTimestamp() { +// return timestamp; +// } - public void setTimestamp(TmfTimestamp ts) { - timestamp = ts; - } +// public void setTimestamp(TmfTimestamp ts) { +// timestamp = ts; +// } - public void setIndex(long value) { - index = value; + public void setRank(long value) { + rank = value; } - public long getIndex() { - return index; + public long getRank() { + return rank; } - public void incrIndex() { - index++; + public void incrRank() { + rank++; } // // ======================================================================== // // Toubleshooting code // // ======================================================================== // +// public Object getLocation() { +// validateLocation(location); +// return location; +// } +// +// // The FW expects the trace events to be ordered in time. +// // If this is not the case, this invalidates the Trace index (at least) +// private TmfTimestamp previous = TmfTimestamp.BigBang; +// public void setLocation(Object loc) { +// if (loc instanceof TmfTimestamp) { +// TmfTimestamp ts = (TmfTimestamp) loc; +// if (ts.compareTo(previous, false) < 0) { +// System.out.println("Going back in time from " + previous + " to " + ts); +// } +// previous = ts; +// } +// validateLocation(loc); +// } +// // static private DataInputStream in; // static private int size = 100000; // static private String locations[] = new String[size]; // static public void init() { // System.out.println("TmfTraceContext: Loading valid locations..."); // try { -// in = new DataInputStream(new BufferedInputStream(new FileInputStream("LTTngOffsets.dat"))); +// // The trace context validation file is created by TmfTrace +// in = new DataInputStream(new BufferedInputStream(new FileInputStream("TmfTraceContext.dat"))); // int i = 0; // while (i < size) { // locations[i] = in.readUTF(); @@ -108,7 +131,7 @@ public class TmfTraceContext { // } // System.out.println("TmfTraceContext: Done."); // } - +// // private boolean bsearch(long key) { // int first = 0; // int last = size; -- 2.34.1