diff options
Diffstat (limited to 'lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control')
13 files changed, 1172 insertions, 158 deletions
diff --git a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/dialogs/CreateSessionDialog.java b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/dialogs/CreateSessionDialog.java index 11e8005186..81a4751523 100644 --- a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/dialogs/CreateSessionDialog.java +++ b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/dialogs/CreateSessionDialog.java @@ -1,12 +1,12 @@ /********************************************************************** * Copyright (c) 2012 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: + * + * Contributors: * Bernd Hufmann - Initial API and implementation **********************************************************************/ package org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs; @@ -24,11 +24,19 @@ import org.eclipse.rse.services.clientserver.messages.SystemMessageException; import org.eclipse.rse.subsystems.files.core.servicesubsystem.IFileServiceSubSystem; import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile; import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CCombo; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; 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; @@ -37,7 +45,7 @@ import org.eclipse.swt.widgets.Text; * <p> * Dialog box for collecting session creation information. * </p> - * + * * @author Bernd Hufmann */ public class CreateSessionDialog extends Dialog implements ICreateSessionDialog { @@ -48,11 +56,44 @@ public class CreateSessionDialog extends Dialog implements ICreateSessionDialog /** * The icon file for this dialog box. */ - public static final String CREATE_SESSION_ICON_FILE = "icons/elcl16/add_button.gif"; //$NON-NLS-1$ + public static final String CREATE_SESSION_ICON_FILE = "icons/elcl16/add_button.gif"; //$NON-NLS-1$ + + /** + * Supported network protocols for streaming + */ + private enum StreamingProtocol { + /** Default network protocol for IPv4 (TCP)*/ + net, + /** Default network protocol for IPv6 (TCP)*/ + net6, + /** File */ + file, + } + + 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 final static int COMMON_URL_LAST_INDEX = 1; + /** + * Index of default streaming protocol. + */ + private final static int DEFAULT_URL_INDEX = 0; // ------------------------------------------------------------------------ // Attributes // ------------------------------------------------------------------------ + + private Control fControl = null; /** * The dialog composite. */ @@ -62,10 +103,70 @@ public class CreateSessionDialog extends Dialog implements ICreateSessionDialog */ private Text fSessionNameText = null; /** - * The text widget for the session path + * The text widget for the session path. */ private Text fSessionPathText = null; /** + * The Group for stream configuration. + */ + private Group fMainStreamingGroup = null; + /** + * The button to show streaming options. + */ + private Button fConfigureStreamingButton = null; + /** + * The composite with streaming configuration parameter. + */ + private Composite fStreamingComposite = 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; + + private ProtocolComboSelectionListener fControlProtocolSelectionListener; + 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 CopyKeyListener fControlUrlKeyListener; + /** + * 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 button to not activate a consumer. + */ + private Button fNoConsumerButton = null; + /** + * The button to disable the consumer. + */ + private Button fDisableConsumerButton = null; + /** * The parent where the new node should be added. */ private TraceSessionGroup fParent = null; @@ -81,6 +182,33 @@ public class CreateSessionDialog extends Dialog implements ICreateSessionDialog * Flag whether default location (path) shall be used or not */ private boolean fIsDefaultPath = true; + /** + * Flag whether the trace is streamed or not + */ + private boolean fIsStreamedTrace = 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; + /** + * Flag for not activating a consumer for this session. + */ + private boolean fIsNoConsumer = false; + /** + * Flag for disabling a consumer for this session. + */ + private boolean fIsDisableConsumer = false; // ------------------------------------------------------------------------ // Constructors @@ -114,7 +242,7 @@ public class CreateSessionDialog extends Dialog implements ICreateSessionDialog public String getSessionPath() { return fSessionPath; } - + /* * (non-Javadoc) * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.ICreateSessionDialog#isDefaultSessionPath() @@ -126,16 +254,69 @@ public class CreateSessionDialog extends Dialog implements ICreateSessionDialog /* * (non-Javadoc) - * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.ICreateSessionDialog#setTraceSessionGroup(org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.TraceSessionGroup) + * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.ICreateSessionDialog#initialze(org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.TraceSessionGroup) */ @Override - public void setTraceSessionGroup(TraceSessionGroup group) { - fParent = group; + public void initialize(TraceSessionGroup group) { + fParent = group; + fStreamingComposite = null; + fSessionName = null; + fSessionPath = null; + fIsDefaultPath = true; + fIsStreamedTrace = false; + fNetworkUrl = null; + fControlUrl = null; + fDataUrl = null; + fIsNoConsumer = false; + fIsDisableConsumer = false; + } + + @Override + public boolean isStreamedTrace() { + return fIsStreamedTrace; + } + @Override + public String getNetworkUrl() { + return fNetworkUrl; + } + @Override + public String getControlUrl() { + return fControlUrl; + } + @Override + public String getDataUrl() { + return fDataUrl; + } + + @Override + public boolean isNoConsumer() { + return fIsNoConsumer; + } + + @Override + public boolean isDisableConsumer() { + return fIsDisableConsumer; } // ------------------------------------------------------------------------ // Operations // ------------------------------------------------------------------------ + + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite) + */ + @Override + protected Control createContents(Composite parent) { + fControl = super.createContents(parent); + + /* set the shell minimum size */ + Point clientArea = fControl.computeSize(SWT.DEFAULT, SWT.DEFAULT); + Rectangle trim = getShell().computeTrim(0, 0, clientArea.x, clientArea.y); + getShell().setMinimumSize(trim.width, trim.height); + + return fControl; + } /* * (non-Javadoc) * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) @@ -153,35 +334,326 @@ public class CreateSessionDialog extends Dialog implements ICreateSessionDialog */ @Override protected Control createDialogArea(Composite parent) { - + // Main dialog panel fDialogComposite = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(4, true); + GridLayout layout = new GridLayout(1, true); fDialogComposite.setLayout(layout); fDialogComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); - Label sessionNameLabel = new Label(fDialogComposite, SWT.RIGHT); + Group sessionGroup = new Group(fDialogComposite, SWT.SHADOW_NONE); + sessionGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + sessionGroup.setLayout(new GridLayout(4, true)); + + Label sessionNameLabel = new Label(sessionGroup, SWT.RIGHT); sessionNameLabel.setText(Messages.TraceControl_CreateSessionNameLabel); - fSessionNameText = new Text(fDialogComposite, SWT.NONE); + fSessionNameText = new Text(sessionGroup, SWT.NONE); fSessionNameText.setToolTipText(Messages.TraceControl_CreateSessionNameTooltip); - - Label sessionPath = new Label(fDialogComposite, SWT.RIGHT); + + Label sessionPath = new Label(sessionGroup, SWT.RIGHT); sessionPath.setText(Messages.TraceControl_CreateSessionPathLabel); - fSessionPathText = new Text(fDialogComposite, SWT.NONE); + fSessionPathText = new Text(sessionGroup, SWT.NONE); fSessionPathText.setToolTipText(Messages.TraceControl_CreateSessionPathTooltip); // layout widgets GridData data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 3; - + fSessionNameText.setLayoutData(data); + + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 3; fSessionPathText.setLayoutData(data); - getShell().setMinimumSize(new Point(300, 150)); - + if (fParent.isNetworkStreamingSupported()) { + fNoConsumerButton = new Button(sessionGroup, SWT.CHECK); + fNoConsumerButton.setText(Messages.TraceControl_CreateSessionNoConsumertText); + fNoConsumerButton.setToolTipText(Messages.TraceControl_CreateSessionNoConsumertTooltip); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 2; + fNoConsumerButton.setLayoutData(data); + + fDisableConsumerButton = new Button(sessionGroup, SWT.CHECK); + fDisableConsumerButton.setText(Messages.TraceControl_CreateSessionDisableConsumertText); + fDisableConsumerButton.setToolTipText(Messages.TraceControl_CreateSessionDisableConsumertTooltip); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 2; + fDisableConsumerButton.setLayoutData(data); + + fNoConsumerButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if (fNoConsumerButton.getSelection()) { + fDisableConsumerButton.setSelection(false); + } + } + }); + + fDisableConsumerButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if (fDisableConsumerButton.getSelection()) { + fNoConsumerButton.setSelection(false); + } + } + }); + + createAdvancedOptionsComposite(); + } + return fDialogComposite; } + private void createAdvancedOptionsComposite() { + + fMainStreamingGroup = new Group(fDialogComposite, SWT.SHADOW_NONE); + fMainStreamingGroup.setLayoutData(new GridData(GridData.FILL_BOTH)); + fMainStreamingGroup.setLayout(new GridLayout(1, true)); + + fConfigureStreamingButton = new Button(fMainStreamingGroup, SWT.PUSH); + fConfigureStreamingButton.setText(">>> " + Messages.TraceControl_CreateSessionConfigureStreamingButtonText); //$NON-NLS-1$ + fConfigureStreamingButton.setToolTipText(Messages.TraceControl_CreateSessionConfigureStreamingButtonTooltip); + fConfigureStreamingButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if (fIsStreamedTrace) { + fIsStreamedTrace = false; + fConfigureStreamingButton.setText(">>> " + Messages.TraceControl_CreateSessionConfigureStreamingButtonText); //$NON-NLS-1$ + fConfigureStreamingButton.setToolTipText(Messages.TraceControl_CreateSessionConfigureStreamingButtonTooltip); + disposeConfigureStreamingComposite(); + } else { + fIsStreamedTrace = true; + fConfigureStreamingButton.setText("<<< " + Messages.TraceControl_CreateSessionNoStreamingButtonText); //$NON-NLS-1$ + fConfigureStreamingButton.setToolTipText(Messages.TraceControl_CreateSessionNoStreamingButtonTooltip); + createConfigureStreamingComposite(); + } + + fDialogComposite.layout(); + + Point clientArea = fControl.computeSize(SWT.DEFAULT, SWT.DEFAULT); + Rectangle trim = getShell().computeTrim(0, 0, clientArea.x, clientArea.y); + getShell().setSize(trim.width, trim.height); + } + }); + } + + private void createConfigureStreamingComposite() { + if (fStreamingComposite == null) { + fStreamingComposite = new Composite(fMainStreamingGroup, SWT.NONE); + GridLayout layout = new GridLayout(1, true); + fStreamingComposite.setLayout(layout); + fStreamingComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); + + Group urlGroup = new Group(fStreamingComposite, SWT.SHADOW_NONE); + layout = new GridLayout(7, true); + urlGroup.setLayout(layout); + urlGroup.setLayoutData(new GridData(GridData.FILL_BOTH)); + + fLinkDataWithControlButton = new Button(urlGroup, SWT.CHECK); + fLinkDataWithControlButton.setText(Messages.TraceControl_CreateSessionLinkButtonText); + fLinkDataWithControlButton.setToolTipText(Messages.TraceControl_CreateSessionLinkButtonTooltip); + GridData data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 7; + fLinkDataWithControlButton.setLayoutData(data); + fLinkDataWithControlButton.setSelection(true); + + Label label = new Label(urlGroup, SWT.NONE); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 1; + label.setLayoutData(data); + + label = new Label(urlGroup, SWT.NONE); + label.setText(Messages.TraceControl_CreateSessionProtocolLabelText); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 1; + label.setLayoutData(data); + + label = new Label(urlGroup, SWT.NONE); + label.setText(Messages.TraceControl_CreateSessionAddressLabelText); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 4; + label.setLayoutData(data); + + label = new Label(urlGroup, SWT.NONE); + label.setText(Messages.TraceControl_CreateSessionPortLabelText); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 1; + label.setLayoutData(data); + + label = new Label(urlGroup, SWT.RIGHT); + label.setText(Messages.TraceControl_CreateSessionControlUrlLabel); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 1; + label.setLayoutData(data); + + fControlProtocolCombo = new CCombo(urlGroup, SWT.READ_ONLY); + fControlProtocolCombo.setToolTipText(Messages.TraceControl_CreateSessionCommonProtocolTooltip); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 1; + fControlProtocolCombo.setLayoutData(data); + + fControlHostAddressText = new Text(urlGroup, SWT.NONE); + fControlHostAddressText.setToolTipText(Messages.TraceControl_CreateSessionControlAddressTooltip); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 4; + fControlHostAddressText.setLayoutData(data); + + fControlPortText = new Text(urlGroup, SWT.NONE); + fControlPortText.setToolTipText(Messages.TraceControl_CreateSessionControlPortTooltip); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 1; + fControlPortText.setLayoutData(data); + + label = new Label(urlGroup, SWT.RIGHT); + label.setText(Messages.TraceControl_CreateSessionDataUrlLabel); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 1; + label.setLayoutData(data); + + fDataProtocolCombo = new CCombo(urlGroup, SWT.READ_ONLY); + fDataProtocolCombo.setEnabled(false); + fDataProtocolCombo.setToolTipText(Messages.TraceControl_CreateSessionProtocolTooltip); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 1; + fDataProtocolCombo.setLayoutData(data); + + String items[] = new String[StreamingProtocol.values().length]; + for (int i = 0; i < items.length; i++) { + items[i] = StreamingProtocol.values()[i].name(); + } + fControlProtocolCombo.setItems(items); + fDataProtocolCombo.setItems(items); + + fDataHostAddressText = new Text(urlGroup, SWT.NONE); + fDataHostAddressText.setEnabled(false); + fDataHostAddressText.setToolTipText(Messages.TraceControl_CreateSessionDataAddressTooltip); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 4; + fDataHostAddressText.setLayoutData(data); + + fDataPortText = new Text(urlGroup, SWT.NONE); + fDataPortText.setEnabled(true); + fDataPortText.setToolTipText(Messages.TraceControl_CreateSessionDataPortTooltip); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 1; + fDataPortText.setLayoutData(data); + + fCopyProtocolSelectionListener = new ControlProtocolSelectionListener(); + fControlProtocolSelectionListener = new ProtocolComboSelectionListener(fControlProtocolCombo, fControlPortText); + fDataProtocolSelectionListener = new ProtocolComboSelectionListener(fDataProtocolCombo, fDataPortText); + + fControlProtocolCombo.addSelectionListener(fCopyProtocolSelectionListener); + + fControlUrlKeyListener = new CopyKeyListener(fControlHostAddressText, fDataHostAddressText); + fControlHostAddressText.addKeyListener(fControlUrlKeyListener); + +// InetAddress inet = null; +// try { +// inet = InetAddress.getLocalHost(); +// inet = InetAddress.getByName(inet.getHostName()); +// } catch (UnknownHostException e1) { +// } +// if (inet != null) { +// fControlUrlAddressText.setText(inet.getHostAddress()); +// fDataUrlAddressText.setText(inet.getHostAddress()); +// } + 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.addKeyListener(fControlUrlKeyListener); + + // Get previous selection and validate + int currentSelection = fControlProtocolCombo.getSelectionIndex() <= COMMON_URL_LAST_INDEX ? + fControlProtocolCombo.getSelectionIndex() : DEFAULT_URL_INDEX; + + // Update combo box items + fControlProtocolCombo.removeAll(); + String[] controlItems = new String[StreamingProtocol.values().length]; + for (int i = 0; i < controlItems.length; i++) { + controlItems[i] = StreamingProtocol.values()[i].name(); + } + fControlProtocolCombo.setItems(controlItems); + fDataProtocolCombo.setItems(controlItems); + + // Set selection + fControlProtocolCombo.select(currentSelection); + fDataProtocolCombo.select(currentSelection); + 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.removeKeyListener(fControlUrlKeyListener); + + // Update combo box items + int currentSelection = fControlProtocolCombo.getSelectionIndex(); + fControlProtocolCombo.removeAll(); + String[] controlItems = new String[StreamingProtocol2.values().length]; + for (int i = 0; i < controlItems.length; i++) { + controlItems[i] = StreamingProtocol2.values()[i].name(); + } + fControlProtocolCombo.setItems(controlItems); + fDataProtocolCombo.setItems(controlItems); + + // Set selection + fControlProtocolCombo.select(currentSelection); + fDataProtocolCombo.select(currentSelection); + + // 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 disposeConfigureStreamingComposite() { + if (fStreamingComposite != null) { + fStreamingComposite.dispose(); + fStreamingComposite = null; + } + } + /* * (non-Javadoc) * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) @@ -204,36 +676,86 @@ public class CreateSessionDialog extends Dialog implements ICreateSessionDialog if (!"".equals(fSessionPath)) { //$NON-NLS-1$ // validate sessionPath - - TargetNodeComponent node = (TargetNodeComponent)fParent.getParent(); - IRemoteSystemProxy proxy = node.getRemoteSystemProxy(); - IFileServiceSubSystem fsss = proxy.getFileServiceSubSystem(); - if (fsss != null) { - try { - IRemoteFile remoteFolder = fsss.getRemoteFileObject(fSessionPath, new NullProgressMonitor()); - if (remoteFolder.exists()) { + if (!fIsStreamedTrace) { + TargetNodeComponent node = (TargetNodeComponent)fParent.getParent(); + IRemoteSystemProxy proxy = node.getRemoteSystemProxy(); + IFileServiceSubSystem fsss = proxy.getFileServiceSubSystem(); + if (fsss != null) { + try { + IRemoteFile remoteFolder = fsss.getRemoteFileObject(fSessionPath, new NullProgressMonitor()); + if (remoteFolder.exists()) { + MessageDialog.openError(getShell(), + Messages.TraceControl_CreateSessionDialogTitle, + Messages.TraceControl_SessionPathAlreadyExistsError + " (" + fSessionPath + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$ + return; + } + } catch (SystemMessageException e) { MessageDialog.openError(getShell(), Messages.TraceControl_CreateSessionDialogTitle, - Messages.TraceControl_SessionPathAlreadyExistsError + " (" + fSessionPath + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$ + Messages.TraceControl_FileSubSystemError + "\n" + e); //$NON-NLS-1$ return; } - } catch (SystemMessageException e) { - MessageDialog.openError(getShell(), - Messages.TraceControl_CreateSessionDialogTitle, - Messages.TraceControl_FileSubSystemError + "\n" + e); //$NON-NLS-1$ - return; - } + } } fIsDefaultPath = false; } - // If no session name is specified use default name auto - if ("".equals(fSessionName)) { //$NON-NLS-1$ - fSessionName = "auto"; //$NON-NLS-1$ + fNetworkUrl = null; + fControlUrl = null; + fDataUrl = null; + + if (fIsStreamedTrace) { + if (fControlProtocolCombo.getSelectionIndex() < 0) { + MessageDialog.openError(getShell(), + Messages.TraceControl_CreateSessionDialogTitle, + "Control Protocol Text is empty\n"); //$NON-NLS-1$ + return; + } + + if ("".equals(fControlHostAddressText.getText())) { //$NON-NLS-1$ + MessageDialog.openError(getShell(), + Messages.TraceControl_CreateSessionDialogTitle, + "Control Address Text is empty\n"); //$NON-NLS-1$ + return; + } + + if(!fLinkDataWithControlButton.getSelection()) { + if (fDataProtocolCombo.getSelectionIndex() < 0) { + MessageDialog.openError(getShell(), + Messages.TraceControl_CreateSessionDialogTitle, + "Control Protocol Text is empty\n"); //$NON-NLS-1$ + return; + } + + if ("".equals(fDataHostAddressText.getText())) { //$NON-NLS-1$ + MessageDialog.openError(getShell(), + Messages.TraceControl_CreateSessionDialogTitle, + "Control Address Text is empty\n"); //$NON-NLS-1$ + return; + } + + fControlUrl = getUrlString(fControlProtocolCombo.getItem(fControlProtocolCombo.getSelectionIndex()), + fControlHostAddressText.getText(), + fControlPortText.getText(), + null, + fSessionPath); + + fDataUrl = getUrlString(fControlProtocolCombo.getItem(fDataProtocolCombo.getSelectionIndex()), + fDataHostAddressText.getText(), + null, + fDataPortText.getText(), + fSessionPath); + } else { + fNetworkUrl = getUrlString(fControlProtocolCombo.getItem(fDataProtocolCombo.getSelectionIndex()), + fControlHostAddressText.getText(), + fControlPortText.getText(), + fDataPortText.getText(), + fSessionPath); + } } // Check for invalid names - if (!fSessionName.matches("^[a-zA-Z0-9\\-\\_]{1,}$")) { //$NON-NLS-1$ + if (!"".equals(fSessionName) && !fSessionName.matches("^[a-zA-Z0-9\\-\\_]{1,}$")) { //$NON-NLS-1$ //$NON-NLS-2$ MessageDialog.openError(getShell(), Messages.TraceControl_CreateSessionDialogTitle, Messages.TraceControl_InvalidSessionNameError + " (" + fSessionName + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$ @@ -247,8 +769,92 @@ public class CreateSessionDialog extends Dialog implements ICreateSessionDialog Messages.TraceControl_SessionAlreadyExistsError + " (" + fSessionName + ")"); //$NON-NLS-1$ //$NON-NLS-2$ return; } - + + if (fParent.isNetworkStreamingSupported()) { + fIsNoConsumer = fNoConsumerButton.getSelection(); + fIsDisableConsumer = fDisableConsumerButton.getSelection(); + } + // validation successful -> call super.okPressed() super.okPressed(); } + + 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 CopyKeyListener extends KeyAdapter { + private Text fSource; + private Text fDestination; + + public CopyKeyListener(Text source, Text destination) { + fSource = source; + fDestination = destination; + } + + @Override + public void keyReleased(KeyEvent 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); + } + } + } + } diff --git a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/dialogs/ICreateSessionDialog.java b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/dialogs/ICreateSessionDialog.java index 2b429514cd..ef13775818 100644 --- a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/dialogs/ICreateSessionDialog.java +++ b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/dialogs/ICreateSessionDialog.java @@ -1,12 +1,12 @@ /********************************************************************** * Copyright (c) 2012 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: + * + * Contributors: * Bernd Hufmann - Initial API and implementation **********************************************************************/ package org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs; @@ -17,11 +17,11 @@ import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.TraceS * <p> * Interface for create session dialog. * </p> - * + * * @author Bernd Hufmann */ public interface ICreateSessionDialog { - + // ------------------------------------------------------------------------ // Accessors // ------------------------------------------------------------------------ @@ -34,17 +34,57 @@ public interface ICreateSessionDialog { * @return the session path (null for default path) */ public String getSessionPath(); - + /** * @return true for default location else false */ public boolean isDefaultSessionPath(); - + /** - * Set trace session group. + * Initializes the dialog box. * @param group - the session group */ - public void setTraceSessionGroup(TraceSessionGroup group); + public void initialize(TraceSessionGroup group); + + /** + * @return true if traces is to be streamed else false. + */ + public boolean isStreamedTrace(); + + /** + * Get the network URL in case control and data is configured together otherwise null + * If it returns a non-null value, getControlUrl() and getDataUrl() have to return null. + * @return The network URL or null. + */ + public String getNetworkUrl(); + + /** + * Get the control URL in case control and data is configured separately. + * If it returns a non-null value, getDataUrl() has to return a valid value too + * and getNetworkUrl() has to return null. + * + * @return The control URL or null. + */ + public String getControlUrl(); + + /** + * Get the data URL in case control and data is configured separately. + * If it returns a non-null value, getControlUrl() has to return a valid value too + * and getNetworkUrl() has to return null. + * + * @return The data URL or null. + */ + public String getDataUrl(); + + /** + * @return for not activating a consumer for this session + */ + public boolean isNoConsumer(); + + /** + * @return for disabling a consumer for this session + */ + public boolean isDisableConsumer(); // ------------------------------------------------------------------------ // Operations diff --git a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/dialogs/ImportDialog.java b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/dialogs/ImportDialog.java index fd9fac07bb..8700e9f856 100644 --- a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/dialogs/ImportDialog.java +++ b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/dialogs/ImportDialog.java @@ -25,13 +25,16 @@ import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ICheckStateListener; +import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.window.Window; +import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.linuxtools.internal.lttng2.ui.Activator; import org.eclipse.linuxtools.internal.lttng2.ui.views.control.messages.Messages; import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.TraceSessionComponent; import org.eclipse.linuxtools.internal.lttng2.ui.views.control.remote.IRemoteSystemProxy; import org.eclipse.linuxtools.tmf.core.TmfProjectNature; import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceFolder; +import org.eclipse.linuxtools.tmf.ui.project.wizards.ImportTraceWizard; import org.eclipse.rse.services.clientserver.messages.SystemMessageException; import org.eclipse.rse.subsystems.files.core.servicesubsystem.IFileServiceSubSystem; import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile; @@ -47,6 +50,7 @@ import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; @@ -88,6 +92,10 @@ public class ImportDialog extends Dialog implements IImportDialog { */ private Button fOverwriteButton; /** + * The button to open import wizard for import locally. + */ + private Button fImportLocallyButton; + /** * List of available LTTng 2.0 projects */ private List<IProject> fProjects; @@ -179,91 +187,19 @@ public class ImportDialog extends Dialog implements IImportDialog { fDialogComposite.setLayout(layout); fDialogComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); - Group contextGroup = new Group(fDialogComposite, SWT.SHADOW_NONE); - contextGroup.setText(Messages.TraceControl_ImportDialogTracesGroupName); - layout = new GridLayout(1, true); - contextGroup.setLayout(layout); - contextGroup.setLayoutData(new GridData(GridData.FILL_BOTH)); - - IRemoteSystemProxy proxy = fSession.getTargetNode().getRemoteSystemProxy(); - - IFileServiceSubSystem fsss = proxy.getFileServiceSubSystem(); - try { - IRemoteFile remoteFolder = fsss.getRemoteFileObject(fSession.getSessionPath(), new NullProgressMonitor()); - - fFolderViewer = new CheckboxTreeViewer(contextGroup, SWT.BORDER); - GridData data = new GridData(GridData.FILL_BOTH); - Tree tree = fFolderViewer.getTree(); - tree.setLayoutData(data); - tree.setFont(parent.getFont()); - tree.setToolTipText(Messages.TraceControl_ImportDialogTracesTooltip); - - fFolderViewer.setContentProvider(new FolderContentProvider()); - fFolderViewer.setLabelProvider(new WorkbenchLabelProvider()); - - fFolderViewer.addCheckStateListener(new ICheckStateListener() { - @Override - public void checkStateChanged(CheckStateChangedEvent event) { - Object elem = event.getElement(); - if (elem instanceof IRemoteFile) { - IRemoteFile element = (IRemoteFile) elem; - if (!element.isDirectory()) { - // A trick to keep selection of a file in sync with the directory - boolean p = fFolderViewer.getChecked((element.getParentRemoteFile())); - fFolderViewer.setChecked(element, p); - return; - } - fFolderViewer.setSubtreeChecked(event.getElement(), event.getChecked()); - if (!event.getChecked()) { - fFolderViewer.setChecked(element.getParentRemoteFile(), false); - } - } - } - }); - fFolderViewer.setInput(remoteFolder); - - Group projectGroup = new Group(fDialogComposite, SWT.SHADOW_NONE); - projectGroup.setText(Messages.TraceControl_ImportDialogProjectsGroupName); - layout = new GridLayout(1, true); - projectGroup.setLayout(layout); - projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - - fProjects = new ArrayList<IProject>(); - List<String> projectNames = new ArrayList<String>(); - for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) { - try { - if (project.isOpen() && project.hasNature(TmfProjectNature.ID)) { - fProjects.add(project); - projectNames.add(project.getName()); - } - } catch (CoreException e) { - createErrorComposite(parent, e.fillInStackTrace()); - return fDialogComposite; - } + if (fSession.isStreamedTrace()) { + createLocalComposite(); + } else { + createRemoteComposite(); } - - fCombo = new CCombo(projectGroup, SWT.READ_ONLY); - fCombo.setToolTipText(Messages.TraceControl_ImportDialogProjectsTooltip); - fCombo.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1)); - fCombo.setItems(projectNames.toArray(new String[projectNames.size()])); - - Group overrideGroup = new Group(fDialogComposite, SWT.SHADOW_NONE); - layout = new GridLayout(1, true); - overrideGroup.setLayout(layout); - overrideGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - - fOverwriteButton = new Button(overrideGroup, SWT.CHECK); - fOverwriteButton.setText(Messages.TraceControl_ImportDialogOverwriteButtonText); - - getShell().setMinimumSize(new Point(500, 400)); - - + } catch (CoreException e) { + createErrorComposite(parent, e.fillInStackTrace()); + return fDialogComposite; } catch (SystemMessageException e) { createErrorComposite(parent, e.fillInStackTrace()); return fDialogComposite; } - return fDialogComposite; } @@ -274,7 +210,10 @@ public class ImportDialog extends Dialog implements IImportDialog { @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$ + fImportLocallyButton = createButton(parent, IDialogConstants.OK_ID, "&Ok", true); //$NON-NLS-1$ + if (fSession.isStreamedTrace()) { + fImportLocallyButton.setText("&Next..."); //$NON-NLS-1$ + } } /* @@ -284,6 +223,7 @@ public class ImportDialog extends Dialog implements IImportDialog { @Override protected void okPressed() { if (!fIsError) { + // Validate input data fTraces.clear(); @@ -296,6 +236,20 @@ public class ImportDialog extends Dialog implements IImportDialog { return; } + if (fSession.isStreamedTrace()) { + // For streaming use standard import wizard from TMF because exact location + // is not available (lttng backend limitation) + IProject project = fProjects.get(fCombo.getSelectionIndex()); + ImportTraceWizard wizard = new ImportTraceWizard(); + wizard.init(PlatformUI.getWorkbench(), new StructuredSelection(project)); + WizardDialog dialog = new WizardDialog(getShell(), wizard); + if (dialog.open() == Window.OK) { + super.okPressed(); + } + super.cancelPressed(); + return; + } + IProject project = fProjects.get(fProjectIndex); IFolder traceFolder = project.getFolder(TmfTraceFolder.TRACE_FOLDER_NAME); @@ -400,5 +354,110 @@ public class ImportDialog extends Dialog implements IImportDialog { errorText.setLayoutData(new GridData(GridData.FILL_BOTH)); } + private void createRemoteComposite() throws CoreException, SystemMessageException{ + Group contextGroup = new Group(fDialogComposite, SWT.SHADOW_NONE); + contextGroup.setText(Messages.TraceControl_ImportDialogTracesGroupName); + GridLayout layout = new GridLayout(1, true); + contextGroup.setLayout(layout); + contextGroup.setLayoutData(new GridData(GridData.FILL_BOTH)); + + IRemoteSystemProxy proxy = fSession.getTargetNode().getRemoteSystemProxy(); + + IFileServiceSubSystem fsss = proxy.getFileServiceSubSystem(); + + IRemoteFile remoteFolder = fsss.getRemoteFileObject(fSession.getSessionPath(), new NullProgressMonitor()); + + fFolderViewer = new CheckboxTreeViewer(contextGroup, SWT.BORDER); + GridData data = new GridData(GridData.FILL_BOTH); + Tree tree = fFolderViewer.getTree(); + tree.setLayoutData(data); + tree.setFont(fDialogComposite.getFont()); + tree.setToolTipText(Messages.TraceControl_ImportDialogTracesTooltip); + + fFolderViewer.setContentProvider(new FolderContentProvider()); + fFolderViewer.setLabelProvider(new WorkbenchLabelProvider()); + + fFolderViewer.addCheckStateListener(new ICheckStateListener() { + @Override + public void checkStateChanged(CheckStateChangedEvent event) { + Object elem = event.getElement(); + if (elem instanceof IRemoteFile) { + IRemoteFile element = (IRemoteFile) elem; + if (!element.isDirectory()) { + // A trick to keep selection of a file in sync with the directory + boolean p = fFolderViewer.getChecked((element.getParentRemoteFile())); + fFolderViewer.setChecked(element, p); + return; + } + fFolderViewer.setSubtreeChecked(event.getElement(), event.getChecked()); + if (!event.getChecked()) { + fFolderViewer.setChecked(element.getParentRemoteFile(), false); + } + } + } + }); + fFolderViewer.setInput(remoteFolder); + + Group projectGroup = new Group(fDialogComposite, SWT.SHADOW_NONE); + projectGroup.setText(Messages.TraceControl_ImportDialogProjectsGroupName); + layout = new GridLayout(1, true); + projectGroup.setLayout(layout); + projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + fProjects = new ArrayList<IProject>(); + List<String> projectNames = new ArrayList<String>(); + for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) { + if (project.isOpen() && project.hasNature(TmfProjectNature.ID)) { + fProjects.add(project); + projectNames.add(project.getName()); + } + } + + fCombo = new CCombo(projectGroup, SWT.READ_ONLY); + fCombo.setToolTipText(Messages.TraceControl_ImportDialogProjectsTooltip); + fCombo.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1)); + fCombo.setItems(projectNames.toArray(new String[projectNames.size()])); + + Group overrideGroup = new Group(fDialogComposite, SWT.SHADOW_NONE); + layout = new GridLayout(1, true); + overrideGroup.setLayout(layout); + overrideGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + fOverwriteButton = new Button(overrideGroup, SWT.CHECK); + fOverwriteButton.setText(Messages.TraceControl_ImportDialogOverwriteButtonText); + getShell().setMinimumSize(new Point(500, 400)); + } + + private void createLocalComposite() throws CoreException { + + Group projectGroup = new Group(fDialogComposite, SWT.SHADOW_NONE); + projectGroup.setText(Messages.TraceControl_ImportDialogProjectsGroupName); + GridLayout layout = new GridLayout(1, true); + projectGroup.setLayout(layout); + projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + fProjects = new ArrayList<IProject>(); + List<String> projectNames = new ArrayList<String>(); + for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) { + if (project.isOpen() && project.hasNature(TmfProjectNature.ID)) { + fProjects.add(project); + projectNames.add(project.getName()); + } + } + + fCombo = new CCombo(projectGroup, SWT.READ_ONLY); + fCombo.setToolTipText(Messages.TraceControl_ImportDialogProjectsTooltip); + fCombo.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1)); + fCombo.setItems(projectNames.toArray(new String[projectNames.size()])); +// Group overrideGroup = new Group(fDialogComposite, SWT.SHADOW_NONE); +// layout = new GridLayout(1, true); +// overrideGroup.setLayout(layout); +// overrideGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); +// +// fOverwriteButton = new Button(overrideGroup, SWT.CHECK); +// fOverwriteButton.setText(Messages.TraceControl_ImportDialogOverwriteButtonText); + + getShell().setMinimumSize(new Point(500, 50)); + } } diff --git a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/handlers/CreateSessionHandler.java b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/handlers/CreateSessionHandler.java index 9098c7bd86..3e379cb5ca 100644 --- a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/handlers/CreateSessionHandler.java +++ b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/handlers/CreateSessionHandler.java @@ -60,21 +60,25 @@ public class CreateSessionHandler extends BaseControlViewHandler { final TraceSessionGroup sessionGroup = fSessionGroup; // Open dialog box for the node name and address - ICreateSessionDialog dialog = TraceControlDialogFactory.getInstance().getCreateSessionDialog(); - dialog.setTraceSessionGroup(sessionGroup); + final ICreateSessionDialog dialog = TraceControlDialogFactory.getInstance().getCreateSessionDialog(); + dialog.initialize(sessionGroup); if (dialog.open() != Window.OK) { return null; } - final String sessionName = dialog.getSessionName(); - final String sessionPath = dialog.isDefaultSessionPath() ? null : dialog.getSessionPath(); - Job job = new Job(Messages.TraceControl_CreateSessionJob) { @Override protected IStatus run(IProgressMonitor monitor) { try { - sessionGroup.createSession(sessionName, sessionPath, monitor); + if (dialog.isStreamedTrace()) { + sessionGroup.createSession(dialog.getSessionName(), dialog.getNetworkUrl(), dialog.getControlUrl(), + dialog.getDataUrl(), dialog.isNoConsumer(), dialog.isDisableConsumer(), monitor); + } else { + String sessionPath = dialog.isDefaultSessionPath() ? null : dialog.getSessionPath(); + sessionGroup.createSession(dialog.getSessionName(), sessionPath, dialog.isNoConsumer(), + dialog.isDisableConsumer(), monitor); + } } catch (ExecutionException e) { return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.TraceControl_CreateSessionFailure, e); } diff --git a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/handlers/ImportHandler.java b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/handlers/ImportHandler.java index 44bc336c7b..f5f38b3898 100644 --- a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/handlers/ImportHandler.java +++ b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/handlers/ImportHandler.java @@ -90,7 +90,7 @@ public class ImportHandler extends BaseControlViewHandler { final IImportDialog dialog = TraceControlDialogFactory.getInstance().getImportDialog(); dialog.setSession(param.getSession()); - if (dialog.open() != Window.OK) { + if ((dialog.open() != Window.OK) || param.getSession().isStreamedTrace()) { return null; } diff --git a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/messages/Messages.java b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/messages/Messages.java index 20b285aa28..fed63b9ae1 100644 --- a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/messages/Messages.java +++ b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/messages/Messages.java @@ -98,6 +98,29 @@ final public class Messages extends NLS { public static String TraceControl_CreateSessionNameTooltip; public static String TraceControl_CreateSessionPathLabel; public static String TraceControl_CreateSessionPathTooltip; + + public static String TraceControl_CreateSessionConfigureStreamingButtonText; + public static String TraceControl_CreateSessionConfigureStreamingButtonTooltip; + public static String TraceControl_CreateSessionNoStreamingButtonText; + public static String TraceControl_CreateSessionNoStreamingButtonTooltip; + public static String TraceControl_CreateSessionLinkButtonText; + public static String TraceControl_CreateSessionLinkButtonTooltip; + public static String TraceControl_CreateSessionProtocolLabelText; + public static String TraceControl_CreateSessionAddressLabelText; + public static String TraceControl_CreateSessionPortLabelText; + public static String TraceControl_CreateSessionControlUrlLabel; + public static String TraceControl_CreateSessionDataUrlLabel; + public static String TraceControl_CreateSessionCommonProtocolTooltip; + public static String TraceControl_CreateSessionControlAddressTooltip; + public static String TraceControl_CreateSessionControlPortTooltip; + public static String TraceControl_CreateSessionProtocolTooltip; + public static String TraceControl_CreateSessionDataAddressTooltip; + public static String TraceControl_CreateSessionDataPortTooltip; + public static String TraceControl_CreateSessionNoConsumertText; + public static String TraceControl_CreateSessionNoConsumertTooltip; + public static String TraceControl_CreateSessionDisableConsumertText; + public static String TraceControl_CreateSessionDisableConsumertTooltip; + public static String TraceControl_InvalidSessionNameError; public static String TraceControl_SessionAlreadyExistsError; public static String TraceControl_SessionPathAlreadyExistsError; diff --git a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/messages/messages.properties b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/messages/messages.properties index 55573d4509..e6a89c578a 100644 --- a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/messages/messages.properties +++ b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/messages/messages.properties @@ -81,6 +81,34 @@ TraceControl_CreateSessionNameLabel=Session Name TraceControl_CreateSessionNameTooltip=The name of the session to be created. TraceControl_CreateSessionPathLabel=Session Path TraceControl_CreateSessionPathTooltip=The session path (keep empty for default location) + +TraceControl_CreateSessionConfigureStreamingButtonText=Configure Streaming +TraceControl_CreateSessionConfigureStreamingButtonTooltip=Configure streaming parameters +TraceControl_CreateSessionNoStreamingButtonText=Remove Streaming +TraceControl_CreateSessionNoStreamingButtonTooltip=Remove streaming configuration +TraceControl_CreateSessionLinkButtonText=Synchronize data with control configuration +TraceControl_CreateSessionLinkButtonTooltip=Synchronize data protocol and host address with control channel configuration +TraceControl_CreateSessionProtocolLabelText=Protocol +TraceControl_CreateSessionAddressLabelText=Address +TraceControl_CreateSessionPortLabelText=Port +TraceControl_CreateSessionControlUrlLabel=Control URL +TraceControl_CreateSessionDataUrlLabel=Data URL +TraceControl_CreateSessionCommonProtocolTooltip=file - Local file system full path\n\ +net or net6 - Default network transport layer which is TCP for both control and data channel. +TraceControl_CreateSessionControlAddressTooltip=IP Address or DNS name used for control channel.\n\ +NOTE: IPv6 address MUST be enclosed in brackets '[]' (rfc2732) +TraceControl_CreateSessionControlPortTooltip=The control port (default: 5342). +TraceControl_CreateSessionProtocolTooltip=file - Local file system full path\n\ +net or net6 - Default network transport layer which is TCP\n\ +tcp or tcp6 - TCP network transport +TraceControl_CreateSessionDataAddressTooltip=IP Address or DNS name used for data channel.\n\ +NOTE: IPv6 address MUST be enclosed in brackets '[]' (rfc2732) +TraceControl_CreateSessionDataPortTooltip=The data port (default: 5343). +TraceControl_CreateSessionNoConsumertText=No Consumer +TraceControl_CreateSessionNoConsumertTooltip=Don't activate a consumer for this session. +TraceControl_CreateSessionDisableConsumertText=Disable Consumer +TraceControl_CreateSessionDisableConsumertTooltip=Disable consumer for this session. + TraceControl_InvalidSessionNameError=The session name is invalid TraceControl_SessionAlreadyExistsError=The session name already exists TraceControl_SessionPathAlreadyExistsError=Session path already exists diff --git a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/model/impl/TargetNodeComponent.java b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/model/impl/TargetNodeComponent.java index 8a46ce1747..457812cbbd 100644 --- a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/model/impl/TargetNodeComponent.java +++ b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/model/impl/TargetNodeComponent.java @@ -225,6 +225,15 @@ public class TargetNodeComponent extends TraceControlComponent implements ICommu return getControlService().isVersionSupported("2.1.0"); //$NON-NLS-1$ } + /** + * Returns if node supports networks streaming or not + * @return <code>true</code> if node supports filtering else <code>false</code> + * + */ + public boolean isNetworkStreamingSupported() { + return getControlService().isVersionSupported("2.1.0"); //$NON-NLS-1$ + } + // ------------------------------------------------------------------------ // Operations // ------------------------------------------------------------------------ diff --git a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/model/impl/TraceSessionComponent.java b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/model/impl/TraceSessionComponent.java index 7fec67c21e..3f10d9af6c 100644 --- a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/model/impl/TraceSessionComponent.java +++ b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/model/impl/TraceSessionComponent.java @@ -165,6 +165,22 @@ public class TraceSessionComponent extends TraceControlComponent { fSessionInfo.setSessionPath(sessionPath); } + /** + * Returns if session is streamed over network + * @return <code>true</code> if streamed over network else <code>false</code> + */ + public boolean isStreamedTrace() { + return fSessionInfo.isStreamedTrace(); + } + + /** + * Sets whether the trace is streamed or not + * @param isStreamedTrace <code>true</code> if streamed over network else <code>false</code> + */ + public void setIsStreamedTrace(boolean isStreamedTrace) { + fSessionInfo.setStreamedTrace(isStreamedTrace); + } + /* * (non-Javadoc) * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.TraceControlComponent#getAdapter(java.lang.Class) diff --git a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/model/impl/TraceSessionGroup.java b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/model/impl/TraceSessionGroup.java index 87177ef3d5..20e315d99a 100644 --- a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/model/impl/TraceSessionGroup.java +++ b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/model/impl/TraceSessionGroup.java @@ -61,6 +61,14 @@ public class TraceSessionGroup extends TraceControlComponent { return (TargetNodeComponent)getParent(); } + /** + * Returns if node supports networks streaming or not + * @return <code>true</code> if node supports filtering else <code>false</code> + */ + public boolean isNetworkStreamingSupported() { + return getTargetNode().isNetworkStreamingSupported(); + } + // ------------------------------------------------------------------------ // Operations // ------------------------------------------------------------------------ @@ -100,12 +108,15 @@ public class TraceSessionGroup extends TraceControlComponent { * - a session name to create * @param sessionPath * - a path for storing the traces (use null for default) + * @param noConsumer + * - a flag to indicate no consumer + * @param disableConsumer + * - a flag to disable consumer * @throws ExecutionException * If the command fails */ - public void createSession(String sessionName, String sessionPath) - throws ExecutionException { - createSession(sessionName, sessionPath, new NullProgressMonitor()); + public void createSession(String sessionName, String sessionPath, boolean noConsumer, boolean disableConsumer) throws ExecutionException { + createSession(sessionName, sessionPath, noConsumer, disableConsumer, new NullProgressMonitor()); } /** @@ -115,15 +126,18 @@ public class TraceSessionGroup extends TraceControlComponent { * - a session name to create * @param sessionPath * - a path for storing the traces (use null for default) + * @param noConsumer + * - a flag to indicate no consumer + * @param disableConsumer + * - a flag to disable consumer * @param monitor * - a progress monitor * @throws ExecutionException * If the command fails */ - public void createSession(String sessionName, String sessionPath, - IProgressMonitor monitor) throws ExecutionException { - ISessionInfo sessionInfo = getControlService().createSession( - sessionName, sessionPath, monitor); + public void createSession(String sessionName, String sessionPath, boolean noConsumer, boolean disableConsumer, IProgressMonitor monitor) throws ExecutionException { + ISessionInfo sessionInfo = getControlService().createSession(sessionName, sessionPath, noConsumer, disableConsumer, monitor); + if (sessionInfo != null) { TraceSessionComponent session = new TraceSessionComponent( sessionInfo.getName(), TraceSessionGroup.this); @@ -133,6 +147,60 @@ public class TraceSessionGroup extends TraceControlComponent { } /** + * Creates a session with given session name and location. + * + * @param sessionName + * - a session name to create + * @param networkUrl + * - a network URL for common definition of data and control channel + * or null if separate definition of data and control channel + * @param controlUrl + * - a URL for control channel (networkUrl has to be null, dataUrl has to be set) + * @param dataUrl + * - a URL for data channel (networkUrl has to be null, controlUrl has to be set) + * @param noConsumer + * - a flag to indicate no consumer + * @param disableConsumer + * - a flag to disable consumer + * @throws ExecutionException + * If the command fails + */ + public void createSession(String sessionName, String networkUrl, String controlUrl, String dataUrl, boolean noConsumer, boolean disableConsumer) throws ExecutionException { + createSession(sessionName, networkUrl, controlUrl, dataUrl, noConsumer, disableConsumer, new NullProgressMonitor()); + } + + /** + * Creates a session with given session name and location. + * + * @param sessionName + * - a session name to create + * @param networkUrl + * - a network URL for common definition of data and control channel + * or null if separate definition of data and control channel + * @param controlUrl + * - a URL for control channel (networkUrl has to be null, dataUrl has to be set) + * @param dataUrl + * - a URL for data channel (networkUrl has to be null, controlUrl has to be set) + * @param noConsumer + * - a flag to indicate no consumer + * @param disableConsumer + * - a flag to disable consumer + * @param monitor + * - a progress monitor + * @throws ExecutionException + * If the command fails + */ + public void createSession(String sessionName, String networkUrl, String controlUrl, String dataUrl, boolean noConsumer, boolean disableConsumer, IProgressMonitor monitor) throws ExecutionException { + ISessionInfo sessionInfo = getControlService().createSession(sessionName, networkUrl, controlUrl, dataUrl, noConsumer, disableConsumer, monitor); + + if (sessionInfo != null) { + TraceSessionComponent session = new TraceSessionComponent(sessionInfo.getName(), TraceSessionGroup.this); + addChild(session); + session.getConfigurationFromNode(monitor); + } + } + + /** * Destroys a session with given session name. * * @param session diff --git a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/ILttngControlService.java b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/ILttngControlService.java index 4499a09dd9..b068361add 100644 --- a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/ILttngControlService.java +++ b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/ILttngControlService.java @@ -121,6 +121,52 @@ public interface ILttngControlService { IProgressMonitor monitor) throws ExecutionException; /** + * Creates a session with given session name and location. + * + * @param sessionName + * - a session name to create + * @param sessionPath + * - a path for storing the traces (use null for default) + * @param noConsumer + * - a flag to indicate no consumer + * @param disableConsumer + * - a flag to disable consumer + * @param monitor + * - a progress monitor + * @return the session information + * @throws ExecutionException + * If the command fails + */ + public ISessionInfo createSession(String sessionName, String sessionPath, boolean noConsumer, boolean disableConsumer, + IProgressMonitor monitor) throws ExecutionException; + + + /** + * Creates a session with given session name and location. + * + * @param sessionName + * - a session name to create + * @param networkUrl + * - a network URL for common definition of data and control channel + * or null if separate definition of data and control channel + * @param controlUrl + * - a URL for control channel (networkUrl has to be null, dataUrl has to be set) + * @param dataUrl + * - a URL for data channel (networkUrl has to be null, controlUrl has to be set) + * @param noConsumer + * - a flag to indicate no consumer + * @param disableConsumer + * - a flag to disable consumer + * @param monitor + * - a progress monitor + * @return the session information + * @throws ExecutionException + * If the command fails + */ + public ISessionInfo createSession(String sessionName, String networkUrl, String controlUrl, String dataUrl, boolean noConsumer, boolean disableConsumer, + IProgressMonitor monitor) throws ExecutionException; + + /** * Destroys a session with given session name. * * @param sessionName diff --git a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlService.java b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlService.java index 92a28c2608..d70f412760 100644 --- a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlService.java +++ b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlService.java @@ -184,6 +184,11 @@ public class LTTngControlService implements ILttngControlService { continue; } + matcher = LTTngControlServiceConstants.TRACE_NETWORK_PATH_PATTERN.matcher(line); + if (matcher.matches()) { + sessionInfo.setStreamedTrace(true); + } + matcher = LTTngControlServiceConstants.TRACE_SESSION_PATH_PATTERN.matcher(line); if (matcher.matches()) { sessionInfo.setSessionPath(matcher.group(1).trim()); @@ -349,6 +354,12 @@ public class LTTngControlService implements ILttngControlService { */ @Override public ISessionInfo createSession(String sessionName, String sessionPath, IProgressMonitor monitor) throws ExecutionException { + return createSession(sessionName, sessionPath, false, false, monitor); + } + + @Override + public ISessionInfo createSession(String sessionName, String sessionPath, boolean noConsumer, boolean disableConsumer, + IProgressMonitor monitor) throws ExecutionException { String newName = formatParameter(sessionName); String newPath = formatParameter(sessionPath); @@ -360,6 +371,12 @@ public class LTTngControlService implements ILttngControlService { command.append(newPath); } + if (noConsumer) { + command.append(LTTngControlServiceConstants.OPTION_NO_CONSUMER); + } else if (disableConsumer) { + command.append(LTTngControlServiceConstants.OPTION_DISABLE_CONSUMER); + } + ICommandResult result = executeCommand(command.toString(), monitor); //Session myssession2 created. @@ -379,33 +396,109 @@ public class LTTngControlService implements ILttngControlService { formatOutput(result)); } - if ((name == null) || (!name.equals(sessionName))) { + if ((name == null) || (!"".equals(sessionName) && !name.equals(sessionName))) { //$NON-NLS-1$ // Unexpected name returned throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$ Messages.TraceControl_UnexpectedNameError + ": " + name); //$NON-NLS-1$ } - // Get and verify session path - matcher = LTTngControlServiceConstants.CREATE_SESSION_PATH_PATTERN.matcher(output[1]); - String path = null; + SessionInfo sessionInfo = new SessionInfo(name); + + if (!noConsumer) { + // Get and verify session path + matcher = LTTngControlServiceConstants.CREATE_SESSION_PATH_PATTERN.matcher(output[1]); + String path = null; + + if (matcher.matches()) { + path = String.valueOf(matcher.group(1).trim()); + } else { + // Output format not expected + throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$ + Messages.TraceControl_UnexpectedCommandOutputFormat + ":\n" + //$NON-NLS-1$ + formatOutput(result)); + } + + if ((path == null) || ((sessionPath != null) && (!path.contains(sessionPath)))) { + // Unexpected path + throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$ + Messages.TraceControl_UnexpectedPathError + ": " + name); //$NON-NLS-1$ + } + sessionInfo.setSessionPath(path); + } + + return sessionInfo; + + } + + /* + * (non-Javadoc) + * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#createSession(java.lang.String, java.lang.String, java.lang.String, java.lang.String, boolean, boolean, org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + public ISessionInfo createSession(String sessionName, String networkUrl, String controlUrl, + String dataUrl, boolean noConsumer, boolean disableConsumer, IProgressMonitor monitor) throws ExecutionException { + + String newName = formatParameter(sessionName); + StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_CREATE_SESSION, newName); + + if (networkUrl != null) { + command.append(LTTngControlServiceConstants.OPTION_NETWORK_URL); + command.append(networkUrl); + } else { + command.append(LTTngControlServiceConstants.OPTION_CONTROL_URL); + command.append(controlUrl); + + command.append(LTTngControlServiceConstants.OPTION_DATA_URL); + command.append(dataUrl); + } + + if (noConsumer) { + command.append(LTTngControlServiceConstants.OPTION_NO_CONSUMER); + } else if (disableConsumer) { + command.append(LTTngControlServiceConstants.OPTION_DISABLE_CONSUMER); + } + + ICommandResult result = executeCommand(command.toString(), monitor); + + //Session myssession2 created. + //Traces will be written in /home/user/lttng-traces/myssession2-20120209-095418 + String[] output = result.getOutput(); + + // Get and verify session name + Matcher matcher = LTTngControlServiceConstants.CREATE_SESSION_NAME_PATTERN.matcher(output[0]); + String name = null; if (matcher.matches()) { - path = String.valueOf(matcher.group(1).trim()); + name = String.valueOf(matcher.group(1).trim()); } else { // Output format not expected throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$ Messages.TraceControl_UnexpectedCommandOutputFormat + ":\n" + //$NON-NLS-1$ formatOutput(result)); } - - if ((path == null) || ((sessionPath != null) && (!path.contains(sessionPath)))) { - // Unexpected path - throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$ - Messages.TraceControl_UnexpectedPathError + ": " + name); //$NON-NLS-1$ - } + // Get and verify session path + matcher = LTTngControlServiceConstants.CREATE_SESSION_PATH_PATTERN.matcher(output[1]); + String path = null; SessionInfo sessionInfo = new SessionInfo(name); - sessionInfo.setSessionPath(path); + if (!noConsumer && (networkUrl != null)) { + if (matcher.matches()) { + path = String.valueOf(matcher.group(1).trim()); + } else { + // Output format not expected + throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$ + Messages.TraceControl_UnexpectedCommandOutputFormat + ":\n" + //$NON-NLS-1$ + formatOutput(result)); + } + + if (path == null) { + // Unexpected path + throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$ + Messages.TraceControl_UnexpectedPathError + ": " + name); //$NON-NLS-1$ + } + sessionInfo.setSessionPath(path); + } + sessionInfo.setStreamedTrace(true); return sessionInfo; } @@ -1182,8 +1275,6 @@ public class LTTngControlService implements ILttngControlService { return index; } - - /** * Formats a command parameter for the command execution i.e. adds quotes * at the beginning and end if necessary. diff --git a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlServiceConstants.java b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlServiceConstants.java index 81b01b7cbd..af9e72c11c 100644 --- a/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlServiceConstants.java +++ b/lttng/org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/service/LTTngControlServiceConstants.java @@ -201,7 +201,26 @@ public class LTTngControlServiceConstants { * Command line option for configuring event's filter */ public final static String OPTION_FILTER = " --filter "; //$NON-NLS-1$ - + /** + * Command line option for configuring the streaming network URL (common for control and data channel). + */ + public final static String OPTION_NETWORK_URL = " -U "; //$NON-NLS-1$ + /** + * Command line option for configuring the streaming control URL. + */ + public final static String OPTION_CONTROL_URL = " -C "; //$NON-NLS-1$ + /** + * Command line option for configuring the streaming data URL. + */ + public final static String OPTION_DATA_URL = " -D "; //$NON-NLS-1$ + /** + * Command line option for configuring of no consumer. + */ + public final static String OPTION_NO_CONSUMER = " --no-consumer "; //$NON-NLS-1$ + /** + * Command line option for disabling the consumer. + */ + public final static String OPTION_DISABLE_CONSUMER = " --disable-consumer "; //$NON-NLS-1$ // ------------------------------------------------------------------------ // Parsing constants @@ -227,6 +246,10 @@ public class LTTngControlServiceConstants { */ public final static Pattern TRACE_SESSION_PATH_PATTERN = Pattern.compile("\\s*Trace\\s+path\\:\\s+(.*)"); //$NON-NLS-1$ /** + * Patter to match session path for network tracing (lttng list <session>) + */ + public final static Pattern TRACE_NETWORK_PATH_PATTERN = Pattern.compile("\\s*Trace\\s+path\\:\\s+(net|net6|file|tcp|tcp6|)\\:\\/\\/(.*)(\\:(\\d*)\\/(.*)\\[data\\:\\s+(\\d*)\\]){0,1}"); //$NON-NLS-1$ + /** * Pattern to match for kernel domain information (lttng list <session>) */ public final static Pattern DOMAIN_KERNEL_PATTERN = Pattern.compile("=== Domain: Kernel ==="); //$NON-NLS-1$ @@ -335,4 +358,5 @@ public class LTTngControlServiceConstants { * Pattern to match error line if no kernel tracer is available or installed. */ public final static Pattern LIST_KERNEL_NO_KERNEL_PROVIDER_PATTERN = Pattern.compile("\\s*Error:\\s+Unable\\s+to\\s+list\\s+kernel\\s+events.*"); //$NON-NLS-1$; + } |