tmf: Move the analysis requirements to their own package
authorGeneviève Bastien <gbastien+lttng@versatic.net>
Tue, 8 Mar 2016 20:39:24 +0000 (15:39 -0500)
committerGenevieve Bastien <gbastien+lttng@versatic.net>
Mon, 11 Apr 2016 13:55:36 +0000 (09:55 -0400)
The o.e.t.tmf.core.analysis package is getting crowded.

Change-Id: I2b8cc1cd9719733b260117787fa2865e03633c60
Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net>
Reviewed-on: https://git.eclipse.org/r/68013
Reviewed-by: Hudson CI
Reviewed-by: Alexandre Montplaisir <alexmonthy@efficios.com>
Tested-by: Alexandre Montplaisir <alexmonthy@efficios.com>
28 files changed:
analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/kernel/KernelAnalysisModule.java
analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/tid/TidAnalysisModule.java
lttng/org.eclipse.tracecompass.lttng2.kernel.core.tests/src/org/eclipse/tracecompass/lttng2/kernel/core/tests/analysis/kernel/LttngKernelAnalysisTest.java
lttng/org.eclipse.tracecompass.lttng2.ust.core.tests/src/org/eclipse/tracecompass/lttng2/ust/core/tests/analysis/debuginfo/UstDebugInfoAnalysisModuleTest.java
lttng/org.eclipse.tracecompass.lttng2.ust.core.tests/src/org/eclipse/tracecompass/lttng2/ust/core/tests/analysis/memory/UstMemoryAnalysisModuleTest.java
lttng/org.eclipse.tracecompass.lttng2.ust.core/src/org/eclipse/tracecompass/lttng2/ust/core/analysis/debuginfo/UstDebugInfoAnalysisModule.java
lttng/org.eclipse.tracecompass.lttng2.ust.core/src/org/eclipse/tracecompass/lttng2/ust/core/analysis/memory/UstMemoryAnalysisModule.java
tmf/org.eclipse.tracecompass.tmf.analysis.xml.core/src/org/eclipse/tracecompass/tmf/analysis/xml/core/module/TmfAnalysisModuleHelperXml.java
tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/AnalysisModuleHelperTest.java
tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/AnalysisRequirementHelperTest.java [deleted file]
tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/AnalysisRequirementTest.java [deleted file]
tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/requirements/AnalysisRequirementHelperTest.java [new file with mode: 0644]
tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/requirements/AnalysisRequirementTest.java [new file with mode: 0644]
tmf/org.eclipse.tracecompass.tmf.core.tests/stubs/org/eclipse/tracecompass/tmf/tests/stubs/analysis/AnalysisModuleTestHelper.java
tmf/org.eclipse.tracecompass.tmf.core.tests/stubs/org/eclipse/tracecompass/tmf/tests/stubs/analysis/AnalysisRequirementFactory.java
tmf/org.eclipse.tracecompass.tmf.core.tests/stubs/org/eclipse/tracecompass/tmf/tests/stubs/analysis/TestRequirementAnalysis.java
tmf/org.eclipse.tracecompass.tmf.core/META-INF/MANIFEST.MF
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/IAnalysisModule.java
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/IAnalysisModuleHelper.java
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/IAnalysisRequirementProvider.java [deleted file]
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/TmfAbstractAnalysisModule.java
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/TmfAnalysisModuleHelperConfigElement.java
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/TmfAnalysisRequirement.java [deleted file]
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/TmfAnalysisRequirementHelper.java [deleted file]
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/requirements/IAnalysisRequirementProvider.java [new file with mode: 0644]
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/requirements/TmfAnalysisRequirement.java [new file with mode: 0644]
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/requirements/TmfAnalysisRequirementHelper.java [new file with mode: 0644]
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/requirements/package-info.java [new file with mode: 0644]

index 21afb745123afd16dc009daf07189e9ee707ef21..dd14094ec3621a8cd02c642a5f92bbcb31ddb716 100644 (file)
@@ -24,7 +24,7 @@ import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEven
 import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelTrace;
 import org.eclipse.tracecompass.common.core.NonNullUtils;
 import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.KernelStateProvider;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
 import org.eclipse.tracecompass.tmf.core.statesystem.ITmfStateProvider;
 import org.eclipse.tracecompass.tmf.core.statesystem.TmfStateSystemAnalysisModule;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
index b4f63a9e174d2a59201189ae5de62c7c4b4cfe61..53182a428140b089b80c0f1d50ea6c6a1d2f151b 100644 (file)
@@ -28,7 +28,7 @@ import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedE
 import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
 import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue;
 import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue.Type;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
 import org.eclipse.tracecompass.tmf.core.statesystem.ITmfStateProvider;
 import org.eclipse.tracecompass.tmf.core.statesystem.TmfStateSystemAnalysisModule;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
index 11cc8cf930a61adf8f980e530f5e8685c6f19602..0e3fd96e2833bb22b32a0f6f8697476fd9a27ddc 100644 (file)
@@ -27,7 +27,7 @@ import org.eclipse.tracecompass.lttng2.control.core.session.SessionConfigStrings
 import org.eclipse.tracecompass.lttng2.kernel.core.trace.LttngKernelTrace;
 import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
 import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
 import org.eclipse.tracecompass.tmf.core.tests.shared.TmfTestHelper;
index 620c534aa4fa6f8c37e8bfea2885a50ea2c3f017..76140ab587094a85deadf3af4f22af1f45864b6e 100644 (file)
@@ -22,7 +22,7 @@ import org.eclipse.tracecompass.lttng2.ust.core.analysis.debuginfo.UstDebugInfoA
 import org.eclipse.tracecompass.lttng2.ust.core.trace.LttngUstTrace;
 import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
 import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
 import org.eclipse.tracecompass.tmf.ctf.core.event.CtfTmfEvent;
index e8584d20bade90c8a63f01137b5b1894c2c87a99..95ccebe10755e982efeb18c1c1ed5371040b74f9 100644 (file)
@@ -16,7 +16,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import org.eclipse.tracecompass.lttng2.ust.core.analysis.memory.UstMemoryAnalysisModule;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
index 7108e1de4e9c6aeb3f770f936927ac9475d507c8..61f8703900a58f8a5fc0cd81c769f132ed6dc618 100644 (file)
@@ -31,7 +31,7 @@ import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundExc
 import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
 import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
 import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.tracecompass.tmf.core.statesystem.ITmfStateProvider;
 import org.eclipse.tracecompass.tmf.core.statesystem.TmfStateSystemAnalysisModule;
index 9b3ace00cf8be80bb40bb4f1a56b59ed202f648d..d20ac4d03d4f90834bb62f7b9ae32c8b9b25f350 100644 (file)
@@ -24,8 +24,8 @@ import org.eclipse.tracecompass.internal.lttng2.ust.core.analysis.memory.UstMemo
 import org.eclipse.tracecompass.lttng2.control.core.session.SessionConfigStrings;
 import org.eclipse.tracecompass.lttng2.ust.core.trace.LttngUstTrace;
 import org.eclipse.tracecompass.lttng2.ust.core.trace.layout.ILttngUstEventLayout;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement.ValuePriorityLevel;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement.ValuePriorityLevel;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.tracecompass.tmf.core.statesystem.ITmfStateProvider;
 import org.eclipse.tracecompass.tmf.core.statesystem.TmfStateSystemAnalysisModule;
index bd0b97d7bbc5c1a604388babf156a2cc174edf65..c88030ef60cb551f7da801749f3e0d0f840b3482 100644 (file)
@@ -25,7 +25,7 @@ import org.eclipse.tracecompass.tmf.analysis.xml.core.stateprovider.XmlStateSyst
 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModuleHelper;
 import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisManager;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.tracecompass.tmf.core.project.model.ITmfPropertiesProvider;
 import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType;
index 89dda502dacc3be3da3928eee858fabb6f2935dc..665aa2aa4d0c69fa0277ef681a5eae1bc5f9d837 100644 (file)
@@ -30,7 +30,7 @@ import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModuleHelper;
 import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisManager;
 import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisModuleHelperConfigElement;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.tracecompass.tmf.core.tests.shared.TmfTestTrace;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
