x-friends:="org.eclipse.linuxtools.lttng2.control.ui.tests",org.eclip
se.linuxtools.internal.lttng2.control.ui.views.service;x-friends:="or
g.eclipse.linuxtools.lttng2.control.ui.tests"
-Import-Package: org.eclipse.rse.core,
+Import-Package: com.google.common.collect,
+ org.eclipse.rse.core,
org.eclipse.rse.core.model,
org.eclipse.rse.core.subsystems,
org.eclipse.rse.services,
about.html,\
plugin.properties
src.includes = about.html
+additional.bundles = org.eclipse.jdt.annotation
+jars.extra.classpath = platform:/plugin/org.eclipse.jdt.annotation
commands.control.create.session=Create Session...
commands.control.create.session.description=Create a Trace Session
+commands.control.execute.command.script=Execute Command Script...
+commands.control.execute.command.script.description=Execute Command Script
+
commands.control.destroy.session=Destroy Session...
commands.control.destroy.session.description=Destroy a Trace Session
id="org.eclipse.linuxtools.internal.lttng2.ui.commands.control.createSession"
name="%commands.control.create.session">
</command>
+ <command
+ categoryId="org.eclipse.linuxtools.internal.lttng2.ui.commands.control.category"
+ description="%commands.control.execute.command.script.description"
+ id="org.eclipse.linuxtools.internal.lttng2.ui.commands.control.executeScript"
+ name="%commands.control.execute.command.script">
+ </command>
<command
categoryId="org.eclipse.linuxtools.internal.lttng2.ui.commands.control.category"
description="%commands.control.destroy.session.description"
</with>
</visibleWhen>
</command>
+ <command
+ commandId="org.eclipse.linuxtools.internal.lttng2.ui.commands.control.executeScript"
+ icon="icons/elcl16/add_button.gif"
+ label="%commands.control.execute.command.script"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <with
+ variable="activeMenuSelection">
+ <iterate
+ operator="or">
+ <instanceof
+ value="org.eclipse.linuxtools.internal.lttng2.control.ui.views.model.impl.TraceSessionGroup">
+ </instanceof>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
<command
commandId="org.eclipse.linuxtools.internal.lttng2.ui.commands.control.start"
icon="icons/elcl16/start_trace.gif"
</with>
</activeWhen>
</handler>
+ <handler
+ class="org.eclipse.linuxtools.internal.lttng2.control.ui.views.handlers.ExecuteCommandScriptHandler"
+ commandId="org.eclipse.linuxtools.internal.lttng2.ui.commands.control.executeScript">
+ <activeWhen>
+ <with
+ variable="selection">
+ <iterate
+ operator="or">
+ <instanceof
+ value="org.eclipse.linuxtools.internal.lttng2.control.ui.views.model.impl.TraceSessionGroup">
+ </instanceof>
+ </iterate>
+ </with>
+ </activeWhen>
+ </handler>
<handler
class="org.eclipse.linuxtools.internal.lttng2.control.ui.views.handlers.DestroySessionHandler"
commandId="org.eclipse.linuxtools.internal.lttng2.ui.commands.control.destroySession">
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Bernd Hufmann - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.linuxtools.internal.lttng2.control.ui.views.dialogs;
+
+import java.util.List;
+
+/**
+ * Interface for dialog for selecting a command script.
+ *
+ * @author Bernd Hufmann
+ *
+ */
+public interface ISelectCommandScriptDialog {
+ /**
+ * @return a list of command
+ */
+ List<String> getCommands();
+
+ /**
+ * @return the open return value
+ */
+ int open();
+}
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Bernd Hufmann - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.linuxtools.internal.lttng2.control.ui.views.dialogs;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.linuxtools.internal.lttng2.control.ui.Activator;
+import org.eclipse.linuxtools.internal.lttng2.control.ui.views.messages.Messages;
+import org.eclipse.linuxtools.tmf.core.io.BufferedRandomAccessFile;
+import org.eclipse.swt.SWT;
+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.Event;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * <p>
+ * Dialog box for selecting a command script. It parses the script and
+ * provides a list of shell commands to be executed.
+ * </p>
+ *
+ * @author Bernd Hufmann
+ */
+public class OpenCommandScriptDialog extends Dialog implements ISelectCommandScriptDialog {
+
+ // ------------------------------------------------------------------------
+ // Constants
+ // ------------------------------------------------------------------------
+ /**
+ * The icon file for this dialog box.
+ */
+ public static final String CREATE_SESSION_ICON_FILE = "icons/elcl16/add_button.gif"; //$NON-NLS-1$
+
+ // ------------------------------------------------------------------------
+ // Attributes
+ // ------------------------------------------------------------------------
+
+ // Dialog attributes
+ private Control fControl = null;
+ private Composite fDialogComposite = null;
+ private Button fBrowseButton;
+ private Label fFileNameLabel = null;
+ private Text fFileNameText = null;
+
+ // Output list of commands
+ private List<String> fCommands = null;
+
+ // ------------------------------------------------------------------------
+ // Constructors
+ // ------------------------------------------------------------------------
+ /**
+ * Constructor
+ * @param shell - a shell for the display of the dialog
+ */
+ public OpenCommandScriptDialog(Shell shell) {
+ super(shell);
+ setShellStyle(SWT.RESIZE | getShellStyle());
+ }
+
+ // ------------------------------------------------------------------------
+ // Accessors
+ // ------------------------------------------------------------------------
+
+ @Override
+ @NonNull public List<String> getCommands() {
+ if (fCommands != null) {
+ return fCommands;
+ }
+ return new ArrayList<>();
+ }
+
+ // ------------------------------------------------------------------------
+ // Operations
+ // ------------------------------------------------------------------------
+
+ @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;
+ }
+
+ @Override
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+ newShell.setText(Messages.TraceControl_ExecuteScriptDialogTitle);
+ newShell.setImage(Activator.getDefault().loadIcon(CREATE_SESSION_ICON_FILE));
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+
+ // Main dialog panel
+ fDialogComposite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(1, true);
+ fDialogComposite.setLayout(layout);
+ fDialogComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ Group sessionGroup = new Group(fDialogComposite, SWT.SHADOW_NONE);
+ sessionGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ sessionGroup.setLayout(new GridLayout(6, true));
+
+ fFileNameLabel = new Label(sessionGroup, SWT.RIGHT);
+ fFileNameLabel.setText(Messages.TraceControl_ExecuteScriptSelectLabel);
+ fFileNameText = new Text(sessionGroup, SWT.NONE);
+
+ fBrowseButton = new Button(sessionGroup, SWT.PUSH);
+ fBrowseButton.setText(Messages.TraceControl_ExecuteScriptBrowseText);
+ fBrowseButton.addListener(SWT.Selection, new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ handleFilePathBrowseButtonPressed(SWT.OPEN);
+ }
+ });
+
+ // layout widgets
+ GridData data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 1;
+ data.grabExcessHorizontalSpace = false;
+ fFileNameLabel.setLayoutData(data);
+
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 4;
+ fFileNameText.setLayoutData(data);
+
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 1;
+
+ // Initialize a empty list
+ fCommands = new ArrayList<>();
+
+ return fDialogComposite;
+ }
+
+ private void handleFilePathBrowseButtonPressed(int fileDialogStyle) {
+ FileDialog dialog = new FileDialog(getShell(), fileDialogStyle | SWT.SHEET);
+ dialog.setFilterExtensions(new String[] { "*.*", "*.*" }); //$NON-NLS-1$ //$NON-NLS-2$
+ dialog.setText(Messages.TraceControl_ExecuteScriptDialogTitle);
+ String selectedFileName = dialog.open();
+ fFileNameText.setText(selectedFileName);
+ }
+
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, true);
+ createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+ }
+
+ @Override
+ protected void okPressed() {
+ // Validate input data
+ String sessionPath = fFileNameText.getText();
+
+ if (!"".equals(sessionPath)) { //$NON-NLS-1$
+ ImmutableList.Builder<String> builder = new ImmutableList.Builder<>();
+ try (BufferedRandomAccessFile rafile = new BufferedRandomAccessFile(sessionPath, "r")) { //$NON-NLS-1$
+ String line = rafile.getNextLine();
+ while (line != null) {
+ builder.add(line);
+ line = rafile.getNextLine();
+ }
+ } catch (IOException e) {
+ return;
+ }
+ fCommands = builder.build();
+ super.okPressed();
+ }
+ }
+}
*/
private ICreateSessionDialog fCreateSessionDialog;
+ /**
+ * The command script selection dialog.
+ */
+ private ISelectCommandScriptDialog fCommandScriptDialog;
+
/**
* The enable events dialog.
*/
return fCreateSessionDialog;
}
+ /**
+ * @return command script selection dialog implementation
+ */
+ public ISelectCommandScriptDialog getCommandScriptDialog() {
+ if (fCommandScriptDialog == null) {
+ fCommandScriptDialog = new OpenCommandScriptDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+ }
+ return fCommandScriptDialog;
+ }
+
/**
* Sets a create session dialog implementation.
* @param createSessionDialog - a create session implementation.
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2014 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Bernd Hufmann - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.linuxtools.internal.lttng2.control.ui.views.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.linuxtools.internal.lttng2.control.ui.Activator;
+import org.eclipse.linuxtools.internal.lttng2.control.ui.views.ControlView;
+import org.eclipse.linuxtools.internal.lttng2.control.ui.views.dialogs.ISelectCommandScriptDialog;
+import org.eclipse.linuxtools.internal.lttng2.control.ui.views.dialogs.TraceControlDialogFactory;
+import org.eclipse.linuxtools.internal.lttng2.control.ui.views.messages.Messages;
+import org.eclipse.linuxtools.internal.lttng2.control.ui.views.model.impl.TraceSessionGroup;
+import org.eclipse.ui.IWorkbenchPage;
+
+/**
+ * <p>
+ * Command handler implementation to execute commands of a command script.
+ * </p>
+ *
+ * @author Bernd Hufmann
+ */
+public class ExecuteCommandScriptHandler extends BaseControlViewHandler {
+
+ // ------------------------------------------------------------------------
+ // Attributes
+ // ------------------------------------------------------------------------
+
+ /**
+ * The trace session group the command is to be executed on.
+ */
+ private TraceSessionGroup fSessionGroup = null;
+
+ // ------------------------------------------------------------------------
+ // Operations
+ // ------------------------------------------------------------------------
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ fLock.lock();
+ try {
+ final TraceSessionGroup sessionGroup = fSessionGroup;
+
+ // Open dialog box for the node name and address
+ final ISelectCommandScriptDialog dialog = TraceControlDialogFactory.getInstance().getCommandScriptDialog();
+
+ if (dialog.open() != Window.OK) {
+ return null;
+ }
+
+ Job job = new Job(Messages.TraceControl_ExecuteScriptJob) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ sessionGroup.executeCommands(monitor, dialog.getCommands());
+ } catch (ExecutionException e) {
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.TraceControl_CreateSessionFailure, e);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ job.setUser(true);
+ job.schedule();
+ } finally {
+ fLock.unlock();
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabled() {
+
+ // Get workbench page for the Control View
+ IWorkbenchPage page = getWorkbenchPage();
+ if (page == null) {
+ return false;
+ }
+
+ TraceSessionGroup sessionGroup = null;
+
+ // Check if the session group project is selected
+ ISelection selection = page.getSelection(ControlView.ID);
+ if (selection instanceof StructuredSelection) {
+ Object element = ((StructuredSelection) selection).getFirstElement();
+ sessionGroup = (element instanceof TraceSessionGroup) ? (TraceSessionGroup) element : null;
+ }
+
+ boolean isEnabled = sessionGroup != null;
+ fLock.lock();
+ try {
+ fSessionGroup = null;
+ if(isEnabled) {
+ fSessionGroup = sessionGroup;
+ }
+ } finally {
+ fLock.unlock();
+ }
+ return isEnabled;
+ }
+}
public static String TraceControl_VerboseLevelVeryVerbosePreference;
public static String TraceControl_VerboseLevelVeryVeryVerbosePreference;
+ public static String TraceControl_ExecuteScriptJob;
+ public static String TraceControl_ExecuteScriptError;
+
+ public static String TraceControl_ExecuteScriptDialogTitle;
+ public static String TraceControl_ExecuteScriptBrowseText;
+ public static String TraceControl_ExecuteScriptSelectLabel;
+
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
TraceControl_VerboseLevelVerbosePreference=Level 1
TraceControl_VerboseLevelVeryVerbosePreference=Level 2
TraceControl_VerboseLevelVeryVeryVerbosePreference=Level 3
+
+TraceControl_ExecuteScriptJob=Executing command script
+TraceControl_ExecuteScriptError=Error executing command script
+
+TraceControl_ExecuteScriptDialogTitle=Select command script
+TraceControl_ExecuteScriptBrowseText=Browse...
+TraceControl_ExecuteScriptSelectLabel=Select Script
**********************************************************************/
package org.eclipse.linuxtools.internal.lttng2.control.ui.views.model.impl;
+import java.util.List;
+
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
}
}
+ /**
+ * Command to execute a list of commands
+ * @param monitor
+ * - a progress monitor
+ * @param commands
+ * - a list of commands to execute
+ * @throws ExecutionException
+ * If the command fails
+ */
+ public void executeCommands(IProgressMonitor monitor, List<String> commands) throws ExecutionException {
+ getControlService().runCommands(monitor, commands);
+ getTargetNode().refresh();
+ }
+
/**
* Destroys a session with given session name.
*
*/
void recordSnapshot(String sessionName, IProgressMonitor monitor)
throws ExecutionException;
+
+ /**
+ * Executes a list of commands
+ *
+ * @param monitor
+ * - a progress monitor
+ * @param commands
+ * - array of commands
+ * @throws ExecutionException
+ * If a command fails
+ */
+ void runCommands(IProgressMonitor monitor, List<String> commands)
+ throws ExecutionException;
}
executeCommand(command.toString(), monitor);
}
+ @Override
+ public void runCommands(IProgressMonitor monitor, List<String> commands) throws ExecutionException {
+ for (String command : commands) {
+ if (monitor.isCanceled()) {
+ return;
+ }
+
+ if (command.isEmpty() || command.startsWith("#")) { //$NON-NLS-1$
+ continue;
+ }
+ executeCommand(command, monitor);
+ }
+ }
+
// ------------------------------------------------------------------------
// Helper methods
// ------------------------------------------------------------------------