From 8aa463e0c25d9a53f055c7344db98c175af0c532 Mon Sep 17 00:00:00 2001 From: Matthew Khouzam Date: Tue, 15 Dec 2015 15:12:00 -0500 Subject: [PATCH] ctf: Introduce ICTFStream This allows a CTFStream to be shared while not being modifyiable. Change-Id: I4bf4985abd5221ebfa543d0a7ff0cfeda0874fce Signed-off-by: Matthew Khouzam Reviewed-on: https://git.eclipse.org/r/62767 Reviewed-by: Francis Giraldeau Reviewed-by: Hudson CI --- .../tests/trace/CTFStreamInputReaderTest.java | 8 +- .../core/tests/trace/CTFStreamInputTest.java | 5 +- .../ctf/core/tests/trace/CTFStreamTest.java | 2 +- .../ctf/core/tests/trace/CTFTraceTest.java | 5 +- .../ctf/core/tests/trace/MetadataTest.java | 6 +- .../tests/types/EventDeclarationTest.java | 2 +- .../ctf/core/event/IEventDeclaration.java | 6 +- .../ctf/core/event/LostEventDeclaration.java | 7 +- .../ctf/core/trace/CTFStreamInput.java | 8 +- .../tracecompass/ctf/core/trace/CTFTrace.java | 45 +++--- .../ctf/core/trace/CTFTraceReader.java | 4 +- .../ctf/core/trace/CTFTraceWriter.java | 2 +- .../ctf/core/trace/ICTFStream.java | 129 ++++++++++++++++++ .../ctf/core/event/EventDeclaration.java | 2 +- .../ctf/core/event/metadata/IOStructGen.java | 23 ++-- .../ctf/core/trace/CTFStream.java | 83 +++-------- 16 files changed, 224 insertions(+), 113 deletions(-) create mode 100644 ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/ICTFStream.java rename ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/{ => internal}/ctf/core/trace/CTFStream.java (84%) diff --git a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFStreamInputReaderTest.java b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFStreamInputReaderTest.java index aad70eb98c..ccfab8e985 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFStreamInputReaderTest.java +++ b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFStreamInputReaderTest.java @@ -29,11 +29,12 @@ import org.eclipse.tracecompass.ctf.core.event.types.StructDeclaration; import org.eclipse.tracecompass.ctf.core.event.types.StructDefinition; import org.eclipse.tracecompass.ctf.core.tests.shared.CtfTestTraceUtils; import org.eclipse.tracecompass.ctf.core.trace.CTFResponse; -import org.eclipse.tracecompass.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.ctf.core.trace.CTFStreamInput; import org.eclipse.tracecompass.ctf.core.trace.CTFStreamInputReader; import org.eclipse.tracecompass.ctf.core.trace.CTFTrace; +import org.eclipse.tracecompass.ctf.core.trace.ICTFStream; import org.eclipse.tracecompass.internal.ctf.core.event.EventDeclaration; +import org.eclipse.tracecompass.internal.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace; import org.junit.Before; import org.junit.Test; @@ -68,13 +69,12 @@ public class CTFStreamInputReaderTest { null, "packet", new Definition[] { new StringDefinition(StringDeclaration.getStringDeclaration(Encoding.UTF8), null, "field", "test") }), - null) - ); + null)); } private static CTFStreamInputReader getStreamInputReader() throws CTFException { CTFTrace trace = CtfTestTraceUtils.getTrace(testTrace); - CTFStream s = trace.getStream((long) 0); + ICTFStream s = trace.getStream((long) 0); Set streamInput = s.getStreamInputs(); CTFStreamInputReader retVal = null; for (CTFStreamInput si : streamInput) { diff --git a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFStreamInputTest.java b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFStreamInputTest.java index 9146c77c7f..884f13abaf 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFStreamInputTest.java +++ b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFStreamInputTest.java @@ -24,8 +24,9 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.tracecompass.ctf.core.CTFException; import org.eclipse.tracecompass.ctf.core.event.types.IDefinition; import org.eclipse.tracecompass.ctf.core.tests.shared.CtfTestTraceUtils; -import org.eclipse.tracecompass.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.ctf.core.trace.CTFStreamInput; +import org.eclipse.tracecompass.ctf.core.trace.ICTFStream; +import org.eclipse.tracecompass.internal.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace; import org.junit.Before; import org.junit.Test; @@ -103,7 +104,7 @@ public class CTFStreamInputTest { */ @Test public void testGetStream() { - CTFStream result = fixture.getStream(); + ICTFStream result = fixture.getStream(); assertNotNull(result); } diff --git a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFStreamTest.java b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFStreamTest.java index 737a06dada..6c29917134 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFStreamTest.java +++ b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFStreamTest.java @@ -23,11 +23,11 @@ import org.eclipse.tracecompass.ctf.core.CTFException; import org.eclipse.tracecompass.ctf.core.event.types.IDeclaration; import org.eclipse.tracecompass.ctf.core.event.types.StructDeclaration; import org.eclipse.tracecompass.ctf.core.tests.shared.CtfTestTraceUtils; -import org.eclipse.tracecompass.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.ctf.core.trace.CTFStreamInput; import org.eclipse.tracecompass.ctf.core.trace.CTFTrace; import org.eclipse.tracecompass.internal.ctf.core.event.EventDeclaration; import org.eclipse.tracecompass.internal.ctf.core.event.metadata.exceptions.ParseException; +import org.eclipse.tracecompass.internal.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace; import org.junit.Before; import org.junit.Test; diff --git a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFTraceTest.java b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFTraceTest.java index ffd3989c1c..fa9b59fe1b 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFTraceTest.java +++ b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/CTFTraceTest.java @@ -29,9 +29,10 @@ import org.eclipse.tracecompass.ctf.core.event.CTFClock; import org.eclipse.tracecompass.ctf.core.event.types.IDefinition; import org.eclipse.tracecompass.ctf.core.event.types.StructDeclaration; import org.eclipse.tracecompass.ctf.core.tests.shared.CtfTestTraceUtils; -import org.eclipse.tracecompass.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.ctf.core.trace.CTFTrace; +import org.eclipse.tracecompass.ctf.core.trace.ICTFStream; import org.eclipse.tracecompass.internal.ctf.core.event.metadata.exceptions.ParseException; +import org.eclipse.tracecompass.internal.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace; import org.junit.Before; import org.junit.Test; @@ -186,7 +187,7 @@ public class CTFTraceTest { @Test public void testGetStream() { Long id = new Long(0L); - CTFStream result = fixture.getStream(id); + ICTFStream result = fixture.getStream(id); assertNotNull(result); } diff --git a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/MetadataTest.java b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/MetadataTest.java index b6005352be..fc3699aeed 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/MetadataTest.java +++ b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/trace/MetadataTest.java @@ -27,8 +27,8 @@ import org.eclipse.tracecompass.ctf.core.event.IEventDeclaration; import org.eclipse.tracecompass.ctf.core.event.types.IDeclaration; import org.eclipse.tracecompass.ctf.core.event.types.ISimpleDatatypeDeclaration; import org.eclipse.tracecompass.ctf.core.tests.shared.CtfTestTraceUtils; -import org.eclipse.tracecompass.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.ctf.core.trace.CTFTrace; +import org.eclipse.tracecompass.ctf.core.trace.ICTFStream; import org.eclipse.tracecompass.ctf.core.trace.Metadata; import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace; import org.junit.Before; @@ -251,12 +251,12 @@ public class MetadataTest { protected CTFTrace testSingleFragment() throws CTFException { fixture = new Metadata(); CTFTrace trace = fixture.getTrace(); - for (CTFStream s : trace.getStreams()) { + for (ICTFStream s : trace.getStreams()) { fail("This should be empty, has" + s.toString()); } fixture.parseText(mdStart); int count = 0; - for (CTFStream s : trace.getStreams()) { + for (ICTFStream s : trace.getStreams()) { count++; assertNotNull(s); } diff --git a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/types/EventDeclarationTest.java b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/types/EventDeclarationTest.java index 9b3c96c915..101d05e119 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/types/EventDeclarationTest.java +++ b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/types/EventDeclarationTest.java @@ -23,10 +23,10 @@ import org.eclipse.tracecompass.ctf.core.event.IEventDeclaration; import org.eclipse.tracecompass.ctf.core.event.LostEventDeclaration; import org.eclipse.tracecompass.ctf.core.event.types.StructDeclaration; import org.eclipse.tracecompass.ctf.core.tests.shared.CtfTestTraceUtils; -import org.eclipse.tracecompass.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.ctf.core.trace.CTFTrace; import org.eclipse.tracecompass.ctf.core.trace.CTFTraceReader; import org.eclipse.tracecompass.internal.ctf.core.event.EventDeclaration; +import org.eclipse.tracecompass.internal.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace; import org.junit.Before; import org.junit.Test; diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/IEventDeclaration.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/IEventDeclaration.java index 166b8e1da5..6419c95592 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/IEventDeclaration.java +++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/IEventDeclaration.java @@ -17,8 +17,9 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.tracecompass.ctf.core.CTFException; import org.eclipse.tracecompass.ctf.core.event.io.BitBuffer; import org.eclipse.tracecompass.ctf.core.event.types.StructDeclaration; -import org.eclipse.tracecompass.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.ctf.core.trace.CTFStreamInputReader; +import org.eclipse.tracecompass.ctf.core.trace.ICTFStream; +import org.eclipse.tracecompass.internal.ctf.core.trace.CTFStream; /** * Representation of one type of event. A bit like "int" or "long" but for trace @@ -83,8 +84,9 @@ public interface IEventDeclaration { * Gets the {@link CTFStream} of an event declaration * * @return the stream + * @since 2.0 */ - CTFStream getStream(); + ICTFStream getStream(); /** * What is the log level of this event? diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/LostEventDeclaration.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/LostEventDeclaration.java index 1ffddc43ce..a995feebbd 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/LostEventDeclaration.java +++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/LostEventDeclaration.java @@ -19,8 +19,8 @@ import org.eclipse.tracecompass.ctf.core.CTFStrings; import org.eclipse.tracecompass.ctf.core.event.io.BitBuffer; import org.eclipse.tracecompass.ctf.core.event.types.IntegerDeclaration; import org.eclipse.tracecompass.ctf.core.event.types.StructDeclaration; -import org.eclipse.tracecompass.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.ctf.core.trace.CTFStreamInputReader; +import org.eclipse.tracecompass.ctf.core.trace.ICTFStream; /** * A lost event definition @@ -75,8 +75,11 @@ public class LostEventDeclaration implements IEventDeclaration { return LOST_EVENT_ID; } + /** + * @since 2.0 + */ @Override - public CTFStream getStream() { + public ICTFStream getStream() { return null; } diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFStreamInput.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFStreamInput.java index 7c62cfb1b2..babc8ad04d 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFStreamInput.java +++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFStreamInput.java @@ -54,7 +54,7 @@ public class CTFStreamInput implements IDefinitionScope { /** * The associated Stream */ - private final CTFStream fStream; + private final ICTFStream fStream; /** * Information on the file (used for debugging) @@ -99,8 +99,9 @@ public class CTFStreamInput implements IDefinitionScope { * The stream to which this StreamInput belongs to. * @param file * Information about the trace file (for debugging purposes). + * @since 2.0 */ - public CTFStreamInput(CTFStream stream, File file) { + public CTFStreamInput(ICTFStream stream, File file) { fStream = stream; fFile = file; String name = fFile.getName(); @@ -135,8 +136,9 @@ public class CTFStreamInput implements IDefinitionScope { * Gets the stream the streamInput wrapper is wrapping * * @return the stream the streamInput wrapper is wrapping + * @since 2.0 */ - public CTFStream getStream() { + public ICTFStream getStream() { return fStream; } diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTrace.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTrace.java index dab024292b..e44ad4a9f0 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTrace.java +++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTrace.java @@ -49,6 +49,7 @@ import org.eclipse.tracecompass.ctf.core.event.types.StructDefinition; import org.eclipse.tracecompass.internal.ctf.core.SafeMappedByteBuffer; import org.eclipse.tracecompass.internal.ctf.core.event.metadata.MetadataStrings; import org.eclipse.tracecompass.internal.ctf.core.event.metadata.exceptions.ParseException; +import org.eclipse.tracecompass.internal.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.internal.ctf.core.trace.Utils; /** @@ -119,7 +120,7 @@ public class CTFTrace implements IDefinitionScope { /** * Collection of streams contained in the trace. */ - private final Map fStreams = new HashMap<>(); + private final Map fStreams = new HashMap<>(); /** * Collection of environment variables set by the tracer @@ -201,7 +202,7 @@ public class CTFTrace implements IDefinitionScope { } /* Create their index */ - for (CTFStream stream : getStreams()) { + for (ICTFStream stream : getStreams()) { Set inputs = stream.getStreamInputs(); for (CTFStreamInput s : inputs) { addStream(s); @@ -221,7 +222,7 @@ public class CTFTrace implements IDefinitionScope { * @return The list of event declarations */ public Collection getEventDeclarations(Long streamId) { - CTFStream stream = fStreams.get(streamId); + ICTFStream stream = fStreams.get(streamId); if (stream == null) { return null; } @@ -234,8 +235,9 @@ public class CTFTrace implements IDefinitionScope { * @param id * Long the id of the stream * @return Stream the stream that we need + * @since 2.0 */ - public CTFStream getStream(Long id) { + public ICTFStream getStream(Long id) { if (id == null) { return fStreams.get(0L); } @@ -405,7 +407,7 @@ public class CTFTrace implements IDefinitionScope { * * @return Iterable<Stream> an iterable over streams. */ - public Iterable getStreams() { + public Iterable getStreams() { return fStreams.values(); } @@ -428,7 +430,7 @@ public class CTFTrace implements IDefinitionScope { /* * add the stream */ - CTFStream stream = s.getStream(); + ICTFStream stream = s.getStream(); fStreams.put(stream.getId(), stream); /* @@ -449,10 +451,10 @@ public class CTFTrace implements IDefinitionScope { * @throws CTFException * if there is a file error */ - private CTFStream openStreamInput(File streamFile) throws CTFException { + private ICTFStream openStreamInput(File streamFile) throws CTFException { ByteBuffer byteBuffer; BitBuffer streamBitBuffer; - CTFStream stream; + ICTFStream stream; if (!streamFile.canRead()) { throw new CTFException("Unreadable file : " //$NON-NLS-1$ @@ -504,13 +506,16 @@ public class CTFTrace implements IDefinitionScope { throw new CTFException("Unexpected end of stream"); //$NON-NLS-1$ } + if (!(stream instanceof CTFStream)) { + throw new CTFException("Stream is not a CTFStream, but rather a " + stream.getClass().getCanonicalName()); //$NON-NLS-1$ + } + CTFStream ctfStream = (CTFStream) stream; /* * Create the stream input and add a reference to the streamInput in the * stream. */ - stream.addInput(new CTFStreamInput(stream, streamFile)); - - return stream; + ctfStream.addInput(new CTFStreamInput(ctfStream, streamFile)); + return ctfStream; } private void validateUUID(StructDefinition packetHeaderDef) throws CTFException { @@ -586,8 +591,9 @@ public class CTFTrace implements IDefinitionScope { * A stream object. * @throws ParseException * If there was some problem reading the metadata + * @since 2.0 */ - public void addStream(CTFStream stream) throws ParseException { + public void addStream(ICTFStream stream) throws ParseException { /* * If there is already a stream without id (the null key), it must be * the only one @@ -607,7 +613,7 @@ public class CTFTrace implements IDefinitionScope { /* * If a stream with the same ID already exists, it is not valid. */ - CTFStream existingStream = fStreams.get(stream.getId()); + ICTFStream existingStream = fStreams.get(stream.getId()); if (existingStream != null) { throw new ParseException("Stream id already exists"); //$NON-NLS-1$ } @@ -709,7 +715,7 @@ public class CTFTrace implements IDefinitionScope { */ public long getCurrentStartTime() { long currentStart = Long.MAX_VALUE; - for (CTFStream stream : fStreams.values()) { + for (ICTFStream stream : fStreams.values()) { for (CTFStreamInput si : stream.getStreamInputs()) { currentStart = Math.min(currentStart, si.getIndex().getElement(0).getTimestampBegin()); } @@ -724,7 +730,7 @@ public class CTFTrace implements IDefinitionScope { */ public long getCurrentEndTime() { long currentEnd = Long.MIN_VALUE; - for (CTFStream stream : fStreams.values()) { + for (ICTFStream stream : fStreams.values()) { for (CTFStreamInput si : stream.getStreamInputs()) { currentEnd = Math.max(currentEnd, si.getTimestampEnd()); } @@ -807,12 +813,17 @@ public class CTFTrace implements IDefinitionScope { if (file == null) { throw new CTFException("cannot create a stream with no file"); //$NON-NLS-1$ } - CTFStream stream = fStreams.get(id); + ICTFStream stream = fStreams.get(id); if (stream == null) { stream = new CTFStream(this); fStreams.put(id, stream); } - stream.addInput(new CTFStreamInput(stream, file)); + if (stream instanceof CTFStream) { + CTFStream ctfStream = (CTFStream) stream; + ctfStream.addInput(new CTFStreamInput(stream, file)); + } else { + throw new CTFException("Stream does not support adding input"); //$NON-NLS-1$ + } } /** diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTraceReader.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTraceReader.java index 905856dbb2..9c9bae563b 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTraceReader.java +++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTraceReader.java @@ -201,7 +201,7 @@ public class CTFTraceReader implements AutoCloseable { /* * For each stream. */ - for (CTFStream stream : fTrace.getStreams()) { + for (ICTFStream stream : fTrace.getStreams()) { Set streamInputs = stream.getStreamInputs(); /* @@ -240,7 +240,7 @@ public class CTFTraceReader implements AutoCloseable { */ public void update() throws CTFException { Set readers = new HashSet<>(); - for (CTFStream stream : fTrace.getStreams()) { + for (ICTFStream stream : fTrace.getStreams()) { Set streamInputs = stream.getStreamInputs(); for (CTFStreamInput streamInput : streamInputs) { /* diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTraceWriter.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTraceWriter.java index 46eaa665b1..c51977740d 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTraceWriter.java +++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTraceWriter.java @@ -99,7 +99,7 @@ public class CTFTraceWriter { } // Copy packets - for (CTFStream stream : trace.getStreams()) { + for (ICTFStream stream : trace.getStreams()) { Set inputs = stream.getStreamInputs(); for (CTFStreamInput s : inputs) { CTFStreamOutputWriter streamOutputwriter = new CTFStreamOutputWriter(checkNotNull(s), out); diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/ICTFStream.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/ICTFStream.java new file mode 100644 index 0000000000..d98f131bd0 --- /dev/null +++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/ICTFStream.java @@ -0,0 +1,129 @@ +/******************************************************************************* + * Copyright (c) 2011, 2014 Ericsson, Ecole Polytechnique de Montreal and others + * + * 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: Matthew Khouzam - Initial API and implementation + * Contributors: Simon Marchi - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.tracecompass.ctf.core.trace; + +import java.util.List; +import java.util.Set; + +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.tracecompass.ctf.core.event.IEventDeclaration; +import org.eclipse.tracecompass.ctf.core.event.types.IDeclaration; +import org.eclipse.tracecompass.ctf.core.event.types.StructDeclaration; +import org.eclipse.tracecompass.internal.ctf.core.event.EventDeclaration; + +/** + * An _event stream_ can be divided into contiguous event packets of variable + * size. An event packet can contain a certain amount of padding at the end. The + * stream header is repeated at the beginning of each event packet. The + * rationale for the event stream design choices is explained in + * Stream header rationale. + *

