tmf: extract operation for creating an experiment
authorBernd Hufmann <Bernd.Hufmann@ericsson.com>
Fri, 19 Feb 2016 20:46:13 +0000 (15:46 -0500)
committerBernd Hufmann <bernd.hufmann@ericsson.com>
Fri, 26 Feb 2016 01:48:43 +0000 (20:48 -0500)
This operation can be reused later on.

Change-Id: Ife31591f94656195837e4b788b0b99d16ac77ebf
Signed-off-by: Bernd Hufmann <Bernd.Hufmann@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/67167
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/Messages.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/operations/NewExperimentOperation.java [new file with mode: 0644]
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/operations/messages.properties
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/project/wizards/NewExperimentDialog.java

index 72501d020c18c9b4cbfb711f73b773eb7d759ce0..6e36f93a20c24a33a51325be54b2717a329c020b 100644 (file)
@@ -32,6 +32,10 @@ public class Messages extends NLS {
      * The error message when selecting of traces for an experiment fails.
      */
     public static String SelectTracesWizardPage_SelectionError;
+
+    /** The error message when an experiment could not be created */
+    public static String NewExperimentOperation_CreationError;
+
     static {
         // initialize resource bundle
         NLS.initializeMessages(BUNDLE_NAME, Messages.class);
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/operations/NewExperimentOperation.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/project/operations/NewExperimentOperation.java
new file mode 100644 (file)
index 0000000..530d8db
--- /dev/null
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 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
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.internal.tmf.ui.project.operations;
+
+import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.InvalidRegistryObjectException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.operation.ModalContext;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.tracecompass.internal.tmf.ui.Activator;
+import org.eclipse.tracecompass.tmf.core.TmfCommonConstants;
+import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentFolder;
+
+/**
+ * Operation to create a new experiment.
+ *
+ * @author Bernd Hufmann
+ *
+ */
+public class NewExperimentOperation implements IRunnableWithProgress {
+
+    private final @NonNull String fExperimentName;
+    private final @NonNull TmfExperimentFolder fExperimentFolderRoot;
+    private @Nullable IFolder fExperimentFolder = null;
+    private @NonNull IStatus fStatus = checkNotNull(Status.OK_STATUS);
+
+    /**
+     * Constructor
+     *
+     * @param experimentFolder
+     *            the experiment folder root {@link TmfExperimentFolder}
+     * @param experimentName
+     *            the name of the experiment
+     */
+    public NewExperimentOperation (@NonNull TmfExperimentFolder experimentFolder, @NonNull String experimentName) {
+        fExperimentFolderRoot = experimentFolder;
+        fExperimentName = experimentName;
+    }
+
+    @Override
+    public void run(IProgressMonitor monitor) {
+        final IFolder experimentFolder = createExperiment(fExperimentName);
+        try {
+            monitor.beginTask("", 1000); //$NON-NLS-1$
+            ModalContext.checkCanceled(monitor);
+            experimentFolder.create(false, true, monitor);
+
+            /*
+             * Experiments can be set to the default experiment type. No
+             * need to force user to select an experiment type
+             */
+            IConfigurationElement ce = TmfTraceType.getTraceAttributes(TmfTraceType.DEFAULT_EXPERIMENT_TYPE);
+            if (ce != null) {
+                experimentFolder.setPersistentProperty(TmfCommonConstants.TRACETYPE, ce.getAttribute(TmfTraceType.ID_ATTR));
+            }
+            fExperimentFolder = experimentFolder;
+            setStatus(checkNotNull(Status.OK_STATUS));
+        } catch (InterruptedException e) {
+            setStatus(checkNotNull(Status.CANCEL_STATUS));
+        } catch (InvalidRegistryObjectException | CoreException e) {
+            String msg = NLS.bind(Messages.NewExperimentOperation_CreationError, fExperimentName);
+            Activator.getDefault().logError(msg, e);
+            setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, msg, e));
+        }
+    }
+
+    /**
+     * @return the experimentFolder
+     */
+    public @Nullable IFolder getExperimentFolder() {
+        return fExperimentFolder;
+    }
+
+    private IFolder createExperiment(String experimentName) {
+        IFolder expResource = fExperimentFolderRoot.getResource();
+        IWorkspaceRoot workspaceRoot = expResource.getWorkspace().getRoot();
+        IPath folderPath = expResource.getFullPath().append(experimentName);
+        IFolder folder = workspaceRoot.getFolder(folderPath);
+        return folder;
+    }
+
+    /**
+     * Set the status for this operation
+     *
+     * @param status
+     *            the status
+     */
+    protected void setStatus(@NonNull IStatus status) {
+        fStatus = status;
+    }
+
+    /**
+     * Returns the status of the operation execution.
+     *
+     * @return status
+     */
+    public @NonNull IStatus getStatus() {
+        return fStatus;
+    }
+
+}
index 5f7128ee173c64a4aff8945352594d8858011563..240c354c7d629bb507dbe5b35534a76d04a350ea 100644 (file)
@@ -10,3 +10,5 @@
 SelectTracesWizardPage_TraceRemovalTask=Removing trace
 SelectTracesWizardPage_TraceSelectionTask=Selecting trace
 SelectTracesWizardPage_SelectionError=Error selecting traces for experiment
