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;
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.
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.
* 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;
}
// 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 {
}
// 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$
/*******************************************************************************
- * 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
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;
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;
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;
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;
// 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$
* 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
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();
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;
String path = traceFolder.getFullPath().toString();
setContainerFieldValue(path);
}
+
+ TmfProjectElement project = fTraceFolderElement.getProject();
+ fExperimentFolderElement = project.getExperimentsFolder();
}
/**
// 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));
// 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);
// 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);
// 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() {
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();
}
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;
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;
}
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 {
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) {
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
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) {
* @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;
if (fPreserveFolderStructureButton != null && fPreserveFolderStructureButton.getSelection()) {
flags |= OPTION_PRESERVE_FOLDER_STRUCTURE;
}
+ if (fCreateExperimentCheckbox != null && fCreateExperimentCheckbox.getSelection()) {
+ flags |= OPTION_CREATE_EXPERIMENT;
+ }
return flags;
}