blob: 924bdd6b1a73efa6e953cc6f629637368d000f23 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2018 Red Hat.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat - Sami Wagiaalla
*******************************************************************************/
package org.eclipse.linuxtools.internal.systemtap.ui.ide.launcher;
import java.text.MessageFormat;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jface.resource.ResourceLocator;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.linuxtools.internal.systemtap.ui.ide.IDEPlugin;
import org.eclipse.linuxtools.internal.systemtap.ui.ide.editors.stp.PathEditorInput;
import org.eclipse.linuxtools.systemtap.graphing.ui.widgets.ExceptionErrorDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
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.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.ResourceUtil;
public class SystemTapScriptLaunchConfigurationTab extends
AbstractLaunchConfigurationTab {
static final String SCRIPT_PATH_ATTR = "ScriptPath"; //$NON-NLS-1$
static final String CURRENT_USER_ATTR = "executeAsCurrentUser"; //$NON-NLS-1$
static final String USER_NAME_ATTR = "userName"; //$NON-NLS-1$
static final String USER_PASS_ATTR = "userPassword"; //$NON-NLS-1$
static final String LOCAL_HOST_ATTR = "executeOnLocalHost"; //$NON-NLS-1$
static final String HOST_NAME_ATTR = "hostName"; //$NON-NLS-1$
static final String PORT_ATTR = "port"; //$NON-NLS-1$
static final String USE_DEFAULT_PORT_ATTR = "useDefaultPort"; //$NON-NLS-1$
private Text scriptPathText;
private Button currentUserCheckButton;
private Text userNameText;
private Label userNameLabel;
private Text userPasswordText;
private Label userPasswordLabel;
private Button localHostCheckButton;
private Group hostSettingsGroup;
private Text hostNameText;
private Label hostNameLabel;
private Text portText;
private Label portLabel;
private Button portCheckButton;
private FileDialog fileDialog;
SelectionListener checkListener = new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
update();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
update();
}
private void update() {
updateLaunchConfigurationDialog();
}
};
/**
* @return The path of the chosen script the Run Configuration will be applied to,
* or <code>null</code> if no file exists at the given path.
*/
IPath getScriptPath() {
IPath scriptPath = new Path(scriptPathText.getText());
return scriptPath.toFile().exists() ? scriptPath : null;
}
@Override
public void createControl(Composite parent) {
fileDialog = new FileDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.OPEN);
fileDialog.setText(Messages.SystemTapScriptLaunchConfigurationTab_selectScript);
fileDialog.setFilterPath(Platform.getLocation().toOSString());
GridLayout layout = new GridLayout();
Composite top = new Composite(parent, SWT.NONE);
setControl(top);
top.setLayout(layout);
top.setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, true));
// Script path
Group scriptSettingsGroup = new Group(top, SWT.SHADOW_ETCHED_IN);
scriptSettingsGroup.setText(Messages.SystemTapScriptLaunchConfigurationTab_script);
scriptSettingsGroup.setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, false));
layout = new GridLayout();
layout.numColumns = 2;
scriptSettingsGroup.setLayout(layout);
scriptPathText = new Text(scriptSettingsGroup, SWT.SINGLE | SWT.BORDER);
scriptPathText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
scriptPathText.addModifyListener(e -> updateLaunchConfigurationDialog());
Button selectScriptButon = new Button(scriptSettingsGroup, 0);
GridData gridData = new GridData();
gridData.widthHint = 110;
selectScriptButon.setLayoutData(gridData);
selectScriptButon.setText(Messages.SystemTapScriptLaunchConfigurationTab_browse);
selectScriptButon.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
String path = fileDialog.open();
if (path != null) {
scriptPathText.setText(path);
}
}));
// User Settings
Group userSettingsGroup = new Group(top, SWT.SHADOW_ETCHED_IN);
layout = new GridLayout();
userSettingsGroup.setLayout(layout);
layout.numColumns = 2;
userSettingsGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
currentUserCheckButton = new Button(userSettingsGroup, SWT.CHECK);
currentUserCheckButton.setText(Messages.SystemTapScriptLaunchConfigurationTab_currentUser);
currentUserCheckButton.setSelection(true);
gridData = new GridData();
gridData.horizontalSpan = 2;
currentUserCheckButton.setLayoutData(gridData);
currentUserCheckButton.addSelectionListener(checkListener);
userNameLabel = new Label(userSettingsGroup, SWT.NONE);
userNameLabel.setText(Messages.SystemTapScriptLaunchConfigurationTab_username);
userNameText = new Text(userSettingsGroup, SWT.SINGLE | SWT.BORDER);
userNameText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
userPasswordLabel = new Label(userSettingsGroup, SWT.NONE);
userPasswordLabel.setText(Messages.SystemTapScriptLaunchConfigurationTab_password);
userPasswordText = new Text(userSettingsGroup, SWT.SINGLE | SWT.BORDER | SWT.PASSWORD);
userPasswordText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
userSettingsGroup.setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, false));
userSettingsGroup.setText(Messages.SystemTapScriptLaunchConfigurationTab_user);
userNameText.addModifyListener(e -> updateLaunchConfigurationDialog());
userPasswordText.addModifyListener(e -> updateLaunchConfigurationDialog());
// Host settings
hostSettingsGroup = new Group(top, SWT.SHADOW_ETCHED_IN);
hostSettingsGroup.setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, false));
hostSettingsGroup.setText(Messages.SystemTapScriptLaunchConfigurationTab_host);
layout = new GridLayout();
hostSettingsGroup.setLayout(layout);
layout.numColumns = 2;
localHostCheckButton = new Button(hostSettingsGroup, SWT.CHECK);
localHostCheckButton.setText(Messages.SystemTapScriptLaunchConfigurationTab_runLocally);
gridData = new GridData();
gridData.horizontalSpan = 2;
hostNameLabel = new Label(hostSettingsGroup, SWT.NONE);
hostNameLabel.setText(Messages.SystemTapScriptLaunchConfigurationTab_hostname);
hostNameText = new Text(hostSettingsGroup, SWT.SINGLE | SWT.BORDER);
hostNameText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
localHostCheckButton.setLayoutData(gridData);
localHostCheckButton.addSelectionListener(checkListener);
hostNameText.addModifyListener(e -> updateLaunchConfigurationDialog());
portCheckButton = new Button(hostSettingsGroup, SWT.CHECK);
portCheckButton.setText(Messages.SystemTapScriptLaunchConfigurationTab_useDefaultPort);
gridData = new GridData();
gridData.horizontalSpan = 2;
portCheckButton.setLayoutData(gridData);
portCheckButton.addSelectionListener(checkListener);
portLabel = new Label(hostSettingsGroup, SWT.NONE);
portLabel.setText(Messages.SystemTapScriptLaunchConfigurationTab_port);
portText = new Text(hostSettingsGroup, SWT.SINGLE | SWT.BORDER);
portText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
portText.setTextLimit(5);
portText.addVerifyListener(e -> {
if (e.keyCode == SWT.BS) {
return;
}
for (int i = 0, n = e.text.length(); i < n; i++) {
if (!Character.isDigit(e.text.charAt(i))) {
e.doit = false;
return;
}
}
});
portText.addModifyListener(e -> updateLaunchConfigurationDialog());
}
private void setUserGroupEnablement(boolean enable) {
userNameText.setEnabled(enable);
userNameLabel.setEnabled(enable);
userPasswordText.setEnabled(enable);
userPasswordLabel.setEnabled(enable);
hostSettingsGroup.setEnabled(enable);
localHostCheckButton.setEnabled(enable);
}
private void setHostGroupEnablement(boolean enable) {
hostNameText.setEnabled(enable);
hostNameLabel.setEnabled(enable);
portCheckButton.setEnabled(enable);
boolean portEnabled = enable && !portCheckButton.getSelection();
portText.setEnabled(portEnabled);
portLabel.setEnabled(portEnabled);
}
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
configuration.setAttribute(SCRIPT_PATH_ATTR, getSelectedScriptPath());
configuration.setAttribute(CURRENT_USER_ATTR, true);
configuration.setAttribute(USER_NAME_ATTR, ""); //$NON-NLS-1$
configuration.setAttribute(USER_PASS_ATTR, ""); //$NON-NLS-1$
configuration.setAttribute(LOCAL_HOST_ATTR, true);
configuration.setAttribute(HOST_NAME_ATTR, ""); //$NON-NLS-1$
configuration.setAttribute(PORT_ATTR,
SystemTapScriptLaunchConfigurationDelegate.DEFAULT_PORT);
configuration.setAttribute(USE_DEFAULT_PORT_ATTR, true);
}
@Override
public void initializeFrom(ILaunchConfiguration configuration) {
try {
this.scriptPathText.setText(configuration.getAttribute(SCRIPT_PATH_ATTR, "")); //$NON-NLS-1$
this.currentUserCheckButton.setSelection(configuration.getAttribute(CURRENT_USER_ATTR, true));
this.userNameText.setText(configuration.getAttribute(USER_NAME_ATTR, "")); //$NON-NLS-1$
this.userPasswordText.setText(configuration.getAttribute(USER_PASS_ATTR, "")); //$NON-NLS-1$
this.localHostCheckButton.setSelection(configuration.getAttribute(LOCAL_HOST_ATTR, true));
this.hostNameText.setText(configuration.getAttribute(HOST_NAME_ATTR, "")); //$NON-NLS-1$
this.portText.setText(Integer.toString(configuration.getAttribute(PORT_ATTR,
SystemTapScriptLaunchConfigurationDelegate.DEFAULT_PORT)));
this.portCheckButton.setSelection(configuration.getAttribute(USE_DEFAULT_PORT_ATTR, true));
} catch (CoreException e) {
ExceptionErrorDialog.openError(Messages.SystemTapScriptLaunchConfigurationTab_errorInitializingTab, e);
}
}
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
configuration.setAttribute(SCRIPT_PATH_ATTR, this.scriptPathText.getText());
configuration.setAttribute(CURRENT_USER_ATTR, this.currentUserCheckButton.getSelection());
configuration.setAttribute(USER_NAME_ATTR, this.userNameText.getText());
configuration.setAttribute(USER_PASS_ATTR, this.userPasswordText.getText());
configuration.setAttribute(LOCAL_HOST_ATTR, this.localHostCheckButton.getSelection());
configuration.setAttribute(HOST_NAME_ATTR, this.hostNameText.getText());
configuration.setAttribute(USE_DEFAULT_PORT_ATTR, portCheckButton.getSelection());
String portString = this.portText.getText();
configuration.setAttribute(PORT_ATTR, !portString.isEmpty() ? Integer.valueOf(portString) : 0);
boolean enable = !currentUserCheckButton.getSelection();
setUserGroupEnablement(enable);
enable &= !localHostCheckButton.getSelection();
setHostGroupEnablement(enable);
}
@Override
public boolean isValid(ILaunchConfiguration launchConfig) {
setErrorMessage(null);
IPath scriptPath = getScriptPath();
if (scriptPath == null) {
setErrorMessage(MessageFormat.format(Messages.SystemTapScriptLaunchConfigurationTab_fileNotFound, scriptPathText.getText()));
return false;
}
String extension = scriptPath.getFileExtension();
if (extension == null || !extension.equals("stp")) { //$NON-NLS-1$
setErrorMessage(Messages.SystemTapScriptLaunchConfigurationTab_fileNotStp);
return false;
}
return true;
}
@Override
public String getName() {
return Messages.SystemTapScriptLaunchConfigurationTab_general;
}
private String getSelectedScriptPath() {
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
String pathString = ""; //$NON-NLS-1$
if (window != null)
{
ISelection selection = window.getSelectionService().getSelection();
// Figure out the selected systemtap script
if (selection instanceof TreeSelection) {
Object selectedElement = ((TreeSelection)selection).getFirstElement();
if (selectedElement instanceof IFile)
{
IPath path = ((IFile)selectedElement).getLocation();
pathString = path.toOSString();
}
}
// If it is a text selection use the path from the active editor.
if (selection instanceof TextSelection) {
IEditorPart ed = window.getActivePage().getActiveEditor();
if(ed.getEditorInput() instanceof PathEditorInput) {
pathString = ((PathEditorInput)ed.getEditorInput()).getPath().toString();
} else {
pathString = ResourceUtil.getFile(ed.getEditorInput()).getLocation().toString();
}
}
}
if (pathString.endsWith(".stp")) { //$NON-NLS-1$
return pathString;
}
return ""; //$NON-NLS-1$
}
@Override
public Image getImage() {
return ResourceLocator.imageDescriptorFromBundle(IDEPlugin.PLUGIN_ID, "icons/main_tab.gif").get().createImage(); //$NON-NLS-1$
}
}