/********************************************************************** * Copyright (c) 2012, 2014 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Bernd Hufmann - Initial API and implementation * Bernd Hufmann - Updated for support of LTTng Tools 2.1 **********************************************************************/ package org.eclipse.tracecompass.internal.lttng2.control.ui.views.dialogs; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Shell; import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel; import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType; import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType; import org.eclipse.tracecompass.internal.lttng2.control.ui.Activator; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.messages.Messages; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceDomainComponent; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceProviderGroup; /** * <p> * Dialog box for collecting information events to be enabled. * </p> * * @author Bernd Hufmann */ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog { // ------------------------------------------------------------------------ // Constants // ------------------------------------------------------------------------ /** * The icon file for this dialog box. */ public static final String ENABLE_EVENT_ICON_FILE = "icons/elcl16/enable_event.gif"; //$NON-NLS-1$ // ------------------------------------------------------------------------ // Attributes // ------------------------------------------------------------------------ /** * The dialog composite. */ private Composite fDialogComposite; /** * The composite with widgets for collecting information about kernel events. */ private EnableKernelEventComposite fKernelComposite; /** * The composite with widgets for collecting information about UST events. */ private EnableUstEventsComposite fUstComposite; /** * The composite with widgets for collecting information about JUL events. */ private EnableLoggersComposite fJulComposite; /** * The composite with widgets for collecting information about LOG4J events. */ private EnableLoggersComposite fLog4jComposite; /** * The composite with widgets for collecting information about Python events. */ private EnableLoggersComposite fPythonComposite; /** * Radio button for selecting kernel domain. */ private Button fKernelButton; /** * Radio button for selecting UST domain. */ private Button fUstButton; /** * Radio button for selecting JUL domain. */ private Button fJulButton; /** * Radio button for selecting LOG4J domain. */ private Button fLog4jButton; /** * Radio button for selecting Python domain. */ private Button fPythonButton; /** * The referenced trace provider group containing the kernel provider and UST * provider component which contains a list of available tracepoints. */ private TraceProviderGroup fProviderGroup; /** * The parent domain component where the channel node should be added. * Null in case the domain is not known (i.e. on session level). */ private TraceDomainComponent fDomainComponent; /** * The domain type ({@link TraceDomainType}) */ private TraceDomainType fDomain; // ------------------------------------------------------------------------ // Constructors // ------------------------------------------------------------------------ /** * Constructor * @param shell - a shell for the display of the dialog */ public EnableEventsDialog(Shell shell) { super(shell); setShellStyle(SWT.RESIZE | getShellStyle()); } // ------------------------------------------------------------------------ // Accessors // ------------------------------------------------------------------------ @Override public boolean isAllEvents() { switch (fDomain) { case KERNEL: return fKernelComposite.isAllEvents(); case JUL: return fJulComposite.isAllTracePoints(); case UST: return fUstComposite.isAllTracePoints(); case LOG4J: return fLog4jComposite.isAllTracePoints(); case PYTHON: return fPythonComposite.isAllTracePoints(); case UNKNOWN: default: return false; } } @Override public boolean isTracepoints() { switch (fDomain) { case JUL: case LOG4J: case PYTHON: // Loggers are always TRACEPOINT return true; case KERNEL: return fKernelComposite.isTracepoints(); case UST: return fUstComposite.isTracepoints(); case UNKNOWN: default: return false; } } @Override public boolean isAllTracePoints() { switch (fDomain) { case KERNEL: return fKernelComposite.isAllTracePoints(); case UST: return fUstComposite.isAllTracePoints(); case JUL: return fJulComposite.isAllTracePoints(); case LOG4J: return fLog4jComposite.isAllTracePoints(); case PYTHON: return fPythonComposite.isAllTracePoints(); case UNKNOWN: default: return false; } } @Override public boolean isSyscalls() { if (fDomain.equals(TraceDomainType.KERNEL)) { return fKernelComposite.isSyscalls(); } return false; } @Override public boolean isAllSyscalls() { if (fDomain.equals(TraceDomainType.KERNEL)) { return fKernelComposite.isAllSyscalls(); } return false; } @Override public List<String> getEventNames() { switch (fDomain) { case JUL: return fJulComposite.getEventNames(); case KERNEL: return fKernelComposite.getEventNames(); case UST: return fUstComposite.getEventNames(); case LOG4J: return fLog4jComposite.getEventNames(); case PYTHON: return fPythonComposite.getEventNames(); case UNKNOWN: default: return null; } } @Override public boolean isDynamicProbe() { if (fDomain.equals(TraceDomainType.KERNEL)) { return fKernelComposite.isDynamicProbe(); } return false; } @Override public String getProbeName() { if (fDomain.equals(TraceDomainType.KERNEL)) { return fKernelComposite.getProbeName(); } return null; } @Override public String getProbeEventName() { if (fDomain.equals(TraceDomainType.KERNEL)) { return fKernelComposite.getProbeEventName(); } return null; } @Override public boolean isDynamicFunctionProbe() { if (fDomain.equals(TraceDomainType.KERNEL)) { return fKernelComposite.isDynamicFunctionProbe(); } return false; } @Override public String getFunctionEventName() { if (fDomain.equals(TraceDomainType.KERNEL)) { return fKernelComposite.getFunctionEventName(); } return null; } @Override public String getFunction() { if (fDomain.equals(TraceDomainType.KERNEL)) { return fKernelComposite.getFunction(); } return null; } @Override public boolean isWildcard() { if (fDomain.equals(TraceDomainType.UST)) { return fUstComposite.isWildcard(); } return false; } @Override public String getWildcard() { if (fDomain.equals(TraceDomainType.UST)) { return fUstComposite.getWildcard(); } return null; } @Override public boolean isLogLevel() { switch (fDomain) { case JUL: return fJulComposite.isLogLevel(); case KERNEL: return false; case UST: return fUstComposite.isLogLevel(); case LOG4J: return fLog4jComposite.isLogLevel(); case PYTHON: return fPythonComposite.isLogLevel(); case UNKNOWN: default: return false; } } @Override public LogLevelType getLogLevelType() { switch (fDomain) { case JUL: return fJulComposite.getLogLevelType(); case KERNEL: return null; case UST: return fUstComposite.getLogLevelType(); case LOG4J: return fLog4jComposite.getLogLevelType(); case PYTHON: return fPythonComposite.getLogLevelType(); case UNKNOWN: default: return null; } } @Override public ITraceLogLevel getLogLevel() { switch (fDomain) { case JUL: return fJulComposite.getLogLevel(); case KERNEL: return null; case UST: return fUstComposite.getLogLevel(); case LOG4J: return fLog4jComposite.getLogLevel(); case PYTHON: return fPythonComposite.getLogLevel(); case UNKNOWN: default: return null; } } @Override public TraceDomainType getDomain() { return fDomain; } @Override public void setTraceProviderGroup(TraceProviderGroup providerGroup) { fProviderGroup = providerGroup; } @Override public void setTraceDomainComponent(TraceDomainComponent domain) { fDomainComponent = domain; if (fDomainComponent != null) { fDomain = fDomainComponent.getDomain(); } else { if (fProviderGroup != null) { fDomain = fProviderGroup.hasKernelProvider() ? TraceDomainType.KERNEL : TraceDomainType.UST; } } } @Override public String getFilterExpression() { switch (fDomain) { case KERNEL: return fKernelComposite.getFilterExpression(); case UST: return fUstComposite.getFilterExpression(); case JUL: case LOG4J: case PYTHON: case UNKNOWN: default: return null; } } @Override public List<String> getExcludedEvents() { if (fDomain.equals(TraceDomainType.UST)) { return fUstComposite.getExcludedEvents(); } return null; } // ------------------------------------------------------------------------ // Operations // ------------------------------------------------------------------------ @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(Messages.TraceControl_EnableEventsDialogTitle); newShell.setImage(Activator.getDefault().loadIcon(ENABLE_EVENT_ICON_FILE)); } @Override protected Control createDialogArea(Composite parent) { // Main dialog panel fDialogComposite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(1, true); fDialogComposite.setLayout(layout); fDialogComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); // ------------------------------------------------------------------------ // Domain Group // ------------------------------------------------------------------------ Group domainGroup = new Group(fDialogComposite, SWT.SHADOW_NONE); domainGroup.setText(Messages.TraceControl_DomainDisplayName); fKernelButton = new Button(domainGroup, SWT.RADIO); fKernelButton.setText(Messages.TraceControl_KernelDomainDisplayName); fUstButton = new Button(domainGroup, SWT.RADIO); fUstButton.setText(Messages.TraceControl_UstDisplayName); int nbColumns = 2; fKernelButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (fKernelButton.getSelection()) { disposeAllComposite(); createKernelComposite(); fDialogComposite.layout(); } } }); fUstButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (fUstButton.getSelection()) { disposeAllComposite(); createUstComposite(); fDialogComposite.layout(); } } }); if (fProviderGroup.isJulLoggingSupported()) { fJulButton = new Button(domainGroup, SWT.RADIO); fJulButton.setText(Messages.TraceControl_JULDomainDisplayName); nbColumns++; fJulButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (fJulButton.getSelection()) { disposeAllComposite(); createJulComposite(); fDialogComposite.layout(); } } }); } if (fProviderGroup.isLog4jLoggingSupported()) { fLog4jButton = new Button(domainGroup, SWT.RADIO); fLog4jButton.setText(Messages.TraceControl_LOG4JDomainDisplayName); nbColumns++; fLog4jButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (fLog4jButton.getSelection()) { disposeAllComposite(); createLog4jComposite(); fDialogComposite.layout(); } } }); } if (fProviderGroup.isPythonLoggingSupported()) { fPythonButton = new Button(domainGroup, SWT.RADIO); fPythonButton.setText(Messages.TraceControl_PythonDomainDisplayName); nbColumns++; fPythonButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (fPythonButton.getSelection()) { disposeAllComposite(); createPythonComposite(); fDialogComposite.layout(); } } }); } layout = new GridLayout(nbColumns, true); domainGroup.setLayout(layout); switch (fDomain) { case KERNEL: fKernelButton.setSelection(true); break; case UST: fUstButton.setSelection(true); break; case JUL: fJulButton.setSelection(true); break; case LOG4J: fLog4jButton.setSelection(true); break; case PYTHON: fPythonButton.setSelection(true); break; case UNKNOWN: default: break; } // layout widgets GridData data = new GridData(GridData.FILL_HORIZONTAL); domainGroup.setLayoutData(data); data = new GridData(SWT.BEGINNING, SWT.BEGINNING, true, true); fKernelButton.setLayoutData(data); data = new GridData(SWT.BEGINNING, SWT.BEGINNING, true, true); fUstButton.setLayoutData(data); // ------------------------------------------------------------------------ // Domain data group // ------------------------------------------------------------------------ fUstComposite = null; fKernelComposite = null; fJulComposite = null; fLog4jComposite = null; fPythonComposite= null; switch (fDomain) { case KERNEL: createKernelComposite(); break; case UST: createUstComposite(); break; case JUL: createJulComposite(); break; case LOG4J: createLog4jComposite(); break; case PYTHON: createPythonComposite(); break; case UNKNOWN: default: break; } if (fDomainComponent != null) { fKernelButton.setEnabled(false); fUstButton.setEnabled(false); if (fProviderGroup.isJulLoggingSupported()) { fJulButton.setEnabled(false); } if (fProviderGroup.isLog4jLoggingSupported()) { fLog4jButton.setEnabled(false); } if (fProviderGroup.isPythonLoggingSupported()) { fPythonButton.setEnabled(false); } } else if ((fProviderGroup != null) && (!fProviderGroup.hasKernelProvider())) { fKernelButton.setEnabled(false); fUstButton.setEnabled(true); if (fProviderGroup.isJulLoggingSupported()) { fJulButton.setEnabled(true); } if (fProviderGroup.isLog4jLoggingSupported()) { fLog4jButton.setEnabled(true); } if (fProviderGroup.isPythonLoggingSupported()) { fPythonButton.setEnabled(true); } } getShell().setMinimumSize(new Point(550, 850)); return fDialogComposite; } @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.CANCEL_ID, "&Cancel", true); //$NON-NLS-1$ createButton(parent, IDialogConstants.OK_ID, "&Ok", true); //$NON-NLS-1$ } @Override protected void okPressed() { if (fKernelButton.getSelection()) { fDomain = TraceDomainType.KERNEL; } else if (fUstButton.getSelection()){ fDomain = TraceDomainType.UST; } else if (fJulButton.getSelection()) { fDomain = TraceDomainType.JUL; } else if (fLog4jButton.getSelection()) { fDomain= TraceDomainType.LOG4J; } else if (fPythonButton.getSelection()) { fDomain = TraceDomainType.PYTHON; } // Validate kernel composite in case of kernel domain if (fKernelComposite != null && !fKernelComposite.isValid()) { return; } // Validate UST composite in case of UST domain if (fUstComposite != null && !fUstComposite.isValid()) { return; } // Validate JUL composite in case of JUL domain if (fJulComposite != null && !fJulComposite.isValid()) { return; } // Validate LOG4J composite in case of LOG4J domain if (fLog4jComposite != null && !fLog4jComposite.isValid()) { return; } // Validate Python composite in case of Python domain if (fPythonComposite != null && !fPythonComposite.isValid()) { return; } // validation successful -> call super.okPressed() super.okPressed(); } // ------------------------------------------------------------------------ // Helper methods // ------------------------------------------------------------------------ /** * Disposes all composites (if existing) */ private void disposeAllComposite() { disposeKernelComposite(); disposeUstComposite(); disposeJulComposite(); disposeLog4jComposite(); disposePythonComposite(); } /** * Creates the kernel composite (if not existing) */ private void createKernelComposite() { if (fKernelComposite == null) { fKernelComposite = new EnableKernelEventComposite(fDialogComposite, SWT.NONE, fProviderGroup); GridLayout layout = new GridLayout(1, true); fKernelComposite.setLayout(layout); fKernelComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); fKernelComposite.createContent(); } } /** * Disposes the kernel composite (if existing) */ private void disposeKernelComposite() { if (fKernelComposite != null) { fKernelComposite.dispose(); fKernelComposite = null; } } /** * Creates the UST composite (if not existing) */ private void createUstComposite() { if (fUstComposite == null) { fUstComposite = new EnableUstEventsComposite(fDialogComposite, SWT.NONE, fProviderGroup); GridLayout layout = new GridLayout(1, true); fUstComposite.setLayout(layout); fUstComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); fUstComposite.createContent(); } } /** * Disposes the UST composite (if existing) */ private void disposeUstComposite() { if (fUstComposite != null) { fUstComposite.dispose(); fUstComposite = null; } } /** * Creates the JUL composite (if not existing) */ private void createJulComposite() { if (fJulComposite == null) { fJulComposite = new EnableLoggersComposite(fDialogComposite, SWT.NONE, fProviderGroup, TraceDomainType.JUL); GridLayout layout = new GridLayout(1, true); fJulComposite.setLayout(layout); fJulComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); fJulComposite.createContent(); } } /** * Disposes the JUL composite (if existing) */ private void disposeJulComposite() { if (fJulComposite != null) { fJulComposite.dispose(); fJulComposite = null; } } /** * Creates the LOG4J composite (if not existing) */ private void createLog4jComposite() { if (fLog4jComposite == null) { fLog4jComposite = new EnableLoggersComposite(fDialogComposite, SWT.NONE, fProviderGroup, TraceDomainType.LOG4J); GridLayout layout = new GridLayout(1, true); fLog4jComposite.setLayout(layout); fLog4jComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); fLog4jComposite.createContent(); } } /** * Disposes the LOG4J composite (if existing) */ private void disposeLog4jComposite() { if (fLog4jComposite != null) { fLog4jComposite.dispose(); fLog4jComposite = null; } } /** * Creates the Python composite (if not existing) */ private void createPythonComposite() { if (fPythonComposite == null) { fPythonComposite = new EnableLoggersComposite(fDialogComposite, SWT.NONE, fProviderGroup, TraceDomainType.PYTHON); GridLayout layout = new GridLayout(1, true); fPythonComposite.setLayout(layout); fPythonComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); fPythonComposite.createContent(); } } /** * Disposes the Python composite (if existing) */ private void disposePythonComposite() { if (fPythonComposite != null) { fPythonComposite.dispose(); fPythonComposite = null; } } }