Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeneviève Bastien2016-09-22 20:56:24 +0000
committerGenevieve Bastien2017-02-21 16:41:12 +0000
commit7480f4718cd300828a72664ae3ea9ef00c516c62 (patch)
treedf260140f716fcddaa97017c9413c2c9e6b7c2da /statesystem
parent457c184f5e04b1ebef3b5dbe26da63231cf48aa8 (diff)
downloadorg.eclipse.tracecompass-7480f4718cd300828a72664ae3ea9ef00c516c62.tar.gz
org.eclipse.tracecompass-7480f4718cd300828a72664ae3ea9ef00c516c62.tar.xz
org.eclipse.tracecompass-7480f4718cd300828a72664ae3ea9ef00c516c62.zip
segStore: Add a INamedSegment interface
This interface is to be implemented by any segment that has a name. This name can be used in statistics, and other segment store views Change-Id: Idc1ff17d9725b6ac0b1d79c04c61fedd96366278 Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net> Reviewed-on: https://git.eclipse.org/r/82284 Reviewed-by: Hudson CI Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com> Tested-by: Matthew Khouzam <matthew.khouzam@ericsson.com> Reviewed-by: Jean-Christian Kouame <jean-christian.kouame@ericsson.com>
Diffstat (limited to 'statesystem')
-rw-r--r--statesystem/org.eclipse.tracecompass.segmentstore.core.tests/src/org/eclipse/tracecompass/segmentstore/core/tests/interfaces/INamedSegmentTest.java135
-rw-r--r--statesystem/org.eclipse.tracecompass.segmentstore.core/META-INF/MANIFEST.MF3
-rw-r--r--statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/INamedSegment.java32
-rw-r--r--statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/SegmentAspects.java43
-rw-r--r--statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/SegmentTypeComparators.java53
-rw-r--r--statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/package-info.java14
6 files changed, 279 insertions, 1 deletions
diff --git a/statesystem/org.eclipse.tracecompass.segmentstore.core.tests/src/org/eclipse/tracecompass/segmentstore/core/tests/interfaces/INamedSegmentTest.java b/statesystem/org.eclipse.tracecompass.segmentstore.core.tests/src/org/eclipse/tracecompass/segmentstore/core/tests/interfaces/INamedSegmentTest.java
new file mode 100644
index 0000000000..005b9f5189
--- /dev/null
+++ b/statesystem/org.eclipse.tracecompass.segmentstore.core.tests/src/org/eclipse/tracecompass/segmentstore/core/tests/interfaces/INamedSegmentTest.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2016 École Polytechnique de Montréal
+ *
+ * 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
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.segmentstore.core.tests.interfaces;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Comparator;
+import java.util.Iterator;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.tracecompass.common.core.NonNullUtils;
+import org.eclipse.tracecompass.segmentstore.core.BasicSegment;
+import org.eclipse.tracecompass.segmentstore.core.ISegment;
+import org.eclipse.tracecompass.segmentstore.core.ISegmentStore;
+import org.eclipse.tracecompass.segmentstore.core.SegmentStoreFactory;
+import org.eclipse.tracecompass.segmentstore.core.SegmentStoreFactory.SegmentStoreType;
+import org.eclipse.tracecompass.segmentstore.core.segment.interfaces.INamedSegment;
+import org.eclipse.tracecompass.segmentstore.core.segment.interfaces.SegmentAspects;
+import org.eclipse.tracecompass.segmentstore.core.segment.interfaces.SegmentTypeComparators;
+import org.junit.Test;
+
+/**
+ * Test the INamedSegment interface
+ *
+ * @author Geneviève Bastien
+ */
+@NonNullByDefault
+public class INamedSegmentTest {
+
+ // 5 test segments
+ private static final BasicSegment BASE_SEGMENT = new BasicSegment(10, 12);
+ private static final NamedSegment NAMED_SEGMENT1 = new NamedSegment(10, 12, "test");
+ private static final NamedSegment NAMED_SEGMENT2 = new NamedSegment(12, 13, "abc");
+ private static final NamedSegment NAMED_SEGMENT3 = new NamedSegment(14, 15, "abc");
+ private static final NamedSegment NAMED_SEGMENT4 = new NamedSegment(14, 15, "");
+
+ /**
+ * A class for INamedSegment tests
+ */
+ private static class NamedSegment extends BasicSegment implements INamedSegment {
+
+ private static final long serialVersionUID = -7955666081972046597L;
+ private final String fName;
+
+ public NamedSegment(long start, long end, String name) {
+ super(start, end);
+ fName = name;
+ }
+
+ @Override
+ public @NonNull String getName() {
+ return fName;
+ }
+
+ }
+
+ /**
+ * Test the {@link SegmentTypeComparators#NAMED_SEGMENT_COMPARATOR}
+ * comparator
+ */
+ @Test
+ public void testComparator() {
+ Comparator<ISegment> cmp = SegmentTypeComparators.NAMED_SEGMENT_COMPARATOR;
+
+ // Verify the comparator with the segments
+ assertEquals(cmp.compare(NAMED_SEGMENT2, NAMED_SEGMENT3), cmp.compare(NAMED_SEGMENT3, NAMED_SEGMENT2));
+ assertTrue(cmp.compare(NAMED_SEGMENT1, NAMED_SEGMENT2) > 0);
+ assertEquals(cmp.compare(NAMED_SEGMENT1, NAMED_SEGMENT2), -1 * cmp.compare(NAMED_SEGMENT2, NAMED_SEGMENT1));
+ assertTrue(cmp.compare(BASE_SEGMENT, NAMED_SEGMENT2) > 0);
+ assertTrue(cmp.compare(NAMED_SEGMENT2, BASE_SEGMENT) < 0);
+ assertTrue(cmp.compare(BASE_SEGMENT, NAMED_SEGMENT4) > 0);
+ assertTrue(cmp.compare(NAMED_SEGMENT4, BASE_SEGMENT) < 0);
+
+ // Add the segments to a segment store
+ ISegmentStore<BasicSegment> segStore = SegmentStoreFactory.createSegmentStore(SegmentStoreType.Fast);
+ segStore.add(BASE_SEGMENT);
+ segStore.add(NAMED_SEGMENT1);
+ segStore.add(NAMED_SEGMENT2);
+ segStore.add(NAMED_SEGMENT3);
+ segStore.add(NAMED_SEGMENT4);
+
+ // Iterate with this comparator on the segment store
+ Iterable<BasicSegment> iterable = segStore.iterator(cmp);
+ Iterator<BasicSegment> iterator = iterable.iterator();
+ assertTrue(iterator.hasNext());
+ BasicSegment current = iterator.next();
+ BasicSegment prev = current;
+ int count = 1;
+ while (iterator.hasNext()) {
+ current = iterator.next();
+ assertTrue(cmp.compare(prev, current) <= 0);
+ prev = current;
+ count++;
+ }
+ assertEquals(5, count);
+
+ // Iterate with the reverse comparator
+ iterable = segStore.iterator(NonNullUtils.checkNotNull(cmp.reversed()));
+ iterator = iterable.iterator();
+ assertTrue(iterator.hasNext());
+ current = iterator.next();
+ prev = current;
+ count = 1;
+ while (iterator.hasNext()) {
+ current = iterator.next();
+ assertTrue(cmp.compare(prev, current) >= 0);
+ prev = current;
+ count++;
+ }
+ assertEquals(5, count);
+ }
+
+ /**
+ * Test the {@link SegmentAspects} method
+ */
+ @Test
+ public void testNamedAspect() {
+ assertNull(SegmentAspects.getName(BASE_SEGMENT));
+ assertEquals("test", SegmentAspects.getName(NAMED_SEGMENT1));
+ assertEquals("abc", SegmentAspects.getName(NAMED_SEGMENT2));
+ assertEquals("", SegmentAspects.getName(NAMED_SEGMENT4));
+
+ }
+
+}
diff --git a/statesystem/org.eclipse.tracecompass.segmentstore.core/META-INF/MANIFEST.MF b/statesystem/org.eclipse.tracecompass.segmentstore.core/META-INF/MANIFEST.MF
index 986869cdc6..a235473e1c 100644
--- a/statesystem/org.eclipse.tracecompass.segmentstore.core/META-INF/MANIFEST.MF
+++ b/statesystem/org.eclipse.tracecompass.segmentstore.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-Vendor: %Bundle-Vendor
-Bundle-Version: 1.1.0.qualifier
+Bundle-Version: 1.2.0.qualifier
Bundle-Localization: plugin
Bundle-SymbolicName: org.eclipse.tracecompass.segmentstore.core;singleton:=true
Bundle-Activator: org.eclipse.tracecompass.internal.segmentstore.core.Activator
@@ -15,5 +15,6 @@ Export-Package: org.eclipse.tracecompass.internal.segmentstore.core;x-internal:=
org.eclipse.tracecompass.internal.segmentstore.core.arraylist;x-friends:="org.eclipse.tracecompass.segmentstore.core.tests",
org.eclipse.tracecompass.internal.segmentstore.core.treemap;x-friends:="org.eclipse.tracecompass.segmentstore.core.tests",
org.eclipse.tracecompass.segmentstore.core,
+ org.eclipse.tracecompass.segmentstore.core.segment.interfaces,
org.eclipse.tracecompass.segmentstore.core.treemap
Import-Package: com.google.common.collect;version="12.0.0"
diff --git a/statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/INamedSegment.java b/statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/INamedSegment.java
new file mode 100644
index 0000000000..b7083b3529
--- /dev/null
+++ b/statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/INamedSegment.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2016 École Polytechnique de Montréal
+ *
+ * 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
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.segmentstore.core.segment.interfaces;
+
+import org.eclipse.tracecompass.segmentstore.core.ISegment;
+
+/**
+ * Interface to be implemented by segments that have a name to provide. This
+ * name can be used in analyses and outputs to identify segments.
+ *
+ * This interface is a qualifier interface for segments. A concrete segment type
+ * can implement many such qualifier interfaces.
+ *
+ * @since 1.2
+ */
+public interface INamedSegment extends ISegment {
+
+ /**
+ * Get the name of this segment
+ *
+ * @return Name
+ */
+ String getName();
+
+}
diff --git a/statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/SegmentAspects.java b/statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/SegmentAspects.java
new file mode 100644
index 0000000000..3068df843a
--- /dev/null
+++ b/statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/SegmentAspects.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2016 École Polytechnique de Montréal
+ *
+ * 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
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.segmentstore.core.segment.interfaces;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.tracecompass.segmentstore.core.ISegment;
+
+/**
+ * Interface to return some fields of a segment depending on the interfaces it
+ * implements
+ *
+ * @since 1.2
+ */
+public final class SegmentAspects {
+
+ private SegmentAspects() {
+
+ }
+
+ /**
+ * Get the name aspect of a segment. If the segment is a
+ * {@link INamedSegment}, the aspect will return its name. Otherwise, it is
+ * <code>null</code>
+ *
+ * @param segment
+ * The segment to get the aspect of
+ * @return The name of a {@link INamedSegment}, <code>null</code> otherwise
+ */
+ public static @Nullable String getName(ISegment segment) {
+ if (segment instanceof INamedSegment) {
+ return ((INamedSegment) segment).getName();
+ }
+ return null;
+ }
+
+}
diff --git a/statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/SegmentTypeComparators.java b/statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/SegmentTypeComparators.java
new file mode 100644
index 0000000000..8b1e2ef00a
--- /dev/null
+++ b/statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/SegmentTypeComparators.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2016 École Polytechnique de Montréal
+ *
+ * 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
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.segmentstore.core.segment.interfaces;
+
+import java.util.Comparator;
+import java.util.Objects;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.tracecompass.segmentstore.core.ISegment;
+
+/**
+ * Segments comparators for specific segment interfaces
+ *
+ * @author Geneviève Bastien
+ * @noimplement This interface only contains static definitions.
+ * @since 1.2
+ */
+public interface SegmentTypeComparators {
+
+ /**
+ * Compare named segments. If segments that are not named are mixed with
+ * named segments, their order will be undefined by they will be greater
+ * than all the named ones.
+ */
+ Comparator<ISegment> NAMED_SEGMENT_COMPARATOR = new Comparator<ISegment>() {
+ @Override
+ public int compare(@Nullable ISegment o1, @Nullable ISegment o2) {
+ if (o1 == null || o2 == null) {
+ throw new IllegalArgumentException("One of the segment to compare is null, that should never happen"); //$NON-NLS-1$
+ }
+ String name1 = SegmentAspects.getName(o1);
+ String name2 = SegmentAspects.getName(o2);
+ if (Objects.equals(name1, name2)) {
+ return 0;
+ }
+ // Segments that are not named are greater than named ones
+ if (name2 == null) {
+ return -1;
+ }
+ if (name1 == null) {
+ return 1;
+ }
+ return name1.compareTo(name2);
+ }
+ };
+}
diff --git a/statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/package-info.java b/statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/package-info.java
new file mode 100644
index 0000000000..eb8ee5ce8c
--- /dev/null
+++ b/statesystem/org.eclipse.tracecompass.segmentstore.core/src/org/eclipse/tracecompass/segmentstore/core/segment/interfaces/package-info.java
@@ -0,0 +1,14 @@
+/*******************************************************************************
+ * Copyright (c) 2015 EfficiOS Inc. 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:
+ * Alexandre Montplaisir - Initial API and implementation
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.tracecompass.segmentstore.core.segment.interfaces;

Back to the top