aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Wininger2013-11-06 13:43:38 -0500
committerGenevieve Bastien2014-02-05 14:57:31 -0500
commit9f42250afac3a1e558069ed58c2f4ead8355edf9 (patch)
treec6d3b79a1006ce793c05e8f679dbd8467684daea
parentbfb4dc5008e66e9eb518d9af324257be91763d8d (diff)
downloadorg.eclipse.linuxtools-9f42250afac3a1e558069ed58c2f4ead8355edf9.zip
org.eclipse.linuxtools-9f42250afac3a1e558069ed58c2f4ead8355edf9.tar.gz
org.eclipse.linuxtools-9f42250afac3a1e558069ed58c2f4ead8355edf9.tar.xz
TMF: Add the XML analysis module source
This patch allows the importation of XML files from the TMF GUI. Analysis modules described in those XML files will appear under the trace, if applicable. Change-Id: I0910946f35fe921c22b319b77ab2aefeb385edf3 Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net> Signed-off-by: Florian Wininger <florian.wininger@polymtl.ca> Reviewed-on: https://git.eclipse.org/r/20155 Tested-by: Hudson CI Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com> IP-Clean: Matthew Khouzam <matthew.khouzam@ericsson.com>
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.core/src/org/eclipse/linuxtools/tmf/analysis/xml/core/stateprovider/TmfXmlStrings.java5
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/META-INF/MANIFEST.MF4
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/plugin.properties2
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/tests/AllAnalysisXmlUiTests.java3
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/tests/module/AllTests.java27
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/tests/module/XmlAnalysisModuleSourceTest.java126
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/META-INF/MANIFEST.MF4
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/build.properties3
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/plugin.properties5
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/plugin.xml85
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/internal/tmf/analysis/xml/ui/handler/ImportXmlHandler.java110
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/Messages.java35
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/TmfAnalysisModuleHelperXml.java144
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/XmlAnalysisModuleSource.java98
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/XmlHeadInfoUi.java66
-rw-r--r--lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/messages.properties1
16 files changed, 712 insertions, 6 deletions
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.core/src/org/eclipse/linuxtools/tmf/analysis/xml/core/stateprovider/TmfXmlStrings.java b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.core/src/org/eclipse/linuxtools/tmf/analysis/xml/core/stateprovider/TmfXmlStrings.java
index ede1402..0cfb511 100644
--- a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.core/src/org/eclipse/linuxtools/tmf/analysis/xml/core/stateprovider/TmfXmlStrings.java
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.core/src/org/eclipse/linuxtools/tmf/analysis/xml/core/stateprovider/TmfXmlStrings.java
@@ -30,4 +30,9 @@ public interface TmfXmlStrings {
static final String NAME = "name";
static final String VERSION = "version";
+ /* XML head element */
+ static final String HEAD = "head";
+ static final String TRACETYPE = "tracetype";
+ static final String ID = "id";
+
} \ No newline at end of file
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/META-INF/MANIFEST.MF b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/META-INF/MANIFEST.MF
index 10a1d7f..d800647 100644
--- a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/META-INF/MANIFEST.MF
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/META-INF/MANIFEST.MF
@@ -11,8 +11,10 @@ Require-Bundle: org.eclipse.ui,
org.eclipse.linuxtools.tmf.analysis.xml.core,
org.eclipse.core.resources,
org.eclipse.linuxtools.tmf.core,
+ org.eclipse.linuxtools.tmf.analysis.xml.core,
org.eclipse.linuxtools.tmf.analysis.xml.ui,
- org.eclipse.linuxtools.tmf.ui
+ org.eclipse.linuxtools.tmf.ui,
+ org.eclipse.linuxtools.tmf.analysis.xml.core.tests
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
Import-Package: org.junit.runners
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/plugin.properties b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/plugin.properties
index 445d261..6424a1e 100644
--- a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/plugin.properties
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/plugin.properties
@@ -12,4 +12,4 @@
#Properties file for org.eclipse.linuxtools.tmf.core
Bundle-Vendor = Eclipse Linux Tools
-Bundle-Name = Linux Tools TMF Xml Analysis UI Tests Plug-in
+Bundle-Name = Linux Tools TMF XML Analysis UI Tests Plug-in
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/tests/AllAnalysisXmlUiTests.java b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/tests/AllAnalysisXmlUiTests.java
index 2b0dd54..61e085c 100644
--- a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/tests/AllAnalysisXmlUiTests.java
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/tests/AllAnalysisXmlUiTests.java
@@ -20,7 +20,8 @@ import org.junit.runners.Suite;
*/
@RunWith(Suite.class)
@Suite.SuiteClasses({
- XmlAnalysisUiPluginTest.class
+ XmlAnalysisUiPluginTest.class,
+ org.eclipse.linuxtools.tmf.analysis.xml.ui.tests.module.AllTests.class
})
public class AllAnalysisXmlUiTests {
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/tests/module/AllTests.java b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/tests/module/AllTests.java
new file mode 100644
index 0000000..865fd02
--- /dev/null
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/tests/module/AllTests.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * 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:
+ * Geneviève Bastien - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.analysis.xml.ui.tests.module;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Test suite for org.eclipse.linuxtools.tmf.analysis.xml.ui.module package
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ XmlAnalysisModuleSourceTest.class
+})
+public class AllTests {
+
+}
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/tests/module/XmlAnalysisModuleSourceTest.java b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/tests/module/XmlAnalysisModuleSourceTest.java
new file mode 100644
index 0000000..c35a44c
--- /dev/null
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui.tests/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/tests/module/XmlAnalysisModuleSourceTest.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * 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:
+ * Geneviève Bastien - Initial implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.analysis.xml.ui.tests.module;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.util.Map;
+
+import org.eclipse.linuxtools.tmf.analysis.xml.core.module.XmlUtils;
+import org.eclipse.linuxtools.tmf.analysis.xml.core.tests.common.TmfXmlTestFiles;
+import org.eclipse.linuxtools.tmf.analysis.xml.ui.module.XmlAnalysisModuleSource;
+import org.eclipse.linuxtools.tmf.core.analysis.IAnalysisModuleHelper;
+import org.eclipse.linuxtools.tmf.core.analysis.TmfAnalysisManager;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test suite for the {@link XmlAnalysisModuleSource} class
+ *
+ * @author Geneviève Bastien
+ */
+public class XmlAnalysisModuleSourceTest {
+
+ private static final String SS_MODULE = "polymtl.kernel.sp";
+
+ private static void emptyXmlFolder() {
+ File fFolder = XmlUtils.getXmlFilesPath().toFile();
+ if (!(fFolder.isDirectory() && fFolder.exists())) {
+ return;
+ }
+ for (File xmlFile : fFolder.listFiles()) {
+ xmlFile.delete();
+ }
+ XmlAnalysisModuleSource.notifyModuleChange();
+ }
+
+ /**
+ * Empty the XML directory before the test, just in case
+ */
+ @Before
+ public void setUp() {
+ emptyXmlFolder();
+ }
+
+ /**
+ * Empty the XML directory after the test
+ */
+ @After
+ public void cleanUp() {
+ emptyXmlFolder();
+ }
+
+ /**
+ * Test the {@link XmlAnalysisModuleSource#getAnalysisModules()} method
+ */
+ @Test
+ public void testPopulateModules() {
+ XmlAnalysisModuleSource module = new XmlAnalysisModuleSource();
+
+ Iterable<IAnalysisModuleHelper> modules = module.getAnalysisModules();
+ assertFalse(modules.iterator().hasNext());
+
+ /* use the valid XML test file */
+ File testXmlFile = TmfXmlTestFiles.VALID_FILE.getFile();
+ if ((testXmlFile == null) || !testXmlFile.exists()) {
+ fail("XML test file does not exist");
+ }
+
+ XmlUtils.addXmlFile(testXmlFile);
+ XmlAnalysisModuleSource.notifyModuleChange();
+ modules = module.getAnalysisModules();
+
+ assertTrue(modules.iterator().hasNext());
+ assertTrue(findStateSystemModule(modules));
+ }
+
+ private static boolean findStateSystemModule(Iterable<IAnalysisModuleHelper> modules) {
+ for (IAnalysisModuleHelper helper : modules) {
+ if (SS_MODULE.equals(helper.getId())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Test that XML modules are available through the analysis manager
+ */
+ @Test
+ public void testPopulateModulesWithAnalysisManager() {
+
+ /*
+ * Make sure module sources are initialized. When run as unit test, the
+ * XML module source is sometimes missing
+ */
+ TmfAnalysisManager.initializeModuleSources();
+
+ Map<String, IAnalysisModuleHelper> modules = TmfAnalysisManager.getAnalysisModules();
+ assertFalse(findStateSystemModule(modules.values()));
+
+ /* use the valid XML test file */
+ File testXmlFile = TmfXmlTestFiles.VALID_FILE.getFile();
+ if ((testXmlFile == null) || !testXmlFile.exists()) {
+ fail("XML test file does not exist");
+ }
+
+ XmlUtils.addXmlFile(testXmlFile);
+ XmlAnalysisModuleSource.notifyModuleChange();
+ modules = TmfAnalysisManager.getAnalysisModules();
+ assertTrue(findStateSystemModule(modules.values()));
+ }
+}
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/META-INF/MANIFEST.MF b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/META-INF/MANIFEST.MF
index 465d519..50c8ed6 100644
--- a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/META-INF/MANIFEST.MF
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/META-INF/MANIFEST.MF
@@ -13,4 +13,6 @@ Require-Bundle: org.eclipse.ui,
org.eclipse.linuxtools.tmf.core,
org.eclipse.linuxtools.tmf.ui,
org.eclipse.linuxtools.tmf.analysis.xml.core
-Export-Package: org.eclipse.linuxtools.internal.tmf.analysis.xml.ui;x-friends:="org.eclipse.linuxtools.tmf.analysis.xml.ui.tests"
+Export-Package: org.eclipse.linuxtools.internal.tmf.analysis.xml.ui;x-friends:="org.eclipse.linuxtools.tmf.analysis.xml.ui.tests",
+ org.eclipse.linuxtools.internal.tmf.analysis.xml.ui.handler;x-internal:=true,
+ org.eclipse.linuxtools.tmf.analysis.xml.ui.module
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/build.properties b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/build.properties
index 2b112c4..1dde0d2 100644
--- a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/build.properties
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/build.properties
@@ -3,5 +3,6 @@ output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.properties,\
- about.html
+ about.html,\
+ plugin.xml
src.includes = about.html
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/plugin.properties b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/plugin.properties
index b6fa118..6d20813 100644
--- a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/plugin.properties
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/plugin.properties
@@ -12,5 +12,8 @@
#Properties file for org.eclipse.linuxtools.tmf.core
Bundle-Vendor = Eclipse Linux Tools
-Bundle-Name = Linux Tools TMF Xml Analysis UI Plug-in
+Bundle-Name = Linux Tools TMF XML Analysis UI Plug-in
+command.xml.import = Import XML file
+command.xml.import.mnemonic = I
+command.xml.import.description = Import an XML file containing analysis information
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/plugin.xml b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/plugin.xml
new file mode 100644
index 0000000..54b3b8f
--- /dev/null
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/plugin.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.linuxtools.tmf.core.analysis">
+ <source
+ class="org.eclipse.linuxtools.tmf.analysis.xml.ui.module.XmlAnalysisModuleSource">
+ </source>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ categoryId="org.eclipse.linuxtools.tmf.ui.commands.category"
+ id="org.eclipse.linuxtools.tmf.analysis.xml.ui.importxml"
+ name="%command.xml.import"
+ description="%command.xml.import.description">
+ </command>
+ </extension>
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="popup:org.eclipse.ui.popup.any?after=additions">
+ <command
+ commandId="org.eclipse.linuxtools.tmf.analysis.xml.ui.importxml"
+ label="%command.xml.import"
+ mnemonic="%command.xml.import.mnemonic"
+ style="push"
+ tooltip="%command.xml.import.description">
+ <visibleWhen
+ checkEnabled="false">
+ <with
+ variable="selection">
+ <count
+ value="1">
+ </count>
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <or>
+ <instanceof
+ value="org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceFolder">
+ </instanceof>
+ <instanceof
+ value="org.eclipse.linuxtools.tmf.ui.project.model.TmfExperimentFolder">
+ </instanceof>
+ <instanceof
+ value="org.eclipse.linuxtools.tmf.ui.project.model.TmfProjectElement">
+ </instanceof>
+ </or>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+ <extension
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.linuxtools.internal.tmf.analysis.xml.ui.handler.ImportXmlHandler"
+ commandId="org.eclipse.linuxtools.tmf.analysis.xml.ui.importxml">
+ <activeWhen>
+ <and>
+ <count
+ value="1">
+ </count>
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <or>
+ <instanceof
+ value="org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceFolder">
+ </instanceof>
+ <instanceof
+ value="org.eclipse.linuxtools.tmf.ui.project.model.TmfExperimentFolder">
+ </instanceof>
+ <instanceof
+ value="org.eclipse.linuxtools.tmf.ui.project.model.TmfProjectElement">
+ </instanceof>
+ </or>
+ </iterate>
+ </and>
+ </activeWhen>
+ </handler>
+ </extension>
+</plugin>
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/internal/tmf/analysis/xml/ui/handler/ImportXmlHandler.java b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/internal/tmf/analysis/xml/ui/handler/ImportXmlHandler.java
new file mode 100644
index 0000000..8ea66a3
--- /dev/null
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/internal/tmf/analysis/xml/ui/handler/ImportXmlHandler.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * 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:
+ * Geneviève Bastien - Initial implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.tmf.analysis.xml.ui.handler;
+
+import java.io.File;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.linuxtools.tmf.analysis.xml.core.module.XmlUtils;
+import org.eclipse.linuxtools.tmf.analysis.xml.ui.module.Messages;
+import org.eclipse.linuxtools.tmf.analysis.xml.ui.module.XmlAnalysisModuleSource;
+import org.eclipse.linuxtools.tmf.ui.project.model.TmfProjectModelElement;
+import org.eclipse.linuxtools.tmf.ui.project.model.TraceUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Imports and validates an XML file
+ *
+ * @author Geneviève Bastien
+ */
+public class ImportXmlHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ FileDialog dlg = new FileDialog(new Shell(), SWT.OPEN);
+ dlg.setFilterNames(new String[] { Messages.ImportXmlHandler_ImportXmlFile + " (*.xml)" }); //$NON-NLS-1$
+ dlg.setFilterExtensions(new String[] { "*.xml" }); //$NON-NLS-1$
+
+ String fn = dlg.open();
+ if (fn != null) {
+ File file = new File(fn);
+ IStatus status = XmlUtils.xmlValidate(file);
+ if (status.isOK()) {
+ status = XmlUtils.addXmlFile(file);
+ if (status.isOK()) {
+ XmlAnalysisModuleSource.notifyModuleChange();
+ /*
+ * FIXME: It refreshes the list of analysis under a trace,
+ * but since modules are instantiated when the trace opens,
+ * the changes won't apply to an opened trace, it needs to
+ * be closed then reopened
+ */
+ refreshProject();
+ } else {
+ TraceUtils.displayErrorMsg(Messages.ImportXmlHandler_ImportXmlFile, status.getMessage());
+ }
+ } else {
+ TraceUtils.displayErrorMsg(Messages.ImportXmlHandler_ImportXmlFile, status.getMessage());
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Refresh the selected project with the new XML file import
+ */
+ private static void refreshProject() {
+ // Check if we are closing down
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ return;
+ }
+
+ // Get the selection
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IWorkbenchPart part = page.getActivePart();
+ if (part == null) {
+ return;
+ }
+ ISelectionProvider selectionProvider = part.getSite().getSelectionProvider();
+ if (selectionProvider == null) {
+ return;
+ }
+ ISelection selection = selectionProvider.getSelection();
+
+ if (selection instanceof TreeSelection) {
+ TreeSelection sel = (TreeSelection) selection;
+ // There should be only one item selected as per the plugin.xml
+ Object element = sel.getFirstElement();
+ if (element instanceof TmfProjectModelElement) {
+ ((TmfProjectModelElement) element).getProject().refresh();
+ }
+ }
+
+ }
+
+}
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/Messages.java b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/Messages.java
new file mode 100644
index 0000000..c720fa2
--- /dev/null
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/Messages.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * 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:
+ * Geneviève Bastien - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.analysis.xml.ui.module;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Externalized messages for the XML analysis module package
+ *
+ * @author Geneviève Bastien
+ */
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.linuxtools.tmf.analysis.xml.ui.module.messages"; //$NON-NLS-1$
+
+ /** Import XML file title */
+ public static String ImportXmlHandler_ImportXmlFile;
+
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/TmfAnalysisModuleHelperXml.java b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/TmfAnalysisModuleHelperXml.java
new file mode 100644
index 0000000..f26ccd8
--- /dev/null
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/TmfAnalysisModuleHelperXml.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * 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:
+ * Geneviève Bastien - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.analysis.xml.ui.module;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.linuxtools.internal.tmf.analysis.xml.ui.Activator;
+import org.eclipse.linuxtools.tmf.analysis.xml.core.stateprovider.TmfXmlStrings;
+import org.eclipse.linuxtools.tmf.analysis.xml.core.stateprovider.XmlStateSystemModule;
+import org.eclipse.linuxtools.tmf.core.analysis.IAnalysisModule;
+import org.eclipse.linuxtools.tmf.core.analysis.IAnalysisModuleHelper;
+import org.eclipse.linuxtools.tmf.core.exceptions.TmfAnalysisException;
+import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
+import org.eclipse.linuxtools.tmf.ui.analysis.TmfAnalysisViewOutput;
+import org.osgi.framework.Bundle;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * Analysis module helpers for modules provided by XML files
+ *
+ * @author Geneviève Bastien
+ */
+public class TmfAnalysisModuleHelperXml implements IAnalysisModuleHelper {
+
+ /**
+ * The types of analysis that can be XML-defined
+ */
+ public enum XmlAnalysisModuleType {
+ /** Analysis will be of type XmlStateSystemModule */
+ STATE_SYSTEM
+ }
+
+ private final File fSourceFile;
+ private final Element fSourceElement;
+ private final XmlAnalysisModuleType fType;
+ private final XmlHeadInfoUi fHeadInfo;
+
+ /**
+ * Constructor
+ *
+ * @param xmlFile
+ * The XML file containing the details of this analysis
+ * @param node
+ * The XML node element
+ * @param type
+ * The type of analysis
+ */
+ public TmfAnalysisModuleHelperXml(File xmlFile, Element node, XmlAnalysisModuleType type) {
+ fSourceFile = xmlFile;
+ fSourceElement = node;
+ fType = type;
+
+ NodeList head = fSourceElement.getElementsByTagName(TmfXmlStrings.HEAD);
+ if (head.getLength() == 1) {
+ fHeadInfo = new XmlHeadInfoUi(head.item(0));
+ } else {
+ fHeadInfo = null;
+ }
+ }
+
+ @Override
+ public String getId() {
+ return fSourceElement.getAttribute(TmfXmlStrings.ANALYSIS_ID);
+ }
+
+ @Override
+ public String getName() {
+ String name = fHeadInfo.getName();
+ if (name == null) {
+ name = getId();
+ }
+ return name;
+ }
+
+ @Override
+ public boolean isAutomatic() {
+ return false;
+ }
+
+ @Override
+ public String getHelpText() {
+ return new String();
+ }
+
+ @Override
+ public String getIcon() {
+ return null;
+ }
+
+ @Override
+ public Bundle getBundle() {
+ return Activator.getDefault().getBundle();
+ }
+
+ @Override
+ public boolean appliesToTraceType(Class<? extends ITmfTrace> traceclass) {
+ /* Trace types may be available in XML header */
+ if (fHeadInfo == null) {
+ return true;
+ }
+
+ return fHeadInfo.checkTraceType(traceclass);
+ }
+
+ @Override
+ public IAnalysisModule newModule(ITmfTrace trace) throws TmfAnalysisException {
+ String analysisid = getId();
+ IAnalysisModule module = null;
+ switch (fType) {
+ case STATE_SYSTEM:
+ module = new XmlStateSystemModule();
+ XmlStateSystemModule ssModule = (XmlStateSystemModule) module;
+ module.setId(analysisid);
+ ssModule.setXmlFile(new Path(fSourceFile.getAbsolutePath()));
+
+ /* Set header information if available */
+ ssModule.setHeadInfo(fHeadInfo);
+
+ module.registerOutput(new TmfAnalysisViewOutput("org.eclipse.linuxtools.tmf.ui.views.ssvisualizer")); //$NON-NLS-1$
+ break;
+ default:
+ break;
+
+ }
+ if (module != null) {
+ module.setTrace(trace);
+ }
+
+ return module;
+ }
+
+}
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/XmlAnalysisModuleSource.java b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/XmlAnalysisModuleSource.java
new file mode 100644
index 0000000..c975069
--- /dev/null
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/XmlAnalysisModuleSource.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * 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:
+ * Geneviève Bastien - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.analysis.xml.ui.module;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.linuxtools.internal.tmf.analysis.xml.ui.Activator;
+import org.eclipse.linuxtools.tmf.analysis.xml.core.module.XmlUtils;
+import org.eclipse.linuxtools.tmf.analysis.xml.core.stateprovider.TmfXmlStrings;
+import org.eclipse.linuxtools.tmf.analysis.xml.ui.module.TmfAnalysisModuleHelperXml.XmlAnalysisModuleType;
+import org.eclipse.linuxtools.tmf.core.analysis.IAnalysisModuleHelper;
+import org.eclipse.linuxtools.tmf.core.analysis.IAnalysisModuleSource;
+import org.eclipse.linuxtools.tmf.core.analysis.TmfAnalysisManager;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * Analysis module source who creates helpers for the analysis modules described
+ * in the imported XML files
+ *
+ * @author Geneviève Bastien
+ * @since 3.0
+ */
+public class XmlAnalysisModuleSource implements IAnalysisModuleSource {
+
+ private static List<IAnalysisModuleHelper> fModules = null;
+
+ @Override
+ public synchronized Iterable<IAnalysisModuleHelper> getAnalysisModules() {
+ if (fModules == null) {
+ populateAnalysisModules();
+ }
+ return fModules;
+ }
+
+ private static void populateAnalysisModules() {
+ fModules = new ArrayList<>();
+ IPath pathToFiles = XmlUtils.getXmlFilesPath();
+ File fFolder = pathToFiles.toFile();
+ if (!(fFolder.isDirectory() && fFolder.exists())) {
+ return;
+ }
+ for (File xmlFile : fFolder.listFiles()) {
+ if (!XmlUtils.xmlValidate(xmlFile).isOK()) {
+ continue;
+ }
+
+ try {
+ /* Load the XML File */
+ DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+ Document doc = dBuilder.parse(xmlFile);
+ doc.getDocumentElement().normalize();
+
+ /* get State Providers modules */
+ NodeList stateproviderNodes = doc.getElementsByTagName(TmfXmlStrings.STATE_PROVIDER);
+ for (int i = 0; i < stateproviderNodes.getLength(); i++) {
+ Element node = (Element) stateproviderNodes.item(i);
+
+ IAnalysisModuleHelper helper = new TmfAnalysisModuleHelperXml(xmlFile, node, XmlAnalysisModuleType.STATE_SYSTEM);
+ fModules.add(helper);
+ }
+ } catch (ParserConfigurationException | SAXException | IOException e) {
+ Activator.logError("Error opening XML file", e); //$NON-NLS-1$
+ }
+ }
+ }
+
+ /**
+ * Notifies the main XML analysis module that the executable modules list
+ * may have changed and needs to be refreshed.
+ */
+ public static void notifyModuleChange() {
+ fModules = null;
+ TmfAnalysisManager.refreshModules();
+ }
+
+}
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/XmlHeadInfoUi.java b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/XmlHeadInfoUi.java
new file mode 100644
index 0000000..1184880
--- /dev/null
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/XmlHeadInfoUi.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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:
+ * Geneviève Bastien - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.analysis.xml.ui.module;
+
+import java.util.List;
+
+import org.eclipse.linuxtools.tmf.analysis.xml.core.module.XmlHeadInfo;
+import org.eclipse.linuxtools.tmf.analysis.xml.core.stateprovider.TmfXmlStrings;
+import org.eclipse.linuxtools.tmf.core.project.model.TmfTraceType;
+import org.eclipse.linuxtools.tmf.core.project.model.TraceTypeHelper;
+import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * Class to store and interpret the header information of XML-defined components
+ *
+ * TODO: When trace types are moved to the o.e.l.tmf.core plug-in, there will be
+ * no need for this class anymore, move to o.e.l.tmf.analysis.xml.core plug-in.
+ *
+ * @author Geneviève Bastien
+ */
+public class XmlHeadInfoUi extends XmlHeadInfo {
+
+ /**
+ * Constructor
+ *
+ * @param item
+ * The XML node corresponding to this header
+ */
+ public XmlHeadInfoUi(Node item) {
+ super(item);
+ }
+
+ @Override
+ public boolean checkTraceType(Class<? extends ITmfTrace> traceClass) {
+ /*
+ * TODO: This wouldn't work for custom traces since {@link
+ * TmfTraceType#getTraceType(String)} has no helper for those traces
+ */
+ List<Element> elements = getElements(TmfXmlStrings.TRACETYPE);
+ if (elements.isEmpty()) {
+ return true;
+ }
+
+ for (Element element : elements) {
+ String traceTypeId = element.getAttribute(TmfXmlStrings.ID);
+ TraceTypeHelper helper = TmfTraceType.getInstance().getTraceType(traceTypeId);
+ if ((helper != null) && helper.getTrace().getClass().isAssignableFrom(traceClass)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/messages.properties b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/messages.properties
new file mode 100644
index 0000000..0f35f23
--- /dev/null
+++ b/lttng/org.eclipse.linuxtools.tmf.analysis.xml.ui/src/org/eclipse/linuxtools/tmf/analysis/xml/ui/module/messages.properties
@@ -0,0 +1 @@
+ImportXmlHandler_ImportXmlFile=Import XML analysis file