tmf: Create experiment when importing traces import trace wizard
authorBernd Hufmann <Bernd.Hufmann@ericsson.com>
Thu, 25 Feb 2016 15:06:02 +0000 (10:06 -0500)
committerBernd Hufmann <bernd.hufmann@ericsson.com>
Fri, 26 Feb 2016 15:51:10 +0000 (10:51 -0500)
Using the standard import wizard it's now possible to create an
experiment using all successfully imported traces. Unrecognized
traces won't be added to the experiment. Traces that are skipped
during the import (name conflict) are not added to the experiment.

The name of the experiment is by default the root folder when importing
from a directory. Or the archive name when importing from archive.
The user has the possibility to change the experiment name.

The option to create an experiment is persisted so that the checkbox
is selected/deselect when reopening the import wizard.

Change-Id: I06b15419ebd90983865c770d7a771bc5d190cc39
Signed-off-by: Bernd Hufmann <Bernd.Hufmann@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/67168
Reviewed-by: Hudson CI
Reviewed-by: Patrick Tasse <patrick.tasse@gmail.com>
Tested-by: Patrick Tasse <patrick.tasse@gmail.com>
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/operations/SelectTracesOperation.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/wizards/importtrace/ImportTraceWizardPage.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/wizards/importtrace/Messages.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/wizards/importtrace/TraceValidateAndImportOperation.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/wizards/importtrace/messages.properties
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/project/model/TmfExperimentFolder.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/project/model/TmfTraceFolder.java

index 8d1e34bbd448f5dd820aa50eeec08207d80ab4c2..c4c63ff0fabc157582ecfac451bb86e64753be60 100644 (file)
@@ -12,10 +12,13 @@ import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
@@ -28,7 +31,9 @@ import org.eclipse.jface.operation.ModalContext;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.tracecompass.internal.tmf.ui.Activator;
 import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentElement;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentFolder;
 import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceFolder;
 
 /**
  * Operation to add traces to an experiment.
@@ -38,10 +43,28 @@ import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement;
 public class SelectTracesOperation implements IRunnableWithProgress {
 
     private final @Nullable TmfExperimentElement fExperimentElement;
-    private final @NonNull List<TmfTraceElement> fTraceElements;
-    private final @NonNull Map<String, TmfTraceElement> fPreviousTraces;
+    private final @Nullable TmfTraceFolder fParentTraceFolder;
+    private final @Nullable List<TmfTraceElement> fTraceElements;
+    private final @Nullable List<IResource> fResources;
+    private final @Nullable Map<String, TmfTraceElement> fPreviousTraces;
     private @NonNull IStatus fStatus = checkNotNull(Status.OK_STATUS);
 
+    /**
+     * Constructor
+     *
+     * @param experimentFolderElement
+     *              workspace experiment folder containing the experiment
+     * @param experiment
+     *              experiment folder where to add traces
+     * @param parentTraceFolder
+     *              the parent trace folder containing the trace resources
+     * @param resources
+     *              the trace resources to add to the experiment
+     */
+    public SelectTracesOperation(@NonNull TmfExperimentFolder experimentFolderElement, @NonNull IFolder experiment, @NonNull TmfTraceFolder parentTraceFolder, @NonNull List<IResource> resources) {
+        this(experimentFolderElement.getExperiment(experiment), parentTraceFolder, null, resources, null);
+    }
+
     /**
      * Constructor. It will add traces to given experiment and remove traces
      * that don't exist anymore.
@@ -54,9 +77,20 @@ public class SelectTracesOperation implements IRunnableWithProgress {
      *              map of traces currently available in the experiment
      */
     public SelectTracesOperation(@NonNull TmfExperimentElement experimentElement, @NonNull TmfTraceElement[] traces, @NonNull Map<String, TmfTraceElement> previousTraces) {
+        this(experimentElement, null, traces, null, previousTraces);
+    }
+
+    // Full constructor for internal use only
+    private SelectTracesOperation(TmfExperimentElement experimentElement, TmfTraceFolder parentTraceFolder, TmfTraceElement[] traces, List<IResource> resources, Map<String, TmfTraceElement> previousTraces) {
         fExperimentElement = experimentElement;
-        fTraceElements = new ArrayList<>();
-        fTraceElements.addAll(Arrays.asList(traces));
+        fParentTraceFolder = parentTraceFolder;
+        if (traces == null) {
+            fTraceElements = null;
+        } else {
+            fTraceElements = new ArrayList<>();
+            fTraceElements.addAll(Arrays.asList(traces));
+        }
+        fResources = resources;
         fPreviousTraces = previousTraces;
     }
 