diff --git a/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/AnalysisRequirementHelperTest.java b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/AnalysisRequirementHelperTest.java
deleted file mode 100644 (file)
index 4a14eff..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014 É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
- *
- * Contributors:
- *   Guilliano Molaire - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.core.tests.analysis;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisRequirementProvider;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirementHelper;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement.ValuePriorityLevel;
-import org.eclipse.tracecompass.tmf.tests.stubs.analysis.AnalysisModuleTestHelper;
-import org.eclipse.tracecompass.tmf.tests.stubs.analysis.AnalysisRequirementFactory;
-import org.eclipse.tracecompass.tmf.tests.stubs.analysis.AnalysisModuleTestHelper.moduleStubEnum;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.collect.Multimap;
-
-/**
- * Test suite for the {@link TmfAnalysisRequirementHelper} class
- */
-public class AnalysisRequirementHelperTest {
-
-    private AnalysisModuleTestHelper fTestModuleHelper;
-    private AnalysisModuleTestHelper fTestModuleHelper2;
-
-    /**
-     * Set up analysis modules
-     */
-    @Before
-    public void setUpTest() {
-        fTestModuleHelper = new AnalysisModuleTestHelper(moduleStubEnum.TEST);
-        fTestModuleHelper2 = new AnalysisModuleTestHelper(moduleStubEnum.TEST2);
-    }
-
-    /**
-     * Test suite for the
-     * {@link TmfAnalysisRequirementHelper#getRequirementValues(IAnalysisRequirementProvider, String)}
-     * method
-     */
-    @Test
-    public void testGetRequirementValues() {
-        /* Test with a supported type */
-        String type = AnalysisRequirementFactory.REQUIREMENT_TYPE_1;
-        Set<String> values = TmfAnalysisRequirementHelper.getRequirementValues(fTestModuleHelper, type);
-        assertEquals(AnalysisRequirementFactory.REQUIREMENT_VALUES_1.size(), values.size());
-
-        /* Test with a type not supported */
-        type = AnalysisRequirementFactory.REQUIREMENT_TYPE_2;
-        values = TmfAnalysisRequirementHelper.getRequirementValues(fTestModuleHelper, type);
-        assertTrue(values.isEmpty());
-    }
-
-    /**
-     * Test suite for the
-     * {@link TmfAnalysisRequirementHelper#getRequirementValues(IAnalysisRequirementProvider, String, ValuePriorityLevel)}
-     * method
-     */
-    @Test
-    public void testGetRequirementValuesWithLevel() {
-        /* Test with a supported type */
-        String type = AnalysisRequirementFactory.REQUIREMENT_TYPE_2;
-        Set<String> values = TmfAnalysisRequirementHelper.getRequirementValues(fTestModuleHelper2, type, ValuePriorityLevel.MANDATORY);
-        assertEquals(3, values.size());
-
-        /* Test with another value level */
-        values = TmfAnalysisRequirementHelper.getRequirementValues(fTestModuleHelper2, type, ValuePriorityLevel.OPTIONAL);
-        assertEquals(2, values.size());
-
-        /* Test with a type not supported */
-        type = AnalysisRequirementFactory.REQUIREMENT_TYPE_1;
-        values = TmfAnalysisRequirementHelper.getRequirementValues(fTestModuleHelper2, type, ValuePriorityLevel.MANDATORY);
-        assertTrue(values.isEmpty());
-    }
-
-    /**
-     * Test suite for the
-     * {@link TmfAnalysisRequirementHelper#getRequirementValuesMap(Iterable)}
-     * method
-     */
-    @Test
-    public void testGetRequirementValuesMap() {
-        Set<IAnalysisRequirementProvider> providers = new HashSet<>();
-        providers.add(fTestModuleHelper2);
-        providers.add(fTestModuleHelper);
-
-        Multimap<String, String> valuesByType = TmfAnalysisRequirementHelper.getRequirementValuesMap(providers);
-        assertFalse(valuesByType.isEmpty());
-
-        /* There should be 3 types */
-        assertEquals(3, valuesByType.keySet().size());
-
-        Collection<String> values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_1);
-        assertEquals(4, values.size());
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_1));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_2));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_3));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_5));
-
-        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_2);
-        assertEquals(5, values.size());
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_1));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_2));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_3));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_4));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_5));
-
-        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_3);
-        assertEquals(3, values.size());
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_3));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_4));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_5));
-    }
-
-    /**
-     * Test suite for the
-     * {@link TmfAnalysisRequirementHelper#getRequirementValuesMap(Iterable, ValuePriorityLevel)}
-     * method
-     */
-    @Test
-    public void testGetRequirementValuesMapWithLevel() {
-        Set<IAnalysisRequirementProvider> providers = new HashSet<>();
-        providers.add(fTestModuleHelper2);
-        providers.add(fTestModuleHelper);
-
-        /* There should be 3 optional requirements types */
-        Multimap<String, String> valuesByType = TmfAnalysisRequirementHelper.getRequirementValuesMap(providers, ValuePriorityLevel.OPTIONAL);
-        assertTrue(!valuesByType.isEmpty());
-        assertEquals(1, valuesByType.keySet().size());
-
-        Collection<String> values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_1);
-        assertTrue(values.isEmpty());
-
-        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_2);
-        assertEquals(2, values.size());
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_2));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_4));
-
-        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_3);
-        assertTrue(values.isEmpty());
-
-        /* And 3 types with mandatory requirements */
-        valuesByType = TmfAnalysisRequirementHelper.getRequirementValuesMap(providers, ValuePriorityLevel.MANDATORY);
-        assertTrue(!valuesByType.isEmpty());
-        assertEquals(3, valuesByType.keySet().size());
-
-        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_1);
-        assertEquals(4, values.size());
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_1));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_2));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_3));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_5));
-
-        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_2);
-        assertEquals(3, values.size());
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_1));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_3));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_5));
-
-        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_3);
-        assertEquals(3, values.size());
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_3));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_4));
-        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_5));
-    }
-
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/AnalysisRequirementTest.java b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/AnalysisRequirementTest.java
deleted file mode 100644 (file)
index 0838a58..0000000
+++ /dev/null
@@ -1,244 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014 É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
- *
- * Contributors:
- *   Guilliano Molaire - Initial API and implementation
- *   Mathieu Rail - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.core.tests.analysis;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement.ValuePriorityLevel;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-/**
- * Test suite for the {@link TmfAnalysisRequirement} class.
- *
- * @author Guilliano Molaire
- * @author Mathieu Rail
- */
-public class AnalysisRequirementTest {
-
-    /* Requirements used in the tests */
-    private TmfAnalysisRequirement fRequirement;
-    private TmfAnalysisRequirement fSubRequirement;
-
-    /* Types of requirement type strings */
-    private static final String TYPE_A = "Test Type A";
-    private static final String TYPE_B = "Test Type B";
-
-    /* Requirement value name strings */
-    private static final String VALUE_A = "Test Value A";
-    private static final String VALUE_B = "Test Value B";
-    private static final String VALUE_C = "Test Value C";
-    private static final String VALUE_D = "Test Value D";
-    private static final String VALUE_E = "Test Value E";
-    private static final String VALUE_F = "Test Value F";
-
-    /* Requirement information strings */
-    private static final @NonNull String INFO_A = "This is an information.";
-    private static final @NonNull String INFO_B = "This is another information.";
-    private static final @NonNull String INFO_C = "This is the last information.";
-
-    /**
-     * Test suite for the {@link TmfAnalysisRequirement#addInformation} and the
-     * {@link TmfAnalysisRequirement#getInformation} methods.
-     */
-    @Test
-    public void testAddAndGetInformation() {
-        fRequirement = new TmfAnalysisRequirement(TYPE_A);
-
-        fRequirement.addInformation(INFO_A);
-        fRequirement.addInformation(INFO_B);
-        fRequirement.addInformation(INFO_B);
-
-        Set<String> information = fRequirement.getInformation();
-
-        assertEquals(2, information.size());
-
-        assertTrue(information.contains(INFO_A));
-        assertTrue(information.contains(INFO_B));
-    }
-
-    /**
-     * Test suite for the {@link TmfAnalysisRequirement#addValues} and the
-     * {@link TmfAnalysisRequirement#addValue} methods.
-     */
-    @Test
-    public void testAddValuesToRequirement() {
-        fRequirement = new TmfAnalysisRequirement(TYPE_A);
-
-        assertEquals(0, fRequirement.getValues().size());
-
-        List<String> values = new ArrayList<>();
-        values.add(VALUE_A);
-        values.add(VALUE_B);
-        values.add(VALUE_C);
-        values.add(VALUE_C);
-
-        /*
-         * Add values to the requirement with the same level, Value C should
-         * only exist once
-         */
-        fRequirement.addValues(values, ValuePriorityLevel.MANDATORY);
-        assertEquals(3, fRequirement.getValues().size());
-
-        /*
-         * The new value should only exist once and its level should be
-         * mandatory
-         */
-        fRequirement.addValue(VALUE_D, ValuePriorityLevel.OPTIONAL);
-        fRequirement.addValue(VALUE_D, ValuePriorityLevel.MANDATORY);
-
-        assertEquals(4, fRequirement.getValues().size());
-        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_D));
-    }
-
-    /**
-     * Test suite for the {@link TmfAnalysisRequirement#getValueLevel} method.
-     */
-    @Test
-    public void testGetValueLevel() {
-        fRequirement = new TmfAnalysisRequirement(TYPE_A);
-        fRequirement.addValue(VALUE_A, ValuePriorityLevel.OPTIONAL);
-
-        /* Try to get the level of a value */
-        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_A));
-
-        /* Try to get the level of a value that doesn't exist */
-        assertNull(fRequirement.getValueLevel(VALUE_B));
-    }
-
-    /**
-     * Test suite for the {@link TmfAnalysisRequirement#merge} method with the
-     * parameter value MANDATORY.
-     */
-    @Test
-    public void testMergeMandatory() {
-        initMergeRequirements(TYPE_A, TYPE_A);
-
-        assertTrue(fRequirement.merge(fSubRequirement, ValuePriorityLevel.MANDATORY));
-
-        assertEquals(fRequirement.getValues().size(), 6);
-
-        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_A));
-        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_B));
-
-        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_C));
-        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_D));
-
-        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_E));
-        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_F));
-
-        Set<String> information = fRequirement.getInformation();
-
-        assertEquals(3, information.size());
-
-        assertTrue(information.contains(INFO_A));
-        assertTrue(information.contains(INFO_B));
-        assertTrue(information.contains(INFO_C));
-    }
-
-    /**
-     * Test suite for the {@link TmfAnalysisRequirement#merge} method with the
-     * parameter value OPTIONAL.
-     */
-    @Test
-    public void testMergeOptional() {
-        initMergeRequirements(TYPE_A, TYPE_A);
-
-        assertTrue(fRequirement.merge(fSubRequirement, ValuePriorityLevel.OPTIONAL));
-
-        assertEquals(6, fRequirement.getValues().size());
-
-        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_A));
-        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_B));
-
-        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_C));
-        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_D));
-
-        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_E));
-        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_F));
-
-        Set<String> information = fRequirement.getInformation();
-
-        assertEquals(3, information.size());
-
-        assertTrue(information.contains(INFO_A));
-        assertTrue(information.contains(INFO_B));
-        assertTrue(information.contains(INFO_C));
-    }
-
-    /**
-     * Test suite for the {@link TmfAnalysisRequirement#merge} method with
-     * different requirement types.
-     */
-    @Test
-    public void testMergeDifferentTypes() {
-        initMergeRequirements(TYPE_A, TYPE_B);
-
-        assertFalse(fRequirement.merge(fSubRequirement, ValuePriorityLevel.OPTIONAL));
-    }
-
-    /**
-     * Test suite for the {@link TmfAnalysisRequirement#isSameType} method.
-     */
-    @Test
-    public void testIsSameRequirementType() {
-        fRequirement = new TmfAnalysisRequirement(TYPE_A);
-
-        assertTrue(fRequirement.isSameType(new TmfAnalysisRequirement(TYPE_A)));
-        assertFalse(fRequirement.isSameType(new TmfAnalysisRequirement(TYPE_B)));
-    }
-
-    /**
-     * Initialize the requirement and sub-requirement for the merge tests.
-     *
-     * @param typeA
-     *            The type of the first requirement
-     * @param typeB
-     *            The type of the second requirement
-     */
-    private void initMergeRequirements(String typeA, String typeB) {
-        fRequirement = new TmfAnalysisRequirement(typeA);
-        fRequirement.addValue(VALUE_A, ValuePriorityLevel.MANDATORY);
-        fRequirement.addValue(VALUE_B, ValuePriorityLevel.MANDATORY);
-
-        fRequirement.addValue(VALUE_C, ValuePriorityLevel.OPTIONAL);
-        fRequirement.addValue(VALUE_D, ValuePriorityLevel.OPTIONAL);
-
-        fRequirement.addInformation(INFO_A);
-        fRequirement.addInformation(INFO_B);
-
-        /* This sub-requirement will be merged into requirement */
-        fSubRequirement = new TmfAnalysisRequirement(typeB);
-        fSubRequirement.addValue(VALUE_A, ValuePriorityLevel.MANDATORY);
-        fSubRequirement.addValue(VALUE_B, ValuePriorityLevel.OPTIONAL);
-
-        fSubRequirement.addValue(VALUE_C, ValuePriorityLevel.MANDATORY);
-        fSubRequirement.addValue(VALUE_D, ValuePriorityLevel.OPTIONAL);
-
-        fSubRequirement.addValue(VALUE_E, ValuePriorityLevel.MANDATORY);
-        fSubRequirement.addValue(VALUE_F, ValuePriorityLevel.OPTIONAL);
-
-        fSubRequirement.addInformation(INFO_B);
-        fSubRequirement.addInformation(INFO_C);
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/requirements/AnalysisRequirementHelperTest.java b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/requirements/AnalysisRequirementHelperTest.java
new file mode 100644 (file)
index 0000000..4bc3f9b
--- /dev/null
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2014 É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
+ *
+ * Contributors:
+ *   Guilliano Molaire - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.tmf.core.tests.analysis.requirements;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement.ValuePriorityLevel;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.IAnalysisRequirementProvider;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirementHelper;
+import org.eclipse.tracecompass.tmf.tests.stubs.analysis.AnalysisModuleTestHelper;
+import org.eclipse.tracecompass.tmf.tests.stubs.analysis.AnalysisModuleTestHelper.moduleStubEnum;
+import org.eclipse.tracecompass.tmf.tests.stubs.analysis.AnalysisRequirementFactory;
+import org.junit.Test;
+
+import com.google.common.collect.Multimap;
+
+/**
+ * Test suite for the {@link TmfAnalysisRequirementHelper} class
+ */
+public class AnalysisRequirementHelperTest {
+
+    private final @NonNull AnalysisModuleTestHelper fTestModuleHelper = new AnalysisModuleTestHelper(moduleStubEnum.TEST);
+    private final @NonNull AnalysisModuleTestHelper fTestModuleHelper2 = new AnalysisModuleTestHelper(moduleStubEnum.TEST2);
+
+    /**
+     * Test suite for the
+     * {@link TmfAnalysisRequirementHelper#getRequirementValues(IAnalysisRequirementProvider, String)}
+     * method
+     */
+    @Test
+    public void testGetRequirementValues() {
+        /* Test with a supported type */
+        String type = AnalysisRequirementFactory.REQUIREMENT_TYPE_1;
+        Set<String> values = TmfAnalysisRequirementHelper.getRequirementValues(fTestModuleHelper, type);
+        assertEquals(AnalysisRequirementFactory.REQUIREMENT_VALUES_1.size(), values.size());
+
+        /* Test with a type not supported */
+        type = AnalysisRequirementFactory.REQUIREMENT_TYPE_2;
+        values = TmfAnalysisRequirementHelper.getRequirementValues(fTestModuleHelper, type);
+        assertTrue(values.isEmpty());
+    }
+
+    /**
+     * Test suite for the
+     * {@link TmfAnalysisRequirementHelper#getRequirementValues(IAnalysisRequirementProvider, String, ValuePriorityLevel)}
+     * method
+     */
+    @Test
+    public void testGetRequirementValuesWithLevel() {
+        /* Test with a supported type */
+        String type = AnalysisRequirementFactory.REQUIREMENT_TYPE_2;
+        Set<String> values = TmfAnalysisRequirementHelper.getRequirementValues(fTestModuleHelper2, type, ValuePriorityLevel.MANDATORY);
+        assertEquals(3, values.size());
+
+        /* Test with another value level */
+        values = TmfAnalysisRequirementHelper.getRequirementValues(fTestModuleHelper2, type, ValuePriorityLevel.OPTIONAL);
+        assertEquals(2, values.size());
+
+        /* Test with a type not supported */
+        type = AnalysisRequirementFactory.REQUIREMENT_TYPE_1;
+        values = TmfAnalysisRequirementHelper.getRequirementValues(fTestModuleHelper2, type, ValuePriorityLevel.MANDATORY);
+        assertTrue(values.isEmpty());
+    }
+
+    /**
+     * Test suite for the
+     * {@link TmfAnalysisRequirementHelper#getRequirementValuesMap(Iterable)}
+     * method
+     */
+    @Test
+    public void testGetRequirementValuesMap() {
+        Set<@NonNull IAnalysisRequirementProvider> providers = new HashSet<>();
+        providers.add(fTestModuleHelper2);
+        providers.add(fTestModuleHelper);
+
+        Multimap<String, String> valuesByType = TmfAnalysisRequirementHelper.getRequirementValuesMap(providers);
+        assertFalse(valuesByType.isEmpty());
+
+        /* There should be 3 types */
+        assertEquals(3, valuesByType.keySet().size());
+
+        Collection<String> values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_1);
+        assertEquals(4, values.size());
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_1));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_2));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_3));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_5));
+
+        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_2);
+        assertEquals(5, values.size());
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_1));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_2));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_3));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_4));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_5));
+
+        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_3);
+        assertEquals(3, values.size());
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_3));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_4));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_5));
+    }
+
+    /**
+     * Test suite for the
+     * {@link TmfAnalysisRequirementHelper#getRequirementValuesMap(Iterable, ValuePriorityLevel)}
+     * method
+     */
+    @Test
+    public void testGetRequirementValuesMapWithLevel() {
+        Set<@NonNull IAnalysisRequirementProvider> providers = new HashSet<>();
+        providers.add(fTestModuleHelper2);
+        providers.add(fTestModuleHelper);
+
+        /* There should be 3 optional requirements types */
+        Multimap<String, String> valuesByType = TmfAnalysisRequirementHelper.getRequirementValuesMap(providers, ValuePriorityLevel.OPTIONAL);
+        assertTrue(!valuesByType.isEmpty());
+        assertEquals(1, valuesByType.keySet().size());
+
+        Collection<String> values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_1);
+        assertTrue(values.isEmpty());
+
+        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_2);
+        assertEquals(2, values.size());
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_2));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_4));
+
+        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_3);
+        assertTrue(values.isEmpty());
+
+        /* And 3 types with mandatory requirements */
+        valuesByType = TmfAnalysisRequirementHelper.getRequirementValuesMap(providers, ValuePriorityLevel.MANDATORY);
+        assertTrue(!valuesByType.isEmpty());
+        assertEquals(3, valuesByType.keySet().size());
+
+        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_1);
+        assertEquals(4, values.size());
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_1));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_2));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_3));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_5));
+
+        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_2);
+        assertEquals(3, values.size());
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_1));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_3));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_5));
+
+        values = valuesByType.get(AnalysisRequirementFactory.REQUIREMENT_TYPE_3);
+        assertEquals(3, values.size());
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_3));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_4));
+        assertTrue(values.contains(AnalysisRequirementFactory.REQUIREMENT_VALUE_5));
+    }
+
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/requirements/AnalysisRequirementTest.java b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/analysis/requirements/AnalysisRequirementTest.java
new file mode 100644 (file)
index 0000000..4daf2a9
--- /dev/null
@@ -0,0 +1,251 @@
+/*******************************************************************************
+ * Copyright (c) 2014 É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
+ *
+ * Contributors:
+ *   Guilliano Molaire - Initial API and implementation
+ *   Mathieu Rail - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.tmf.core.tests.analysis.requirements;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement.ValuePriorityLevel;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * Test suite for the {@link TmfAnalysisRequirement} class.
+ *
+ * @author Guilliano Molaire
+ * @author Mathieu Rail
+ */
+public class AnalysisRequirementTest {
+
+    /* Requirements used in the tests */
+    private TmfAnalysisRequirement fRequirement;
+    private TmfAnalysisRequirement fSubRequirement;
+
+    /* Types of requirement type strings */
+    private static final @NonNull String TYPE_A = "Test Type A";
+    private static final @NonNull String TYPE_B = "Test Type B";
+
+    /* Requirement value name strings */
+    private static final @NonNull String VALUE_A = "Test Value A";
+    private static final @NonNull String VALUE_B = "Test Value B";
+    private static final @NonNull String VALUE_C = "Test Value C";
+    private static final @NonNull String VALUE_D = "Test Value D";
+    private static final @NonNull String VALUE_E = "Test Value E";
+    private static final @NonNull String VALUE_F = "Test Value F";
+
+    /* Requirement information strings */
+    private static final @NonNull String INFO_A = "This is an information.";
+    private static final @NonNull String INFO_B = "This is another information.";
+    private static final @NonNull String INFO_C = "This is the last information.";
+
+    /**
+     * Test suite for the {@link TmfAnalysisRequirement#addInformation} and the
+     * {@link TmfAnalysisRequirement#getInformation} methods.
+     */
+    @Test
+    public void testAddAndGetInformation() {
+        fRequirement = new TmfAnalysisRequirement(TYPE_A);
+
+        fRequirement.addInformation(INFO_A);
+        fRequirement.addInformation(INFO_B);
+        fRequirement.addInformation(INFO_B);
+
+        Set<String> information = fRequirement.getInformation();
+
+        assertEquals(2, information.size());
+
+        assertTrue(information.contains(INFO_A));
+        assertTrue(information.contains(INFO_B));
+    }
+
+    /**
+     * Test suite for the {@link TmfAnalysisRequirement#addValues} and the
+     * {@link TmfAnalysisRequirement#addValue} methods.
+     */
+    @Test
+    public void testAddValuesToRequirement() {
+        fRequirement = new TmfAnalysisRequirement(TYPE_A);
+
+        assertEquals(0, fRequirement.getValues().size());
+
+        List<@NonNull String> values = new ArrayList<>();
+        values.add(VALUE_A);
+        values.add(VALUE_B);
+        values.add(VALUE_C);
+        values.add(VALUE_C);
+
+        /*
+         * Add values to the requirement with the same level, Value C should
+         * only exist once
+         */
+        fRequirement.addValues(values, ValuePriorityLevel.MANDATORY);
+        assertEquals(3, fRequirement.getValues().size());
+
+        /*
+         * The new value should only exist once and its level should be
+         * mandatory
+         */
+        fRequirement.addValue(VALUE_D, ValuePriorityLevel.OPTIONAL);
+        fRequirement.addValue(VALUE_D, ValuePriorityLevel.MANDATORY);
+
+        assertEquals(4, fRequirement.getValues().size());
+        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_D));
+    }
+
+    /**
+     * Test suite for the {@link TmfAnalysisRequirement#getValueLevel} method.
+     */
+    @Test
+    public void testGetValueLevel() {
+        fRequirement = new TmfAnalysisRequirement(TYPE_A);
+        fRequirement.addValue(VALUE_A, ValuePriorityLevel.OPTIONAL);
+
+        /* Try to get the level of a value */
+        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_A));
+
+        /* Try to get the level of a value that doesn't exist */
+        assertNull(fRequirement.getValueLevel(VALUE_B));
+    }
+
+    /**
+     * Test suite for the {@link TmfAnalysisRequirement#merge} method with the
+     * parameter value MANDATORY.
+     */
+    @Test
+    public void testMergeMandatory() {
+        initMergeRequirements(TYPE_A, TYPE_A);
+        TmfAnalysisRequirement subReq = fSubRequirement;
+        assertNotNull(subReq);
+
+        assertTrue(fRequirement.merge(subReq, ValuePriorityLevel.MANDATORY));
+
+        assertEquals(fRequirement.getValues().size(), 6);
+
+        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_A));
+        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_B));
+
+        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_C));
+        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_D));
+
+        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_E));
+        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_F));
+
+        Set<String> information = fRequirement.getInformation();
+
+        assertEquals(3, information.size());
+
+        assertTrue(information.contains(INFO_A));
+        assertTrue(information.contains(INFO_B));
+        assertTrue(information.contains(INFO_C));
+    }
+
+    /**
+     * Test suite for the {@link TmfAnalysisRequirement#merge} method with the
+     * parameter value OPTIONAL.
+     */
+    @Test
+    public void testMergeOptional() {
+        initMergeRequirements(TYPE_A, TYPE_A);
+        TmfAnalysisRequirement subReq = fSubRequirement;
+        assertNotNull(subReq);
+
+        assertTrue(fRequirement.merge(subReq, ValuePriorityLevel.OPTIONAL));
+
+        assertEquals(6, fRequirement.getValues().size());
+
+        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_A));
+        assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_B));
+
+        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_C));
+        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_D));
+
+        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_E));
+        assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_F));
+
+        Set<String> information = fRequirement.getInformation();
+
+        assertEquals(3, information.size());
+
+        assertTrue(information.contains(INFO_A));
+        assertTrue(information.contains(INFO_B));
+        assertTrue(information.contains(INFO_C));
+    }
+
+    /**
+     * Test suite for the {@link TmfAnalysisRequirement#merge} method with
+     * different requirement types.
+     */
+    @Test
+    public void testMergeDifferentTypes() {
+        initMergeRequirements(TYPE_A, TYPE_B);
+        TmfAnalysisRequirement subReq = fSubRequirement;
+        assertNotNull(subReq);
+
+        assertFalse(fRequirement.merge(subReq, ValuePriorityLevel.OPTIONAL));
+    }
+
+    /**
+     * Test suite for the {@link TmfAnalysisRequirement#isSameType} method.
+     */
+    @Test
+    public void testIsSameRequirementType() {
+        fRequirement = new TmfAnalysisRequirement(TYPE_A);
+
+        assertTrue(fRequirement.isSameType(new TmfAnalysisRequirement(TYPE_A)));
+        assertFalse(fRequirement.isSameType(new TmfAnalysisRequirement(TYPE_B)));
+    }
+
+    /**
+     * Initialize the requirement and sub-requirement for the merge tests.
+     *
+     * @param typeA
+     *            The type of the first requirement
+     * @param typeB
+     *            The type of the second requirement
+     */
+    private void initMergeRequirements(@NonNull String typeA, @NonNull String typeB) {
+        fRequirement = new TmfAnalysisRequirement(typeA);
+        fRequirement.addValue(VALUE_A, ValuePriorityLevel.MANDATORY);
+        fRequirement.addValue(VALUE_B, ValuePriorityLevel.MANDATORY);
+
+        fRequirement.addValue(VALUE_C, ValuePriorityLevel.OPTIONAL);
+        fRequirement.addValue(VALUE_D, ValuePriorityLevel.OPTIONAL);
+
+        fRequirement.addInformation(INFO_A);
+        fRequirement.addInformation(INFO_B);
+
+        /* This sub-requirement will be merged into requirement */
+        fSubRequirement = new TmfAnalysisRequirement(typeB);
+        fSubRequirement.addValue(VALUE_A, ValuePriorityLevel.MANDATORY);
+        fSubRequirement.addValue(VALUE_B, ValuePriorityLevel.OPTIONAL);
+
+        fSubRequirement.addValue(VALUE_C, ValuePriorityLevel.MANDATORY);
+        fSubRequirement.addValue(VALUE_D, ValuePriorityLevel.OPTIONAL);
+
+        fSubRequirement.addValue(VALUE_E, ValuePriorityLevel.MANDATORY);
+        fSubRequirement.addValue(VALUE_F, ValuePriorityLevel.OPTIONAL);
+
+        fSubRequirement.addInformation(INFO_B);
+        fSubRequirement.addInformation(INFO_C);
+    }
+}
index 31a2287598bf558a5a13d700fd1369622b9d329c..e34e7fb379010680f9a00d67a82cfae3d452c918 100644 (file)
@@ -19,7 +19,7 @@ import org.eclipse.core.runtime.Platform;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModuleHelper;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
 import org.eclipse.tracecompass.tmf.tests.stubs.trace.TmfTraceStub;
