1 /*******************************************************************************
2 * Copyright (c) 2015 Ericsson
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
10 * Marc-Andre Laperle - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.tracecompass
.internal
.tmf
.remote
.ui
.wizards
.fetch
;
15 import static org
.eclipse
.tracecompass
.common
.core
.NonNullUtils
.checkNotNull
;
17 import java
.lang
.reflect
.InvocationTargetException
;
18 import java
.text
.MessageFormat
;
19 import java
.util
.HashSet
;
20 import java
.util
.List
;
23 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
24 import org
.eclipse
.core
.runtime
.IStatus
;
25 import org
.eclipse
.core
.runtime
.Status
;
26 import org
.eclipse
.core
.runtime
.SubMonitor
;
27 import org
.eclipse
.jface
.operation
.IRunnableWithProgress
;
28 import org
.eclipse
.jface
.viewers
.CheckboxTreeViewer
;
29 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
30 import org
.eclipse
.jface
.viewers
.ViewerSorter
;
31 import org
.eclipse
.swt
.SWT
;
32 import org
.eclipse
.swt
.events
.SelectionAdapter
;
33 import org
.eclipse
.swt
.events
.SelectionEvent
;
34 import org
.eclipse
.swt
.graphics
.Image
;
35 import org
.eclipse
.swt
.layout
.GridData
;
36 import org
.eclipse
.swt
.layout
.GridLayout
;
37 import org
.eclipse
.swt
.widgets
.Composite
;
38 import org
.eclipse
.swt
.widgets
.ToolBar
;
39 import org
.eclipse
.swt
.widgets
.ToolItem
;
40 import org
.eclipse
.tracecompass
.internal
.tmf
.remote
.ui
.Activator
;
41 import org
.eclipse
.tracecompass
.internal
.tmf
.remote
.ui
.messages
.RemoteMessages
;
42 import org
.eclipse
.tracecompass
.internal
.tmf
.remote
.ui
.wizards
.fetch
.model
.RemoteGenerateManifestOperation
;
43 import org
.eclipse
.tracecompass
.internal
.tmf
.remote
.ui
.wizards
.fetch
.model
.RemoteImportConnectionNodeElement
;
44 import org
.eclipse
.tracecompass
.internal
.tmf
.remote
.ui
.wizards
.fetch
.model
.RemoteImportProfileElement
;
45 import org
.eclipse
.tracecompass
.internal
.tmf
.remote
.ui
.wizards
.fetch
.model
.RemoteImportTracesOperation
;
46 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.project
.wizards
.tracepkg
.AbstractTracePackageOperation
;
47 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.project
.wizards
.tracepkg
.AbstractTracePackageWizardPage
;
48 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.project
.wizards
.tracepkg
.TracePackageElement
;
49 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.project
.wizards
.tracepkg
.TracePackageFilesElement
;
50 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.project
.wizards
.tracepkg
.TracePackageLabelProvider
;
51 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.project
.wizards
.tracepkg
.TracePackageTraceElement
;
52 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.project
.wizards
.tracepkg
.importexport
.Messages
;
53 import org
.eclipse
.tracecompass
.tmf
.ui
.project
.model
.TmfTraceFolder
;
54 import org
.eclipse
.ui
.ISharedImages
;
55 import org
.eclipse
.ui
.PlatformUI
;
56 import org
.eclipse
.ui
.plugin
.AbstractUIPlugin
;
59 * Wizard page that connects to a remote node, lists all traces according to
60 * a given remote profile and imports the selected traces.
62 * @author Marc-Andre Laperle
63 * @author Bernd Hufmann
65 public class RemoteFetchLogWizardRemotePage
extends AbstractTracePackageWizardPage
{
67 // ------------------------------------------------------------------------
69 // ------------------------------------------------------------------------
71 private static final String PAGE_NAME
= "org.eclipse.tracecompass.internal.tmf.remote.ui.wizards.fetch"; //$NON-NLS-1$
72 private static final String ICON_PATH
= "icons/elcl16/fetch_log_wiz.gif"; //$NON-NLS-1$
73 private static final Image COLLAPSE_ALL_IMAGE
= PlatformUI
.getWorkbench().getSharedImages().getImage(ISharedImages
.IMG_ELCL_COLLAPSEALL
);
74 private static final Image EXPAND_ALL_IMAGE
= Activator
.getDefault().getImageFromPath("icons/elcl16/expandall.png"); //$NON-NLS-1$
76 // ------------------------------------------------------------------------
78 // ------------------------------------------------------------------------
79 private TmfTraceFolder fTmfTraceFolder
;
81 private RemoteImportProfileElement fProfile
;
82 private final Set
<RemoteImportConnectionNodeElement
> fRemoteHosts
= new HashSet
<>();
83 private boolean fOverwriteAll
;
84 private boolean fIsVisible
= false;
86 // ------------------------------------------------------------------------
88 // ------------------------------------------------------------------------
95 * The current selection (trace folder element)
97 protected RemoteFetchLogWizardRemotePage(String title
, IStructuredSelection selection
) {
98 super(PAGE_NAME
, title
, null, selection
);
99 setImageDescriptor(AbstractUIPlugin
.imageDescriptorFromPlugin(Activator
.PLUGIN_ID
, ICON_PATH
));
101 if (selection
.getFirstElement() instanceof TmfTraceFolder
) {
102 fTmfTraceFolder
= (TmfTraceFolder
) selection
.getFirstElement();
105 if (fTmfTraceFolder
== null) {
106 throw new IllegalArgumentException();
108 setDescription(RemoteMessages
.RemoteFetchLogWizardRemotePage_Description
);
111 // ------------------------------------------------------------------------
113 // ------------------------------------------------------------------------
115 public void createControl(Composite parent
) {
116 initializeDialogUnits(parent
);
118 Composite composite
= new Composite(parent
, SWT
.NULL
);
119 composite
.setLayout(new GridLayout());
120 composite
.setLayoutData(new GridData(GridData
.VERTICAL_ALIGN_FILL
121 | GridData
.HORIZONTAL_ALIGN_FILL
));
122 composite
.setFont(parent
.getFont());
124 createToolBar(composite
);
125 createElementViewer(composite
);
127 createButtonsGroup(composite
);
129 restoreWidgetValues();
130 updatePageCompletion();
132 setControl(composite
);
136 protected boolean determinePageCompletion() {
137 return getElementViewer().getCheckedElements().length
> 0;
141 protected void updateWithFilePathSelection() {
145 public void setVisible(final boolean visible
) {
146 super.setVisible(visible
);
148 fIsVisible
= visible
;
151 getContainer().getShell().getDisplay().asyncExec(new Runnable() {
158 getElementViewer().setInput(null);
162 private void createToolBar(Composite parent
) {
163 ToolBar toolBar
= new ToolBar(parent
, SWT
.HORIZONTAL
);
164 toolBar
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, false, false));
166 ToolItem expandAll
= new ToolItem(toolBar
, SWT
.PUSH
);
167 expandAll
.setImage(EXPAND_ALL_IMAGE
);
168 expandAll
.setToolTipText(RemoteMessages
.RemoteFetchLogWizardRemotePage_ExpandAll
);
169 expandAll
.addSelectionListener(new SelectionAdapter() {
171 public void widgetSelected(SelectionEvent e
) {
172 getElementViewer().expandAll();
176 ToolItem collapseAll
= new ToolItem(toolBar
, SWT
.PUSH
);
177 collapseAll
.setImage(COLLAPSE_ALL_IMAGE
);
178 collapseAll
.setToolTipText(RemoteMessages
.RemoteFetchLogWizardRemotePage_CollapseAll
);
179 collapseAll
.addSelectionListener(new SelectionAdapter() {
181 public void widgetSelected(SelectionEvent e
) {
182 getElementViewer().collapseAll();
188 protected void createElementViewer(Composite compositeParent
) {
189 super.createElementViewer(compositeParent
);
191 CheckboxTreeViewer elementViewer
= getElementViewer();
192 elementViewer
.setLabelProvider(new TracePackageLabelProvider() {
194 public String
getText(Object element
) {
195 if (element
instanceof TracePackageTraceElement
) {
196 for (TracePackageElement files
: ((TracePackageTraceElement
) element
).getChildren()) {
197 if (files
instanceof TracePackageFilesElement
) {
198 return ((TracePackageFilesElement
) files
).getFileName();
202 return super.getText(element
);
205 public Image
getImage(Object element
) {
206 if (element
instanceof TracePackageTraceElement
) {
207 for (TracePackageElement files
: ((TracePackageTraceElement
) element
).getChildren()) {
208 return files
.getImage();
211 return super.getImage(element
);
214 elementViewer
.setSorter(new ViewerSorter() {
216 public int category(Object element
) {
217 if (element
instanceof TracePackageTraceElement
) {
226 protected Object
createElementViewerInput() {
227 if (fProfile
== null) {
230 final List
<RemoteImportConnectionNodeElement
> remoteHosts
= fProfile
.getConnectionNodeElements();
232 if (remoteHosts
.size() == 0) {
233 return new Status(IStatus
.ERROR
, Activator
.PLUGIN_ID
, RemoteMessages
.RemoteFetchLogWizardRemotePage_MissingConnectionInformation
);
236 final IStatus status
[] = new IStatus
[1];
238 getContainer().run(true, true, new IRunnableWithProgress() {
240 public void run(IProgressMonitor monitor
) throws InvocationTargetException
, InterruptedException
{
241 SubMonitor subMonitor
= SubMonitor
.convert(monitor
, remoteHosts
.size());
242 for (final RemoteImportConnectionNodeElement remoteHost
: remoteHosts
) {
243 SubMonitor child
= subMonitor
.newChild(1);
244 child
.setTaskName(MessageFormat
.format(RemoteMessages
.RemoteFetchLogWizardRemotePage_OpeningConnectionTo
, remoteHost
.getURI()));
245 status
[0] = remoteHost
.connect(checkNotNull(subMonitor
.newChild(1)));
246 if (!status
[0].isOK()) {
251 fRemoteHosts
.add(remoteHost
);
256 } catch (InvocationTargetException e
) {
258 MessageFormat
.format(RemoteMessages
.RemoteFetchLogWizardRemotePage_ConnectionError
, fProfile
.getText()),
261 } catch (InterruptedException e
) {
263 status
[0] = Status
.CANCEL_STATUS
;
266 if (!status
[0].isOK()) {
267 handleErrorStatus(status
[0]);
272 final AbstractTracePackageOperation generateManifestOperation
= new RemoteGenerateManifestOperation(fProfile
);
274 getContainer().run(true, true, new IRunnableWithProgress() {
276 public void run(IProgressMonitor monitor
)
277 throws InvocationTargetException
, InterruptedException
{
279 Messages
.ImportTracePackageWizardPage_ReadingPackage
,
281 generateManifestOperation
.run(monitor
);
286 status
[0] = generateManifestOperation
.getStatus();
287 if (status
[0].getSeverity() == IStatus
.ERROR
) {
288 handleErrorStatus(status
[0]);
291 return generateManifestOperation
.getResultElements();
292 } catch (InvocationTargetException e1
) {
294 Messages
.TracePackageExtractManifestOperation_ErrorReadingManifest
,
296 } catch (InterruptedException e1
) {
303 * Method to set input data for this wizard
307 * @param overwriteAll
308 * Overwrite existing traces without confirmation
310 public void setPageData(RemoteImportProfileElement profile
, boolean overwriteAll
) {
312 fOverwriteAll
= overwriteAll
;
316 * Finishes the wizard page.
318 * @return <code>true</code> if successful else <code>false</code>
320 public boolean finish() {
323 boolean result
= updateViewer();
329 Object
[] elements
= getElementViewer().getCheckedElements();
330 final RemoteImportTracesOperation importOperation
= new RemoteImportTracesOperation(getContainer().getShell(), fTmfTraceFolder
, elements
, fOverwriteAll
);
333 getContainer().run(true, true, new IRunnableWithProgress() {
335 public void run(IProgressMonitor monitor
) throws InvocationTargetException
, InterruptedException
{
336 importOperation
.run(monitor
);
340 } catch (InvocationTargetException e
) {
342 Messages
.TracePackageExtractManifestOperation_ErrorReadingManifest
,
345 } catch (InterruptedException e
) {
350 IStatus status
= importOperation
.getStatus();
351 if (status
.getSeverity() == IStatus
.ERROR
) {
352 handleErrorStatus(status
);
356 disconnectAllRemoteHosts();
361 * Cancels the the wizard and disconnects all open connections.
363 public void cancel() {
364 disconnectAllRemoteHosts();
367 // ------------------------------------------------------------------------
369 // ------------------------------------------------------------------------
370 private void disconnectAllRemoteHosts() {
371 for (RemoteImportConnectionNodeElement remoteHost
: fRemoteHosts
) {
372 remoteHost
.disconnect();
376 private boolean updateViewer() {
377 Object elementViewerInput
= createElementViewerInput();
378 if (elementViewerInput
== null) {
382 CheckboxTreeViewer elementViewer
= getElementViewer();
383 elementViewer
.setInput(elementViewerInput
);
384 elementViewer
.expandToLevel(3);
385 setAllChecked(elementViewer
, false, true);
386 updatePageCompletion();