@@ -70,10 +104,21 @@ public class SelectTracesOperation implements IRunnableWithProgress {
         // Check if operation was cancelled.
         boolean changed = false;
 
+        Map<String, TmfTraceElement> previousTraces = new HashMap<>();
+        if (fPreviousTraces != null) {
+            previousTraces = fPreviousTraces;
+        }
 
         List<TmfTraceElement> elements = fTraceElements;
+        if (elements == null) {
+            if ((fParentTraceFolder != null) && (fResources != null)) {
+                elements = fParentTraceFolder.getTraceElements(fResources);
+            } else {
+                return;
+            }
+        }
 
-        Set<String> keys = fPreviousTraces.keySet();
+        Set<String> keys = previousTraces.keySet();
         SubMonitor subMonitor = SubMonitor.convert(progressMonitor, elements.size() + keys.size());
         // Add the selected traces to the experiment
         try {
@@ -92,7 +137,7 @@ public class SelectTracesOperation implements IRunnableWithProgress {
             }
 
             // Remove traces that were unchecked (thus left in fPreviousTraces)
-            for (Map.Entry<String, TmfTraceElement> entry : fPreviousTraces.entrySet()) {
+            for (Map.Entry<String, TmfTraceElement> entry : previousTraces.entrySet()) {
                 ModalContext.checkCanceled(progressMonitor);
                 TmfTraceElement trace = entry.getValue();
                 subMonitor.setTaskName(Messages.SelectTracesWizardPage_TraceRemovalTask + " " + trace.getElementPath()); //$NON-NLS-1$
index 248ea781482d354d8aacd679c03a9231d2792999..44bd425df655cb8e95c6f2bb969b70a561be08cc 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 Ericsson and others.
+ * Copyright (c) 2009, 2016 Ericsson and others.
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -23,6 +23,7 @@ package org.eclipse.tracecompass.internal.tmf.ui.project.wizards.importtrace;
 
 import java.io.File;
 import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
@@ -30,6 +31,8 @@ import java.util.List;
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
@@ -47,6 +50,7 @@ import org.eclipse.jface.viewers.CheckStateChangedEvent;
 import org.eclipse.jface.viewers.ICheckStateListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.BusyIndicator;
 import org.eclipse.swt.events.FocusAdapter;
@@ -67,11 +71,16 @@ import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.FileDialog;
 import org.eclipse.swt.widgets.Group;
 import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
 import org.eclipse.tracecompass.internal.tmf.ui.Activator;
+import org.eclipse.tracecompass.internal.tmf.ui.project.operations.NewExperimentOperation;
+import org.eclipse.tracecompass.internal.tmf.ui.project.operations.SelectTracesOperation;
 import org.eclipse.tracecompass.tmf.core.TmfCommonConstants;
 import org.eclipse.tracecompass.tmf.core.TmfProjectNature;
 import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType;
 import org.eclipse.tracecompass.tmf.core.util.Pair;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentElement;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentFolder;
 import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectElement;
 import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectRegistry;
 import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceFolder;
@@ -108,11 +117,12 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
     // Constants
     // ------------------------------------------------------------------------
     private static final String IMPORT_WIZARD_PAGE_NAME = "ImportTraceWizardPage"; //$NON-NLS-1$
-    private static final String IMPORT_WIZARD_ROOT_DIRECTORY_ID = ".import_root_directory_id"; //$NON-NLS-1$;
+    private static final String IMPORT_WIZARD_ROOT_DIRECTORY_ID = ".import_root_directory_id"; //$NON-NLS-1$ ;
     private static final String IMPORT_WIZARD_ARCHIVE_FILE_NAME_ID = ".import_archive_file_name_id"; //$NON-NLS-1$
     private static final String IMPORT_WIZARD_IMPORT_UNRECOGNIZED_ID = ".import_unrecognized_traces_id"; //$NON-NLS-1$
     private static final String IMPORT_WIZARD_PRESERVE_FOLDERS_ID = ".import_preserve_folders_id"; //$NON-NLS-1$
     private static final String IMPORT_WIZARD_IMPORT_FROM_DIRECTORY_ID = ".import_from_directory"; //$NON-NLS-1$
+    private static final String IMPORT_WIZARD_CREATE_EXPERIMENT_ID = ".create_experiment"; //$NON-NLS-1$
 
     // constant from WizardArchiveFileResourceImportPage1
     private static final String[] FILE_IMPORT_MASK = { "*.jar;*.zip;*.tar;*.tar.gz;*.tgz;*.gz", "*.*" }; //$NON-NLS-1$ //$NON-NLS-2$
@@ -140,6 +150,10 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
      * Overwrite existing resources without prompting.
      */
     public static final int OPTION_OVERWRITE_EXISTING_RESOURCES = 1 << 4;
+    /**
+     * Create an experiment with imported traces.
+     */
+    public static final int OPTION_CREATE_EXPERIMENT = 1 << 5;
 
     // ------------------------------------------------------------------------
     // Attributes
@@ -149,6 +163,9 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
     private IFolder fTargetFolder;
     // Target Trace folder element
     private TmfTraceFolder fTraceFolderElement;
+    // The workspace experiment folder
+    private TmfExperimentFolder fExperimentFolderElement;
+    private  String fPreviousSource;
     // Flag to handle destination folder change event
     private Boolean fIsDestinationChanged = false;
     private final Object fSyncObject = new Object();
@@ -162,6 +179,10 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
     private Button fCreateLinksInWorkspaceButton;
     // Button to preserve folder structure
     private Button fPreserveFolderStructureButton;
+    // Button to create an experiment
+    private Button fCreateExperimentCheckbox;
+    // Text box for experiment name
+    private Text fExperimentNameText;
     private boolean entryChanged = false;
     // The import from directory radio button
     private Button fImportFromDirectoryRadio;
@@ -238,6 +259,9 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
             String path = traceFolder.getFullPath().toString();
             setContainerFieldValue(path);
         }
+
+        TmfProjectElement project = fTraceFolderElement.getProject();
+        fExperimentFolderElement = project.getExperimentsFolder();
     }
 
     /**
@@ -260,7 +284,7 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
 
         // Just create with a dummy root.
         fSelectionGroup = new ResourceTreeAndListGroup(parent,
-                new FileSystemElement("Dummy", null, true),//$NON-NLS-1$
+                new FileSystemElement("Dummy", null, true), //$NON-NLS-1$
                 getFolderProvider(), new WorkbenchLabelProvider(),
                 getFileProvider(), new WorkbenchLabelProvider(), SWT.NONE,
                 DialogUtil.inRegularFontMode(parent));
@@ -354,8 +378,7 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
 
         // import from directory radio button
         fImportFromDirectoryRadio = new Button(sourceGroup, SWT.RADIO);
-        fImportFromDirectoryRadio
-                .setText(Messages.ImportTraceWizard_DirectoryLocation);
+        fImportFromDirectoryRadio.setText(Messages.ImportTraceWizard_DirectoryLocation);
 
         // import location entry combo
         directoryNameField = createPathSelectionCombo(sourceGroup);
@@ -363,8 +386,7 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
 
         // import from archive radio button
         fImportFromArchiveRadio = new Button(sourceGroup, SWT.RADIO);
-        fImportFromArchiveRadio
-                .setText(Messages.ImportTraceWizard_ArchiveLocation);
+        fImportFromArchiveRadio.setText(Messages.ImportTraceWizard_ArchiveLocation);
 
         // import location entry combo
         fArchiveNameField = createPathSelectionCombo(sourceGroup);
@@ -736,11 +758,23 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
     // File Selection Group (forked WizardFileSystemResourceImportPage1)
     // ------------------------------------------------------------------------
     private void resetSelection() {
+
         if (fSelectionGroupRoot != null) {
             disposeSelectionGroupRoot();
         }
         fSelectionGroupRoot = getFileSystemTree();
         fSelectionGroup.setRoot(fSelectionGroupRoot);
+
+        if (fCreateExperimentCheckbox != null) {
+            File file = getSourceFile();
+            if (file != null) {
+                String previousName = fExperimentNameText.getText().trim();
+                if (((fPreviousSource != null) && (previousName.equals(fPreviousSource))) || previousName.isEmpty()) {
+                    fExperimentNameText.setText(file.getName());
+                }
+                fPreviousSource = file.getName();
+            }
+        }
     }
 
     private void disposeSelectionGroupRoot() {
@@ -850,6 +884,43 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
         fPreserveFolderStructureButton.setText(Messages.ImportTraceWizard_PreserveFolderStructure);
         fPreserveFolderStructureButton.setSelection(true);
 
+        Composite comp = new Composite(optionsGroup, SWT.NONE);
+        GridLayout layout = new GridLayout(2, false);
+        layout.marginLeft = 0;
+        layout.marginRight = 0;
+        layout.marginBottom = 0;
+        layout.marginTop = 0;
+        layout.marginWidth = 0;
+        comp.setLayout(layout);
+        GridData data = new GridData(GridData.FILL, GridData.CENTER, true, false);
+        comp.setLayoutData(data);
+
+        fCreateExperimentCheckbox = new Button(comp, SWT.CHECK);
+        fCreateExperimentCheckbox.setFont(comp.getFont());
+        fCreateExperimentCheckbox.setText(Messages.ImportTraceWizard_CreateExperiment);
+        fCreateExperimentCheckbox.setSelection(false);
+        data = new GridData(GridData.BEGINNING, GridData.CENTER, false, false);
+        fCreateExperimentCheckbox.setLayoutData(data);
+
+        fExperimentNameText = new Text(comp, SWT.BORDER);
+        data = new GridData(GridData.FILL, GridData.CENTER, true, false);
+        fExperimentNameText.setLayoutData(data);
+
+        fExperimentNameText.addModifyListener(new ModifyListener() {
+            @Override
+            public void modifyText(ModifyEvent e) {
+                updateWidgetEnablements();
+            }
+        });
+
+        fCreateExperimentCheckbox.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                fExperimentNameText.setEnabled(fCreateExperimentCheckbox.getSelection());
+                updateWidgetEnablements();
+            }
+        });
+
         updateWidgetEnablements();
     }
 
@@ -872,7 +943,8 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
             return false;
         }
 
-        if (!isImportFromDirectory() && !ArchiveUtil.ensureTarSourceIsValid(source.getAbsolutePath(), getContainer().getShell()) && !ArchiveUtil.ensureZipSourceIsValid(source.getAbsolutePath(), getContainer().getShell()) && !ArchiveUtil.ensureGzipSourceIsValid(source.getAbsolutePath())) {
+        if (!isImportFromDirectory() && !ArchiveUtil.ensureTarSourceIsValid(source.getAbsolutePath(), getContainer().getShell()) && !ArchiveUtil.ensureZipSourceIsValid(source.getAbsolutePath(), getContainer().getShell())
+                && !ArchiveUtil.ensureGzipSourceIsValid(source.getAbsolutePath())) {
             setMessage(null);
             setErrorMessage(Messages.ImportTraceWizard_BadArchiveFormat);
             return false;
@@ -897,7 +969,44 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
                 return false;
             }
         }
+        setErrorMessage(null);
+        return true;
+    }
 
+    @Override
+    protected boolean validateOptionsGroup() {
+        if (fCreateExperimentCheckbox != null && fCreateExperimentCheckbox.getSelection()) {
+            String name = fExperimentNameText.getText().trim();
+            // verify if experiment name is empty
+            if (name.isEmpty()) {
+                setMessage(null);
+                setErrorMessage(Messages.ImportTraceWizard_ErrorEmptyExperimentName);
+                return false;
+            }
+            // verify that name is a valid resource name
+            IWorkspace workspace = ResourcesPlugin.getWorkspace();
+            if ((workspace != null) && (!workspace.validateName(name, IResource.FILE).isOK())) {
+                setMessage(null);
+                setErrorMessage(NLS.bind(Messages.ImportTraceWizard_ErrorExperimentNameInvalid, name));
+                return false;
+            }
+            // verify if experiment already exists
+            if (fExperimentFolderElement != null) {
+                TmfExperimentElement element = fExperimentFolderElement.getExperiment(name);
+                if (element != null) {
+                    setMessage(null);
+                    setErrorMessage(NLS.bind(Messages.ImportTraceWizard_ErrorExperimentAlreadyExists, name));
+                    return false;
+                }
+                IFolder expResource = fExperimentFolderElement.getResource();
+                IResource res = expResource.findMember(name);
+                if (res != null) {
+                    setMessage(null);
+                    setErrorMessage(NLS.bind(Messages.ImportTraceWizard_ErrorResourceAlreadyExists, name));
+                    return false;
+                }
+            }
+        }
         setErrorMessage(null);
         return true;
     }
@@ -934,6 +1043,16 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
             fPreserveFolderStructureButton.setSelection(value);
         }
 
+        if (fCreateExperimentCheckbox != null) {
+            if (settings.get(getPageStoreKey(IMPORT_WIZARD_CREATE_EXPERIMENT_ID)) == null) {
+                value = false;
+            } else {
+                value = settings.getBoolean(getPageStoreKey(IMPORT_WIZARD_CREATE_EXPERIMENT_ID));
+            }
+            fCreateExperimentCheckbox.setSelection(value);
+            fExperimentNameText.setEnabled(fCreateExperimentCheckbox.getSelection());
+        }
+
         if (settings.get(getPageStoreKey(IMPORT_WIZARD_IMPORT_FROM_DIRECTORY_ID)) == null) {
             value = true;
         } else {
@@ -971,6 +1090,11 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
         if (fPreserveFolderStructureButton != null) {
             settings.put(getPageStoreKey(IMPORT_WIZARD_PRESERVE_FOLDERS_ID), fPreserveFolderStructureButton.getSelection());
         }
+
+        if (fCreateExperimentCheckbox != null) {
+            settings.put(getPageStoreKey(IMPORT_WIZARD_CREATE_EXPERIMENT_ID), fCreateExperimentCheckbox.getSelection());
+        }
+
         settings.put(getPageStoreKey(IMPORT_WIZARD_IMPORT_FROM_DIRECTORY_ID), isImportFromDirectory());
 
         if (directoryNameField != null) {
@@ -1031,6 +1155,7 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
 
         final IStatus[] operationStatus = new IStatus[1];
         operationStatus[0] = Status.OK_STATUS;
+        final List<IResource> traceResources = new ArrayList<>();
         try {
             getContainer().run(true, true, new IRunnableWithProgress() {
                 @Override
@@ -1062,9 +1187,53 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
                     operation.run(monitor);
                     monitor.done();
                     operationStatus[0] = operation.getStatus();
+                    traceResources.addAll(operation.getImportedResources());
                 }
             });
 
+            // Only create experiment when option is selected and
+            // if there has been at least one trace imported
+            if (((importOptionFlags & OPTION_CREATE_EXPERIMENT) != 0) && (traceResources.size() > 0)) {
+                final IFolder[] experimentFolders = new IFolder[1];
+                final TmfExperimentFolder root = fExperimentFolderElement;
+                final String experimentName = fExperimentNameText.getText().trim();
+                // just safety guards
+                if ((root == null) || (experimentName == null)) {
+                    return true;
+                }
+                if ((operationStatus[0] != null) && (operationStatus[0].isOK())) {
+                    getContainer().run(true, true, new IRunnableWithProgress() {
+                        @Override
+                        public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+                            operationStatus[0] = null;
+                            final NewExperimentOperation operation = new NewExperimentOperation(root, experimentName);
+                            operation.run(monitor);
+                            monitor.done();
+                            operationStatus[0] = operation.getStatus();
+                            experimentFolders[0] = operation.getExperimentFolder();
+                        }
+                    });
+
+                    final IFolder expFolder = experimentFolders[0];
+                    final TmfTraceFolder parentTraceFolder = fTraceFolderElement;
+                    // just safety guards
+                    if ((expFolder == null) || (parentTraceFolder == null)) {
+                        return true;
+                    }
+                    if ((operationStatus[0] != null) && (operationStatus[0].isOK())) {
+                        getContainer().run(true, true, new IRunnableWithProgress() {
+                            @Override
+                            public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+                                operationStatus[0] = null;
+                                final SelectTracesOperation operation = new SelectTracesOperation(root, expFolder, parentTraceFolder, traceResources);
+                                operation.run(monitor);
+                                monitor.done();
+                                operationStatus[0] = operation.getStatus();
+                            }
+                        });
+                    }
+                }
+            }
         } catch (InvocationTargetException e) {
             operationStatus[0] = new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.ImportTraceWizard_ImportProblem, e.getTargetException());
         } catch (InterruptedException e) {
@@ -1109,6 +1278,7 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
      * @see #OPTION_IMPORT_UNRECOGNIZED_TRACES
      * @see #OPTION_OVERWRITE_EXISTING_RESOURCES
      * @see #OPTION_PRESERVE_FOLDER_STRUCTURE
+     * @see #OPTION_CREATE_EXPERIMENT
      */
     protected int getImportOptionFlags() {
         int flags = 0;
@@ -1124,6 +1294,9 @@ public class ImportTraceWizardPage extends WizardResourceImportPage {
         if (fPreserveFolderStructureButton != null && fPreserveFolderStructureButton.getSelection()) {
             flags |= OPTION_PRESERVE_FOLDER_STRUCTURE;
         }
+        if (fCreateExperimentCheckbox != null && fCreateExperimentCheckbox.getSelection()) {
+            flags |= OPTION_CREATE_EXPERIMENT;
+        }
         return flags;
     }
 
index 3973b0b041a8494e33e8bc2f8ccfa9264e794db8..8e1995ef8ddf0c9fc4f46a79e7d70f3072dadc39 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2013, 2015 Ericsson
+ * Copyright (c) 2013, 2016 Ericsson
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -71,6 +71,10 @@ public class Messages extends NLS {
      * The label of the checkbox to preserve the folder structure of selected the traces in workspace (import trace wizard)
      */
     public static String ImportTraceWizard_PreserveFolderStructure;
+    /**
+     * The label of the checkbox to create an experiment after importing traces (import trace wizard)
+     */
+    public static String ImportTraceWizard_CreateExperiment;
     /**
      * The error message for invalid trace directory (import trace wizard)
      */
@@ -123,6 +127,22 @@ public class Messages extends NLS {
      * The error message when an error occurred during import operation.
      */
     public static String ImportTraceWizard_ImportProblem;
+    /**
+     * The error message when an experiment already exists
+     */
+    public static String ImportTraceWizard_ErrorExperimentAlreadyExists;
+    /**
+     * The error message when a resource in experiment folder already exists
+     */
+    public static String ImportTraceWizard_ErrorResourceAlreadyExists;
+    /**
+     * The error message when an experiment name is invalid
+     */
+    public static String ImportTraceWizard_ErrorExperimentNameInvalid;
+    /**
+     * The error message when no experiment name was entered
+     */
+    public static String ImportTraceWizard_ErrorEmptyExperimentName;
     /**
      * The error message if destination directory is a virtual folder.
      */
index b8c31b34114ce9f2d2ab08f780778c0e6700225c..b4d1bf7520f08df3bdf23e78f9a82d6e57572767 100644 (file)
@@ -227,7 +227,10 @@ public class TraceValidateAndImportOperation implements IRunnableWithProgress {
      * example use case would be to use this to open traces that were imported
      * by this operation.
      *
-     * @return the resources that were imported
+     * Note this includes only valid traces and doesn'tinclude unrecognized
+     * files.
+     *
+     * @return the trace resources that were imported
      */
     public List<IResource> getImportedResources() {
         return fImportedResources;
index 567db849e6d85b76134dd3a703346fa549939b41..a1af39e147255e0c54889531cd188e7c8c44021f 100644 (file)
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2013, 2014 Ericsson
+# Copyright (c) 2013, 2016 Ericsson
 #
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
@@ -24,6 +24,7 @@ ImportTraceWizard_SelectTraceDirectoryMessage=Select directory to import trace f
 ImportTraceWizard_OverwriteExistingTrace=Overwrite existing trace without warning
 ImportTraceWizard_CreateLinksInWorkspace=Create lin&ks in workspace
 ImportTraceWizard_PreserveFolderStructure=Preserve &folder structure
+ImportTraceWizard_CreateExperiment=Create experiment
 ImportTraceWizard_TraceValidationFailed=Validation failed for trace resource {0}
 ImportTraceWizard_TraceAlreadyExists=Trace with name "{0}" already exists in project. Do you want to rename, overwrite or skip?
 ImportTraceWizard_ImportConfigurationRename=Rename
@@ -37,6 +38,10 @@ ImportTraceWizard_SelectTraceSourceEmpty=Source must not be empty
 ImportTraceWizard_BadArchiveFormat=Source file is not a valid tar or zip file.
 ImportTraceWizard_SelectTraceNoneSelected=No trace selected
 ImportTraceWizard_ImportProblem=Import problem
+ImportTraceWizard_ErrorExperimentAlreadyExists=Experiment "{0}" already exists
+ImportTraceWizard_ErrorResourceAlreadyExists=Resource with same name as experiment "{0}" already exists
+ImportTraceWizard_ErrorExperimentNameInvalid=Experiment name "{0}" is not a valid resource name
+ImportTraceWizard_ErrorEmptyExperimentName=No experiment name provided
 ImportTraceWizard_CannotImportFilesUnderAVirtualFolder=Can not import trace under a virtual folder
 ImportTraceWizard_HaveToCreateLinksUnderAVirtualFolder=Have to create link under a virtual folder
 ImportTraceWizard_Information=Information
index d04f7d275f3f178b1e7d15fcd0c85103fe2bc0dc..6f28bf0de08db91520991fb3fd302da549c1af8e 100644 (file)
@@ -22,6 +22,8 @@ import java.util.Map;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.tracecompass.tmf.ui.properties.ReadOnlyTextPropertyDescriptor;
 import org.eclipse.ui.views.properties.IPropertyDescriptor;
 import org.eclipse.ui.views.properties.IPropertySource2;
@@ -142,6 +144,40 @@ public class TmfExperimentFolder extends TmfProjectModelElement implements IProp
         return traces;
     }
 
+    /**
+     * Finds the experiment element for a given resource
+     *
+     * @param resource
+     *            the resource to search for
+     * @return the experiment element if found else null
+     * @since 2.0
+     */
+    public @Nullable TmfExperimentElement getExperiment(@NonNull IResource resource) {
+        String name = resource.getName();
+        if (name != null) {
+            return getExperiment(name);
+        }
+        return null;
+    }
+
+    /**
+     * Finds the experiment element for a given name
+     *
+     * @param name
+     *            the name of experiment to search for
+     * @return the experiment element if found else null
+     * @since 2.0
+     */
+    public @Nullable TmfExperimentElement getExperiment(@NonNull String name) {
+        return getExperiments()
+        .stream()
+        .filter(experiment ->
+            (experiment != null)
+            && (experiment.getName().equals(name)))
+        .findFirst()
+        .orElse(null);
+    }
+
     // ------------------------------------------------------------------------
     // IPropertySource2
     // ------------------------------------------------------------------------
index 4a5dc45e5b141c88a4f682a2b4c7b7b8a508a6f7..e326c0ad363b4ab7c1d470b5ffeae8329bb0ad66 100644 (file)
@@ -22,6 +22,7 @@ import java.util.Map;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType;
 import org.eclipse.tracecompass.tmf.ui.properties.ReadOnlyTextPropertyDescriptor;
 import org.eclipse.ui.views.properties.IPropertyDescriptor;
@@ -157,6 +158,32 @@ public class TmfTraceFolder extends TmfProjectModelElement implements IPropertyS
         return traces;
     }
 
+    /**
+     * Gets the traces elements under this folder containing the given resources
+     *
+     * @param resources
+     *            resources to search for
+     * @return list of trace elements
+     * @since 2.0
+     */
+    public @NonNull List<TmfTraceElement> getTraceElements(@NonNull List<IResource> resources) {
+        List<TmfTraceElement> traceElements = new ArrayList<>();
+        List<TmfTraceElement> children = getTraces();
+        for (IResource resource : resources) {
+            TmfTraceElement el = children.stream()
+                    .filter(traceElement ->
+                    ((traceElement != null) &&
+                    traceElement.getResource().equals(resource)))
+                .findFirst()
+                .orElse(null);
+
+            if (el != null) {
+                traceElements.add(el);
+            }
+        }
+        return traceElements;
+    }
+
     // ------------------------------------------------------------------------
     // IPropertySource2
     // ------------------------------------------------------------------------
This page took 0.036085 seconds and 5 git commands to generate.