Use threads in open experiment/trace for long init operations
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / internal / tmf / ui / project / handlers / OpenExperimentHandler.java
index 3c1c4ef36c303dddd440aa9d332140e3d73b18d9..dc8740f406169fdc36495dc6d365d3e1616109c7 100644 (file)
@@ -25,6 +25,7 @@ import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.linuxtools.internal.tmf.ui.Activator;
 import org.eclipse.linuxtools.tmf.core.TmfCommonConstants;
 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
 import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;
@@ -34,6 +35,7 @@ import org.eclipse.linuxtools.tmf.ui.editors.TmfEditorInput;
 import org.eclipse.linuxtools.tmf.ui.editors.TmfEventsEditor;
 import org.eclipse.linuxtools.tmf.ui.project.model.TmfExperimentElement;
 import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceElement;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.MessageBox;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorPart;
@@ -97,7 +99,6 @@ public class OpenExperimentHandler extends AbstractHandler {
     // Execution
     // ------------------------------------------------------------------------
 
-    @SuppressWarnings({ "rawtypes", "unchecked" })
     @Override
     public Object execute(final ExecutionEvent event) throws ExecutionException {
 
@@ -107,88 +108,128 @@ public class OpenExperimentHandler extends AbstractHandler {
             return false;
         }
 
-        try {
-            final IFile bookmarksFile = fExperiment.getProject().getExperimentsFolder().getResource().getFile(BOOKMARKS_HIDDEN_FILE);
-            if (!bookmarksFile.exists()) {
-                final InputStream source = new ByteArrayInputStream(new byte[0]);
-                bookmarksFile.create(source, true, null);
-            }
-            bookmarksFile.setHidden(true);
+        final TmfExperimentElement experimentElement = fExperiment;
+
+        Thread thread = new Thread() {
+            @Override
+            public void run() {
+
+                final IFile file;
 
-            final IFile file = fExperiment.getResource().getFile(fExperiment.getName() + '_');
-            if (!file.exists()) {
-                file.createLink(bookmarksFile.getLocation(), IResource.REPLACE, null);
-            }
-            file.setHidden(true);
-            file.setPersistentProperty(TmfCommonConstants.TRACETYPE, TmfExperiment.class.getCanonicalName());
-
-            // Instantiate the experiment's traces
-            final List<TmfTraceElement> traceEntries = fExperiment.getTraces();
-            final int nbTraces = traceEntries.size();
-            int cacheSize = Integer.MAX_VALUE;
-            String commonEditorId = null;
-            final ITmfTrace[] traces = new ITmfTrace[nbTraces];
-            for (int i = 0; i < nbTraces; i++) {
-                TmfTraceElement element = traceEntries.get(i);
-
-                // Since trace is under an experiment, use the original trace from the traces folder
-                element = element.getElementUnderTraceFolder();
-
-                final ITmfTrace trace = element.instantiateTrace();
-                final ITmfEvent traceEvent = element.instantiateEvent();
-                if ((trace == null) || (traceEvent == null)) {
-                    displayErrorMsg(Messages.OpenExperimentHandler_NoTraceType);
-                    for (int j = 0; j < i; j++) {
-                        traces[j].dispose();
-                    }
-                    return null;
-                }
                 try {
-                    trace.initTrace(element.getResource(), element.getLocation().getPath(), traceEvent.getClass());
-                } catch (final TmfTraceException e) {
-                    displayErrorMsg(""); //$NON-NLS-1$
-                }
-                cacheSize = Math.min(cacheSize, trace.getCacheSize());
-
-                // If all traces use the same editorId, use it, otherwise use the default
-                final String editorId = element.getEditorId();
-                if (commonEditorId == null) {
-                    commonEditorId = (editorId != null) ? editorId : TmfEventsEditor.ID;
-                } else if (!commonEditorId.equals(editorId)) {
-                    commonEditorId = TmfEventsEditor.ID;
-                }
-                traces[i] = trace;
-            }
+                    final IFile bookmarksFile = experimentElement.getProject().getExperimentsFolder().getResource().getFile(BOOKMARKS_HIDDEN_FILE);
+                    if (!bookmarksFile.exists()) {
+                        final InputStream source = new ByteArrayInputStream(new byte[0]);
+                        bookmarksFile.create(source, true, null);
+                    }
+                    bookmarksFile.setHidden(true);
+
+                    file = experimentElement.getResource().getFile(experimentElement.getName() + '_');
+                    if (!file.exists()) {
+                        file.createLink(bookmarksFile.getLocation(), IResource.REPLACE, null);
+                    }
+                    file.setHidden(true);
+                    file.setPersistentProperty(TmfCommonConstants.TRACETYPE, TmfExperiment.class.getCanonicalName());
 
-            // Create the experiment
-            TmfExperiment experiment = new TmfExperiment(ITmfEvent.class, fExperiment.getName(), traces, cacheSize);
-            experiment.setBookmarksFile(file);
+                } catch (final CoreException e) {
+                    Activator.getDefault().logError("Error opening experiment " + experimentElement.getName(), e); //$NON-NLS-1$
+                    displayErrorMsg(Messages.OpenExperimentHandler_Error + "\n\n" + e.getMessage()); //$NON-NLS-1$
+                    return;
+                }
 
-            final IEditorInput editorInput = new TmfEditorInput(file, experiment);
-            final IWorkbench wb = PlatformUI.getWorkbench();
-            final IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();
+                // Instantiate the experiment's traces
+                final List<TmfTraceElement> traceEntries = experimentElement.getTraces();
+                final int nbTraces = traceEntries.size();
+                int cacheSize = Integer.MAX_VALUE;
+                String commonEditorId = null;
+                final ITmfTrace[] traces = new ITmfTrace[nbTraces];
+                for (int i = 0; i < nbTraces; i++) {
+                    TmfTraceElement element = traceEntries.get(i);
+
+                    // Since trace is under an experiment, use the original trace from the traces folder
+                    element = element.getElementUnderTraceFolder();
+
+                    final ITmfTrace trace = element.instantiateTrace();
+                    final ITmfEvent traceEvent = element.instantiateEvent();
+                    if ((trace == null) || (traceEvent == null)) {
+                        displayErrorMsg(Messages.OpenExperimentHandler_NoTraceType);
+                        for (int j = 0; j < i; j++) {
+                            traces[j].dispose();
+                        }
+                        if (trace != null) {
+                            trace.dispose();
+                        }
+                        return;
+                    }
+                    try {
+                        trace.initTrace(element.getResource(), element.getLocation().getPath(), traceEvent.getClass());
+                    } catch (final TmfTraceException e) {
+                        displayErrorMsg(Messages.OpenTraceHandler_InitError + "\n\n" + e); //$NON-NLS-1$
+                        for (int j = 0; j < i; j++) {
+                            traces[j].dispose();
+                        }
+                        trace.dispose();
+                        return;
+                    }
+                    cacheSize = Math.min(cacheSize, trace.getCacheSize());
+
+                    // If all traces use the same editorId, use it, otherwise use the default
+                    final String editorId = element.getEditorId();
+                    if (commonEditorId == null) {
+                        commonEditorId = (editorId != null) ? editorId : TmfEventsEditor.ID;
+                    } else if (!commonEditorId.equals(editorId)) {
+                        commonEditorId = TmfEventsEditor.ID;
+                    }
+                    traces[i] = trace;
+                }
 
-            final IEditorPart editor = activePage.findEditor(new FileEditorInput(file));
-            if ((editor != null) && (editor instanceof IReusableEditor)) {
-                activePage.reuseEditor((IReusableEditor) editor, editorInput);
-                activePage.activate(editor);
-            } else {
-                activePage.openEditor(editorInput, commonEditorId);
+                // Create the experiment
+                final TmfExperiment experiment = new TmfExperiment(ITmfEvent.class, experimentElement.getName(), traces, cacheSize);
+                experiment.setBookmarksFile(file);
+
+                final String finalCommonEditorId = commonEditorId;
+                Display.getDefault().asyncExec(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            final IEditorInput editorInput = new TmfEditorInput(file, experiment);
+                            final IWorkbench wb = PlatformUI.getWorkbench();
+                            final IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();
+
+                            final IEditorPart editor = activePage.findEditor(new FileEditorInput(file));
+                            if ((editor != null) && (editor instanceof IReusableEditor)) {
+                                activePage.reuseEditor((IReusableEditor) editor, editorInput);
+                                activePage.activate(editor);
+                            } else {
+                                activePage.openEditor(editorInput, finalCommonEditorId);
+                            }
+                            IDE.setDefaultEditor(file, finalCommonEditorId);
+                            // editor should dispose the experiment on close
+                        } catch (final CoreException e) {
+                            Activator.getDefault().logError("Error opening experiment " + experimentElement.getName(), e); //$NON-NLS-1$
+                            displayErrorMsg(Messages.OpenExperimentHandler_Error + "\n\n" + e.getMessage()); //$NON-NLS-1$
+                            experiment.dispose();
+                            return;
+                        }
+                    }
+                });
             }
-            IDE.setDefaultEditor(file, commonEditorId);
-            // editor should dispose the experiment on close
-        } catch (final CoreException e) {
-            displayErrorMsg(e.getMessage());
-        }
+        };
+
+        thread.start();
 
         return null;
     }
 
     private static void displayErrorMsg(final String errorMsg) {
-        final MessageBox mb = new MessageBox(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
-        mb.setText(Messages.OpenExperimentHandler_Title);
-        mb.setMessage(errorMsg);
-        mb.open();
+        Display.getDefault().asyncExec(new Runnable() {
+            @Override
+            public void run() {
+                final MessageBox mb = new MessageBox(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+                mb.setText(Messages.OpenExperimentHandler_Title);
+                mb.setMessage(errorMsg);
+                mb.open();
+            }
+        });
     }
-
 }
This page took 0.026222 seconds and 5 git commands to generate.