blob: be177dc322e49e7ac12c463ad6f8b0b9725aa2d3 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2012, 2014 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Bernd Hufmann - Initial API and implementation
* Bernd Hufmann - Updated for support of LTTng Tools 2.1
* Marc-Andre Laperle - Support for opening a live session
**********************************************************************/
package org.eclipse.tracecompass.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.swt.graphics.Image;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.IChannelInfo;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.IDomainInfo;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.ISessionInfo;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.ISnapshotInfo;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceSessionState;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.impl.SessionInfo;
import org.eclipse.tracecompass.internal.lttng2.control.ui.Activator;
import org.eclipse.tracecompass.internal.lttng2.control.ui.views.messages.Messages;
import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.ITraceControlComponent;
import org.eclipse.tracecompass.internal.lttng2.control.ui.views.property.TraceSessionPropertySource;
import org.eclipse.ui.views.properties.IPropertySource;
/**
* <p>
* Implementation of the trace session component.
* </p>
*
* @author Bernd Hufmann
*/
public class TraceSessionComponent extends TraceControlComponent {
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
/**
* Path to icon file for this component (inactive state).
*/
public static final String TRACE_SESSION_ICON_FILE_INACTIVE = "icons/obj16/session_inactive.gif"; //$NON-NLS-1$
/**
* Path to icon file for this component (active state).
*/
public static final String TRACE_SESSION_ICON_FILE_ACTIVE = "icons/obj16/session_active.gif"; //$NON-NLS-1$
/**
* Path to icon file for this component (destroyed state).
*/
public static final String TRACE_SESSION_ICON_FILE_DESTROYED = "icons/obj16/session_destroyed.gif"; //$NON-NLS-1$
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
/**
* The session information.
*/
private ISessionInfo fSessionInfo = null;
/**
* A flag to indicate if session has been destroyed.
*/
private boolean fIsDestroyed = false;
/**
* The image to be displayed in state active.
*/
private Image fActiveImage = null;
/**
* The image to be displayed in state destroyed
*/
private Image fDestroyedImage = null;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
/**
* Constructor
* @param name - the name of the component.
* @param parent - the parent of this component.
*/
public TraceSessionComponent(String name, ITraceControlComponent parent) {
super(name, parent);
setImage(TRACE_SESSION_ICON_FILE_INACTIVE);
setToolTip(Messages.TraceControl_SessionDisplayName);
fSessionInfo = new SessionInfo(name);
fActiveImage = Activator.getDefault().loadIcon(TRACE_SESSION_ICON_FILE_ACTIVE);
fDestroyedImage = Activator.getDefault().loadIcon(TRACE_SESSION_ICON_FILE_DESTROYED);
}
/**
* Constructor
*
* @param sessionInfo
* the session information used to create the session
* @param parent
* the parent of this component.
*/
public TraceSessionComponent(ISessionInfo sessionInfo, ITraceControlComponent parent) {
this(sessionInfo.getName(), parent);
copyLiveInfo(sessionInfo);
}
private void copyLiveInfo(ISessionInfo sessionInfo) {
/*
* Since we can't retrieve this live port and URL from the node, we
* copy it over. Note that this information gets lost when the user
* presses the refresh button or restarts or Trace Compass.
*/
if (sessionInfo.getLivePort() != null) {
fSessionInfo.setLivePort(sessionInfo.getLivePort());
}
if (sessionInfo.getLiveUrl() != null) {
fSessionInfo.setLiveUrl(sessionInfo.getLiveUrl());
}
/*
* Live streaming has been added in 2.4.x. Since we can't retrieve
* whether a session is live or not from a 2.4.x node, we copy it over.
* Note that this information gets lost when the user presses the
* refresh button or restarts or Trace Compass.
*
* For LTTng 2.5.0 and later it's possible to retrieve this information.
* So we don't need to copy this over be set here. This will make sure
* that the session is recognized as live after a Trace Compass restart
* or a refresh.
*/
if (!getTargetNode().isVersionSupported("2.5.0")) { //$NON-NLS-1$
fSessionInfo.setLive(sessionInfo.isLive());
}
}
// ------------------------------------------------------------------------
// Accessors
// ------------------------------------------------------------------------
@Override
public Image getImage() {
if (fIsDestroyed) {
return fDestroyedImage;
}
if (fSessionInfo.getSessionState() == TraceSessionState.INACTIVE) {
return super.getImage();
}
return fActiveImage;
}
/**
* @return the whether the session is destroyed or not.
*/
public boolean isDestroyed() {
return fIsDestroyed;
}
/**
* Sets the session destroyed state to the given value.
* @param destroyed - value to set.
*/
public void setDestroyed(boolean destroyed) {
fIsDestroyed = destroyed;
}
/**
* @return the session state state (active or inactive).
*/
public TraceSessionState getSessionState() {
return fSessionInfo.getSessionState();
}
/**
* Sets the session state to the given value.
* @param state - state to set.
*/
public void setSessionState(TraceSessionState state) {
fSessionInfo.setSessionState(state);
}
/**
* Sets the event state to the value specified by the given name.
* @param stateName - state to set.
*/
public void setSessionState(String stateName) {
fSessionInfo.setSessionState(stateName);
}
/**
* @return path string where session is located.
*/
public String getSessionPath() {
return fSessionInfo.getSessionPath();
}
/**
* Sets the path string (where session is located) to the given value.
* @param sessionPath - session path to set.
*/
public void setSessionPath(String sessionPath) {
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);
}
/**
* Returns whether the session is snapshot session or not
* @return <code>true</code> if it is snapshot session else <code>false</code>
*/
public boolean isSnapshotSession() {
return fSessionInfo.isSnapshotSession();
}
/**
* Gets the snapshot information if available whether the session is a snapshot session or not
* @return the snapshot information or null if it is not a snapshot session
*/
public ISnapshotInfo getSnapshotInfo() {
return fSessionInfo.getSnapshotInfo();
}
@Override
public <T> T getAdapter(Class<T> adapter) {
if (adapter == IPropertySource.class) {
return adapter.cast(new TraceSessionPropertySource(this));
}
return null;
}
/**
* @return all available domains of this session.
*/
public TraceDomainComponent[] getDomains() {
List<ITraceControlComponent> sessions = getChildren(TraceDomainComponent.class);
return sessions.toArray(new TraceDomainComponent[sessions.size()]);
}
/**
* @return the parent target node
*/
public TargetNodeComponent getTargetNode() {
return ((TraceSessionGroup)getParent()).getTargetNode();
}
/**
* Returns whether the kernel provider is available or not
* @return <code>true</code> if kernel provide is available or <code>false</code>
*/
public boolean hasKernelProvider() {
List<ITraceControlComponent> providerGroups = getTargetNode().getChildren(TraceProviderGroup.class);
return (!providerGroups.isEmpty() ? ((TraceProviderGroup) providerGroups.get(0)).hasKernelProvider() : false);
}
/**
* Returns if node supports filtering of events
* @param domain - the domain type ({@link TraceDomainType})
* @return <code>true</code> if node supports filtering else <code>false</code>
*/
public boolean isEventFilteringSupported(TraceDomainType domain) {
return ((TargetNodeComponent)getParent().getParent()).isEventFilteringSupported(domain);
}
/**
* Returns if node supports snapshots or not
* @return <code>true</code> if it supports snapshots else <code>false</code>
*
*/
public boolean isSnapshotSupported() {
return ((TargetNodeComponent)getParent().getParent()).isSnapshotSupported();
}
// ------------------------------------------------------------------------
// Operations
// ------------------------------------------------------------------------
/**
* Retrieves the session configuration from the node.
*
* @param monitor
* - a progress monitor
* @throws ExecutionException
* If the command fails
*/
public void getConfigurationFromNode(IProgressMonitor monitor)
throws ExecutionException {
removeAllChildren();
ISessionInfo newInfo = getControlService().getSession(getName(), monitor);
if (newInfo != null) {
ISessionInfo oldSessionInfo = fSessionInfo;
fSessionInfo = newInfo;
copyLiveInfo(oldSessionInfo);
IDomainInfo[] domains = fSessionInfo.getDomains();
for (int i = 0; i < domains.length; i++) {
TraceDomainComponent domainComponent = new TraceDomainComponent(domains[i].getName(), this);
addChild(domainComponent);
domainComponent.setDomainInfo(domains[i]);
}
}
}
/**
* Starts the session.
*
* @param monitor
* - a progress monitor
* @throws ExecutionException
* If the command fails
*/
public void startSession(IProgressMonitor monitor)
throws ExecutionException {
getControlService().startSession(getName(), monitor);
}
/**
* Starts the session.
*
* @param monitor
* - a progress monitor
* @throws ExecutionException
* If the command fails
*/
public void stopSession(IProgressMonitor monitor) throws ExecutionException {
getControlService().stopSession(getName(), monitor);
}
/**
* Enables channels with given names which are part of this domain. If a
* given channel doesn't exists it creates a new channel with the given
* parameters (or default values if given parameter is null).
*
* @param channelNames
* - a list of channel names to enable on this domain
* @param info
* - channel information to set for the channel (use null for
* default)
* @param domain
* - indicate the domain type ({@link TraceDomainType})
* @param monitor
* - a progress monitor
* @throws ExecutionException
* If the command fails
*/
public void enableChannels(List<String> channelNames, IChannelInfo info,
TraceDomainType domain, IProgressMonitor monitor)
throws ExecutionException {
getControlService().enableChannels(getName(), channelNames, domain,
info, monitor);
}
/**
* Enables a list of events with no additional parameters.
*
* @param eventNames
* - a list of event names to enabled.
* @param domain
* - the type of the domain type ({@link TraceDomainType})
* @param filterExpression
* - a filter expression
* @param excludedEvents
* - a list of events to exclude.
* @param monitor
* - a progress monitor
* @throws ExecutionException
* If the command fails
*/
public void enableEvents(List<String> eventNames, TraceDomainType domain,
String filterExpression, List<String> excludedEvents, IProgressMonitor monitor) throws ExecutionException {
getControlService().enableEvents(getName(), null, eventNames, domain,
filterExpression, excludedEvents, monitor);
}
/**
* Enables all syscalls (for kernel domain)
*
* @param syscallNames
* - a list of syscall names to be enabled
* @param monitor
* - a progress monitor
* @throws ExecutionException
* If the command fails
*/
public void enableSyscalls(List<String> syscallNames, IProgressMonitor monitor)
throws ExecutionException {
getControlService().enableSyscalls(getName(), null, syscallNames, monitor);
}
/**
* Enables a dynamic probe (for kernel domain)
*
* @param eventName
* - event name for probe
* @param isFunction
* - true for dynamic function entry/return probe else false
* @param probe
* - the actual probe
* @param monitor
* - a progress monitor
* @throws ExecutionException
* If the command fails
*/
public void enableProbe(String eventName, boolean isFunction, String probe,
IProgressMonitor monitor) throws ExecutionException {
getControlService().enableProbe(getName(), null, eventName, isFunction,
probe, monitor);
}
/**
* Enables events using log level.
*
* @param eventNames
* - a list of event names
* @param logLevelType
* - a log level type
* @param level
* - a log level
* @param filterExpression
* - a filter expression
* @param domain
* - the domain type ({@link TraceDomainType})
* @param monitor
* - a progress monitor
* @throws ExecutionException
* If the command fails
*/
public void enableLogLevel(List<String> eventNames, LogLevelType logLevelType,
ITraceLogLevel level, String filterExpression,
TraceDomainType domain, IProgressMonitor monitor)
throws ExecutionException {
getControlService().enableLogLevel(getName(), null, eventNames,
logLevelType, level, null, domain, monitor);
}
/**
* Gets all available contexts to be added to channels/events.
*
* @param monitor
* The monitor that will indicate the progress
* @return the list of available contexts
* @throws ExecutionException
* If the command fails
*/
public List<String> getContextList(IProgressMonitor monitor)
throws ExecutionException {
return getControlService().getContextList(monitor);
}
/**
* Records a snapshot.
*
* @param monitor
* - a progress monitor
* @throws ExecutionException
* If the command fails
*/
public void recordSnapshot(IProgressMonitor monitor) throws ExecutionException {
getControlService().recordSnapshot(getName(), monitor);
}
/**
* Save all or a given session.
*
* @param session
* a session name to save or null for all
* @param outputPath
* a path to save session or null for default location
* @param isForce
* flag whether to overwrite existing or not
* @param monitor
* a progress monitor
* @throws ExecutionException
* If the command fails
*/
public void saveSession(String session, String outputPath, boolean isForce, IProgressMonitor monitor) throws ExecutionException {
getControlService().saveSession(session, outputPath, isForce, monitor);
}
/**
* Returns if session is live.
* @return <code>true</code> if session if live else <code>false</code>
*/
public boolean isLiveTrace() {
return fSessionInfo.isLive();
}
/**
* Get the live URL.
*
* @return the live URL
*/
public String getLiveUrl() {
return fSessionInfo.getLiveUrl();
}
/**
* Get the live port.
*
* @return the live port
*/
public Integer getLivePort() {
return fSessionInfo.getLivePort();
}
}