index fe6e3a70ef9d072120f25a5fcca8fd3a4fb58c79..e500487da6662a60f7d55b01bf9888edf418c4a0 100644 (file)
@@ -15,8 +15,8 @@ package org.eclipse.tracecompass.tmf.tests.stubs.analysis;
 import java.util.Set;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement.ValuePriorityLevel;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement.ValuePriorityLevel;
 
 import com.google.common.collect.ImmutableSet;
 
index f0fa61d20189f7b0c84d9d830c5af8818cd991cf..859922b0bf44931a8857ece1c489d2618d0e09ca 100644 (file)
@@ -17,8 +17,8 @@ import java.util.Map;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.tracecompass.tmf.core.analysis.TmfAbstractAnalysisModule;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement.ValuePriorityLevel;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement.ValuePriorityLevel;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
 import org.eclipse.tracecompass.tmf.tests.stubs.trace.TmfTraceStub;
index 29d62ac1bd7ae1568f1dfb6a9a94a332d07984d0..ebb96a8e3fdbbd8d2ab83b3981736459446f94d3 100644 (file)
@@ -30,6 +30,7 @@ Export-Package: org.eclipse.tracecompass.internal.tmf.core;x-friends:="org.eclip
  org.eclipse.tracecompass.internal.tmf.core.trace.indexer;x-friends:="org.eclipse.tracecompass.tmf.core.tests",
  org.eclipse.tracecompass.tmf.core,
  org.eclipse.tracecompass.tmf.core.analysis,