+ * + * The event stream header will therefore be referred to as the _event packet + * header_ throughout the rest of this document. + * + * @author Matthew Khouzam + * @author Efficios - Javadoc + * @since 2.0 + */ +public interface ICTFStream { + + /** + * Gets the id of a stream + * + * @return id the id of a stream + * @since 1.0 + */ + long getId(); + + /** + * Is the id of a stream set + * + * @return If the ID is set or not + */ + boolean isIdSet(); + + /** + * + * @return is the event header set (timestamp and stuff) (see Ctf Spec) + */ + boolean isEventHeaderSet(); + + /** + * + * @return is the event context set (pid and stuff) (see Ctf Spec) + */ + boolean isEventContextSet(); + + /** + * + * @return Is the packet context set (see Ctf Spec) + */ + boolean isPacketContextSet(); + + /** + * Gets the event header declaration + * + * @return the event header declaration in declaration form + */ + IDeclaration getEventHeaderDeclaration(); + + /** + * + * @return the event context declaration in structdeclaration form + */ + StructDeclaration getEventContextDecl(); + + /** + * + * @return the packet context declaration in structdeclaration form + */ + StructDeclaration getPacketContextDecl(); + + /** + * + * @return the set of all stream inputs for this stream + */ + Set getStreamInputs(); + + /** + * + * @return the parent trace + */ + CTFTrace getTrace(); + + /** + * Get all the event declarations in this stream. + * + * @return The event declarations for this stream + * @since 2.0 + */ + @NonNull + List<@Nullable IEventDeclaration> getEventDeclarations(); + + /** + * Get the event declaration for a given ID. + * + * @param eventId + * The ID, can be {@link EventDeclaration#UNSET_EVENT_ID}, or any + * positive value + * @return The event declaration with the given ID for this stream, or + * 'null' if there are no declaration with this ID + * @throws IllegalArgumentException + * If the passed ID is invalid + */ + @Nullable + IEventDeclaration getEventDeclaration(int eventId); + +} \ No newline at end of file diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/internal/ctf/core/event/EventDeclaration.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/internal/ctf/core/event/EventDeclaration.java index 6eb404b3a2..3172b9daa2 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/internal/ctf/core/event/EventDeclaration.java +++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/internal/ctf/core/event/EventDeclaration.java @@ -31,11 +31,11 @@ import org.eclipse.tracecompass.ctf.core.event.types.IntegerDefinition; import org.eclipse.tracecompass.ctf.core.event.types.StructDeclaration; import org.eclipse.tracecompass.ctf.core.event.types.StructDefinition; import org.eclipse.tracecompass.ctf.core.trace.CTFIOException; -import org.eclipse.tracecompass.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.ctf.core.trace.CTFStreamInputReader; import org.eclipse.tracecompass.ctf.core.trace.CTFTrace; import org.eclipse.tracecompass.ctf.core.trace.ICTFPacketDescriptor; import org.eclipse.tracecompass.internal.ctf.core.event.types.composite.EventHeaderDefinition; +import org.eclipse.tracecompass.internal.ctf.core.trace.CTFStream; /** * Representation of one type of event. A bit like "int" or "long" but for trace diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/internal/ctf/core/event/metadata/IOStructGen.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/internal/ctf/core/event/metadata/IOStructGen.java index e94d57ffcb..bd7c26dc3b 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/internal/ctf/core/event/metadata/IOStructGen.java +++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/internal/ctf/core/event/metadata/IOStructGen.java @@ -45,8 +45,8 @@ import org.eclipse.tracecompass.ctf.core.event.types.IntegerDeclaration; import org.eclipse.tracecompass.ctf.core.event.types.StringDeclaration; import org.eclipse.tracecompass.ctf.core.event.types.StructDeclaration; import org.eclipse.tracecompass.ctf.core.event.types.VariantDeclaration; -import org.eclipse.tracecompass.ctf.core.trace.CTFStream; import org.eclipse.tracecompass.ctf.core.trace.CTFTrace; +import org.eclipse.tracecompass.ctf.core.trace.ICTFStream; import org.eclipse.tracecompass.ctf.parser.CTFParser; import org.eclipse.tracecompass.internal.ctf.core.Activator; import org.eclipse.tracecompass.internal.ctf.core.event.EventDeclaration; @@ -56,6 +56,7 @@ import org.eclipse.tracecompass.internal.ctf.core.event.types.SequenceDeclaratio import org.eclipse.tracecompass.internal.ctf.core.event.types.StructDeclarationFlattener; import org.eclipse.tracecompass.internal.ctf.core.event.types.composite.EventHeaderCompactDeclaration; import org.eclipse.tracecompass.internal.ctf.core.event.types.composite.EventHeaderLargeDeclaration; +import org.eclipse.tracecompass.internal.ctf.core.trace.CTFStream; import com.google.common.collect.Iterables; @@ -458,8 +459,8 @@ public class IOStructGen { EnumDeclaration newEnum = new EnumDeclaration(IntegerDeclaration.createDeclaration(containerType.getLength(), containerType.isSigned(), containerType.getBase(), byteOrder, containerType.getEncoding(), containerType.getClock(), containerType.getAlignment())); - for( Entry entry : decl.getEnumTable().entrySet()){ - newEnum.add(entry.getValue().getFirst(), entry.getValue().getSecond(), entry.getKey()); + for (Entry entry : decl.getEnumTable().entrySet()) { + newEnum.add(entry.getValue().getFirst(), entry.getValue().getSecond(), entry.getKey()); } parentScope.replaceType(name, newEnum); @@ -724,10 +725,11 @@ public class IOStructGen { * could be possible to just get the only existing stream, whatever * is its id. */ - CTFStream stream = fTrace.getStream(null); + ICTFStream iStream = fTrace.getStream(null); + if (iStream instanceof CTFStream) { - if (stream != null) { - event.setStream(stream); + CTFStream ctfStream = (CTFStream) iStream; + event.setStream(ctfStream); } else { throw new ParseException("Event without stream_id, but there is no stream without id"); //$NON-NLS-1$ } @@ -739,6 +741,7 @@ public class IOStructGen { event.getStream().addEvent(event); popScope(); + } private void parseEventDeclaration(CommonTree eventDecl, @@ -785,13 +788,15 @@ public class IOStructGen { long streamId = getStreamID(rightNode); - CTFStream stream = fTrace.getStream(streamId); + ICTFStream iStream = fTrace.getStream(streamId); - if (stream == null) { + if (iStream instanceof CTFStream) { + CTFStream stream = (CTFStream) iStream; + event.setStream(stream); + } else { throw new ParseException("Stream " + streamId + " not found"); //$NON-NLS-1$ //$NON-NLS-2$ } - event.setStream(stream); } else if (left.equals(MetadataStrings.CONTEXT)) { if (event.contextIsSet()) { throw new ParseException("context already defined"); //$NON-NLS-1$ diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFStream.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/internal/ctf/core/trace/CTFStream.java similarity index 84% rename from ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFStream.java rename to ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/internal/ctf/core/trace/CTFStream.java index 00b25372af..b434e4cdbb 100644 --- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFStream.java +++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/internal/ctf/core/trace/CTFStream.java @@ -10,7 +10,7 @@ * Contributors: Simon Marchi - Initial API and implementation *******************************************************************************/ -package org.eclipse.tracecompass.ctf.core.trace; +package org.eclipse.tracecompass.internal.ctf.core.trace; import java.util.ArrayList; import java.util.Collection; @@ -19,7 +19,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.tracecompass.common.core.NonNullUtils; import org.eclipse.tracecompass.ctf.core.CTFException; @@ -27,6 +26,9 @@ import org.eclipse.tracecompass.ctf.core.event.IEventDeclaration; import org.eclipse.tracecompass.ctf.core.event.types.IDeclaration; import org.eclipse.tracecompass.ctf.core.event.types.IEventHeaderDeclaration; import org.eclipse.tracecompass.ctf.core.event.types.StructDeclaration; +import org.eclipse.tracecompass.ctf.core.trace.CTFStreamInput; +import org.eclipse.tracecompass.ctf.core.trace.CTFTrace; +import org.eclipse.tracecompass.ctf.core.trace.ICTFStream; import org.eclipse.tracecompass.internal.ctf.core.event.EventDeclaration; import org.eclipse.tracecompass.internal.ctf.core.event.metadata.exceptions.ParseException; @@ -35,7 +37,7 @@ import org.eclipse.tracecompass.internal.ctf.core.event.metadata.exceptions.Pars *

* Represents a stream in a trace. */ -public class CTFStream { +public class CTFStream implements ICTFStream { // ------------------------------------------------------------------------ // Attributes @@ -100,45 +102,27 @@ public class CTFStream { fStreamIdSet = true; } - /** - * Gets the id of a stream - * - * @return id the id of a stream - * @since 1.0 - */ + @Override public long getId() { return fId; } - /** - * Is the id of a stream set - * - * @return If the ID is set or not - */ + @Override public boolean isIdSet() { return fStreamIdSet; } - /** - * - * @return is the event header set (timestamp and stuff) (see Ctf Spec) - */ + @Override public boolean isEventHeaderSet() { return fEventHeaderDecl != null; } - /** - * - * @return is the event context set (pid and stuff) (see Ctf Spec) - */ + @Override public boolean isEventContextSet() { return fEventContextDecl != null; } - /** - * - * @return Is the packet context set (see Ctf Spec) - */ + @Override public boolean isPacketContextSet() { return fPacketContextDecl != null; } @@ -181,69 +165,41 @@ public class CTFStream { fPacketContextDecl = packetContext; } - /** - * Gets the event header declaration - * - * @return the event header declaration in declaration form - */ + @Override public IDeclaration getEventHeaderDeclaration() { return fEventHeaderDecl; } - /** - * - * @return the event context declaration in structdeclaration form - */ + @Override public StructDeclaration getEventContextDecl() { return fEventContextDecl; } - /** - * - * @return the packet context declaration in structdeclaration form - */ + @Override public StructDeclaration getPacketContextDecl() { return fPacketContextDecl; } - /** - * - * @return the set of all stream inputs for this stream - */ + @Override public Set getStreamInputs() { return fInputs; } - /** - * - * @return the parent trace - */ + @Override public CTFTrace getTrace() { return fTrace; } /** - * Get all the event declarations in this stream. - * - * @return The event declarations for this stream * @since 2.0 */ - public @NonNull List<@Nullable IEventDeclaration> getEventDeclarations() { + @Override + public List<@Nullable IEventDeclaration> getEventDeclarations() { return NonNullUtils.checkNotNull(Collections.unmodifiableList(fEvents)); } - /** - * Get the event declaration for a given ID. - * - * @param eventId - * The ID, can be {@link EventDeclaration#UNSET_EVENT_ID}, or any - * positive value - * @return The event declaration with the given ID for this stream, or - * 'null' if there are no declaration with this ID - * @throws IllegalArgumentException - * If the passed ID is invalid - */ - public @Nullable IEventDeclaration getEventDeclaration(int eventId) { + @Override + public IEventDeclaration getEventDeclaration(int eventId) { int eventIndex = (eventId == IEventDeclaration.UNSET_EVENT_ID) ? 0 : eventId; if (eventIndex < 0) { /* Any negative value other than UNSET_EVENT_ID is invalid */ @@ -274,6 +230,7 @@ public class CTFStream { * @throws ParseException * If there was a problem reading the event or adding it to the * stream + * @since 2.0 */ public void addEvent(IEventDeclaration event) throws ParseException { if (fEventUnsetId) { -- 2.34.1