+
+NewExperimentOperation_CreationError=Error creating experiment {0}
index ef1d4747ba812ff0f05235d6343e5f6928966589..150a4caf7be7c3149b3108609ba2acd396f61e9d 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2014 Ericsson, École Polytechnique de Montréal
+ * Copyright (c) 2009, 2016 Ericsson, É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
@@ -19,16 +19,13 @@ import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
 import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
@@ -43,8 +40,7 @@ import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.tracecompass.internal.tmf.ui.Activator;
-import org.eclipse.tracecompass.tmf.core.TmfCommonConstants;
-import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType;
+import org.eclipse.tracecompass.internal.tmf.ui.project.operations.NewExperimentOperation;
 import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentFolder;
 import org.eclipse.tracecompass.tmf.ui.project.model.TraceUtils;
 import org.eclipse.ui.PlatformUI;
@@ -55,7 +51,6 @@ import org.eclipse.ui.dialogs.SelectionStatusDialog;
  * Implementation of new experiment dialog that creates the experiment element.
  * <p>
  *
- * @version 1.0
  * @author Francois Chouinard
  */
 public class NewExperimentDialog extends SelectionStatusDialog {
@@ -66,6 +61,7 @@ public class NewExperimentDialog extends SelectionStatusDialog {
 
     private Text fExperimentName;
     private final IContainer fExperimentFolder;
+    private final TmfExperimentFolder fExperimentFolderRoot;
 
     // ------------------------------------------------------------------------
     // Constructor
@@ -80,6 +76,7 @@ public class NewExperimentDialog extends SelectionStatusDialog {
      */
     public NewExperimentDialog(Shell shell, TmfExperimentFolder experimentFolder) {
         super(shell);
+        fExperimentFolderRoot = experimentFolder;
         fExperimentFolder = experimentFolder.getResource();
         setTitle(Messages.NewExperimentDialog_DialogTitle);
         setStatusLineAboveButtons(true);
@@ -167,7 +164,11 @@ public class NewExperimentDialog extends SelectionStatusDialog {
 
     @Override
     protected void okPressed() {
-        IFolder folder = createNewExperiment(fExperimentName.getText());
+        String experimentName = fExperimentName.getText();
+        if (experimentName == null) {
+            return;
+        }
+        IFolder folder = createNewExperiment(experimentName);
         if (folder == null) {
             return;
         }
@@ -175,37 +176,29 @@ public class NewExperimentDialog extends SelectionStatusDialog {
         super.okPressed();
     }
 
-    private IFolder createNewExperiment(String experimentName) {
-
-        final IFolder experimentFolder = createExperiment(experimentName);
-
+    private IFolder createNewExperiment(@NonNull String experimentName) {
+        final IFolder[] experimentFolders = new IFolder[1];
+        final TmfExperimentFolder root = fExperimentFolderRoot;
+        if (root == null) {
+            return null;
+        }
         WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
             @Override
-            public void execute(IProgressMonitor monitor) throws CoreException {
-                try {
-                    monitor.beginTask("", 1000); //$NON-NLS-1$
-                    if (monitor.isCanceled()) {
+            public void execute(IProgressMonitor monitor) throws InterruptedException, InvocationTargetException {
+                NewExperimentOperation createOperation = new NewExperimentOperation(root, experimentName);
+                createOperation.run(monitor);
+                IStatus status = createOperation.getStatus();
+                if (!status.isOK()) {
+                    if (status.getSeverity() == IStatus.CANCEL) {
                         throw new OperationCanceledException();
                     }
-                    experimentFolder.create(false, true, monitor);
-
-                    /*
-                     * Experiments can be set to the default experiment type. No
-                     * need to force user to select an experiment type
-                     */
-                    IConfigurationElement ce = TmfTraceType.getTraceAttributes(TmfTraceType.DEFAULT_EXPERIMENT_TYPE);
-                    if (ce != null) {
-                        try {
-                            experimentFolder.setPersistentProperty(TmfCommonConstants.TRACETYPE, ce.getAttribute(TmfTraceType.ID_ATTR));
-                        } catch (InvalidRegistryObjectException | CoreException e) {
-                        }
+                    Throwable exception = status.getException();
+                    if (exception != null) {
+                        throw new InvocationTargetException(exception);
                     }
-                    if (monitor.isCanceled()) {
-                        throw new OperationCanceledException();
-                    }
-                } finally {
-                    monitor.done();
+                    return;
                 }
+                experimentFolders[0] = createOperation.getExperimentFolder();
             }
         };
         try {
@@ -216,16 +209,7 @@ public class NewExperimentDialog extends SelectionStatusDialog {
             TraceUtils.displayErrorMsg("", NLS.bind("", exception.getTargetException().getMessage())); //$NON-NLS-1$ //$NON-NLS-2$
             return null;
         }
-
-        return experimentFolder;
-    }
-
-    private IFolder createExperiment(String experimentName) {
-        IWorkspaceRoot workspaceRoot = fExperimentFolder.getWorkspace().getRoot();
-        IPath folderPath = fExperimentFolder.getFullPath().append(experimentName);
-        IFolder folder = workspaceRoot.getFolder(folderPath);
-
-        return folder;
+        return experimentFolders[0];
     }
 
 }
This page took 0.028824 seconds and 5 git commands to generate.