+ org.eclipse.tracecompass.tmf.core.analysis.requirements,
  org.eclipse.tracecompass.tmf.core.callstack,
  org.eclipse.tracecompass.tmf.core.component,
  org.eclipse.tracecompass.tmf.core.event,
index bd20bccaac4af63ecc4e434ec3ccb10365dbf145..0a8061b54d34d502e455721d09fb4ece73624cbf 100644 (file)
@@ -16,6 +16,7 @@ import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.IAnalysisRequirementProvider;
 import org.eclipse.tracecompass.tmf.core.component.ITmfComponent;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
index 497afa8f1d9b9b0c17ac17da943baf7079e058e9..b5a8c01d4037eb777d2563b1709c11436f1da004 100644 (file)
@@ -14,6 +14,7 @@ package org.eclipse.tracecompass.tmf.core.analysis;
 
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.IAnalysisRequirementProvider;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
 import org.osgi.framework.Bundle;
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/IAnalysisRequirementProvider.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/IAnalysisRequirementProvider.java
deleted file mode 100644 (file)
index 62e41fb..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014 É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
- *
- * Contributors:
- *   Guilliano Molaire - Initial API and implementation
- *   Mathieu Rail - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.core.analysis;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-
-/**
- * Interface that provides the necessary methods for an analysis to define its
- * requirements.
- *
- * @author Guilliano Molaire
- * @author Mathieu Rail
- */
-@NonNullByDefault
-public interface IAnalysisRequirementProvider {
-
-    /**
-     * Gets the requirements associated with this analysis.
-     *
-     * @return List of requirement
-     */
-    Iterable<TmfAnalysisRequirement> getAnalysisRequirements();
-}
index 6df4a158912cb23f15ad4e10cae56d1948382fce..d005443d417414fd777db43717b2788f0b7a4014 100644 (file)
@@ -36,7 +36,8 @@ import org.eclipse.osgi.util.NLS;
 import org.eclipse.tracecompass.common.core.NonNullUtils;
 import org.eclipse.tracecompass.internal.tmf.core.Activator;
 import org.eclipse.tracecompass.internal.tmf.core.TmfCoreTracer;
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement.ValuePriorityLevel;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement.ValuePriorityLevel;
 import org.eclipse.tracecompass.tmf.core.component.TmfComponent;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.tracecompass.tmf.core.project.model.ITmfPropertiesProvider;
