lttng.control: Adding support for the Python domain in the Control view
[deliverable/tracecompass.git] / lttng / org.eclipse.tracecompass.lttng2.control.ui / src / org / eclipse / tracecompass / internal / lttng2 / control / ui / views / dialogs / EnableLoggersComposite.java
CommitLineData
74fe9bdd
BR
1/**********************************************************************
2 * Copyright (c) 2016 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 * Bruno Roy - Initial API and implementation
11 **********************************************************************/
12package org.eclipse.tracecompass.internal.lttng2.control.ui.views.dialogs;
13
14import java.util.ArrayList;
690cef63 15import java.util.Arrays;
74fe9bdd
BR
16import java.util.HashSet;
17import java.util.List;
18import java.util.Set;
19import java.util.stream.Collectors;
20
21import org.eclipse.jface.dialogs.MessageDialog;
22import org.eclipse.jface.viewers.CheckStateChangedEvent;
23import org.eclipse.jface.viewers.CheckboxTreeViewer;
24import org.eclipse.jface.viewers.ICheckStateListener;
25import org.eclipse.jface.viewers.TreeViewer;
26import org.eclipse.swt.SWT;
27import org.eclipse.swt.custom.CCombo;
28import org.eclipse.swt.events.SelectionAdapter;
29import org.eclipse.swt.events.SelectionEvent;
30import org.eclipse.swt.graphics.Image;
31import org.eclipse.swt.layout.GridData;
32import org.eclipse.swt.layout.GridLayout;
33import org.eclipse.swt.widgets.Button;
34import org.eclipse.swt.widgets.Composite;
35import org.eclipse.swt.widgets.Group;
690cef63
BR
36import org.eclipse.swt.widgets.Label;
37import org.eclipse.swt.widgets.Text;
74fe9bdd
BR
38import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel;
39import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType;
40import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType;
41import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceJulLogLevel;
42import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceLog4jLogLevel;
3d2d8c9f 43import org.eclipse.tracecompass.internal.lttng2.control.core.model.TracePythonLogLevel;
74fe9bdd
BR
44import org.eclipse.tracecompass.internal.lttng2.control.ui.views.messages.Messages;
45import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.ITraceControlComponent;
46import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.BaseLoggerComponent;
47import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TargetNodeComponent;
48import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceControlContentProvider;
49import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceControlLabelProvider;
50import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceProviderGroup;
51import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.UstProviderComponent;
52import org.eclipse.ui.dialogs.FilteredTree;
53import org.eclipse.ui.dialogs.PatternFilter;
54
55/**
56 * A composite for collecting information about loggers to be enabled.
57 *
58 * @author Bruno Roy
59 */
60public class EnableLoggersComposite extends Composite implements IBaseEnableUstEvents {
61
62 // ------------------------------------------------------------------------
63 // Constants
64 // ------------------------------------------------------------------------
65
66 private enum GroupEnum { LOGGERS }
67
68 // ------------------------------------------------------------------------
69 // Attributes
70 // ------------------------------------------------------------------------
71
72 /**
73 * The referenced trace provider group containing the loggers providers
74 * component which contains a list of available tracepoints.
75 */
76 private final TraceProviderGroup fProviderGroup;
77 /**
78 * A button to enable/disable the loggers group
79 */
80 private Button fLoggersActivateButton;
81 /**
82 * A tree viewer for displaying and selection of available loggers.
83 */
84 private CheckboxTreeViewer fLoggersViewer;
690cef63
BR
85 /**
86 * A Text field for the specific logger name.
87 */
88 private Text fSpecificLoggerText;
74fe9bdd
BR
89 /**
90 * The flag indicating that loggers are selected.
91 */
92 private boolean fIsLoggers;
93 /**
94 * The list of loggers to be enabled.
95 */
96 private List<String> fLoggers;
97 /**
98 * A button to enable/disable the log level group
99 */
100 private Button fLogLevelActivateButton;
101 /**
102 * A Combo box for selecting the log level.
103 */
104 private CCombo fLogLevelCombo;
105 /**
106 * A button for selecting the log level (range 0 to level).
107 */
108 private Button fLogLevelButton;
109 /**
110 * A button for selecting the specified log level only.
111 */
112 private Button fLogLevelOnlyButton;
113 /**
114 * The flag indicating that all log level are selected.
115 */
116 private boolean fIsLogLevel;
117 /**
118 * The flag indicating that all loggers (across providers) are selected.
119 */
120 private boolean fIsAllLoggers;
121 /**
122 * The type of the log level (loglevel or loglevel-only)
123 */
124 private LogLevelType fLogLevelType;
125 /**
126 * The selected log level.
127 */
128 private ITraceLogLevel fLogLevel;
129 /**
130 * The domain of the loggers.
131 */
132 private final TraceDomainType fDomain;
133
134 // ------------------------------------------------------------------------
135 // Constructors
136 // ------------------------------------------------------------------------
137 /**
138 * Constructor
139 *
140 * @param parent
141 * a parent composite
142 * @param style
143 * a composite style
144 * @param providerGroup
145 * the trace provider group
146 * @param domain
147 * the domain of the loggers
148 */
149 public EnableLoggersComposite(Composite parent, int style, TraceProviderGroup providerGroup, TraceDomainType domain) {
150 super(parent, style);
151 fProviderGroup = providerGroup;
152 fDomain = domain;
153 }
154
155 // ------------------------------------------------------------------------
156 // Accessors
157 // ------------------------------------------------------------------------
158
159 @Override
160 public ITraceLogLevel getLogLevel() {
161 return fLogLevel;
162 }
163
164 @Override
165 public LogLevelType getLogLevelType() {
166 return fLogLevelType;
167 }
168
169 @Override
170 public boolean isAllTracePoints() {
171 return fIsAllLoggers;
172 }
173
174 @Override
175 public List<String> getEventNames() {
176 return new ArrayList<>(fLoggers);
177 }
178
179 @Override
180 public boolean isLogLevel() {
181 return fIsLogLevel;
182 }
183
184 // ------------------------------------------------------------------------
185 // Operations
186 // ------------------------------------------------------------------------
187
188 /**
189 * Create the contents of this event composite
190 */
191 public void createContent() {
192
193 // Logger group
194 createLoggersGroup();
195
196 // Log Level Group
197 createLogLevelGroup();
198
199 // Set default enablements
200 setEnablements(GroupEnum.LOGGERS);
201 }
202
203 /**
204 * Validates the loggers composite input data.
205 *
206 * @return true if configured data is valid and can be retrieved.
207 */
208 public boolean isValid() {
209
210 fIsLoggers = fLoggersActivateButton.getSelection();
211 fIsLogLevel = fLogLevelActivateButton.getSelection();
212
213 // Initialize loggers fields
214 fLoggers = new ArrayList<>();
215 if (fIsLoggers) {
216 Set<String> set = new HashSet<>();
217 Object[] checkedElements = fLoggersViewer.getCheckedElements();
690cef63 218 int totalNbLoggers = 0;
74fe9bdd
BR
219 for (int i = 0; i < checkedElements.length; i++) {
220 ITraceControlComponent component = (ITraceControlComponent) checkedElements[i];
221 if (component instanceof BaseLoggerComponent) {
690cef63 222 totalNbLoggers++;
74fe9bdd
BR
223 if (!set.contains(component.getName())) {
224 set.add(component.getName());
225 fLoggers.add(component.getName());
226 }
227 }
74fe9bdd
BR
228 }
229
230 // verify if all events are selected
231 int nbLoggers = 0;
232 List<ITraceControlComponent> comps = fProviderGroup.getChildren(UstProviderComponent.class);
233 for (ITraceControlComponent comp : comps) {
234 // We want the children of each UST provider
235 ITraceControlComponent[] events = comp.getChildren();
236 for (ITraceControlComponent event : events) {
237 if (event instanceof BaseLoggerComponent && fDomain.equals(((BaseLoggerComponent)event).getDomain())) {
238 nbLoggers++;
239 }
240 }
241
242 }
690cef63
BR
243 fIsAllLoggers = (nbLoggers == totalNbLoggers);
244 String tmpSpecificLogger = fSpecificLoggerText.getText();
245 if (!fIsAllLoggers && !tmpSpecificLogger.trim().isEmpty()) {
246 // Format the text to a List<String>
247 // Removing all non visible characters
248 tmpSpecificLogger = tmpSpecificLogger.replaceAll("\\s", ""); //$NON-NLS-1$ //$NON-NLS-2$
249 // Splitting the different events that are separated by commas
250 List<String> specificLoggerList = Arrays.asList(tmpSpecificLogger.split(",")); //$NON-NLS-1$
251 fLoggers.addAll(specificLoggerList);
252 fLoggers = fLoggers.stream().distinct().collect(Collectors.toList());
253 }
74fe9bdd
BR
254 }
255
256 // initialize log level event name string
257 fLogLevelType = LogLevelType.LOGLEVEL_NONE;
258 if (fIsLogLevel) {
259 if (fLogLevelButton.getSelection()) {
260 fLogLevelType = LogLevelType.LOGLEVEL;
261 } else if (fLogLevelOnlyButton.getSelection()) {
262 fLogLevelType = LogLevelType.LOGLEVEL_ONLY;
263 }
264
265 ITraceLogLevel[] levels = getLogLevelNames();
266 int id = fLogLevelCombo.getSelectionIndex();
267
268 if (id < 0) {
269 MessageDialog.openError(getShell(),
270 Messages.TraceControl_EnableLoggersDialogTitle,
271 Messages.TraceControl_InvalidLogLevel);
272
273 return false;
274 }
275
276 if (fLoggers.isEmpty()) {
277 MessageDialog.openError(getShell(),
278 Messages.TraceControl_EnableLoggersDialogTitle,
279 Messages.TraceControl_InvalidLogger);
280
281 return false;
282 }
283 if (levels != null) {
284 fLogLevel = levels[id];
285 }
286 }
287
288 // validation successful -> call super.okPressed()
289 return true;
290 }
291
292 // ------------------------------------------------------------------------
293 // Helper methods
294 // ------------------------------------------------------------------------
295
296 private ITraceLogLevel[] getLogLevelNames() {
297 switch (fDomain) {
298 case JUL:
299 return TraceJulLogLevel.values();
300 case LOG4J:
301 return TraceLog4jLogLevel.values();
3d2d8c9f
BR
302 case PYTHON:
303 return TracePythonLogLevel.values();
74fe9bdd
BR
304 //$CASES-OMITTED$
305 default:
306 return null;
307 }
308 }
309
310 /**
311 * Creates loggers group.
312 */
313 private void createLoggersGroup() {
314 // Create the loggers group
315 Group loggersMainGroup = new Group(this, SWT.SHADOW_NONE);
316 loggersMainGroup.setText(Messages.TraceControl_EnableEventsLoggerGroupName);
317 GridLayout layout = new GridLayout(2, false);
318 loggersMainGroup.setLayout(layout);
319 GridData data = new GridData(GridData.FILL_BOTH);
320 loggersMainGroup.setLayoutData(data);
321
322 // Create the Select button
323 Composite buttonComposite = new Composite(loggersMainGroup, SWT.NONE);
324 layout = new GridLayout(1, true);
325 buttonComposite.setLayout(layout);
326 data = new GridData(SWT.BEGINNING, SWT.CENTER, false, true);
327 buttonComposite.setLayoutData(data);
328
329 fLoggersActivateButton = new Button(buttonComposite, SWT.RADIO);
330 fLoggersActivateButton.setText(Messages.TraceControl_EnableGroupSelectionName);
331 data = new GridData(GridData.FILL_HORIZONTAL);
332 fLoggersActivateButton.setLayoutData(data);
333 fLoggersActivateButton.addSelectionListener(new SelectionAdapter() {
334 @Override
335 public void widgetSelected(SelectionEvent e) {
336 setEnablements(GroupEnum.LOGGERS);
337 }
338 });
339
340 // Create the group for the tree
341 Group loggersGroup = new Group(loggersMainGroup, SWT.SHADOW_NONE);
342 layout = new GridLayout(1, true);
343 loggersGroup.setLayout(layout);
344 data = new GridData(GridData.FILL_BOTH);
345 loggersGroup.setLayoutData(data);
346 new FilteredTree(loggersGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, new PatternFilter(), true) {
347 @Override
348 protected TreeViewer doCreateTreeViewer(Composite aparent, int style) {
349 fLoggersViewer = new CheckboxTreeViewer(aparent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
350 fLoggersViewer.getTree().setToolTipText(Messages.TraceControl_EnableEventsLoggerTreeTooltip);
351 fLoggersViewer.setContentProvider(new LoggersContentProvider());
352
353 fLoggersViewer.setLabelProvider(new LoggersLabelProvider());
354 fLoggersViewer.addCheckStateListener(new LoggersCheckStateListener());
355
356 fLoggersViewer.setInput(fProviderGroup.getParent());
357 fLoggersViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
358 return fLoggersViewer;
359 }
360 };
690cef63
BR
361
362 Group specificLoggerGroup = new Group(loggersGroup, SWT.SHADOW_NONE);
363 specificLoggerGroup.setText(Messages.TraceControl_EnableEventsSpecificLoggerGroupName);
364 layout = new GridLayout(4, true);
365 specificLoggerGroup.setLayout(layout);
366 specificLoggerGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
367
368 Label specificLoggerLabel = new Label(specificLoggerGroup, SWT.LEFT);
369 specificLoggerLabel.setText(Messages.TraceControl_EnableEventsNameLabel);
370 data = new GridData(GridData.FILL_HORIZONTAL);
371 data.horizontalSpan = 1;
372 specificLoggerLabel.setLayoutData(data);
373
374 fSpecificLoggerText = new Text(specificLoggerGroup, SWT.LEFT);
375 fSpecificLoggerText.setToolTipText(Messages.TraceControl_EnableEventsSpecificLoggerTooltip);
376 data = new GridData(GridData.FILL_HORIZONTAL);
377 data.horizontalSpan = 3;
378 fSpecificLoggerText.setLayoutData(data);
74fe9bdd
BR
379 }
380
381 /**
382 * Creates log level group.
383 */
384 private void createLogLevelGroup() {
385 Group logLevelMainGroup = new Group(this, SWT.SHADOW_NONE);
386 logLevelMainGroup.setText(Messages.TraceControl_EnableEventsLogLevelGroupName);
387 GridLayout layout = new GridLayout(2, false);
388 logLevelMainGroup.setLayout(layout);
389 GridData data = new GridData(GridData.FILL_HORIZONTAL);
390 logLevelMainGroup.setLayoutData(data);
391
392 Composite buttonComposite = new Composite(logLevelMainGroup, SWT.NONE);
393 layout = new GridLayout(1, false);
394 buttonComposite.setLayout(layout);
395 data = new GridData(SWT.BEGINNING, SWT.CENTER, false, true);
396 buttonComposite.setLayoutData(data);
397
398 fLogLevelActivateButton = new Button(buttonComposite, SWT.CHECK);
399 fLogLevelActivateButton.setText(Messages.TraceControl_EnableGroupSelectionName);
400 fLogLevelActivateButton.setSelection(false);
401 data = new GridData(GridData.FILL_HORIZONTAL);
402 fLogLevelActivateButton.setLayoutData(data);
403 fLogLevelActivateButton.addSelectionListener(new SelectionAdapter() {
404 @Override
405 public void widgetSelected(SelectionEvent e) {
406 fLogLevelCombo.setEnabled(fLogLevelActivateButton.getSelection());
407 fLogLevelButton.setEnabled(fLogLevelActivateButton.getSelection());
408 fLogLevelOnlyButton.setEnabled(fLogLevelActivateButton.getSelection());
409 }
410 });
411
412 Group logLevelGroup = new Group(logLevelMainGroup, SWT.SHADOW_NONE);
413 layout = new GridLayout(2, true);
414 logLevelGroup.setLayout(layout);
415 logLevelGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
416
417 fLogLevelButton = new Button(logLevelGroup, SWT.RADIO);
418 fLogLevelButton.setText(Messages.TraceControl_EnableEventsLogLevelTypeName);
419 fLogLevelButton.setToolTipText(Messages.TraceControl_EnableEventsLogLevelTypeTooltip);
420 data = new GridData(GridData.FILL_BOTH);
421 fLogLevelButton.setLayoutData(data);
422 fLogLevelButton.setSelection(true);
423
424 fLogLevelOnlyButton = new Button(logLevelGroup, SWT.RADIO);
425 fLogLevelOnlyButton.setText(Messages.TraceControl_EnableEventsLogLevelOnlyTypeName);
426 fLogLevelOnlyButton.setToolTipText(Messages.TraceControl_EnableEventsLogLevelOnlyTypeTooltip);
427 data = new GridData(GridData.FILL_BOTH);
428 fLogLevelButton.setLayoutData(data);
429
430 fLogLevelCombo = new CCombo(logLevelGroup, SWT.READ_ONLY);
431 ITraceLogLevel[] levels = getLogLevelNames();
432 if (levels != null) {
433 String[] levelNames = new String[levels.length - 1];
434 int k = 0;
435 for (int i = 0; i < levels.length; i++) {
436 if (levels[i] != TraceJulLogLevel.LEVEL_UNKNOWN &&
3d2d8c9f
BR
437 levels[i] != TraceLog4jLogLevel.LEVEL_UNKNOWN &&
438 levels[i] != TracePythonLogLevel.LEVEL_UNKNOWN) {
74fe9bdd
BR
439 levelNames[k++] = levels[i].getInName();
440 }
441 }
442 fLogLevelCombo.setItems(levelNames);
443 }
444
445 fLogLevelCombo.setToolTipText(Messages.TraceControl_EnableEventsLogLevelTooltip);
446 data = new GridData(GridData.FILL_HORIZONTAL);
447 data.horizontalSpan = 4;
448 fLogLevelCombo.setLayoutData(data);
449
450 // By default the combo box and the buttons are not enabled
451 fLogLevelCombo.setEnabled(false);
452 fLogLevelButton.setEnabled(false);
453 fLogLevelOnlyButton.setEnabled(false);
454
455 }
456
457 /**
458 * Enable/selects widgets depending on the group specified.
459 *
460 * @param group
461 * group to enable.
462 */
463 private void setEnablements(GroupEnum group) {
464
465 // Enable/disable trace point items
466 fLoggersActivateButton.setSelection(group == GroupEnum.LOGGERS);
467 fLoggersViewer.getTree().setEnabled(group == GroupEnum.LOGGERS);
468 }
469
470 /**
471 * Content provider for the loggers tree.
472 */
473 public final class LoggersContentProvider extends TraceControlContentProvider {
474 @Override
475 public Object[] getChildren(Object parentElement) {
476 if (parentElement instanceof TargetNodeComponent) {
477 List<ITraceControlComponent> children = ((ITraceControlComponent) parentElement).getChildren(TraceProviderGroup.class);
478 return children.toArray(new ITraceControlComponent[children.size()]);
479 }
480 if (parentElement instanceof TraceProviderGroup) {
481 List<ITraceControlComponent> ustProviderChildren = ((ITraceControlComponent) parentElement).getChildren(UstProviderComponent.class)
482 .stream().filter(comp -> ((UstProviderComponent) comp).getLoggerComponents(fDomain).size() > 0)
483 .collect(Collectors.toList());
484 return ustProviderChildren.toArray(new ITraceControlComponent[ustProviderChildren.size()]);
485 }
486 if (parentElement instanceof UstProviderComponent) {
487 List<ITraceControlComponent> loggers = ((UstProviderComponent) parentElement).getLoggerComponents(fDomain);
488 return loggers.toArray(new ITraceControlComponent[loggers.size()]);
489 }
490 return new Object[0];
491 }
492 }
493
494 /**
495 * Content label for the loggers tree.
496 */
497 public static final class LoggersLabelProvider extends TraceControlLabelProvider {
498 @Override
499 public Image getImage(Object element) {
500 return null;
501 }
502
503 @Override
504 public String getText(Object element) {
505 if ((element != null) && (element instanceof TraceProviderGroup)) {
506 return Messages.TraceControl_EnableEventsTreeAllLabel;
507 }
508
509 if ((element != null) && (element instanceof UstProviderComponent)) {
510 return Messages.TraceControl_EnableEventsTreeAllLabel + " - " + ((UstProviderComponent)element).getName(); //$NON-NLS-1$
511 }
512 return super.getText(element);
513 }
514 }
515
516 /**
517 * Check state listener for the loggers tree.
518 */
519 public final class LoggersCheckStateListener implements ICheckStateListener {
520 @Override
521 public void checkStateChanged(CheckStateChangedEvent event) {
522 if (event.getChecked()) {
523 if (event.getElement() instanceof TraceProviderGroup) {
524 fLoggersViewer.setSubtreeChecked(event.getElement(), true);
525 }
526 if (event.getElement() instanceof UstProviderComponent) {
527 fLoggersViewer.setSubtreeChecked(event.getElement(), true);
528 }
529 } else {
530 if (event.getElement() instanceof TraceProviderGroup) {
531 fLoggersViewer.setSubtreeChecked(event.getElement(), true);
532 }
533 if (event.getElement() instanceof UstProviderComponent) {
534 ITraceControlComponent component = (ITraceControlComponent) event.getElement();
535 fLoggersViewer.setSubtreeChecked(event.getElement(), false);
536 fLoggersViewer.setChecked(component.getParent(), false);
537 } else {
538 ITraceControlComponent component = (ITraceControlComponent) event.getElement();
539 fLoggersViewer.setChecked(component.getParent(), false);
540 fLoggersViewer.setChecked(component.getParent().getParent(), false);
541 }
542 }
543 }
544 }
545}
This page took 0.04716 seconds and 5 git commands to generate.