lttng ui: Fix minor sonar warnings
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng2.ui / src / org / eclipse / linuxtools / internal / lttng2 / ui / views / control / dialogs / ImportDialog.java
CommitLineData
291cbdbf 1/**********************************************************************
ba3a9bd2 2 * Copyright (c) 2012, 2013 Ericsson
cfdb727a 3 *
291cbdbf
BH
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
cfdb727a
AM
8 *
9 * Contributors:
291cbdbf 10 * Bernd Hufmann - Initial API and implementation
ba3a9bd2 11 * Bernd Hufmann - Added handling of streamed traces
291cbdbf
BH
12 **********************************************************************/
13package org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs;
14
15import java.util.ArrayList;
16import java.util.List;
17
18import org.eclipse.core.resources.IFolder;
19import org.eclipse.core.resources.IProject;
20import org.eclipse.core.resources.ResourcesPlugin;
21import org.eclipse.core.runtime.CoreException;
22import org.eclipse.core.runtime.NullProgressMonitor;
23import org.eclipse.jface.dialogs.Dialog;
24import org.eclipse.jface.dialogs.IDialogConstants;
25import org.eclipse.jface.dialogs.MessageDialog;
26import org.eclipse.jface.viewers.CheckStateChangedEvent;
27import org.eclipse.jface.viewers.CheckboxTreeViewer;
28import org.eclipse.jface.viewers.ICheckStateListener;
f3b33d40 29import org.eclipse.jface.viewers.StructuredSelection;
291cbdbf 30import org.eclipse.jface.window.Window;
f3b33d40 31import org.eclipse.jface.wizard.WizardDialog;
291cbdbf 32import org.eclipse.linuxtools.internal.lttng2.ui.Activator;
9315aeee 33import org.eclipse.linuxtools.internal.lttng2.ui.views.control.messages.Messages;
291cbdbf
BH
34import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.TraceSessionComponent;
35import org.eclipse.linuxtools.internal.lttng2.ui.views.control.remote.IRemoteSystemProxy;
36import org.eclipse.linuxtools.tmf.core.TmfProjectNature;
37import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceFolder;
d04ec5a7 38import org.eclipse.linuxtools.tmf.ui.project.wizards.importtrace.ImportTraceWizard;
291cbdbf
BH
39import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
40import org.eclipse.rse.subsystems.files.core.servicesubsystem.IFileServiceSubSystem;
41import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
42import org.eclipse.swt.SWT;
43import org.eclipse.swt.custom.CCombo;
44import org.eclipse.swt.graphics.Point;
45import org.eclipse.swt.layout.GridData;
46import org.eclipse.swt.layout.GridLayout;
47import org.eclipse.swt.widgets.Button;
48import org.eclipse.swt.widgets.Composite;
49import org.eclipse.swt.widgets.Control;
50import org.eclipse.swt.widgets.Group;
51import org.eclipse.swt.widgets.Shell;
52import org.eclipse.swt.widgets.Text;
53import org.eclipse.swt.widgets.Tree;
f3b33d40 54import org.eclipse.ui.PlatformUI;
291cbdbf
BH
55import org.eclipse.ui.model.WorkbenchContentProvider;
56import org.eclipse.ui.model.WorkbenchLabelProvider;
57
58/**
291cbdbf
BH
59 * <p>
60 * Dialog box for collecting trace import information.
61 * </p>
cfdb727a 62 *
dbd4432d 63 * @author Bernd Hufmann
291cbdbf
BH
64 */
65public class ImportDialog extends Dialog implements IImportDialog {
66
67 // ------------------------------------------------------------------------
68 // Constants
69 // ------------------------------------------------------------------------
cfdb727a 70 /** The icon file for this dialog box. */
291cbdbf 71 public static final String IMPORT_ICON_FILE = "icons/elcl16/import_trace.gif"; //$NON-NLS-1$
cfdb727a
AM
72
73 /** Parent directory for UST traces */
291cbdbf
BH
74 public static final String UST_PARENT_DIRECTORY = "ust"; //$NON-NLS-1$
75
76 // ------------------------------------------------------------------------
77 // Attributes
78 // ------------------------------------------------------------------------
79 /**
80 * The dialog composite.
81 */
82 private Composite fDialogComposite = null;
83 /**
84 * The checkbox tree viewer for selecting available traces
85 */
86 private CheckboxTreeViewer fFolderViewer;
87 /**
88 * The combo box for selecting a project.
89 */
90 private CCombo fCombo;
91 /**
cfdb727a 92 * The overwrite button
291cbdbf
BH
93 */
94 private Button fOverwriteButton;
f3b33d40
BH
95 /**
96 * The button to open import wizard for import locally.
97 */
98 private Button fImportLocallyButton;
291cbdbf
BH
99 /**
100 * List of available LTTng 2.0 projects
101 */
102 private List<IProject> fProjects;
103 /**
104 * The parent where the new node should be added.
105 */
106 private TraceSessionComponent fSession = null;
107 /**
cfdb727a 108 * List of traces to import
291cbdbf 109 */
cfdb727a 110 private final List<ImportFileInfo> fTraces = new ArrayList<ImportFileInfo>();
291cbdbf 111 /**
cfdb727a 112 * Selection index in project combo box.
291cbdbf
BH
113 */
114 private int fProjectIndex;
115 /**
116 * Flag to indicate that something went wrong when creating the dialog box.
117 */
118 private boolean fIsError = false;
cfdb727a 119
291cbdbf
BH
120 // ------------------------------------------------------------------------
121 // Constructors
122 // ------------------------------------------------------------------------
123 /**
124 * Constructor
125 * @param shell - a shell for the display of the dialog
126 */
127 public ImportDialog(Shell shell) {
128 super(shell);
129 setShellStyle(SWT.RESIZE);
130 }
131
132 // ------------------------------------------------------------------------
133 // Accessors
134 // ------------------------------------------------------------------------
11252342 135
291cbdbf
BH
136 @Override
137 public List<ImportFileInfo> getTracePathes() {
138 List<ImportFileInfo> retList = new ArrayList<ImportFileInfo>();
139 retList.addAll(fTraces);
140 return retList;
141 }
142
291cbdbf
BH
143 @Override
144 public IProject getProject() {
145 return fProjects.get(fProjectIndex);
146 }
cfdb727a 147
291cbdbf
BH
148 @Override
149 public void setSession(TraceSessionComponent session) {
150 fSession = session;
151 }
152
153 // ------------------------------------------------------------------------
154 // Operations
155 // ------------------------------------------------------------------------
11252342 156
291cbdbf
BH
157 @Override
158 protected void configureShell(Shell newShell) {
159 super.configureShell(newShell);
160 newShell.setText(Messages.TraceControl_ImportDialogTitle);
161 newShell.setImage(Activator.getDefault().loadIcon(IMPORT_ICON_FILE));
162 }
163
291cbdbf
BH
164 @Override
165 protected Control createDialogArea(Composite parent) {
cfdb727a 166
291cbdbf
BH
167 // Main dialog panel
168 fDialogComposite = new Composite(parent, SWT.NONE);
169 GridLayout layout = new GridLayout(1, true);
170 fDialogComposite.setLayout(layout);
171 fDialogComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
172
291cbdbf 173 try {
f3b33d40
BH
174 if (fSession.isStreamedTrace()) {
175 createLocalComposite();
176 } else {
177 createRemoteComposite();
291cbdbf 178 }
f3b33d40
BH
179 } catch (CoreException e) {
180 createErrorComposite(parent, e.fillInStackTrace());
181 return fDialogComposite;
291cbdbf
BH
182 } catch (SystemMessageException e) {
183 createErrorComposite(parent, e.fillInStackTrace());
184 return fDialogComposite;
185 }
291cbdbf
BH
186 return fDialogComposite;
187 }
188
291cbdbf
BH
189 @Override
190 protected void createButtonsForButtonBar(Composite parent) {
79c3db85 191 createButton(parent, IDialogConstants.CANCEL_ID, "&Cancel", true); //$NON-NLS-1$
f3b33d40
BH
192 fImportLocallyButton = createButton(parent, IDialogConstants.OK_ID, "&Ok", true); //$NON-NLS-1$
193 if (fSession.isStreamedTrace()) {
194 fImportLocallyButton.setText("&Next..."); //$NON-NLS-1$
195 }
291cbdbf
BH
196 }
197
291cbdbf
BH
198 @Override
199 protected void okPressed() {
200 if (!fIsError) {
f3b33d40 201
291cbdbf
BH
202 // Validate input data
203 fTraces.clear();
204
205 fProjectIndex = fCombo.getSelectionIndex();
206
207 if (fProjectIndex < 0) {
208 MessageDialog.openError(getShell(),
209 Messages.TraceControl_ImportDialogTitle,
210 Messages.TraceControl_ImportDialogNoProjectSelectedError);
211 return;
212 }
213
f3b33d40
BH
214 if (fSession.isStreamedTrace()) {
215 // For streaming use standard import wizard from TMF because exact location
216 // is not available (lttng backend limitation)
217 IProject project = fProjects.get(fCombo.getSelectionIndex());
218 ImportTraceWizard wizard = new ImportTraceWizard();
219 wizard.init(PlatformUI.getWorkbench(), new StructuredSelection(project));
220 WizardDialog dialog = new WizardDialog(getShell(), wizard);
221 if (dialog.open() == Window.OK) {
222 super.okPressed();
223 }
224 super.cancelPressed();
225 return;
226 }
227
291cbdbf
BH
228 IProject project = fProjects.get(fProjectIndex);
229 IFolder traceFolder = project.getFolder(TmfTraceFolder.TRACE_FOLDER_NAME);
230
231 if (!traceFolder.exists()) {
232 // Invalid LTTng 2.0 project
233 MessageDialog.openError(getShell(),
234 Messages.TraceControl_ImportDialogTitle,
235 Messages.TraceControl_ImportDialogInvalidTracingProject + " (" + TmfTraceFolder.TRACE_FOLDER_NAME + ")"); //$NON-NLS-1$//$NON-NLS-2$
236 return;
237 }
238
239 boolean overwriteAll = fOverwriteButton.getSelection();
240
241 Object[] checked = fFolderViewer.getCheckedElements();
242 for (int i = 0; i < checked.length; i++) {
243 IRemoteFile file = (IRemoteFile) checked[i];
cfdb727a
AM
244
245 // Only add actual trace directories
291cbdbf 246 if (file.isDirectory() && !UST_PARENT_DIRECTORY.equals(file.getName())) {
cfdb727a 247
291cbdbf
BH
248 ImportFileInfo info = new ImportFileInfo(file, file.getName(), overwriteAll);
249 String traceName = info.getLocalTraceName();
250 IFolder folder = traceFolder.getFolder(traceName);
251
cfdb727a 252 // Verify if trace directory already exists (and not overwrite)
291cbdbf
BH
253 if (folder.exists() && !overwriteAll) {
254
255 // Ask user for overwrite or new name
256 IImportConfirmationDialog conf = TraceControlDialogFactory.getInstance().getImportConfirmationDialog();
257 conf.setTraceName(traceName);
258
259 // Don't add trace to list if dialog was cancelled.
260 if (conf.open() == Window.OK) {
261 info.setOverwrite(conf.isOverwrite());
262 if (!conf.isOverwrite()) {
263 info.setLocalTraceName(conf.getNewTraceName());
264 }
265 fTraces.add(info);
266 }
cfdb727a 267 } else {
291cbdbf
BH
268 fTraces.add(info);
269 }
270 }
271 }
272
273 if (fTraces.isEmpty()) {
274 MessageDialog.openError(getShell(),
275 Messages.TraceControl_ImportDialogTitle,
276 Messages.TraceControl_ImportDialogNoTraceSelectedError);
277 return;
278 }
279 }
280
281 // validation successful -> call super.okPressed()
282 super.okPressed();
283 }
284
285 // ------------------------------------------------------------------------
286 // Helper methods and classes
287 // ------------------------------------------------------------------------
11252342 288
cfdb727a
AM
289 /**
290 * Helper class for the contents of a folder in a tracing project
291 *
292 * @author Bernd Hufmann
293 */
f455db37 294 public static class FolderContentProvider extends WorkbenchContentProvider {
291cbdbf
BH
295 @Override
296 public Object[] getChildren(Object o) {
297 if (o instanceof IRemoteFile) {
298 IRemoteFile element = (IRemoteFile) o;
299 // For our purpose, we need folders + files
300 if (!element.isDirectory()) {
301 return new Object[0];
302 }
303 }
304 return super.getChildren(o);
305 }
306 }
cfdb727a 307
291cbdbf
BH
308 /**
309 * Creates a dialog composite with an error message which can be used
310 * when an exception occurred during creation time of the dialog box.
311 * @param parent - a parent composite
cfdb727a 312 * @param e - a error causing exception
291cbdbf
BH
313 */
314 private void createErrorComposite(Composite parent, Throwable e) {
315 fIsError = true;
316 fDialogComposite.dispose();
cfdb727a 317
291cbdbf
BH
318 fDialogComposite = new Composite(parent, SWT.NONE);
319 GridLayout layout = new GridLayout(1, true);
320 fDialogComposite.setLayout(layout);
321 fDialogComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
cfdb727a 322
291cbdbf
BH
323 Text errorText = new Text(fDialogComposite, SWT.MULTI);
324 StringBuffer error = new StringBuffer();
325 error.append(Messages.TraceControl_ImportDialogCreationError);
326 error.append(System.getProperty("line.separator")); //$NON-NLS-1$
327 error.append(System.getProperty("line.separator")); //$NON-NLS-1$
328 error.append(e.toString());
329 errorText.setText(error.toString());
330 errorText.setLayoutData(new GridData(GridData.FILL_BOTH));
331 }
332
f3b33d40
BH
333 private void createRemoteComposite() throws CoreException, SystemMessageException{
334 Group contextGroup = new Group(fDialogComposite, SWT.SHADOW_NONE);
335 contextGroup.setText(Messages.TraceControl_ImportDialogTracesGroupName);
336 GridLayout layout = new GridLayout(1, true);
337 contextGroup.setLayout(layout);
338 contextGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
339
340 IRemoteSystemProxy proxy = fSession.getTargetNode().getRemoteSystemProxy();
341
342 IFileServiceSubSystem fsss = proxy.getFileServiceSubSystem();
343
344 IRemoteFile remoteFolder = fsss.getRemoteFileObject(fSession.getSessionPath(), new NullProgressMonitor());
345
346 fFolderViewer = new CheckboxTreeViewer(contextGroup, SWT.BORDER);
347 GridData data = new GridData(GridData.FILL_BOTH);
348 Tree tree = fFolderViewer.getTree();
349 tree.setLayoutData(data);
350 tree.setFont(fDialogComposite.getFont());
351 tree.setToolTipText(Messages.TraceControl_ImportDialogTracesTooltip);
352
353 fFolderViewer.setContentProvider(new FolderContentProvider());
354 fFolderViewer.setLabelProvider(new WorkbenchLabelProvider());
355
356 fFolderViewer.addCheckStateListener(new ICheckStateListener() {
357 @Override
358 public void checkStateChanged(CheckStateChangedEvent event) {
359 Object elem = event.getElement();
360 if (elem instanceof IRemoteFile) {
361 IRemoteFile element = (IRemoteFile) elem;
362 if (!element.isDirectory()) {
363 // A trick to keep selection of a file in sync with the directory
364 boolean p = fFolderViewer.getChecked((element.getParentRemoteFile()));
365 fFolderViewer.setChecked(element, p);
366 return;
367 }
368 fFolderViewer.setSubtreeChecked(event.getElement(), event.getChecked());
369 if (!event.getChecked()) {
370 fFolderViewer.setChecked(element.getParentRemoteFile(), false);
371 }
372 }
373 }
374 });
375 fFolderViewer.setInput(remoteFolder);
376
377 Group projectGroup = new Group(fDialogComposite, SWT.SHADOW_NONE);
378 projectGroup.setText(Messages.TraceControl_ImportDialogProjectsGroupName);
379 layout = new GridLayout(1, true);
380 projectGroup.setLayout(layout);
381 projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
382
383 fProjects = new ArrayList<IProject>();
384 List<String> projectNames = new ArrayList<String>();
385 for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
386 if (project.isOpen() && project.hasNature(TmfProjectNature.ID)) {
387 fProjects.add(project);
388 projectNames.add(project.getName());
389 }
390 }
391
392 fCombo = new CCombo(projectGroup, SWT.READ_ONLY);
393 fCombo.setToolTipText(Messages.TraceControl_ImportDialogProjectsTooltip);
394 fCombo.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
395 fCombo.setItems(projectNames.toArray(new String[projectNames.size()]));
396
397 Group overrideGroup = new Group(fDialogComposite, SWT.SHADOW_NONE);
398 layout = new GridLayout(1, true);
399 overrideGroup.setLayout(layout);
400 overrideGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
401
402 fOverwriteButton = new Button(overrideGroup, SWT.CHECK);
403 fOverwriteButton.setText(Messages.TraceControl_ImportDialogOverwriteButtonText);
404 getShell().setMinimumSize(new Point(500, 400));
405 }
406
407 private void createLocalComposite() throws CoreException {
408
409 Group projectGroup = new Group(fDialogComposite, SWT.SHADOW_NONE);
410 projectGroup.setText(Messages.TraceControl_ImportDialogProjectsGroupName);
411 GridLayout layout = new GridLayout(1, true);
412 projectGroup.setLayout(layout);
413 projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
414
415 fProjects = new ArrayList<IProject>();
416 List<String> projectNames = new ArrayList<String>();
417 for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
418 if (project.isOpen() && project.hasNature(TmfProjectNature.ID)) {
419 fProjects.add(project);
420 projectNames.add(project.getName());
421 }
422 }
423
424 fCombo = new CCombo(projectGroup, SWT.READ_ONLY);
425 fCombo.setToolTipText(Messages.TraceControl_ImportDialogProjectsTooltip);
426 fCombo.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
427 fCombo.setItems(projectNames.toArray(new String[projectNames.size()]));
cfdb727a 428
f3b33d40
BH
429 getShell().setMinimumSize(new Point(500, 50));
430 }
291cbdbf 431 }
This page took 0.051426 seconds and 5 git commands to generate.