diff options
author | Geneviève Bastien | 2016-09-22 20:56:24 +0000 |
---|---|---|
committer | Genevieve Bastien | 2017-02-21 16:41:12 +0000 |
commit | 7480f4718cd300828a72664ae3ea9ef00c516c62 (patch) | |
tree | df260140f716fcddaa97017c9413c2c9e6b7c2da /statesystem | |
parent | 457c184f5e04b1ebef3b5dbe26da63231cf48aa8 (diff) | |
download | org.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')
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; |