| /********************************************************************** |
| * Copyright (c) 2012, 2015 Ericsson |
| * |
| * All rights reserved. This program and the accompanying materials are |
| * made available under the terms of the Eclipse Public License 2.0 which |
| * accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Bernd Hufmann - Initial API and implementation |
| * Bernd Hufmann - Updated for support of LTTng Tools 2.1 |
| * Marc-Andre Laperle - Support for creating a live session |
| * Markus Schorn - Bug 448058: Use org.eclipse.remote in favor of RSE |
| **********************************************************************/ |
| |
| package org.eclipse.tracecompass.internal.lttng2.control.ui.views.dialogs; |
| |
| import org.eclipse.core.filesystem.IFileInfo; |
| import org.eclipse.core.filesystem.IFileStore; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.jface.dialogs.TitleAreaDialog; |
| import org.eclipse.remote.core.IRemoteFileService; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.custom.CCombo; |
| import org.eclipse.swt.events.FocusEvent; |
| import org.eclipse.swt.events.FocusListener; |
| import org.eclipse.swt.events.ModifyEvent; |
| import org.eclipse.swt.events.ModifyListener; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| 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.Label; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Text; |
| import org.eclipse.tracecompass.internal.lttng2.control.core.model.ISessionInfo; |
| import org.eclipse.tracecompass.internal.lttng2.control.core.model.impl.SessionInfo; |
| 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.TargetNodeComponent; |
| import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceSessionGroup; |
| import org.eclipse.tracecompass.internal.lttng2.control.ui.views.service.LTTngControlServiceConstants; |
| import org.eclipse.tracecompass.tmf.remote.core.proxy.RemoteSystemProxy; |
| |
| /** |
| * <p> |
| * Dialog box for collecting session creation information. |
| * </p> |
| * |
| * @author Bernd Hufmann |
| */ |
| public class CreateSessionDialog extends TitleAreaDialog implements ICreateSessionDialog { |
| |
| // ------------------------------------------------------------------------ |
| // Constants |
| // ------------------------------------------------------------------------ |
| /** |
| * The icon file for this dialog box. |
| */ |
| public static final String CREATE_SESSION_ICON_FILE = "icons/elcl16/add_button.gif"; //$NON-NLS-1$ |
| |
| /** |
| * To indicate that the default value will be used for this field |
| */ |
| private static final String DEFAULT_TEXT = "<" + Messages.EnableChannelDialog_DefaultMessage + ">"; //$NON-NLS-1$ //$NON-NLS-2$ |
| |
| /** |
| * Supported network protocols for streaming |
| */ |
| private enum StreamingProtocol { |
| /** Default network protocol for IPv4 (TCP)*/ |
| net, |
| /** Default network protocol for IPv6 (TCP)*/ |
| net6, |
| /** File */ |
| file, |
| } |
| |
| /** |
| * Supported network protocols for Live tracing |
| */ |
| private enum LiveProtocol { |
| /** Default network protocol for IPv4 (TCP)*/ |
| net, |
| /** Default network protocol for IPv6 (TCP)*/ |
| net6 |
| } |
| |
| private enum StreamingProtocol2 { |
| /** Default network protocol for IPv4 (TCP)*/ |
| net, |
| /** Default network protocol for IPv6 (TCP)*/ |
| net6, |
| /** TCP network protocol for IPv4*/ |
| tcp, |
| /** TCP network protocol for IPv6*/ |
| tcp6 } |
| |
| /** |
| * Index of last supported streaming protocol for common URL configuration. |
| */ |
| private static final int COMMON_URL_LAST_INDEX = 1; |
| /** |
| * Index of default streaming protocol. |
| */ |
| private static final int DEFAULT_URL_INDEX = 0; |
| |
| // ------------------------------------------------------------------------ |
| // Attributes |
| // ------------------------------------------------------------------------ |
| /** |
| * The dialog composite. |
| */ |
| private Composite fDialogComposite = null; |
| /** |
| * The text widget for the session name |
| */ |
| private Text fSessionNameText = null; |
| /** |
| * The label widget for the session path. |
| */ |
| private Label fSessionPathLabel = null; |
| /** |
| * The text widget for the session path. |
| */ |
| private Text fSessionPathText = null; |
| /** |
| * The button widget to select a normal session |
| */ |
| private Button fNormalModeButton = null; |
| /** |
| * The button widget to select a snapshot session |
| */ |
| private Button fSnapshotButton = null; |
| /** |
| * The group that contains the mutually exclusive mode buttons |
| */ |
| private Group fModeButtonGroup = null; |
| /** |
| * The button widget to select a live session |
| */ |
| private Button fLiveButton = null; |
| |
| /** |
| * The text widget to set a live delay |
| */ |
| private Text fLiveDelayText = null; |
| /** |
| * The Group for advanced configuration. |
| */ |
| private Group fAdvancedGroup = null; |
| /** |
| * The button to show advanced options. |
| */ |
| private Button fAdvancedButton = null; |
| /** |
| * The composite with streaming configuration parameter. |
| */ |
| private Composite fStreamingComposite = null; |
| /** |
| * The text widget for the trace path. |
| */ |
| private Text fTracePathText = null; |
| /** |
| * The button to link data protocol/Address with control protocol. |
| */ |
| private Button fLinkDataWithControlButton = null; |
| /** |
| * The Combo box for channel protocol selection. |
| */ |
| private CCombo fControlProtocolCombo = null; |
| /** |
| * A selection listener that copies the protocol from control to data when being linked. |
| */ |
| private ControlProtocolSelectionListener fCopyProtocolSelectionListener; |
| /** |
| * A selection listener updates the control port text depending on the control protocol selected. |
| */ |
| private ProtocolComboSelectionListener fControlProtocolSelectionListener; |
| /** |
| * A selection listener updates the data port text depending on the data protocol selected. |
| */ |
| private ProtocolComboSelectionListener fDataProtocolSelectionListener; |
| /** |
| * The text box for the host/IP address of the control channel. |
| */ |
| private Text fControlHostAddressText = null; |
| /** |
| * A key listener that copies the host address from control to data when being linked. |
| */ |
| private CopyModifyListener fControlUrlKeyListener; |
| /** |
| * A modify listener that updates the enablement of the dialog. |
| */ |
| private UpdateEnablementModifyListener fUpdateEnablementModifyListener; |
| /** |
| * The text box for the control port. |
| */ |
| private Text fControlPortText = null; |
| /** |
| * The Combo box for data protocol selection. |
| */ |
| private CCombo fDataProtocolCombo = null; |
| /** |
| * The text box for the host/IP address of the data channel. |
| */ |
| private Text fDataHostAddressText = null; |
| /** |
| * The text box for the data port. |
| */ |
| private Text fDataPortText = null; |
| /** |
| * The parent where the new node should be added. |
| */ |
| private TraceSessionGroup fParent = null; |
| /** |
| * The session name string. |
| */ |
| private String fSessionName = ""; //$NON-NLS-1$; |
| /** |
| * The session path string. |
| */ |
| private String fSessionPath = null; |
| /** |
| * Flag whether the session is snapshot or not |
| */ |
| private boolean fIsSnapshot = false; |
| /** |
| * Flag whether the session is live or not |
| */ |
| private boolean fIsLive = false; |
| /** |
| * The text box for the live address (relayd). |
| */ |
| private Text fLiveHostAddressText = null; |
| /** |
| * The text box for the live port (relayd). |
| */ |
| private Text fLivePortText = null; |
| /** |
| * The live delay |
| */ |
| private Long fLiveDelay = 0L; |
| /** |
| * The live url. |
| */ |
| private String fLiveUrl = null; |
| /** |
| * The live port. |
| */ |
| private Integer fLivePort = 0; |
| /** |
| * Flag whether default location (path) shall be used or not |
| */ |
| private boolean fIsDefaultPath = true; |
| /** |
| * Flag whether the advanced options are enabled or not |
| */ |
| private boolean fIsAdvancedEnabled = false; |
| /** |
| * The network URL in case control and data is configured together. |
| * If set, fControlUrl and fDataUrl will be null. |
| */ |
| private String fNetworkUrl = null; |
| /** |
| * The control URL in case control and data is configured separately. |
| * If set, fDataUrl will be set too and fNetworkUrl will be null. |
| */ |
| private String fControlUrl = null; |
| /** |
| * The data URL in case control and data is configured separately. |
| * If set, fControlUrl will be set too and fNetworkUrl will be null. |
| */ |
| private String fDataUrl = null; |
| /** |
| * The trace path string. |
| */ |
| private String fTracePath = null; |
| /** |
| * The Group for advanced configuration of Live mode. |
| */ |
| private Group fLiveGroup = null; |
| |
| // ------------------------------------------------------------------------ |
| // Constructors |
| // ------------------------------------------------------------------------ |
| /** |
| * Constructor |
| * @param shell - a shell for the display of the dialog |
| */ |
| public CreateSessionDialog(Shell shell) { |
| super(shell); |
| setShellStyle(SWT.RESIZE | getShellStyle()); |
| } |
| |
| // ------------------------------------------------------------------------ |
| // Accessors |
| // ------------------------------------------------------------------------ |
| |
| @Override |
| public void initialize(TraceSessionGroup group) { |
| fParent = group; |
| fStreamingComposite = null; |
| fLiveGroup = null; |
| fLiveButton = null; |
| fIsLive = false; |
| fSnapshotButton = null; |
| fSessionName = ""; //$NON-NLS-1$ |
| fSessionPath = null; |
| fIsSnapshot = false; |
| fIsDefaultPath = true; |
| fIsAdvancedEnabled = false; |
| fNetworkUrl = null; |
| fControlUrl = null; |
| fDataUrl = null; |
| } |
| // ------------------------------------------------------------------------ |
| // Operations |
| // ------------------------------------------------------------------------ |
| |
| @Override |
| protected void configureShell(Shell newShell) { |
| super.configureShell(newShell); |
| newShell.setText(Messages.TraceControl_CreateSessionDialogTitle); |
| newShell.setImage(Activator.getDefault().loadIcon(CREATE_SESSION_ICON_FILE)); |
| } |
| |
| @Override |
| protected Control createDialogArea(Composite parent) { |
| Composite dialogAreaa = (Composite) super.createDialogArea(parent); |
| setTitle(Messages.TraceControl_CreateSessionDialogTitle); |
| setMessage(Messages.TraceControl_CreateSessionDialogMessage); |
| |
| // Main dialog panel |
| fDialogComposite = new Composite(dialogAreaa, SWT.NONE); |
| GridLayout layout = new GridLayout(1, true); |
| fDialogComposite.setLayout(layout); |
| fDialogComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| |
| Group sessionGroup = new Group(fDialogComposite, SWT.SHADOW_NONE); |
| sessionGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| sessionGroup.setLayout(new GridLayout(4, true)); |
| |
| fUpdateEnablementModifyListener = new UpdateEnablementModifyListener(); |
| |
| Label sessionNameLabel = new Label(sessionGroup, SWT.RIGHT); |
| sessionNameLabel.setText(Messages.TraceControl_CreateSessionNameLabel); |
| fSessionNameText = new Text(sessionGroup, SWT.NONE); |
| fSessionNameText.setToolTipText(Messages.TraceControl_CreateSessionNameTooltip); |
| fSessionNameText.addModifyListener(fUpdateEnablementModifyListener); |
| GridData data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 3; |
| fSessionNameText.setLayoutData(data); |
| |
| fSessionPathLabel = new Label(sessionGroup, SWT.RIGHT); |
| fSessionPathLabel.setText(Messages.TraceControl_CreateSessionPathLabel); |
| fSessionPathText = new Text(sessionGroup, SWT.NONE); |
| fSessionPathText.setToolTipText(Messages.TraceControl_CreateSessionPathTooltip); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 3; |
| fSessionPathText.setLayoutData(data); |
| fSessionPathText.addModifyListener(fUpdateEnablementModifyListener); |
| |
| if (fParent.isSnapshotSupported() || fParent.isLiveSupported()) { |
| fModeButtonGroup = new Group(sessionGroup, SWT.NONE); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 4; |
| fModeButtonGroup.setLayoutData(data); |
| fModeButtonGroup.setLayout(new GridLayout(3, true)); |
| |
| SelectionAdapter modeChangedListener = new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| if (fLiveButton != null) { |
| if (fLiveButton.getSelection()) { |
| createAdvancedLiveGroup(); |
| updateSessionPathEnablement(); |
| updateProtocolComboItems(); |
| } else { |
| disposeLiveGroup(); |
| updateSessionPathEnablement(); |
| updateProtocolComboItems(); |
| } |
| } |
| updateEnablement(); |
| } |
| }; |
| |
| fNormalModeButton = new Button(fModeButtonGroup, SWT.RADIO); |
| fNormalModeButton.setText(Messages.TraceControl_CreateSessionNormalLabel); |
| fNormalModeButton.setToolTipText(Messages.TraceControl_CreateSessionNormalTooltip); |
| fNormalModeButton.setSelection(true); |
| fNormalModeButton.addSelectionListener(modeChangedListener); |
| |
| if (fParent.isSnapshotSupported()) { |
| fSnapshotButton = new Button(fModeButtonGroup, SWT.RADIO); |
| fSnapshotButton.setText(Messages.TraceControl_CreateSessionSnapshotLabel); |
| fSnapshotButton.setToolTipText(Messages.TraceControl_CreateSessionSnapshotTooltip); |
| fSnapshotButton.addSelectionListener(modeChangedListener); |
| } |
| |
| if (fParent.isLiveSupported()) { |
| fLiveButton = new Button(fModeButtonGroup, SWT.RADIO); |
| fLiveButton.setText(Messages.TraceControl_CreateSessionLiveLabel); |
| fLiveButton.setToolTipText(Messages.TraceControl_CreateSessionLiveTooltip); |
| fLiveButton.addSelectionListener(modeChangedListener); |
| } |
| } |
| |
| if (fParent.isNetworkStreamingSupported() || fParent.isLiveSupported()) { |
| createAdvancedOptionsComposite(); |
| } |
| |
| return fDialogComposite; |
| } |
| |
| private void createAdvancedOptionsComposite() { |
| |
| fAdvancedGroup = new Group(fDialogComposite, SWT.SHADOW_NONE); |
| fAdvancedGroup.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| fAdvancedGroup.setLayout(new GridLayout(1, true)); |
| |
| fAdvancedButton = new Button(fAdvancedGroup, SWT.PUSH); |
| fAdvancedButton.setText(Messages.TraceControl_CreateSessionConfigureStreamingButtonText + " >>>"); //$NON-NLS-1$ |
| fAdvancedButton.setToolTipText(Messages.TraceControl_CreateSessionConfigureStreamingButtonTooltip); |
| fAdvancedButton.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| if (fIsAdvancedEnabled) { |
| fIsAdvancedEnabled = false; |
| fAdvancedButton.setText(Messages.TraceControl_CreateSessionConfigureStreamingButtonText + " >>>"); //$NON-NLS-1$ |
| fAdvancedButton.setToolTipText(Messages.TraceControl_CreateSessionConfigureStreamingButtonTooltip); |
| |
| if (fParent.isNetworkStreamingSupported()) { |
| updateSessionPathEnablement(); |
| disposeConfigureStreamingComposite(); |
| } |
| |
| if (fParent.isLiveSupported()) { |
| disposeLiveGroup(); |
| } |
| } else { |
| fIsAdvancedEnabled = true; |
| fAdvancedButton.setText("<<< " + Messages.TraceControl_CreateSessionNoStreamingButtonText); //$NON-NLS-1$ |
| fAdvancedButton.setToolTipText(Messages.TraceControl_CreateSessionNoStreamingButtonTooltip); |
| |
| if (fParent.isNetworkStreamingSupported()) { |
| updateSessionPathEnablement(); |
| createConfigureStreamingComposite(); |
| } |
| if (fLiveButton != null && fLiveButton.getSelection()) { |
| createAdvancedLiveGroup(); |
| } |
| } |
| |
| updateEnablement(); |
| getShell().pack(); |
| } |
| }); |
| } |
| |
| private void updateSessionPathEnablement() { |
| if (fIsAdvancedEnabled || fIsLive) { |
| fSessionPathText.setEnabled(false); |
| fSessionPathText.setText(""); //$NON-NLS-1$ |
| fSessionPathLabel.setText(""); //$NON-NLS-1$ |
| } else { |
| fSessionPathText.setEnabled(true); |
| fSessionPathLabel.setText(Messages.TraceControl_CreateSessionPathLabel); |
| } |
| } |
| |
| private void updateProtocolComboItems() { |
| if (fControlProtocolCombo == null || fControlProtocolCombo.isDisposed()) { |
| return; |
| } |
| |
| int currentSelection = fControlProtocolCombo.getSelectionIndex() <= COMMON_URL_LAST_INDEX ? |
| fControlProtocolCombo.getSelectionIndex() : DEFAULT_URL_INDEX; |
| |
| fControlProtocolCombo.removeAll(); |
| Enum<? extends Enum<?>>[] values; |
| if (fIsLive) { |
| values = LiveProtocol.values(); |
| } else if (fLinkDataWithControlButton.getSelection()) { |
| values = StreamingProtocol.values(); |
| } else { |
| values = StreamingProtocol2.values(); |
| } |
| |
| String[] controlItems = new String[values.length]; |
| for (int i = 0; i < controlItems.length; i++) { |
| controlItems[i] = values[i].name(); |
| } |
| fControlProtocolCombo.setItems(controlItems); |
| fDataProtocolCombo.setItems(controlItems); |
| |
| // Set selection |
| if (currentSelection != -1) { |
| fControlProtocolCombo.select(currentSelection); |
| fDataProtocolCombo.select(currentSelection); |
| } |
| } |
| |
| private void createConfigureStreamingComposite() { |
| if (fStreamingComposite == null) { |
| fStreamingComposite = new Group(fAdvancedGroup, SWT.SHADOW_NONE); |
| GridLayout layout = new GridLayout(1, true); |
| fStreamingComposite.setLayout(layout); |
| fStreamingComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| |
| layout = new GridLayout(7, true); |
| fStreamingComposite.setLayout(layout); |
| fStreamingComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| |
| Label tracePathLabel = new Label(fStreamingComposite, SWT.RIGHT); |
| tracePathLabel.setText(Messages.TraceControl_CreateSessionTracePathText); |
| fTracePathText = new Text(fStreamingComposite, SWT.NONE); |
| fTracePathText.setToolTipText(Messages.TraceControl_CreateSessionTracePathTooltip); |
| |
| // layout widgets |
| GridData data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 6; |
| fTracePathText.setLayoutData(data); |
| fTracePathText.addModifyListener(fUpdateEnablementModifyListener); |
| |
| fLinkDataWithControlButton = new Button(fStreamingComposite, SWT.CHECK); |
| fLinkDataWithControlButton.setText(Messages.TraceControl_CreateSessionLinkButtonText); |
| fLinkDataWithControlButton.setToolTipText(Messages.TraceControl_CreateSessionLinkButtonTooltip); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 7; |
| fLinkDataWithControlButton.setLayoutData(data); |
| fLinkDataWithControlButton.setSelection(true); |
| |
| Label label = new Label(fStreamingComposite, SWT.NONE); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 1; |
| label.setLayoutData(data); |
| |
| label = new Label(fStreamingComposite, SWT.NONE); |
| label.setText(Messages.TraceControl_CreateSessionProtocolLabelText); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 1; |
| label.setLayoutData(data); |
| |
| label = new Label(fStreamingComposite, SWT.NONE); |
| label.setText(Messages.TraceControl_CreateSessionAddressLabelText); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 4; |
| label.setLayoutData(data); |
| |
| label = new Label(fStreamingComposite, SWT.NONE); |
| label.setText(Messages.TraceControl_CreateSessionPortLabelText); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 1; |
| label.setLayoutData(data); |
| |
| label = new Label(fStreamingComposite, SWT.RIGHT); |
| label.setText(Messages.TraceControl_CreateSessionControlUrlLabel); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 1; |
| label.setLayoutData(data); |
| |
| fControlProtocolCombo = new CCombo(fStreamingComposite, SWT.READ_ONLY); |
| fControlProtocolCombo.setToolTipText(Messages.TraceControl_CreateSessionCommonProtocolTooltip); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 1; |
| fControlProtocolCombo.setLayoutData(data); |
| fControlProtocolCombo.addModifyListener(fUpdateEnablementModifyListener); |
| |
| fControlHostAddressText = new Text(fStreamingComposite, SWT.NONE); |
| fControlHostAddressText.setToolTipText(Messages.TraceControl_CreateSessionControlAddressTooltip); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 4; |
| fControlHostAddressText.setLayoutData(data); |
| fControlHostAddressText.addModifyListener(fUpdateEnablementModifyListener); |
| |
| fControlPortText = new Text(fStreamingComposite, SWT.NONE); |
| fControlPortText.setToolTipText(Messages.TraceControl_CreateSessionControlPortTooltip); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 1; |
| fControlPortText.setLayoutData(data); |
| fControlPortText.addModifyListener(fUpdateEnablementModifyListener); |
| |
| label = new Label(fStreamingComposite, SWT.RIGHT); |
| label.setText(Messages.TraceControl_CreateSessionDataUrlLabel); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 1; |
| label.setLayoutData(data); |
| |
| fDataProtocolCombo = new CCombo(fStreamingComposite, SWT.READ_ONLY); |
| fDataProtocolCombo.setEnabled(false); |
| fDataProtocolCombo.setToolTipText(Messages.TraceControl_CreateSessionProtocolTooltip); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 1; |
| fDataProtocolCombo.setLayoutData(data); |
| fDataProtocolCombo.addModifyListener(fUpdateEnablementModifyListener); |
| |
| updateProtocolComboItems(); |
| |
| fDataHostAddressText = new Text(fStreamingComposite, SWT.NONE); |
| fDataHostAddressText.setEnabled(false); |
| fDataHostAddressText.setToolTipText(Messages.TraceControl_CreateSessionDataAddressTooltip); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 4; |
| fDataHostAddressText.setLayoutData(data); |
| fDataHostAddressText.addModifyListener(fUpdateEnablementModifyListener); |
| |
| fDataPortText = new Text(fStreamingComposite, SWT.NONE); |
| fDataPortText.setEnabled(true); |
| fDataPortText.setToolTipText(Messages.TraceControl_CreateSessionDataPortTooltip); |
| data = new GridData(GridData.FILL_HORIZONTAL); |
| data.horizontalSpan = 1; |
| fDataPortText.setLayoutData(data); |
| fDataPortText.addModifyListener(fUpdateEnablementModifyListener); |
| |
| fCopyProtocolSelectionListener = new ControlProtocolSelectionListener(); |
| fControlProtocolSelectionListener = new ProtocolComboSelectionListener(fControlProtocolCombo, fControlPortText); |
| fDataProtocolSelectionListener = new ProtocolComboSelectionListener(fDataProtocolCombo, fDataPortText); |
| |
| fControlProtocolCombo.addSelectionListener(fCopyProtocolSelectionListener); |
| |
| fControlUrlKeyListener = new CopyModifyListener(fControlHostAddressText, fDataHostAddressText); |
| fControlHostAddressText.addModifyListener(fControlUrlKeyListener); |
| |
| fControlProtocolCombo.select(DEFAULT_URL_INDEX); |
| fDataProtocolCombo.select(DEFAULT_URL_INDEX); |
| |
| fLinkDataWithControlButton.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| if (fLinkDataWithControlButton.getSelection()) { |
| // Set enablement control data channel inputs |
| fDataProtocolCombo.setEnabled(false); |
| fDataHostAddressText.setEnabled(false); |
| fControlPortText.setEnabled(true); |
| fDataPortText.setEnabled(true); |
| |
| // Update listeners |
| fControlProtocolCombo.removeSelectionListener(fControlProtocolSelectionListener); |
| fDataProtocolCombo.removeSelectionListener(fDataProtocolSelectionListener); |
| fControlProtocolCombo.addSelectionListener(fCopyProtocolSelectionListener); |
| fControlHostAddressText.addModifyListener(fControlUrlKeyListener); |
| |
| updateProtocolComboItems(); |
| |
| fDataHostAddressText.setText(fControlHostAddressText.getText()); |
| |
| // Update tool tips |
| fControlProtocolCombo.setToolTipText(Messages.TraceControl_CreateSessionCommonProtocolTooltip); |
| } else { |
| // Enable data channel inputs |
| fDataProtocolCombo.setEnabled(true); |
| fDataHostAddressText.setEnabled(true); |
| |
| // Update listeners |
| fControlProtocolCombo.removeSelectionListener(fCopyProtocolSelectionListener); |
| fControlProtocolCombo.addSelectionListener(fControlProtocolSelectionListener); |
| fDataProtocolCombo.addSelectionListener(fDataProtocolSelectionListener); |
| fControlHostAddressText.removeModifyListener(fControlUrlKeyListener); |
| |
| updateProtocolComboItems(); |
| |
| // Update tool tips |
| fDataProtocolCombo.setToolTipText(Messages.TraceControl_CreateSessionProtocolTooltip); |
| fControlProtocolCombo.setToolTipText(Messages.TraceControl_CreateSessionProtocolTooltip); |
| |
| // Update control/data port enablement and input |
| if (fControlProtocolCombo.getItem(fControlProtocolCombo.getSelectionIndex()).equals(StreamingProtocol.net.name()) || |
| fControlProtocolCombo.getItem(fControlProtocolCombo.getSelectionIndex()).equals(StreamingProtocol.net6.name())) { |
| fControlPortText.setText(""); //$NON-NLS-1$ |
| fControlPortText.setEnabled(false); |
| } else { |
| fControlPortText.setEnabled(true); |
| } |
| |
| if (fDataProtocolCombo.getItem(fDataProtocolCombo.getSelectionIndex()).equals(StreamingProtocol.net.name()) || |
| fDataProtocolCombo.getItem(fDataProtocolCombo.getSelectionIndex()).equals(StreamingProtocol.net6.name())) { |
| fDataPortText.setText(""); //$NON-NLS-1$ |
| fDataPortText.setEnabled(false); |
| } else { |
| fDataPortText.setEnabled(true); |
| } |
| } |
| } |
| }); |
| } |
| } |
| |
| private void createAdvancedLiveGroup() { |
| if (fLiveGroup == null && fIsAdvancedEnabled) { |
| GridLayout layout = new GridLayout(7, true); |
| fLiveGroup = new Group(fAdvancedGroup, SWT.NONE); |
| fLiveGroup.setLayout(layout); |
| GridData layoutData = new GridData(GridData.FILL_BOTH); |
| fLiveGroup.setLayoutData(layoutData); |
| |
| Label label = new Label(fLiveGroup, SWT.NONE); |
| label.setText(Messages.TraceControl_CreateSessionLiveConnectionLabel); |
| layoutData = new GridData(GridData.FILL_HORIZONTAL); |
| layoutData.horizontalSpan = 2; |
| label.setLayoutData(layoutData); |
| |
| fLiveHostAddressText = new Text(fLiveGroup, SWT.NONE); |
| fLiveHostAddressText.setText(SessionInfo.DEFAULT_LIVE_NETWORK_URL); |
| fLiveHostAddressText.setEnabled(false); |
| fLiveHostAddressText.setToolTipText(Messages.TraceControl_CreateSessionLiveConnectionUrlTooltip); |
| layoutData = new GridData(GridData.FILL_HORIZONTAL); |
| layoutData.horizontalSpan = 4; |
| fLiveHostAddressText.setLayoutData(layoutData); |
| |
| fLivePortText = new Text(fLiveGroup, SWT.NONE); |
| fLivePortText.setText(Integer.toString(SessionInfo.DEFAULT_LIVE_PORT)); |
| fLivePortText.setToolTipText(Messages.TraceControl_CreateSessionLiveConnectionPortTooltip); |
| layoutData = new GridData(GridData.FILL_HORIZONTAL); |
| fLivePortText.setLayoutData(layoutData); |
| |
| Label liveDelayLabel = new Label(fLiveGroup, SWT.NONE); |
| layoutData = new GridData(GridData.FILL_HORIZONTAL); |
| liveDelayLabel.setText(Messages.TraceControl_CreateSessionLiveDelayLabel); |
| liveDelayLabel.setLayoutData(layoutData); |
| fLiveDelayText = new Text(fLiveGroup, SWT.NONE); |
| fLiveDelayText.setText(DEFAULT_TEXT); |
| fLiveDelayText.setForeground(getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY)); |
| fLiveDelayText.setToolTipText(Messages.TraceControl_CreateSessionLiveDelayTooltip); |
| fLiveDelayText.addVerifyListener(e -> { |
| // only numbers and default are allowed. |
| e.doit = e.text.matches("[0-9]*") || e.text.matches(DEFAULT_TEXT); //$NON-NLS-1$ |
| updateEnablement(); |
| }); |
| fLiveDelayText.addModifyListener(event -> updateEnablement()); |
| |
| fLiveDelayText.addFocusListener(new FocusListener() { |
| |
| @Override |
| public void focusLost(FocusEvent e) { |
| Text focusLostWidget = (Text) e.widget; |
| if (focusLostWidget.getText().isEmpty()) { |
| focusLostWidget.setText(DEFAULT_TEXT); |
| focusLostWidget.setForeground(getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY)); |
| } |
| } |
| |
| @Override |
| public void focusGained(FocusEvent e) { |
| Text focusGainedWidget = (Text) e.widget; |
| if (focusGainedWidget.getText().equals(DEFAULT_TEXT)) { |
| focusGainedWidget.setText(""); //$NON-NLS-1$ |
| focusGainedWidget.setForeground(getShell().getDisplay().getSystemColor(SWT.COLOR_BLACK)); |
| } |
| } |
| }); |
| |
| layoutData = new GridData(GridData.FILL_HORIZONTAL); |
| layoutData.grabExcessHorizontalSpace = true; |
| layoutData.horizontalSpan = 6; |
| fLiveDelayText.setLayoutData(layoutData); |
| getShell().pack(); |
| } |
| } |
| |
| private void disposeLiveGroup() { |
| if (fLiveGroup != null) { |
| fLiveGroup.dispose(); |
| fLiveGroup = null; |
| getShell().pack(); |
| } |
| } |
| |
| private void disposeConfigureStreamingComposite() { |
| if (fStreamingComposite != null) { |
| fStreamingComposite.dispose(); |
| fStreamingComposite = null; |
| } |
| } |
| |
| @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$ |
| } |
| |
| private void updateEnablement() { |
| validate(); |
| getButton(IDialogConstants.OK_ID).setEnabled(getErrorMessage() == null); |
| } |
| |
| private void validate() { |
| // Validate input data |
| fSessionName = fSessionNameText.getText(); |
| fSessionPath = fSessionPathText.getText(); |
| setErrorMessage(null); |
| |
| if (fParent.isLiveSupported() && fLiveButton != null) { |
| fIsLive = fLiveButton.getSelection(); |
| fLiveDelay = Long.valueOf(LTTngControlServiceConstants.UNUSED_VALUE); |
| fLiveUrl = SessionInfo.DEFAULT_LIVE_NETWORK_URL; |
| fLivePort = SessionInfo.DEFAULT_LIVE_PORT; |
| } |
| |
| if (!"".equals(fSessionPath)) { //$NON-NLS-1$ |
| // validate sessionPath |
| if (!fIsAdvancedEnabled && !fIsLive) { |
| TargetNodeComponent node = (TargetNodeComponent)fParent.getParent(); |
| RemoteSystemProxy proxy = node.getRemoteSystemProxy(); |
| IRemoteFileService fsss = proxy.getRemoteConnection().getService(IRemoteFileService.class); |
| if (fsss != null) { |
| IFileStore remoteFolder = fsss.getResource(fSessionPath); |
| if (remoteFolder == null) { |
| setErrorMessage(Messages.TraceControl_InvalidSessionPathError + " (" + fSessionPath + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$ |
| return; |
| } |
| IFileInfo fileInfo = remoteFolder.fetchInfo(); |
| if (fileInfo.exists()) { |
| setErrorMessage(Messages.TraceControl_SessionPathAlreadyExistsError + " (" + fSessionPath + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$ |
| return; |
| } |
| } |
| } |
| fIsDefaultPath = false; |
| } |
| |
| if (fParent.isSnapshotSupported()) { |
| fIsSnapshot = fSnapshotButton.getSelection(); |
| } |
| |
| fNetworkUrl = null; |
| fControlUrl = null; |
| fDataUrl = null; |
| |
| if (fIsAdvancedEnabled && fStreamingComposite != null) { |
| // Validate input data |
| |
| if (fIsLive && fLiveGroup != null) { |
| String liveDelayText = fLiveDelayText.getText(); |
| try { |
| fLiveDelay = liveDelayText.equals(DEFAULT_TEXT) ? LTTngControlServiceConstants.UNUSED_VALUE : Long.valueOf(liveDelayText); |
| fLivePort = Integer.valueOf(fLivePortText.getText()); |
| fLiveUrl = fLiveHostAddressText.getText(); |
| } catch (NumberFormatException e) { |
| setErrorMessage(Messages.TraceControl_InvalidLiveDelayError); |
| return; |
| } |
| } |
| |
| fTracePath = fTracePathText.getText(); |
| |
| if (fControlProtocolCombo.getSelectionIndex() < 0) { |
| setErrorMessage("Control Protocol Text is empty\n"); //$NON-NLS-1$ |
| return; |
| } |
| |
| if ("".equals(fControlHostAddressText.getText())) { //$NON-NLS-1$ |
| setErrorMessage("Control Address Text is empty\n"); //$NON-NLS-1$ |
| return; |
| } |
| |
| if (!fLinkDataWithControlButton.getSelection()) { |
| if (fDataProtocolCombo.getSelectionIndex() < 0) { |
| setErrorMessage("Data Protocol Text is empty\n"); //$NON-NLS-1$ |
| return; |
| } |
| |
| if ("".equals(fDataHostAddressText.getText())) { //$NON-NLS-1$ |
| setErrorMessage("Data Address Text is empty\n"); //$NON-NLS-1$ |
| return; |
| } |
| |
| fControlUrl = getUrlString(fControlProtocolCombo.getItem(fControlProtocolCombo.getSelectionIndex()), |
| fControlHostAddressText.getText(), |
| fControlPortText.getText(), |
| null, |
| fTracePath); |
| |
| fDataUrl = getUrlString(fDataProtocolCombo.getItem(fDataProtocolCombo.getSelectionIndex()), |
| fDataHostAddressText.getText(), |
| null, |
| fDataPortText.getText(), |
| fTracePath); |
| } else { |
| fNetworkUrl = getUrlString(fControlProtocolCombo.getItem(fControlProtocolCombo.getSelectionIndex()), |
| fControlHostAddressText.getText(), |
| fControlPortText.getText(), |
| fDataPortText.getText(), |
| fTracePath); |
| } |
| } |
| |
| if (fIsLive && fNetworkUrl == null && fControlUrl == null && fDataUrl == null) { |
| fNetworkUrl = SessionInfo.DEFAULT_LIVE_NETWORK_URL; |
| } |
| |
| // Check for invalid names |
| if (!"".equals(fSessionName) && !fSessionName.matches("^[a-zA-Z0-9\\-\\_]{1,}$")) { //$NON-NLS-1$ //$NON-NLS-2$ |
| setErrorMessage(Messages.TraceControl_InvalidSessionNameError + " (" + fSessionName + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$ |
| return; |
| } |
| |
| // Check if node with name already exists in parent |
| if(fParent.containsChild(fSessionName)) { |
| setErrorMessage(Messages.TraceControl_SessionAlreadyExistsError + " (" + fSessionName + ")"); //$NON-NLS-1$ //$NON-NLS-2$ |
| return; |
| } |
| } |
| |
| private static String getUrlString(String proto, String host, String ctrlPort, String dataPort, String sessionPath) { |
| //proto://[HOST|IP][:PORT1[:PORT2]][/TRACE_PATH] |
| StringBuilder stringBuilder = new StringBuilder(); |
| stringBuilder.append(proto); |
| stringBuilder.append("://"); //$NON-NLS-1$ |
| stringBuilder.append(host); |
| |
| if ((ctrlPort != null) && (!"".equals(ctrlPort))) { //$NON-NLS-1$ |
| stringBuilder.append(":"); //$NON-NLS-1$ |
| stringBuilder.append(ctrlPort); |
| } |
| |
| if ((dataPort != null) && (!"".equals(dataPort))) { //$NON-NLS-1$ |
| stringBuilder.append(":"); //$NON-NLS-1$ |
| stringBuilder.append(dataPort); |
| } |
| |
| if ((sessionPath != null) && (!"".equals(sessionPath))) { //$NON-NLS-1$ |
| stringBuilder.append("/"); //$NON-NLS-1$ |
| stringBuilder.append(sessionPath); |
| } |
| return stringBuilder.toString(); |
| } |
| |
| private static class CopyModifyListener implements ModifyListener { |
| private Text fSource; |
| private Text fDestination; |
| |
| public CopyModifyListener(Text source, Text destination) { |
| fSource = source; |
| fDestination = destination; |
| } |
| |
| @Override |
| public void modifyText(ModifyEvent e) { |
| fDestination.setText(fSource.getText()); |
| } |
| } |
| |
| private class ControlProtocolSelectionListener extends SelectionAdapter { |
| |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| fDataProtocolCombo.select(fControlProtocolCombo.getSelectionIndex()); |
| if (fControlProtocolCombo.getItem(fControlProtocolCombo.getSelectionIndex()).equals(StreamingProtocol.file.name())) { |
| fControlPortText.setText(""); //$NON-NLS-1$ |
| fDataPortText.setText(""); //$NON-NLS-1$ |
| fControlPortText.setEnabled(false); |
| fDataPortText.setEnabled(false); |
| } else { |
| fControlPortText.setEnabled(true); |
| fDataPortText.setEnabled(true); |
| } |
| } |
| } |
| |
| private class ProtocolComboSelectionListener extends SelectionAdapter { |
| |
| private CCombo fCombo; |
| private Text fPortText; |
| |
| public ProtocolComboSelectionListener(CCombo combo, Text portText) { |
| fCombo = combo; |
| fPortText = portText; |
| } |
| |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| if (fCombo.getItem(fCombo.getSelectionIndex()).equals(StreamingProtocol.net.name()) || |
| fCombo.getItem(fCombo.getSelectionIndex()).equals(StreamingProtocol.net6.name())) { |
| fPortText.setText(""); //$NON-NLS-1$ |
| fPortText.setEnabled(false); |
| } else { |
| fPortText.setEnabled(true); |
| } |
| } |
| } |
| |
| @Override |
| public ISessionInfo getParameters() { |
| ISessionInfo sessionInfo = new SessionInfo(fSessionName); |
| |
| boolean isStreaming = (fIsAdvancedEnabled && fStreamingComposite != null) || fIsLive; |
| if (isStreaming) { |
| sessionInfo.setNetworkUrl(fNetworkUrl); |
| sessionInfo.setControlUrl(fControlUrl); |
| sessionInfo.setDataUrl(fDataUrl); |
| sessionInfo.setStreamedTrace(true); |
| } else if (!fIsDefaultPath) { |
| sessionInfo.setSessionPath(fSessionPath); |
| } |
| |
| sessionInfo.setLive(fIsLive); |
| sessionInfo.setLiveUrl(fLiveUrl); |
| sessionInfo.setLivePort(fLivePort); |
| sessionInfo.setLiveDelay(fLiveDelay); |
| sessionInfo.setSnapshot(fIsSnapshot); |
| |
| return sessionInfo; |
| } |
| |
| private final class UpdateEnablementModifyListener implements ModifyListener { |
| @Override |
| public void modifyText(ModifyEvent e) { |
| updateEnablement(); |
| } |
| } |
| } |