/********************************************************************** * 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 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 * 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(); } }