control: replace ImportDialog with TMF remote fetch wizard
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.remote.ui / src / org / eclipse / tracecompass / internal / tmf / remote / ui / wizards / fetch / RemoteFetchLogWizardRemotePage.java
1 /*******************************************************************************
2 * Copyright (c) 2015 Ericsson
3 *
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
10 * Marc-Andre Laperle - Initial API and implementation
11 *******************************************************************************/
12
13 package org.eclipse.tracecompass.internal.tmf.remote.ui.wizards.fetch;
14
15 import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
16
17 import java.lang.reflect.InvocationTargetException;
18 import java.text.MessageFormat;
19 import java.util.ArrayList;
20 import java.util.HashSet;
21 import java.util.List;
22 import java.util.Set;
23
24 import org.eclipse.core.resources.IFolder;
25 import org.eclipse.core.resources.IProject;
26 import org.eclipse.core.runtime.CoreException;
27 import org.eclipse.core.runtime.IProgressMonitor;
28 import org.eclipse.core.runtime.IStatus;
29 import org.eclipse.core.runtime.Status;
30 import org.eclipse.core.runtime.SubMonitor;
31 import org.eclipse.jdt.annotation.Nullable;
32 import org.eclipse.jface.operation.IRunnableWithProgress;
33 import org.eclipse.jface.viewers.CheckboxTreeViewer;
34 import org.eclipse.jface.viewers.IStructuredSelection;
35 import org.eclipse.jface.viewers.ViewerSorter;
36 import org.eclipse.swt.SWT;
37 import org.eclipse.swt.custom.CCombo;
38 import org.eclipse.swt.events.SelectionAdapter;
39 import org.eclipse.swt.events.SelectionEvent;
40 import org.eclipse.swt.graphics.Image;
41 import org.eclipse.swt.layout.GridData;
42 import org.eclipse.swt.layout.GridLayout;
43 import org.eclipse.swt.widgets.Composite;
44 import org.eclipse.swt.widgets.Group;
45 import org.eclipse.swt.widgets.ToolBar;
46 import org.eclipse.swt.widgets.ToolItem;
47 import org.eclipse.tracecompass.internal.tmf.remote.ui.Activator;
48 import org.eclipse.tracecompass.internal.tmf.remote.ui.messages.RemoteMessages;
49 import org.eclipse.tracecompass.internal.tmf.remote.ui.wizards.fetch.model.RemoteGenerateManifestOperation;
50 import org.eclipse.tracecompass.internal.tmf.remote.ui.wizards.fetch.model.RemoteImportConnectionNodeElement;
51 import org.eclipse.tracecompass.internal.tmf.remote.ui.wizards.fetch.model.RemoteImportProfileElement;
52 import org.eclipse.tracecompass.internal.tmf.remote.ui.wizards.fetch.model.RemoteImportTracesOperation;
53 import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.tracepkg.AbstractTracePackageOperation;
54 import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.tracepkg.AbstractTracePackageWizardPage;
55 import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.tracepkg.TracePackageElement;
56 import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.tracepkg.TracePackageFilesElement;
57 import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.tracepkg.TracePackageLabelProvider;
58 import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.tracepkg.TracePackageTraceElement;
59 import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.tracepkg.importexport.Messages;
60 import org.eclipse.tracecompass.tmf.core.TmfProjectNature;
61 import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectElement;
62 import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectRegistry;
63 import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceFolder;
64 import org.eclipse.tracecompass.tmf.ui.project.model.TmfTracesFolder;
65 import org.eclipse.tracecompass.tmf.ui.project.model.TraceUtils;
66 import org.eclipse.ui.ISharedImages;
67 import org.eclipse.ui.PlatformUI;
68 import org.eclipse.ui.plugin.AbstractUIPlugin;
69
70 /**
71 * Wizard page that connects to a remote node, lists all traces according to
72 * a given remote profile and imports the selected traces.
73
74 * @author Marc-Andre Laperle
75 * @author Bernd Hufmann
76 */
77 public class RemoteFetchLogWizardRemotePage extends AbstractTracePackageWizardPage {
78
79 // ------------------------------------------------------------------------
80 // Constant(s)
81 // ------------------------------------------------------------------------
82 /* The page name */
83 private static final String PAGE_NAME = "org.eclipse.tracecompass.internal.tmf.remote.ui.wizards.fetch"; //$NON-NLS-1$
84 private static final String ICON_PATH = "icons/elcl16/fetch_log_wiz.gif"; //$NON-NLS-1$
85 private static final Image COLLAPSE_ALL_IMAGE = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_ELCL_COLLAPSEALL);
86 private static final Image EXPAND_ALL_IMAGE = Activator.getDefault().getImageFromPath("icons/elcl16/expandall.png"); //$NON-NLS-1$
87 /** Name of default project to import traces to */
88 public static final String DEFAULT_REMOTE_PROJECT_NAME = "Remote"; //$NON-NLS-1$
89
90 // ------------------------------------------------------------------------
91 // Attributes(s)
92 // ------------------------------------------------------------------------
93 private TmfTraceFolder fTmfTraceFolder;
94
95 private RemoteImportProfileElement fProfile;
96 private final Set<RemoteImportConnectionNodeElement> fRemoteHosts = new HashSet<>();
97 private boolean fOverwriteAll;
98 private boolean fIsVisible = false;
99 private String fDefaultProjectName = null;
100 private CCombo fCombo;
101 private List<IProject> fProjects;
102
103 // ------------------------------------------------------------------------
104 // Constructors
105 // ------------------------------------------------------------------------
106 /**
107 * Constructor
108 *
109 * @param title
110 * The Wizard title
111 * @param selection
112 * The current selection (trace folder element)
113 * @param profile
114 * A profile to use or null
115 */
116 protected RemoteFetchLogWizardRemotePage(String title, IStructuredSelection selection, @Nullable RemoteImportProfileElement profile) {
117 super(PAGE_NAME, title, null, selection);
118 setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, ICON_PATH));
119
120 if (selection.getFirstElement() instanceof TmfTraceFolder) {
121 fTmfTraceFolder = (TmfTraceFolder) selection.getFirstElement();
122 }
123
124 if (fTmfTraceFolder == null) {
125 // create default project
126 TmfProjectRegistry.createProject(DEFAULT_REMOTE_PROJECT_NAME, null, null);
127 fDefaultProjectName = DEFAULT_REMOTE_PROJECT_NAME;
128 }
129
130 fProfile = profile;
131 setDescription(RemoteMessages.RemoteFetchLogWizardRemotePage_Description);
132 }
133
134 // ------------------------------------------------------------------------
135 // Operations
136 // ------------------------------------------------------------------------
137 @Override
138 public void createControl(Composite parent) {
139 initializeDialogUnits(parent);
140
141 Composite composite = new Composite(parent, SWT.NULL);
142 composite.setLayout(new GridLayout());
143 composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
144 | GridData.HORIZONTAL_ALIGN_FILL));
145 composite.setFont(parent.getFont());
146
147 createToolBar(composite);
148 createElementViewer(composite);
149
150 createButtonsGroup(composite);
151
152 createProjectGroup(composite);
153
154 restoreWidgetValues();
155 updatePageCompletion();
156
157 setControl(composite);
158 }
159
160 @Override
161 protected boolean determinePageCompletion() {
162 return getElementViewer().getCheckedElements().length > 0;
163 }
164
165 @Override
166 protected void updateWithFilePathSelection() {
167 }
168
169 @Override
170 public void setVisible(final boolean visible) {
171 super.setVisible(visible);
172
173 fIsVisible = visible;
174
175 if (visible) {
176 getContainer().getShell().getDisplay().asyncExec(new Runnable() {
177 @Override
178 public void run() {
179 updateViewer();
180 }
181 });
182 } else {
183 getElementViewer().setInput(null);
184 }
185 }
186
187 private void createToolBar(Composite parent) {
188 ToolBar toolBar = new ToolBar(parent, SWT.HORIZONTAL);
189 toolBar.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
190
191 ToolItem expandAll = new ToolItem(toolBar, SWT.PUSH);
192 expandAll.setImage(EXPAND_ALL_IMAGE);
193 expandAll.setToolTipText(RemoteMessages.RemoteFetchLogWizardRemotePage_ExpandAll);
194 expandAll.addSelectionListener(new SelectionAdapter() {
195 @Override
196 public void widgetSelected(SelectionEvent e) {
197 getElementViewer().expandAll();
198 }
199 });
200
201 ToolItem collapseAll = new ToolItem(toolBar, SWT.PUSH);
202 collapseAll.setImage(COLLAPSE_ALL_IMAGE);
203 collapseAll.setToolTipText(RemoteMessages.RemoteFetchLogWizardRemotePage_CollapseAll);
204 collapseAll.addSelectionListener(new SelectionAdapter() {
205 @Override
206 public void widgetSelected(SelectionEvent e) {
207 getElementViewer().collapseAll();
208 }
209 });
210 }
211
212 @Override
213 protected void createElementViewer(Composite compositeParent) {
214 super.createElementViewer(compositeParent);
215
216 CheckboxTreeViewer elementViewer = getElementViewer();
217 elementViewer.setLabelProvider(new TracePackageLabelProvider() {
218 @Override
219 public String getText(Object element) {
220 if (element instanceof TracePackageTraceElement) {
221 for (TracePackageElement files : ((TracePackageTraceElement) element).getChildren()) {
222 if (files instanceof TracePackageFilesElement) {
223 return ((TracePackageFilesElement) files).getFileName();
224 }
225 }
226 }
227 return super.getText(element);
228 }
229 @Override
230 public Image getImage(Object element) {
231 if (element instanceof TracePackageTraceElement) {
232 for (TracePackageElement files : ((TracePackageTraceElement) element).getChildren()) {
233 return files.getImage();
234 }
235 }
236 return super.getImage(element);
237 }
238 });
239 elementViewer.setSorter(new ViewerSorter() {
240 @Override
241 public int category(Object element) {
242 if (element instanceof TracePackageTraceElement) {
243 return 1;
244 }
245 return 0;
246 }
247 });
248 }
249
250 private void createProjectGroup(Composite parent) {
251 if (fDefaultProjectName != null) {
252 Group projectGroup = new Group(parent, SWT.SHADOW_NONE);
253 projectGroup.setText(RemoteMessages.RemoteFetchLogWizardRemotePage_ImportDialogProjectsGroupName);
254 GridLayout layout = new GridLayout(1, true);
255 projectGroup.setLayout(layout);
256 projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
257
258 fProjects = new ArrayList<>();
259 List<String> projectNames = new ArrayList<>();
260
261 for (IProject project : TraceUtils.getOpenedTmfProjects()) {
262 fProjects.add(project);
263 projectNames.add(project.getName());
264 }
265
266 fCombo = new CCombo(projectGroup, SWT.READ_ONLY);
267 fCombo.setToolTipText(RemoteMessages.RemoteFetchLogWizardRemotePage_ImportDialogProjectsGroupName);
268 fCombo.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
269 fCombo.setItems(projectNames.toArray(new String[projectNames.size()]));
270 int select = projectNames.indexOf(fDefaultProjectName);
271 fCombo.select(select);
272 }
273 }
274
275 @Override
276 protected Object createElementViewerInput() {
277 if (fProfile == null) {
278 return null;
279 }
280 final List<RemoteImportConnectionNodeElement> remoteHosts = fProfile.getConnectionNodeElements();
281
282 if (remoteHosts.size() == 0) {
283 return new Status(IStatus.ERROR, Activator.PLUGIN_ID, RemoteMessages.RemoteFetchLogWizardRemotePage_MissingConnectionInformation);
284 }
285
286 final IStatus status[] = new IStatus[1];
287 try {
288 getContainer().run(true, true, new IRunnableWithProgress() {
289 @Override
290 public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
291 SubMonitor subMonitor = SubMonitor.convert(monitor, remoteHosts.size());
292 for (final RemoteImportConnectionNodeElement remoteHost : remoteHosts) {
293 SubMonitor child = subMonitor.newChild(1);
294 child.setTaskName(MessageFormat.format(RemoteMessages.RemoteFetchLogWizardRemotePage_OpeningConnectionTo, remoteHost.getURI()));
295 status[0] = remoteHost.connect(checkNotNull(subMonitor.newChild(1)));
296 if (!status[0].isOK()) {
297 monitor.done();
298 return;
299 }
300 // cache remote host
301 fRemoteHosts.add(remoteHost);
302 }
303 monitor.done();
304 }
305 });
306 } catch (InvocationTargetException e) {
307 handleError(
308 MessageFormat.format(RemoteMessages.RemoteFetchLogWizardRemotePage_ConnectionError, fProfile.getText()),
309 e);
310 return null;
311 } catch (InterruptedException e) {
312 // Cancelled
313 status[0] = Status.CANCEL_STATUS;
314 }
315
316 if (!status[0].isOK()) {
317 handleErrorStatus(status[0]);
318 return null;
319 }
320
321 try {
322 final AbstractTracePackageOperation generateManifestOperation = new RemoteGenerateManifestOperation(fProfile);
323
324 getContainer().run(true, true, new IRunnableWithProgress() {
325 @Override
326 public void run(IProgressMonitor monitor)
327 throws InvocationTargetException, InterruptedException {
328 monitor.beginTask(
329 Messages.ImportTracePackageWizardPage_ReadingPackage,
330 10);
331 generateManifestOperation.run(monitor);
332 monitor.done();
333 }
334 });
335
336 status[0] = generateManifestOperation.getStatus();
337 if (status[0].getSeverity() == IStatus.ERROR) {
338 handleErrorStatus(status[0]);
339 return null;
340 }
341 return generateManifestOperation.getResultElements();
342 } catch (InvocationTargetException e1) {
343 handleError(
344 Messages.TracePackageExtractManifestOperation_ErrorReadingManifest,
345 e1);
346 } catch (InterruptedException e1) {
347 // Canceled
348 }
349 return null;
350 }
351
352 /**
353 * Method to set input data for this wizard
354 *
355 * @param profile
356 * The remote profile
357 * @param overwriteAll
358 * Overwrite existing traces without confirmation
359 */
360 public void setPageData(RemoteImportProfileElement profile, boolean overwriteAll) {
361 fProfile = profile;
362 fOverwriteAll = overwriteAll;
363 }
364
365 /**
366 * Finishes the wizard page.
367 *
368 * @return <code>true</code> if successful else <code>false</code>
369 */
370 public boolean finish() {
371
372 boolean result;
373 if (!fIsVisible) {
374 result = updateViewer();
375 if (!result) {
376 return false;
377 }
378 }
379
380 result = validateProject();
381 if (!result) {
382 return false;
383 }
384
385 Object[] elements = getElementViewer().getCheckedElements();
386 final RemoteImportTracesOperation importOperation = new RemoteImportTracesOperation(getContainer().getShell(), fTmfTraceFolder, elements, fOverwriteAll);
387
388 try {
389 getContainer().run(true, true, new IRunnableWithProgress() {
390 @Override
391 public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
392 importOperation.run(monitor);
393 monitor.done();
394 }
395 });
396 } catch (InvocationTargetException e) {
397 handleError(
398 Messages.TracePackageExtractManifestOperation_ErrorReadingManifest,
399 e);
400 return false;
401 } catch (InterruptedException e) {
402 // Cancelled
403 return false;
404 }
405
406 IStatus status = importOperation.getStatus();
407 if (status.getSeverity() == IStatus.ERROR) {
408 handleErrorStatus(status);
409 return false;
410 }
411
412 disconnectAllRemoteHosts();
413 return true;
414 }
415
416 /**
417 * Cancels the the wizard and disconnects all open connections.
418 */
419 public void cancel() {
420 disconnectAllRemoteHosts();
421 }
422
423 // ------------------------------------------------------------------------
424 // Helper Methods
425 // ------------------------------------------------------------------------
426 private void disconnectAllRemoteHosts() {
427 for (RemoteImportConnectionNodeElement remoteHost : fRemoteHosts) {
428 remoteHost.disconnect();
429 }
430 }
431
432 private boolean updateViewer() {
433 Object elementViewerInput = createElementViewerInput();
434 if (elementViewerInput == null) {
435 return false;
436 }
437
438 CheckboxTreeViewer elementViewer = getElementViewer();
439 elementViewer.setInput(elementViewerInput);
440 elementViewer.expandToLevel(3);
441 setAllChecked(elementViewer, false, true);
442 updatePageCompletion();
443
444 return true;
445 }
446
447 private boolean validateProject() {
448 if (fCombo != null) {
449 int fProjectIndex = fCombo.getSelectionIndex();
450 if (fProjectIndex < 0) {
451 handleError(RemoteMessages.RemoteFetchLogWizardRemotePage_NoProjectSelectedError, null);
452 return false;
453 }
454
455 IProject project = fProjects.get(fProjectIndex);
456 IFolder traceFolder = project.getFolder(TmfTracesFolder.TRACES_FOLDER_NAME);
457
458 if (!traceFolder.exists()) {
459 handleError(RemoteMessages.RemoteFetchLogWizardRemotePage_InvalidTracingProject, null);
460 return false;
461 }
462
463 try {
464 if (project.hasNature(TmfProjectNature.ID)) {
465 TmfProjectElement projectElement = TmfProjectRegistry.getProject(project, true);
466 fTmfTraceFolder = projectElement.getTracesFolder();
467 }
468 } catch (CoreException ex) {
469 handleError(RemoteMessages.RemoteFetchLogWizardRemotePage_InvalidTracingProject, ex);
470 return false;
471 }
472 }
473 return true;
474 }
475
476 }
This page took 0.041617 seconds and 6 git commands to generate.