@@ -521,7 +522,7 @@ public abstract class TmfAbstractAnalysisModule extends TmfComponent
     }
 
     @Override
-    public Iterable<TmfAnalysisRequirement> getAnalysisRequirements() {
+    public Iterable<@NonNull TmfAnalysisRequirement> getAnalysisRequirements() {
         return Collections.EMPTY_SET;
     }
 
index 8487f54088b2526d0bdad3146465766c80b07a10..716483b14ca765e1e7de55c6212742418f93b936 100644 (file)
@@ -24,6 +24,7 @@ import org.eclipse.core.runtime.InvalidRegistryObjectException;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.tracecompass.internal.tmf.core.Activator;
 import org.eclipse.tracecompass.internal.tmf.core.analysis.TmfAnalysisModuleSourceConfigElement;
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType;
 import org.eclipse.tracecompass.tmf.core.project.model.TraceTypeHelper;
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/TmfAnalysisRequirement.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/TmfAnalysisRequirement.java
deleted file mode 100644 (file)
index 098a23d..0000000
+++ /dev/null
@@ -1,290 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014 É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
- *
- * Contributors:
- *   Mathieu Rail - Initial API and implementation
- *   Guilliano Molaire - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.core.analysis;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTraceWithPreDefinedEvents;
-import org.eclipse.tracecompass.tmf.core.trace.TmfEventTypeCollectionHelper;
-
-/**
- * Class that contains all the values associated with a type needed by an
- * analysis in order to execute. Each value is peered with a level that
- * determines the importance of that specific value for the requirement.
- *
- * The type gives an indication about the kind of value the requirement
- * contains. The value should depend on the type. For instance, a requirement
- * type could be "event" and all the values that would be added in the
- * requirement object could indicate the possible events handled by the
- * analysis.
- *
- * For these values, a level will be assigned indicating how important the value
- * is based on two possibilities: Mandatory or optional.
- *
- * Moreover, useful information that can not be leveled with a priority but are
- * important for the proper execution of an analysis can be added.
- *
- * @author Guilliano Molaire
- * @author Mathieu Rail
- */
-public class TmfAnalysisRequirement {
-
-    /**
-     * String for requirement type 'event', that can be used by analysis
-     */
-    public static final String TYPE_EVENT = "event"; //$NON-NLS-1$
-
-    private final String fType;
-    private final Map<String, ValuePriorityLevel> fValues = new HashMap<>();
-    private final Set<@NonNull String> fInformation = new HashSet<>();
-
-    /**
-     * The possible level for each value. They must be listed in ascending order
-     * of priority.
-     */
-    public enum ValuePriorityLevel {
-        /** The value could be absent and the analysis would still work */
-        OPTIONAL,
-        /** The value must be present at runtime (for the analysis) */
-        MANDATORY
-    }
-
-    /**
-     * Constructor
-     *
-     * @param type
-     *            The type of the requirement
-     */
-    public TmfAnalysisRequirement(String type) {
-        fType = type;
-    }
-
-    /**
-     * Constructor. Instantiate a requirement object with a list of values of
-     * the same level
-     *
-     * @param type
-     *            The type of the requirement
-     * @param values
-     *            All the values associated with that type
-     * @param level
-     *            A level associated with all the values
-     */
-    public TmfAnalysisRequirement(String type, Iterable<String> values, ValuePriorityLevel level) {
-        fType = type;
-        addValues(values, level);
-    }
-
-    /**
-     * Merges the values of the specified requirement with those of this
-     * requirement. All new values will retain their priority value level. If a
-     * value was already inside the current requirement, the current priority
-     * level will be overridden if the new priority level is higher.
-     *
-     * @param subRequirement
-     *            The requirement to be merged into the current one
-     * @param maxSubRequirementValueLevel
-     *            The level associated with all the new values or currently
-     *            lower priority ones
-     * @return True if the merge was successful
-     */
-    public Boolean merge(TmfAnalysisRequirement subRequirement, ValuePriorityLevel maxSubRequirementValueLevel) {
-        /* Two requirements can't be merged if their types are different */
-        if (!isSameType(subRequirement)) {
-            return false;
-        }
-
-        Set<String> values = subRequirement.getValues();
-        for (String value : values) {
-            /*
-             * Sub-requirement value levels are limited to
-             * maxSubRequirementValueLevel, so the level associated with the
-             * values in the merge is the minimum value between
-             * maxSubRequirementValueLevel and its true level.
-             */
-            int minLevel = Math.min(subRequirement.getValueLevel(value).ordinal(), maxSubRequirementValueLevel.ordinal());
-            ValuePriorityLevel subRequirementValueLevel = ValuePriorityLevel.values()[minLevel];
-
-            if (fValues.containsKey(value)) {
-                /*
-                 * If a value is already in a requirement, we update the level
-                 * by the highest value between the current level in the
-                 * requirement and the level of the value in the
-                 * sub-requirement.
-                 */
-                ValuePriorityLevel requirementValueLevel = getValueLevel(value);
-
-                int newValueLevel = Math.max(requirementValueLevel.ordinal(), subRequirementValueLevel.ordinal());
-                ValuePriorityLevel highestLevel = ValuePriorityLevel.values()[newValueLevel];
-                addValue(value, highestLevel);
-            }
-            else {
-                addValue(value, subRequirementValueLevel);
-            }
-        }
-
-        /* Merge the information */
-        fInformation.addAll(subRequirement.getInformation());
-
-        return true;
-    }
-
-    /**
-     * Adds a list of value inside the requirement with the same level.
-     *
-     * @param values
-     *            A list of value
-     * @param level
-     *            The level associated with all the values
-     */
-    public void addValues(Iterable<String> values, ValuePriorityLevel level) {
-        for (String value : values) {
-            addValue(value, level);
-        }
-    }
-
-    /**
-     * Adds a value with his associated level into the requirement. If the value
-     * is already contained in the requirement the method modifies its existing
-     * value level.
-     *
-     * @param value
-     *            The value
-     * @param level
-     *            The level
-     */
-    public void addValue(String value, ValuePriorityLevel level) {
-        synchronized (fValues) {
-            fValues.put(value, level);
-        }
-    }
-
-    /**
-     * Adds an information about the requirement.
-     *
-     * @param information
-     *            The information to be added
-     */
-    public void addInformation(@NonNull String information) {
-        fInformation.add(information);
-    }
-
-    /**
-     * Determines if the analysis requirement has the same type of another
-     * requirement.
-     *
-     * @param requirement
-     *            Requirement whose type is to be compared to this requirement's
-     *            type.
-     * @return True if the two requirements have the same type; otherwise false
-     */
-    public Boolean isSameType(TmfAnalysisRequirement requirement) {
-        return fType.equals(requirement.getType());
-    }
-
-    /**
-     * Gets the requirement type. The type is read only.
-     *
-     * @return The type of this requirement
-     */
-    public String getType() {
-        return fType;
-    }
-
-    /**
-     * Gets all the values associated with the requirement.
-     *
-     * @return Set containing the values
-     */
-    public Set<String> getValues() {
-        synchronized (fValues) {
-            return fValues.keySet();
-        }
-    }
-
-    /**
-     * Gets all the values associated with the requirement with a given priority
-     * level.
-     *
-     * @param level
-     *            The desired level
-     * @return Set containing the values with the given priority level
-     */
-    public Set<String> getValues(ValuePriorityLevel level) {
-        synchronized (fValues) {
-            Set<String> values = new HashSet<>();
-            for (Entry<String, ValuePriorityLevel> entry : fValues.entrySet()) {
-                if (entry.getValue() == level) {
-                    values.add(entry.getKey());
-                }
-            }
-            return values;
-        }
-    }
-
-    /**
-     * Gets information about the requirement.
-     *
-     * @return The set of all the information
-     */
-    public Set<@NonNull String> getInformation() {
-        return fInformation;
-    }
-
-    /**
-     * Gets the level associated with a particular type
-     *
-     * @param value
-     *            The value
-     * @return The level or null if the value does not exist
-     */
-    public ValuePriorityLevel getValueLevel(String value) {
-        synchronized (fValues) {
-            return fValues.get(value);
-        }
-    }
-
-    /**
-     * Verifies whether a trace fulfills this requirement
-     *
-     * @param trace
-     *            The trace on which to check for this requirement
-     * @return True if the trace has all mandatory values of this requirement
-     */
-    public boolean isFulfilled(@NonNull ITmfTrace trace) {
-        switch (fType) {
-        case TYPE_EVENT:
-            if (trace instanceof ITmfTraceWithPreDefinedEvents) {
-                Set<String> traceEvents = TmfEventTypeCollectionHelper.getEventNames(((ITmfTraceWithPreDefinedEvents) trace).getContainedEventTypes());
-                Set<String> mandatoryValues = getValues(ValuePriorityLevel.MANDATORY);
-                return traceEvents.containsAll(mandatoryValues);
-            }
-            break;
-        default:
-            return true;
-        }
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return fType + ": " + fValues; //$NON-NLS-1$
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/TmfAnalysisRequirementHelper.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/TmfAnalysisRequirementHelper.java
deleted file mode 100644 (file)
index 5066cba..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014 É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
- *
- * Contributors:
- *   Guilliano Molaire - Initial API and implementation
- *   Mathieu Rail - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.core.analysis;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement.ValuePriorityLevel;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.SetMultimap;
-
-/**
- * Helper class to simplify analysis requirement management.
- *
- * @author Guilliano Molaire
- */
-public final class TmfAnalysisRequirementHelper {
-
-    /**
-     * Private constructor. The class should not be instantiated.
-     */
-    private TmfAnalysisRequirementHelper() {
-    }
-
-    /**
-     * Gets the requirement values of a given type from an analysis requirement
-     * provider. Only values linked to the type will be returned.
-     *
-     * @param provider
-     *            The analysis requirement provider
-     * @param type
-     *            The type of the requirement values we need
-     * @return The list of values for the specified type
-     */
-    public static Set<String> getRequirementValues(IAnalysisRequirementProvider provider, String type) {
-        Set<String> values = new HashSet<>();
-        for (TmfAnalysisRequirement requirement : provider.getAnalysisRequirements()) {
-            if (requirement.getType().equalsIgnoreCase(type)) {
-                values.addAll(requirement.getValues());
-            }
-        }
-        return values;
-    }
-
-    /**
-     * Gets the requirement values of a given type from an analysis requirement
-     * provider, with the specified level. Only values associated with that type
-     * and level will be returned.
-     *
-     * @param provider
-     *            The analysis requirement provider
-     * @param type
-     *            The type of the requirement values we need
-     * @param level
-     *            The priority level of the values to be returned
-     * @return The list of values for the specified type
-     */
-    public static Set<String> getRequirementValues(IAnalysisRequirementProvider provider, String type, ValuePriorityLevel level) {
-        Set<String> values = new HashSet<>();
-        for (TmfAnalysisRequirement requirement : provider.getAnalysisRequirements()) {
-            if (requirement.getType().equalsIgnoreCase(type)) {
-                for (String value : requirement.getValues()) {
-                    if (requirement.getValueLevel(value) == level) {
-                        values.add(value);
-                    }
-                }
-            }
-        }
-        return values;
-    }
-
-    /**
-     * Gets a map in which the keys are the types of different requirements and
-     * the values represent a set of requirement values linked to that type.
-     *
-     * @param providers
-     *            The set of analysis requirement provider
-     * @return A map with the values keyed by type
-     */
-    public static SetMultimap<String, String> getRequirementValuesMap(Iterable<IAnalysisRequirementProvider> providers) {
-        SetMultimap<String, String> valuesByType = HashMultimap.create();
-        for (IAnalysisRequirementProvider provider : providers) {
-            for (TmfAnalysisRequirement requirement : provider.getAnalysisRequirements()) {
-                valuesByType.putAll(requirement.getType(), requirement.getValues());
-            }
-        }
-        return valuesByType;
-    }
-
-    /**
-     * Gets a map in which the keys are the types of different requirements and
-     * the values represents a list of requirement values linked to that type.
-     * We only take values with the same priority level as the argument.
-     *
-     * @param providers
-     *            The set of analysis requirement provider
-     * @param level
-     *            The priority level of the values to be returned
-     * @return A map with the values keyed by type
-     */
-    public static SetMultimap<String, String> getRequirementValuesMap(Iterable<IAnalysisRequirementProvider> providers, ValuePriorityLevel level) {
-        SetMultimap<String, String> valuesByType = HashMultimap.create();
-        for (IAnalysisRequirementProvider provider : providers) {
-            for (TmfAnalysisRequirement requirement : provider.getAnalysisRequirements()) {
-                /* Since it's a set, there will be no duplicate */
-                for (String value : requirement.getValues()) {
-                    if (requirement.getValueLevel(value) == level) {
-                        valuesByType.put(requirement.getType(), value);
-                    }
-                }
-            }
-        }
-        return valuesByType;
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/requirements/IAnalysisRequirementProvider.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/requirements/IAnalysisRequirementProvider.java
new file mode 100644 (file)
index 0000000..707418d
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014 É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
+ *
+ * Contributors:
+ *   Guilliano Molaire - Initial API and implementation
+ *   Mathieu Rail - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.tmf.core.analysis.requirements;
+
+/**
+ * Interface that provides the necessary methods for an analysis to define its
+ * requirements.
+ *
+ * @author Guilliano Molaire
+ * @author Mathieu Rail
+ * @since 2.0
+ */
+public interface IAnalysisRequirementProvider {
+
+    /**
+     * Gets the requirements associated with this analysis.
+     *
+     * @return List of requirement
+     */
+    Iterable<TmfAnalysisRequirement> getAnalysisRequirements();
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/requirements/TmfAnalysisRequirement.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/requirements/TmfAnalysisRequirement.java
new file mode 100644 (file)
index 0000000..c005442
--- /dev/null
@@ -0,0 +1,299 @@
+/*******************************************************************************
+ * Copyright (c) 2014 É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
+ *
+ * Contributors:
+ *   Mathieu Rail - Initial API and implementation
+ *   Guilliano Molaire - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.tmf.core.analysis.requirements;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
+import org.eclipse.tracecompass.tmf.core.trace.ITmfTraceWithPreDefinedEvents;
+import org.eclipse.tracecompass.tmf.core.trace.TmfEventTypeCollectionHelper;
+
+/**
+ * Class that contains all the values associated with a type needed by an
+ * analysis in order to execute. Each value is peered with a level that
+ * determines the importance of that specific value for the requirement.
+ *
+ * The type gives an indication about the kind of value the requirement
+ * contains. The value should depend on the type. For instance, a requirement
+ * type could be "event" and all the values that would be added in the
+ * requirement object could indicate the possible events handled by the
+ * analysis.
+ *
+ * For these values, a level will be assigned indicating how important the value
+ * is based on two possibilities: Mandatory or optional.
+ *
+ * Moreover, useful information that can not be leveled with a priority but are
+ * important for the proper execution of an analysis can be added.
+ *
+ * @author Guilliano Molaire
+ * @author Mathieu Rail
+ * @since 2.0
+ */
+public class TmfAnalysisRequirement {
+
+    /**
+     * String for requirement type 'event', that can be used by analysis
+     */
+    public static final String TYPE_EVENT = "event"; //$NON-NLS-1$
+
+    private final String fType;
+    private final Map<String, @NonNull ValuePriorityLevel> fValues = new HashMap<>();
+    private final Set<@NonNull String> fInformation = new HashSet<>();
+
+    /**
+     * The possible level for each value. They must be listed in ascending order
+     * of priority.
+     */
+    public enum ValuePriorityLevel {
+        /** The value could be absent and the analysis would still work */
+        OPTIONAL,
+        /** The value must be present at runtime (for the analysis) */
+        MANDATORY
+    }
+
+    /**
+     * Constructor
+     *
+     * @param type
+     *            The type of the requirement
+     */
+    public TmfAnalysisRequirement(String type) {
+        fType = type;
+    }
+
+    /**
+     * Constructor. Instantiate a requirement object with a list of values of
+     * the same level
+     *
+     * @param type
+     *            The type of the requirement
+     * @param values
+     *            All the values associated with that type
+     * @param level
+     *            A level associated with all the values
+     */
+    public TmfAnalysisRequirement(String type, Iterable<String> values, ValuePriorityLevel level) {
+        fType = type;
+        addValues(values, level);
+    }
+
+    /**
+     * Merges the values of the specified requirement with those of this
+     * requirement. All new values will retain their priority value level. If a
+     * value was already inside the current requirement, the current priority
+     * level will be overridden if the new priority level is higher.
+     *
+     * @param subRequirement
+     *            The requirement to be merged into the current one
+     * @param maxSubRequirementValueLevel
+     *            The level associated with all the new values or currently
+     *            lower priority ones
+     * @return True if the merge was successful
+     */
+    public Boolean merge(TmfAnalysisRequirement subRequirement, ValuePriorityLevel maxSubRequirementValueLevel) {
+        /* Two requirements can't be merged if their types are different */
+        if (!isSameType(subRequirement)) {
+            return false;
+        }
+
+        Set<String> values = subRequirement.getValues();
+        for (String value : values) {
+            /*
+             * Sub-requirement value levels are limited to
+             * maxSubRequirementValueLevel, so the level associated with the
+             * values in the merge is the minimum value between
+             * maxSubRequirementValueLevel and its true level.
+             */
+            ValuePriorityLevel valueLevel = subRequirement.getValueLevel(value);
+            if (valueLevel == null) {
+                throw new NullPointerException();
+            }
+            int minLevel = Math.min(valueLevel.ordinal(), maxSubRequirementValueLevel.ordinal());
+            ValuePriorityLevel subRequirementValueLevel = ValuePriorityLevel.values()[minLevel];
+
+            if (fValues.containsKey(value)) {
+                /*
+                 * If a value is already in a requirement, we update the level
+                 * by the highest value between the current level in the
+                 * requirement and the level of the value in the
+                 * sub-requirement.
+                 */
+                ValuePriorityLevel requirementValueLevel = getValueLevel(value);
+                if (requirementValueLevel == null) {
+                    throw new NullPointerException();
+                }
+
+                int newValueLevel = Math.max(requirementValueLevel.ordinal(), subRequirementValueLevel.ordinal());
+                ValuePriorityLevel highestLevel = ValuePriorityLevel.values()[newValueLevel];
+                addValue(value, highestLevel);
+            }
+            else {
+                addValue(value, subRequirementValueLevel);
+            }
+        }
+
+        /* Merge the information */
+        fInformation.addAll(subRequirement.getInformation());
+
+        return true;
+    }
+
+    /**
+     * Adds a list of value inside the requirement with the same level.
+     *
+     * @param values
+     *            A list of value
+     * @param level
+     *            The level associated with all the values
+     */
+    public void addValues(Iterable<String> values, ValuePriorityLevel level) {
+        for (String value : values) {
+            addValue(value, level);
+        }
+    }
+
+    /**
+     * Adds a value with his associated level into the requirement. If the value
+     * is already contained in the requirement the method modifies its existing
+     * value level.
+     *
+     * @param value
+     *            The value
+     * @param level
+     *            The level
+     */
+    public void addValue(String value, ValuePriorityLevel level) {
+        synchronized (fValues) {
+            fValues.put(value, level);
+        }
+    }
+
+    /**
+     * Adds an information about the requirement.
+     *
+     * @param information
+     *            The information to be added
+     */
+    public void addInformation(String information) {
+        fInformation.add(information);
+    }
+
+    /**
+     * Determines if the analysis requirement has the same type of another
+     * requirement.
+     *
+     * @param requirement
+     *            Requirement whose type is to be compared to this requirement's
+     *            type.
+     * @return True if the two requirements have the same type; otherwise false
+     */
+    public Boolean isSameType(TmfAnalysisRequirement requirement) {
+        return fType.equals(requirement.getType());
+    }
+
+    /**
+     * Gets the requirement type. The type is read only.
+     *
+     * @return The type of this requirement
+     */
+    public String getType() {
+        return fType;
+    }
+
+    /**
+     * Gets all the values associated with the requirement.
+     *
+     * @return Set containing the values
+     */
+    public Set<String> getValues() {
+        synchronized (fValues) {
+            return fValues.keySet();
+        }
+    }
+
+    /**
+     * Gets all the values associated with the requirement with a given priority
+     * level.
+     *
+     * @param level
+     *            The desired level
+     * @return Set containing the values with the given priority level
+     */
+    public Set<String> getValues(ValuePriorityLevel level) {
+        synchronized (fValues) {
+            Set<String> values = new HashSet<>();
+            for (Entry<String, ValuePriorityLevel> entry : fValues.entrySet()) {
+                if (entry.getValue() == level) {
+                    values.add(entry.getKey());
+                }
+            }
+            return values;
+        }
+    }
+
+    /**
+     * Gets information about the requirement.
+     *
+     * @return The set of all the information
+     */
+    public Set<@NonNull String> getInformation() {
+        return fInformation;
+    }
+
+    /**
+     * Gets the level associated with a particular type
+     *
+     * @param value
+     *            The value
+     * @return The level or null if the value does not exist
+     */
+    public @Nullable ValuePriorityLevel getValueLevel(String value) {
+        synchronized (fValues) {
+            return fValues.get(value);
+        }
+    }
+
+    /**
+     * Verifies whether a trace fulfills this requirement
+     *
+     * @param trace
+     *            The trace on which to check for this requirement
+     * @return True if the trace has all mandatory values of this requirement
+     */
+    public boolean isFulfilled(ITmfTrace trace) {
+        switch (fType) {
+        case TYPE_EVENT:
+            if (trace instanceof ITmfTraceWithPreDefinedEvents) {
+                Set<String> traceEvents = TmfEventTypeCollectionHelper.getEventNames(((ITmfTraceWithPreDefinedEvents) trace).getContainedEventTypes());
+                Set<String> mandatoryValues = getValues(ValuePriorityLevel.MANDATORY);
+                return traceEvents.containsAll(mandatoryValues);
+            }
+            break;
+        default:
+            return true;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return fType + ": " + fValues; //$NON-NLS-1$
+    }
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/requirements/TmfAnalysisRequirementHelper.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/requirements/TmfAnalysisRequirementHelper.java
new file mode 100644 (file)
index 0000000..4bf2817
--- /dev/null
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * Copyright (c) 2014 É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
+ *
+ * Contributors:
+ *   Guilliano Molaire - Initial API and implementation
+ *   Mathieu Rail - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.tmf.core.analysis.requirements;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement.ValuePriorityLevel;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.SetMultimap;
+
+/**
+ * Helper class to simplify analysis requirement management.
+ *
+ * @author Guilliano Molaire
+ * @since 2.0
+ */
+public final class TmfAnalysisRequirementHelper {
+
+    /**
+     * Private constructor. The class should not be instantiated.
+     */
+    private TmfAnalysisRequirementHelper() {
+    }
+
+    /**
+     * Gets the requirement values of a given type from an analysis requirement
+     * provider. Only values linked to the type will be returned.
+     *
+     * @param provider
+     *            The analysis requirement provider
+     * @param type
+     *            The type of the requirement values we need
+     * @return The list of values for the specified type
+     */
+    public static Set<String> getRequirementValues(IAnalysisRequirementProvider provider, String type) {
+        Set<String> values = new HashSet<>();
+        for (TmfAnalysisRequirement requirement : provider.getAnalysisRequirements()) {
+            if (requirement.getType().equalsIgnoreCase(type)) {
+                values.addAll(requirement.getValues());
+            }
+        }
+        return values;
+    }
+
+    /**
+     * Gets the requirement values of a given type from an analysis requirement
+     * provider, with the specified level. Only values associated with that type
+     * and level will be returned.
+     *
+     * @param provider
+     *            The analysis requirement provider
+     * @param type
+     *            The type of the requirement values we need
+     * @param level
+     *            The priority level of the values to be returned
+     * @return The list of values for the specified type
+     */
+    public static Set<String> getRequirementValues(IAnalysisRequirementProvider provider, String type, ValuePriorityLevel level) {
+        Set<String> values = new HashSet<>();
+        for (TmfAnalysisRequirement requirement : provider.getAnalysisRequirements()) {
+            if (requirement.getType().equalsIgnoreCase(type)) {
+                for (String value : requirement.getValues()) {
+                    if (requirement.getValueLevel(value) == level) {
+                        values.add(value);
+                    }
+                }
+            }
+        }
+        return values;
+    }
+
+    /**
+     * Gets a map in which the keys are the types of different requirements and
+     * the values represent a set of requirement values linked to that type.
+     *
+     * @param providers
+     *            The set of analysis requirement provider
+     * @return A map with the values keyed by type
+     */
+    public static SetMultimap<String, String> getRequirementValuesMap(Iterable<IAnalysisRequirementProvider> providers) {
+        SetMultimap<String, String> valuesByType = HashMultimap.create();
+        for (IAnalysisRequirementProvider provider : providers) {
+            for (TmfAnalysisRequirement requirement : provider.getAnalysisRequirements()) {
+                valuesByType.putAll(requirement.getType(), requirement.getValues());
+            }
+        }
+        return valuesByType;
+    }
+
+    /**
+     * Gets a map in which the keys are the types of different requirements and
+     * the values represents a list of requirement values linked to that type.
+     * We only take values with the same priority level as the argument.
+     *
+     * @param providers
+     *            The set of analysis requirement provider
+     * @param level
+     *            The priority level of the values to be returned
+     * @return A map with the values keyed by type
+     */
+    public static SetMultimap<String, String> getRequirementValuesMap(Iterable<IAnalysisRequirementProvider> providers, ValuePriorityLevel level) {
+        SetMultimap<String, String> valuesByType = HashMultimap.create();
+        for (IAnalysisRequirementProvider provider : providers) {
+            for (TmfAnalysisRequirement requirement : provider.getAnalysisRequirements()) {
+                /* Since it's a set, there will be no duplicate */
+                for (String value : requirement.getValues()) {
+                    if (requirement.getValueLevel(value) == level) {
+                        valuesByType.put(requirement.getType(), value);
+                    }
+                }
+            }
+        }
+        return valuesByType;
+    }
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/requirements/package-info.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/analysis/requirements/package-info.java
new file mode 100644 (file)
index 0000000..057b310
--- /dev/null
@@ -0,0 +1,11 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.tracecompass.tmf.core.analysis.requirements;
This page took 0.049887 seconds and 5 git commands to generate.