/**********************************************************************
* 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.handlers;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.window.Window;
import org.eclipse.linuxtools.internal.lttng2.ui.Activator;
import org.eclipse.linuxtools.internal.lttng2.ui.views.control.ControlView;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.Messages;
import org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IGetEventInfoDialog;
import org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.TraceControlDialogFactory;
+import org.eclipse.linuxtools.internal.lttng2.ui.views.control.messages.Messages;
import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.ITraceControlComponent;
import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.BaseEventComponent;
import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.KernelProviderComponent;
import org.eclipse.ui.IWorkbenchPage;
/**
- * <b><u>EnableEventHandler</u></b>
* <p>
* Command handler implementation to assign events to a session and channel and enable/configure them.
* This is done on the trace provider level.
* </p>
+ *
+ * @author Bernd Hufmann
*/
public class AssignEventHandler extends BaseControlViewHandler {
// Attributes
// ------------------------------------------------------------------------
/**
- * The list of event components the command is to be executed on.
+ * The command execution parameter.
*/
- private List<BaseEventComponent> fEvents = new ArrayList<BaseEventComponent>();
-
- /**
- * The list of available sessions.
- */
- private TraceSessionComponent[] fSessions;
-
- /**
- * Flag for indicating Kernel or UST.
- */
- Boolean fIsKernel = null;
-
+ private Parameter fParam;
+
// ------------------------------------------------------------------------
// Operations
// ------------------------------------------------------------------------
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
- // Open dialog box to retrieve the session and channel where the events should be enabled in.
- final IGetEventInfoDialog dialog = TraceControlDialogFactory.getInstance().getGetEventInfoDialog();
- dialog.setIsKernel(fIsKernel);
- dialog.setSessions(fSessions);
+ fLock.lock();
+ try {
+ // Make a copy for thread safety
+ final Parameter param = new Parameter(fParam);
- if (dialog.open() != Window.OK) {
- return null;
- }
+ // Open dialog box to retrieve the session and channel where the events should be enabled in.
+ final IGetEventInfoDialog dialog = TraceControlDialogFactory.getInstance().getGetEventInfoDialog();
+ dialog.setIsKernel(param.isKernel());
+ dialog.setSessions(param.getSessions());
- Job job = new Job(Messages.TraceControl_EnableEventsJob) {
- @Override
- protected IStatus run(IProgressMonitor monitor) {
-
- String errorString = null;
- try {
- List<String> eventNames = new ArrayList<String>();
- // Create list of event names
- for (Iterator<BaseEventComponent> iterator = fEvents.iterator(); iterator.hasNext();) {
- BaseEventComponent event = (BaseEventComponent) iterator.next();
- eventNames.add(event.getName());
- }
+ if (dialog.open() != Window.OK) {
+ return null;
+ }
- TraceChannelComponent channel = dialog.getChannel();
- if (channel == null) {
- // enable events on default channel (which will be created by lttng-tools)
- dialog.getSession().enableEvents(eventNames, fIsKernel, monitor);
- } else {
- channel.enableEvents(eventNames, monitor);
- }
+ Job job = new Job(Messages.TraceControl_EnableEventsJob) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
- } catch (ExecutionException e) {
- errorString = e.toString() + "\n"; //$NON-NLS-1$
- }
+ Exception error = null;
+
+ try {
+ List<String> eventNames = new ArrayList<String>();
+ List<BaseEventComponent> events = param.getEvents();
+ // Create list of event names
+ for (Iterator<BaseEventComponent> iterator = events.iterator(); iterator.hasNext();) {
+ BaseEventComponent event = iterator.next();
+ eventNames.add(event.getName());
+ }
+
+ TraceChannelComponent channel = dialog.getChannel();
+ if (channel == null) {
+ // enable events on default channel (which will be created by lttng-tools)
+ dialog.getSession().enableEvents(eventNames, param.isKernel(), monitor);
+ } else {
+ channel.enableEvents(eventNames, monitor);
+ }
- // get session configuration in all cases
- try {
- dialog.getSession().getConfigurationFromNode(monitor);
- } catch (ExecutionException e) {
- if (errorString == null) {
- errorString = new String();
+ } catch (ExecutionException e) {
+ error = e;
}
- errorString += Messages.TraceControl_ListSessionFailure + ": " + e.toString(); //$NON-NLS-1$
- }
- if (errorString != null) {
- return new Status(Status.ERROR, Activator.PLUGIN_ID, errorString);
+ // refresh in all cases
+ refresh(new CommandParameter(dialog.getSession()));
+
+ if (error != null) {
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.TraceControl_EnableEventsFailure, error);
+ }
+ return Status.OK_STATUS;
}
- return Status.OK_STATUS;
- }
- };
- job.setUser(true);
- job.schedule();
+ };
+ job.setUser(true);
+ job.schedule();
+ } finally {
+ fLock.unlock();
+ }
+
return null;
}
*/
@Override
public boolean isEnabled() {
- fEvents.clear();
- fSessions = null;
- fIsKernel = null;
+ ArrayList<BaseEventComponent> events = new ArrayList<BaseEventComponent>();
+ TraceSessionComponent[] sessions = null;
+ Boolean isKernel = null;
- // Get workbench page for the Control View
+ // Get workbench page for the Control View
IWorkbenchPage page = getWorkbenchPage();
if (page == null) {
return false;
// Check if one or more session are selected
ISelection selection = page.getSelection(ControlView.ID);
if (selection instanceof StructuredSelection) {
-
+
StructuredSelection structered = ((StructuredSelection) selection);
for (Iterator<?> iterator = structered.iterator(); iterator.hasNext();) {
- Object element = (Object) iterator.next();
+ Object element = iterator.next();
if (element instanceof BaseEventComponent) {
BaseEventComponent event = (BaseEventComponent) element;
ITraceControlComponent provider = event.getParent();
-
+
// check for kernel or UST provider
boolean temp = false;
if (provider instanceof KernelProviderComponent) {
} else {
return false;
}
- if (fIsKernel == null) {
- fIsKernel = Boolean.valueOf(temp);
+ if (isKernel == null) {
+ isKernel = Boolean.valueOf(temp);
} else {
// don't mix events from Kernel and UST provider
- if (fIsKernel.booleanValue() != temp) {
+ if (isKernel.booleanValue() != temp) {
return false;
}
}
// Add BaseEventComponents
- fEvents.add(event);
-
- if (fSessions == null) {
+ events.add(event);
+
+ if (sessions == null) {
TargetNodeComponent root = (TargetNodeComponent)event.getParent().getParent().getParent();
- fSessions = root.getSessions();
+ sessions = root.getSessions();
}
}
}
}
- return ((fEvents.size() > 0) && (fSessions != null) && (fSessions.length > 0));
+
+ boolean isEnabled = ((!events.isEmpty()) && (sessions != null) && (sessions.length > 0));
+ fLock.lock();
+ try {
+ fParam = null;
+ if(isEnabled) {
+ fParam = new Parameter(sessions, events, isKernel);
+ }
+ } finally {
+ fLock.unlock();
+ }
+ return isEnabled;
+ }
+
+ /**
+ * Class containing parameter for the command execution.
+ */
+ final static private class Parameter {
+
+ /**
+ * The list of event components the command is to be executed on.
+ */
+ private final List<BaseEventComponent> fEvents;
+
+ /**
+ * The list of available sessions.
+ */
+ final private TraceSessionComponent[] fSessions;
+
+ /**
+ * Flag for indicating Kernel or UST.
+ */
+ final private boolean fIsKernel;
+
+ /**
+ * Constructor
+ *
+ * @param sessions - a array of trace sessions
+ * @param events - a lists of events to enable
+ * @param isKernel - domain (true for kernel or UST)
+ */
+ public Parameter(TraceSessionComponent[] sessions, List<BaseEventComponent> events, boolean isKernel) {
+ fSessions = Arrays.copyOf(sessions, sessions.length);
+ fEvents = new ArrayList<BaseEventComponent>();
+ fEvents.addAll(events);
+ fIsKernel = isKernel;
+ }
+
+ /**
+ * Copy constructor
+ * @param other - a parameter to copy
+ */
+ public Parameter(Parameter other) {
+ this(other.fSessions, other.fEvents, other.fIsKernel);
+ }
+
+ public TraceSessionComponent[] getSessions() {
+ return fSessions;
+ }
+
+ public List<BaseEventComponent> getEvents() {
+ return fEvents;
+ }
+
+ public boolean isKernel() {
+ return fIsKernel;
+ }
}
}