lttng ui: Fix minor sonar warnings
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng2.ui / src / org / eclipse / linuxtools / internal / lttng2 / ui / views / control / service / LTTngControlService.java
index 9746edcd3bf07f43f94e95633540caa36e136e9d..d660dcfdbbff742c2168f9c317bed84cbf8a9840 100644 (file)
@@ -1,13 +1,14 @@
 /**********************************************************************
- * Copyright (c) 2012 Ericsson
- * 
+ * Copyright (c) 2012, 2013 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
+ *   Bernd Hufmann - Updated for support of LTTng Tools 2.1
  **********************************************************************/
 package org.eclipse.linuxtools.internal.lttng2.ui.views.control.service;
 
@@ -19,45 +20,52 @@ import java.util.regex.Matcher;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.Messages;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.IBaseEventInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.IChannelInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.IDomainInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.IEventInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.IFieldInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.IProbeEventInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.ISessionInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.IUstProviderInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.LogLevelType;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.TraceEventType;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.TraceLogLevel;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.BaseEventInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.ChannelInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.DomainInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.EventInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.FieldInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.ProbeEventInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.SessionInfo;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.impl.UstProviderInfo;
 import org.eclipse.linuxtools.internal.lttng2.ui.views.control.logging.ControlCommandLogger;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.IBaseEventInfo;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.IChannelInfo;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.IDomainInfo;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.IEventInfo;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.IProbeEventInfo;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.ISessionInfo;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.IUstProviderInfo;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.LogLevelType;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.TraceEventType;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.TraceLogLevel;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.BaseEventInfo;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.ChannelInfo;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.DomainInfo;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.EventInfo;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.ProbeEventInfo;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.SessionInfo;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.UstProviderInfo;
+import org.eclipse.linuxtools.internal.lttng2.ui.views.control.messages.Messages;
 import org.eclipse.linuxtools.internal.lttng2.ui.views.control.preferences.ControlPreferences;
+import org.eclipse.linuxtools.internal.lttng2.ui.views.control.remote.ICommandResult;
+import org.eclipse.linuxtools.internal.lttng2.ui.views.control.remote.ICommandShell;
 
 /**
- * <b><u>LTTngControlService</u></b>
  * <p>
  * Service for sending LTTng trace control commands to remote host.
  * </p>
+ *
+ * @author Bernd Hufmann
  */
 public class LTTngControlService implements ILttngControlService {
-    
+
     // ------------------------------------------------------------------------
     // Attributes
     // ------------------------------------------------------------------------
     /**
      * The command shell implementation
      */
-    protected ICommandShell fCommandShell = null;
-    
-    protected String fVersion = "Unknown"; //$NON-NLS-1$
+    private final ICommandShell fCommandShell;
+
+    /**
+     * The version string.
+     */
+    private LttngVersion fVersion = null;
 
     // ------------------------------------------------------------------------
     // Constructors
@@ -65,7 +73,7 @@ public class LTTngControlService implements ILttngControlService {
 
     /**
      * Constructor
-     * 
+     *
      * @param shell
      *            - the command shell implementation to use
      */
@@ -76,29 +84,42 @@ public class LTTngControlService implements ILttngControlService {
     // ------------------------------------------------------------------------
     // Accessors
     // ------------------------------------------------------------------------
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#getVersion()
-     */
+
     @Override
     public String getVersion() {
-        return fVersion;
+        if (fVersion == null) {
+            return "Unknown"; //$NON-NLS-1$
+        }
+        return fVersion.toString();
     }
-    
+
+    /**
+     * Sets the version of the LTTng 2.0 control service.
+     * @param version - a version to set
+     */
     public void setVersion(String version) {
-        fVersion = version;
+        fVersion = new LttngVersion(version);
+    }
+
+    @Override
+    public boolean isVersionSupported(String version) {
+        LttngVersion tmp = new LttngVersion(version);
+        return (fVersion != null && fVersion.compareTo(tmp) >= 0) ? true : false;
+    }
+
+    /**
+     * Returns the command shell implementation.
+     *
+     * @return the command shell implementation
+     */
+    protected ICommandShell getCommandShell() {
+        return fCommandShell;
     }
+
     // ------------------------------------------------------------------------
     // Operations
     // ------------------------------------------------------------------------
-    
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
-     * #getSessionNames(org.eclipse.core.runtime.IProgressMonitor)
-     */
+
     @Override
     public String[] getSessionNames(IProgressMonitor monitor) throws ExecutionException {
         StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_LIST);
@@ -107,10 +128,8 @@ public class LTTngControlService implements ILttngControlService {
 
         // Output:
         // Available tracing sessions:
-        // 1) mysession1 (/home/user/lttng-traces/mysession1-20120123-083928)
-        // [inactive]
-        // 2) mysession (/home/user/lttng-traces/mysession-20120123-083318)
-        // [inactive]
+        // 1) mysession1 (/home/user/lttng-traces/mysession1-20120123-083928) [inactive]
+        // 2) mysession (/home/user/lttng-traces/mysession-20120123-083318) [inactive]
         //
         // Use lttng list <session_name> for more details
 
@@ -127,13 +146,6 @@ public class LTTngControlService implements ILttngControlService {
         return retArray.toArray(new String[retArray.size()]);
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
-     * #getSession(java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-     */
     @Override
     public ISessionInfo getSession(String sessionName, IProgressMonitor monitor) throws ExecutionException {
         StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_LIST, sessionName);
@@ -160,6 +172,11 @@ public class LTTngControlService implements ILttngControlService {
                 continue;
             }
 
+            matcher = LTTngControlServiceConstants.TRACE_NETWORK_PATH_PATTERN.matcher(line);
+            if (matcher.matches()) {
+                sessionInfo.setStreamedTrace(true);
+            }
+
             matcher = LTTngControlServiceConstants.TRACE_SESSION_PATH_PATTERN.matcher(line);
             if (matcher.matches()) {
                 sessionInfo.setSessionPath(matcher.group(1).trim());
@@ -171,34 +188,42 @@ public class LTTngControlService implements ILttngControlService {
             if (matcher.matches()) {
                 // Create Domain
                 IDomainInfo domainInfo = new DomainInfo(Messages.TraceControl_KernelDomainDisplayName);
-                sessionInfo.addDomain(domainInfo);
 
                 // in domain kernel
                 ArrayList<IChannelInfo> channels = new ArrayList<IChannelInfo>();
                 index = parseDomain(result.getOutput(), index, channels);
 
-                // set channels
-                domainInfo.setChannels(channels);
-                
-                // set kernel flag
-                domainInfo.setIsKernel(true);
+                if (channels.size() > 0) {
+                    // add domain
+                    sessionInfo.addDomain(domainInfo);
+
+                    // set channels
+                    domainInfo.setChannels(channels);
+
+                    // set kernel flag
+                    domainInfo.setIsKernel(true);
+                }
                 continue;
             }
 
             matcher = LTTngControlServiceConstants.DOMAIN_UST_GLOBAL_PATTERN.matcher(line);
             if (matcher.matches()) {
                 IDomainInfo domainInfo = new DomainInfo(Messages.TraceControl_UstGlobalDomainDisplayName);
-                sessionInfo.addDomain(domainInfo);
 
                 // in domain UST
                 ArrayList<IChannelInfo> channels = new ArrayList<IChannelInfo>();
                 index = parseDomain(result.getOutput(), index, channels);
 
-                // set channels
-                domainInfo.setChannels(channels);
-                
-                // set kernel flag
-                domainInfo.setIsKernel(false);
+                if (channels.size() > 0) {
+                    // add domain
+                    sessionInfo.addDomain(domainInfo);
+
+                    // set channels
+                    domainInfo.setChannels(channels);
+
+                    // set kernel flag
+                    domainInfo.setIsKernel(false);
+                }
                 continue;
             }
             index++;
@@ -206,51 +231,88 @@ public class LTTngControlService implements ILttngControlService {
         return sessionInfo;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
-     * #getKernelProvider(org.eclipse.core.runtime.IProgressMonitor)
-     */
     @Override
     public List<IBaseEventInfo> getKernelProvider(IProgressMonitor monitor) throws ExecutionException {
         StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_LIST_KERNEL);
-        ICommandResult result = executeCommand(command.toString(), monitor);
+        ICommandResult result = executeCommand(command.toString(), monitor, false);
+
+        List<IBaseEventInfo> events = new ArrayList<IBaseEventInfo>();
+
+        if (result.getOutput() != null) {
+            // Ignore the following 2 cases:
+            // Spawning a session daemon
+            // Error: Unable to list kernel events
+            // or:
+            // Error: Unable to list kernel events
+            //
+            int index = 0;
+            while (index < result.getOutput().length) {
+                String line = result.getOutput()[index];
+                Matcher matcher = LTTngControlServiceConstants.LIST_KERNEL_NO_KERNEL_PROVIDER_PATTERN.matcher(line);
+                if (matcher.matches()) {
+                    return events;
+                }
+                index++;
+            }
+        }
+
+        if (isError(result)) {
+            throw new ExecutionException(Messages.TraceControl_CommandError + " " + command.toString() + "\n" + formatOutput(result)); //$NON-NLS-1$ //$NON-NLS-2$
+        }
 
         // Kernel events:
         // -------------
         // sched_kthread_stop (type: tracepoint)
-        List<IBaseEventInfo> events = new ArrayList<IBaseEventInfo>();
         getProviderEventInfo(result.getOutput(), 0, events);
         return events;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
-     * #getUstProvider()
-     */
     @Override
     public List<IUstProviderInfo> getUstProvider() throws ExecutionException {
         return getUstProvider(new NullProgressMonitor());
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
-     * #getUstProvider(org.eclipse.core.runtime.IProgressMonitor)
-     */
     @Override
     public List<IUstProviderInfo> getUstProvider(IProgressMonitor monitor) throws ExecutionException {
         StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_LIST_UST);
 
-        ICommandResult result = executeCommand(command.toString(), monitor);
+        if (isVersionSupported("2.1.0")) { //$NON-NLS-1$
+            command.append(LTTngControlServiceConstants.OPTION_FIELDS);
+        }
+
+        ICommandResult result = executeCommand(command.toString(), monitor, false);
+        List<IUstProviderInfo> allProviders = new ArrayList<IUstProviderInfo>();
+
+        // Workaround for versions 2.0.x which causes a segmentation fault for this command
+        // if LTTng Tools is compiled without UST support.
+        if (!isVersionSupported("2.1.0") && (result.getResult() != 0)) { //$NON-NLS-1$
+            return allProviders;
+        }
 
+        if (result.getOutput() != null) {
+            // Ignore the following 2 cases:
+            // Spawning a session daemon
+            // Error: Unable to list UST events: Listing UST events failed
+            // or:
+            // Error: Unable to list UST events: Listing UST events failed
+            //
+            int index = 0;
+            while (index < result.getOutput().length) {
+                String line = result.getOutput()[index];
+                Matcher matcher = LTTngControlServiceConstants.LIST_UST_NO_UST_PROVIDER_PATTERN.matcher(line);
+                if (matcher.matches()) {
+                    return allProviders;
+                }
+                index++;
+            }
+        }
+
+        if (isError(result)) {
+            throw new ExecutionException(Messages.TraceControl_CommandError + " " + command.toString() + "\n" + formatOutput(result)); //$NON-NLS-1$ //$NON-NLS-2$
+        }
+
+        // Note that field print-outs exists for version >= 2.1.0
+        //
         // UST events:
         // -------------
         //
@@ -259,14 +321,19 @@ public class LTTngControlService implements ILttngControlService {
         // ust_tests_hello:tptest_sighandler (loglevel: TRACE_EMERG0) (type:
         // tracepoint)
         // ust_tests_hello:tptest (loglevel: TRACE_EMERG0) (type: tracepoint)
+        //    field: doublefield (float)
+        //    field: floatfield (float)
+        //    field: stringfield (string)
         //
         // PID: 6459 - Name:
         // /home/user/git/lttng-ust/tests/hello.cxx/.libs/lt-hello
         // ust_tests_hello:tptest_sighandler (loglevel: TRACE_EMERG0) (type:
         // tracepoint)
         // ust_tests_hello:tptest (loglevel: TRACE_EMERG0) (type: tracepoint)
+        //    field: doublefield (float)
+        //    field: floatfield (float)
+        //    field: stringfield (string)
 
-        List<IUstProviderInfo> allProviders = new ArrayList<IUstProviderInfo>();
         IUstProviderInfo provider = null;
 
         int index = 0;
@@ -274,26 +341,19 @@ public class LTTngControlService implements ILttngControlService {
             String line = result.getOutput()[index];
             Matcher matcher = LTTngControlServiceConstants.UST_PROVIDER_PATTERN.matcher(line);
             if (matcher.matches()) {
-
                 provider = new UstProviderInfo(matcher.group(2).trim());
                 provider.setPid(Integer.valueOf(matcher.group(1).trim()));
                 List<IBaseEventInfo> events = new ArrayList<IBaseEventInfo>();
                 index = getProviderEventInfo(result.getOutput(), ++index, events);
                 provider.setEvents(events);
                 allProviders.add(provider);
-
             } else {
                 index++;
             }
-
         }
         return allProviders;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#createSession(java.lang.String, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-     */
     @Override
     public ISessionInfo createSession(String sessionName, String sessionPath, IProgressMonitor monitor) throws ExecutionException {
 
@@ -312,51 +372,119 @@ public class LTTngControlService implements ILttngControlService {
         //Session myssession2 created.
         //Traces will be written in /home/user/lttng-traces/myssession2-20120209-095418
         String[] output = result.getOutput();
-        
-        // Get and verify session name
-        Matcher matcher = LTTngControlServiceConstants.CREATE_SESSION_NAME_PATTERN.matcher(output[0]);
+
+        // Get and session name and path
         String name = null;
+        String path = null;
 
-        if (matcher.matches()) {
-            name = String.valueOf(matcher.group(1).trim());
-        } else {
-            // Output format not expected
-            throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$ 
-                    Messages.TraceControl_UnexpectedCommandOutputFormat + ":\n" + //$NON-NLS-1$ 
-                    formatOutput(result)); 
+        int index = 0;
+        while (index < output.length) {
+            String line = output[index];
+            Matcher nameMatcher = LTTngControlServiceConstants.CREATE_SESSION_NAME_PATTERN.matcher(line);
+            Matcher pathMatcher = LTTngControlServiceConstants.CREATE_SESSION_PATH_PATTERN.matcher(line);
+            if (nameMatcher.matches()) {
+                name = String.valueOf(nameMatcher.group(1).trim());
+            } else if (pathMatcher.matches()) {
+                path = String.valueOf(pathMatcher.group(1).trim());
+            }
+            index++;
         }
 
-        if ((name == null) || (!name.equals(sessionName))) {
+        // Verify session name
+        if ((name == null) || (!"".equals(sessionName) && !name.equals(sessionName))) { //$NON-NLS-1$
             // Unexpected name returned
-            throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$ 
-                    Messages.TraceControl_UnexpectedNameError + ": " + name); //$NON-NLS-1$ 
-        }
-        
-        // Get and verify session path
-        matcher = LTTngControlServiceConstants.CREATE_SESSION_PATH_PATTERN.matcher(output[1]);
-        String path = null;
-        
-        if (matcher.matches()) {
-            path = String.valueOf(matcher.group(1).trim());
-        } else {
-            // Output format not expected
-            throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$ 
-                    Messages.TraceControl_UnexpectedCommandOutputFormat + ":\n" + //$NON-NLS-1$ 
-                    formatOutput(result)); 
+            throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
+                    Messages.TraceControl_UnexpectedNameError + ": " + name); //$NON-NLS-1$
         }
 
+        SessionInfo sessionInfo = new SessionInfo(name);
+
+        // Verify session path
         if ((path == null) || ((sessionPath != null) && (!path.contains(sessionPath)))) {
             // Unexpected path
-            throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$ 
+            throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
                     Messages.TraceControl_UnexpectedPathError + ": " + name); //$NON-NLS-1$
         }
-        
-        SessionInfo sessionInfo = new SessionInfo(name);
+
         sessionInfo.setSessionPath(path);
 
+        return sessionInfo;
+
+    }
+
+    @Override
+    public ISessionInfo createSession(String sessionName, String networkUrl, String controlUrl, String dataUrl, IProgressMonitor monitor) throws ExecutionException {
+
+        String newName = formatParameter(sessionName);
+        StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_CREATE_SESSION, newName);
+
+        if (networkUrl != null) {
+            command.append(LTTngControlServiceConstants.OPTION_NETWORK_URL);
+            command.append(networkUrl);
+        } else {
+            command.append(LTTngControlServiceConstants.OPTION_CONTROL_URL);
+            command.append(controlUrl);
+
+            command.append(LTTngControlServiceConstants.OPTION_DATA_URL);
+            command.append(dataUrl);
+        }
+
+        ICommandResult result = executeCommand(command.toString(), monitor);
+
+        // Verify output
+        String[] output = result.getOutput();
+
+        // Get and session name and path
+        String name = null;
+        String path = null;
+
+        int index = 0;
+        while (index < output.length) {
+            String line = output[index];
+            Matcher nameMatcher = LTTngControlServiceConstants.CREATE_SESSION_NAME_PATTERN.matcher(line);
+            Matcher pathMatcher = LTTngControlServiceConstants.CREATE_SESSION_PATH_PATTERN.matcher(line);
+
+            if (nameMatcher.matches()) {
+                name = String.valueOf(nameMatcher.group(1).trim());
+            } else if (pathMatcher.matches() && (networkUrl != null)) {
+                path = String.valueOf(pathMatcher.group(1).trim());
+            }
+            index++;
+        }
+
+        // Verify session name
+        if ((name == null) || (!"".equals(sessionName) && !name.equals(sessionName))) { //$NON-NLS-1$
+            // Unexpected name returned
+            throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
+                    Messages.TraceControl_UnexpectedNameError + ": " + name); //$NON-NLS-1$
+        }
+
+        SessionInfo sessionInfo = new SessionInfo(name);
+
+        sessionInfo.setStreamedTrace(true);
+
+        // Verify session path
+        if (networkUrl != null) {
+            if (path == null) {
+                // Unexpected path
+                throw new ExecutionException(Messages.TraceControl_CommandError + " " + command + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
+                        Messages.TraceControl_UnexpectedPathError + ": " + name); //$NON-NLS-1$
+            }
+
+            sessionInfo.setSessionPath(path);
+
+            // Check file protocol
+            Matcher matcher = LTTngControlServiceConstants.TRACE_FILE_PROTOCOL_PATTERN.matcher(path);
+            if (matcher.matches()) {
+                sessionInfo.setStreamedTrace(false);
+            }
+        }
+        // When using controlUrl and dataUrl the full session path is not known yet
+        // and will be set later on when listing the session
+
         return sessionInfo;
     }
-    
+
     @Override
     public void destroySession(String sessionName, IProgressMonitor monitor) throws ExecutionException {
         String newName = formatParameter(sessionName);
@@ -365,17 +493,28 @@ public class LTTngControlService implements ILttngControlService {
 
         ICommandResult result = executeCommand(command.toString(), monitor, false);
         String[] output = result.getOutput();
-        
-        if (isError(result) && ((output == null) || (!LTTngControlServiceConstants.SESSION_NOT_FOUND_ERROR_PATTERN.matcher(output[0]).matches()))) {
-                throw new ExecutionException(Messages.TraceControl_CommandError + " " + command.toString() + "\n" + formatOutput(result)); //$NON-NLS-1$ //$NON-NLS-2$
-       }
+
+        boolean isError = isError(result);
+        if (isError && (output != null)) {
+            int index = 0;
+            while (index < output.length) {
+                String line = output[index];
+                Matcher matcher = LTTngControlServiceConstants.SESSION_NOT_FOUND_ERROR_PATTERN.matcher(line);
+                if (matcher.matches()) {
+                    // Don't treat this as an error
+                    isError = false;
+                }
+                index++;
+            }
+        }
+
+        if (isError) {
+            throw new ExecutionException(Messages.TraceControl_CommandError + " " + command.toString() + "\n" + formatOutput(result)); //$NON-NLS-1$ //$NON-NLS-2$
+        }
+
         //Session <sessionName> destroyed
     }
-    
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#startSession(java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-     */
+
     @Override
     public void startSession(String sessionName, IProgressMonitor monitor) throws ExecutionException {
 
@@ -388,10 +527,6 @@ public class LTTngControlService implements ILttngControlService {
         //Session <sessionName> started
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#stopSession(java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-     */
     @Override
     public void stopSession(String sessionName, IProgressMonitor monitor) throws ExecutionException {
         String newSessionName = formatParameter(sessionName);
@@ -400,13 +535,9 @@ public class LTTngControlService implements ILttngControlService {
         executeCommand(command.toString(), monitor);
 
         //Session <sessionName> stopped
-        
+
     }
-    
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#enableChannel(java.lang.String, java.util.List, boolean, org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.IChannelInfo, org.eclipse.core.runtime.IProgressMonitor)
-     */
+
     @Override
     public void enableChannels(String sessionName, List<String> channelNames, boolean isKernel, IChannelInfo info, IProgressMonitor monitor) throws ExecutionException {
 
@@ -418,7 +549,7 @@ public class LTTngControlService implements ILttngControlService {
         StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_ENABLE_CHANNEL);
 
         for (Iterator<String> iterator = channelNames.iterator(); iterator.hasNext();) {
-            String channel = (String) iterator.next();
+            String channel = iterator.next();
             command.append(channel);
             if (iterator.hasNext()) {
                 command.append(',');
@@ -451,7 +582,7 @@ public class LTTngControlService implements ILttngControlService {
 //                                     (default: 8, kernel default: 4)
             command.append(LTTngControlServiceConstants.OPTION_NUM_SUB_BUFFERS);
             command.append(String.valueOf(info.getNumberOfSubBuffers()));
-            
+
 //            --switch-timer USEC  Switch timer interval in usec (default: 0)
             command.append(LTTngControlServiceConstants.OPTION_SWITCH_TIMER);
             command.append(String.valueOf(info.getSwitchTimer()));
@@ -459,19 +590,15 @@ public class LTTngControlService implements ILttngControlService {
 //            --read-timer USEC    Read timer interval in usec (default: 200)
             command.append(LTTngControlServiceConstants.OPTION_READ_TIMER);
             command.append(String.valueOf(info.getReadTimer()));
-        } 
+        }
 
         executeCommand(command.toString(), monitor);
-        
+
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#disableChannel(java.lang.String, java.util.List, org.eclipse.core.runtime.IProgressMonitor)
-     */
     @Override
     public void disableChannels(String sessionName, List<String> channelNames, boolean isKernel, IProgressMonitor monitor) throws ExecutionException {
-        
+
         // no channels to enable
         if (channelNames.isEmpty()) {
             return;
@@ -480,7 +607,7 @@ public class LTTngControlService implements ILttngControlService {
         StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_DISABLE_CHANNEL);
 
         for (Iterator<String> iterator = channelNames.iterator(); iterator.hasNext();) {
-            String channel = (String) iterator.next();
+            String channel = iterator.next();
             command.append(channel);
             if (iterator.hasNext()) {
                 command.append(',');
@@ -499,13 +626,9 @@ public class LTTngControlService implements ILttngControlService {
 
         executeCommand(command.toString(), monitor);
     }
-    
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#enableEvent(java.lang.String, java.lang.String, java.util.List, boolean, org.eclipse.core.runtime.IProgressMonitor)
-     */
+
     @Override
-    public void enableEvents(String sessionName, String channelName, List<String> eventNames, boolean isKernel, IProgressMonitor monitor) throws ExecutionException {
+    public void enableEvents(String sessionName, String channelName, List<String> eventNames, boolean isKernel, String filterExpression, IProgressMonitor monitor) throws ExecutionException {
 
         StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_ENABLE_EVENT);
 
@@ -513,13 +636,15 @@ public class LTTngControlService implements ILttngControlService {
             command.append(LTTngControlServiceConstants.OPTION_ALL);
         } else {
 
+            StringBuffer eventNameParameter = new StringBuffer();
             for (Iterator<String> iterator = eventNames.iterator(); iterator.hasNext();) {
-                String event = (String) iterator.next();
-                command.append(event);
+                String event = iterator.next();
+                eventNameParameter.append(event);
                 if (iterator.hasNext()) {
-                    command.append(',');
+                    eventNameParameter.append(',');
                 }
             }
+            command.append(formatParameter(eventNameParameter.toString()));
         }
 
         if (isKernel) {
@@ -537,17 +662,20 @@ public class LTTngControlService implements ILttngControlService {
             command.append(LTTngControlServiceConstants.OPTION_CHANNEL);
             command.append(channelName);
         }
-        
+
         command.append(LTTngControlServiceConstants.OPTION_TRACEPOINT);
-        
+
+        if (filterExpression != null) {
+            command.append(LTTngControlServiceConstants.OPTION_FILTER);
+            command.append('\'');
+            command.append(filterExpression);
+            command.append('\'');
+        }
+
         executeCommand(command.toString(), monitor);
-        
+
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#enableSyscalls(java.lang.String, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-     */
     @Override
     public void enableSyscalls(String sessionName, String channelName, IProgressMonitor monitor) throws ExecutionException {
 
@@ -565,16 +693,12 @@ public class LTTngControlService implements ILttngControlService {
             command.append(LTTngControlServiceConstants.OPTION_CHANNEL);
             command.append(channelName);
         }
-        
+
         command.append(LTTngControlServiceConstants.OPTION_SYSCALL);
-        
+
         executeCommand(command.toString(), monitor);
     }
-    
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#enableProbe(java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-     */
+
     @Override
     public void enableProbe(String sessionName, String channelName, String eventName, boolean isFunction, String probe, IProgressMonitor monitor) throws ExecutionException {
         StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_ENABLE_EVENT);
@@ -595,18 +719,14 @@ public class LTTngControlService implements ILttngControlService {
         } else {
             command.append(LTTngControlServiceConstants.OPTION_PROBE);
         }
-        
+
         command.append(probe);
-        
+
         executeCommand(command.toString(), monitor);
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#enableLogLevel(java.lang.String, java.lang.String, java.lang.String, org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.LogLevelType, org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.TraceLogLevel, org.eclipse.core.runtime.IProgressMonitor)
-     */
     @Override
-    public void enableLogLevel(String sessionName, String channelName, String eventName, LogLevelType logLevelType, TraceLogLevel level, IProgressMonitor monitor) throws ExecutionException {
+    public void enableLogLevel(String sessionName, String channelName, String eventName, LogLevelType logLevelType, TraceLogLevel level, String filterExpression, IProgressMonitor monitor) throws ExecutionException {
         StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_ENABLE_EVENT);
 
         command.append(eventName);
@@ -620,25 +740,20 @@ public class LTTngControlService implements ILttngControlService {
             command.append(LTTngControlServiceConstants.OPTION_CHANNEL);
             command.append(channelName);
         }
-        
+
         if (logLevelType == LogLevelType.LOGLEVEL) {
             command.append(LTTngControlServiceConstants.OPTION_LOGLEVEL);
         } else if (logLevelType == LogLevelType.LOGLEVEL_ONLY) {
             command.append(LTTngControlServiceConstants.OPTION_LOGLEVEL_ONLY);
-            
+
         } else {
             return;
         }
         command.append(level.getInName());
-        
+
         executeCommand(command.toString(), monitor);
-        
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#disableEvent(java.lang.String, java.lang.String, java.util.List, boolean, org.eclipse.core.runtime.IProgressMonitor)
-     */
     @Override
     public void disableEvent(String sessionName, String channelName, List<String> eventNames, boolean isKernel, IProgressMonitor monitor) throws ExecutionException {
         StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_DISABLE_EVENT);
@@ -646,18 +761,20 @@ public class LTTngControlService implements ILttngControlService {
         if (eventNames == null) {
             command.append(LTTngControlServiceConstants.OPTION_ALL);
         } else {
-            // no events to enable
+            // no events to disable
             if (eventNames.isEmpty()) {
                 return;
             }
 
+            StringBuffer eventNameParameter = new StringBuffer();
             for (Iterator<String> iterator = eventNames.iterator(); iterator.hasNext();) {
-                String event = (String) iterator.next();
-                command.append(event);
+                String event = iterator.next();
+                eventNameParameter.append(event);
                 if (iterator.hasNext()) {
-                    command.append(',');
+                    eventNameParameter.append(',');
                 }
             }
+            command.append(formatParameter(eventNameParameter.toString()));
         }
 
         if (isKernel) {
@@ -678,10 +795,6 @@ public class LTTngControlService implements ILttngControlService {
         executeCommand(command.toString(), monitor);
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#getContexts(org.eclipse.core.runtime.IProgressMonitor)
-     */
     @Override
     public List<String> getContextList(IProgressMonitor monitor) throws ExecutionException {
 
@@ -689,15 +802,15 @@ public class LTTngControlService implements ILttngControlService {
 
         ICommandResult result = executeCommand(command.toString(), monitor);
 
-        String[] output = result.getOutput(); 
-        
+        String[] output = result.getOutput();
+
         List<String> contexts = new ArrayList<String>(0);
-        
+
         int index = 0;
         boolean inList = false;
         while (index < output.length) {
             String line = result.getOutput()[index];
-            
+
             Matcher startMatcher = LTTngControlServiceConstants.ADD_CONTEXT_HELP_CONTEXTS_INTRO.matcher(line);
             Matcher endMatcher = LTTngControlServiceConstants.ADD_CONTEXT_HELP_CONTEXTS_END_LINE.matcher(line);
 
@@ -716,10 +829,6 @@ public class LTTngControlService implements ILttngControlService {
         return contexts;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#addContexts(java.lang.String, java.lang.String, java.lang.String, boolean, java.util.List, org.eclipse.core.runtime.IProgressMonitor)
-     */
     @Override
     public void addContexts(String sessionName, String channelName, String eventName, boolean isKernel, List<String> contextNames, IProgressMonitor monitor) throws ExecutionException {
         StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_ADD_CONTEXT);
@@ -727,7 +836,7 @@ public class LTTngControlService implements ILttngControlService {
         String newSessionName = formatParameter(sessionName);
         command.append(LTTngControlServiceConstants.OPTION_SESSION);
         command.append(newSessionName);
-        
+
         if (channelName != null) {
             command.append(LTTngControlServiceConstants.OPTION_CHANNEL);
             command.append(channelName);
@@ -743,28 +852,20 @@ public class LTTngControlService implements ILttngControlService {
         } else {
             command.append(LTTngControlServiceConstants.OPTION_UST);
         }
-        
+
         for (Iterator<String> iterator = contextNames.iterator(); iterator.hasNext();) {
-            String context = (String) iterator.next();
+            String context = iterator.next();
             command.append(LTTngControlServiceConstants.OPTION_CONTEXT_TYPE);
             command.append(context);
         }
 
         executeCommand(command.toString(), monitor);
-        
+
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#calibrate(boolean, org.eclipse.core.runtime.IProgressMonitor)
-     */
     @Override
     public void calibrate(boolean isKernel, IProgressMonitor monitor) throws ExecutionException {
-//        String newSessionName = formatParameter(sessionName);
         StringBuffer command = createCommand(LTTngControlServiceConstants.COMMAND_CALIBRATE);
-//
-//        command.append(OPTION_SESSION);
-//        command.append(newSessionName);
 
         if (isKernel) {
             command.append(LTTngControlServiceConstants.OPTION_KERNEL);
@@ -776,32 +877,46 @@ public class LTTngControlService implements ILttngControlService {
 
         executeCommand(command.toString(), monitor);
     }
-    
+
     // ------------------------------------------------------------------------
     // Helper methods
     // ------------------------------------------------------------------------
+
     /**
      * Checks if command result is an error result.
-     * 
+     *
      * @param result
      *            - the command result to check
      * @return true if error else false
      */
     protected boolean isError(ICommandResult result) {
-        if ((result.getResult()) != 0 || (result.getOutput().length < 1 || LTTngControlServiceConstants.ERROR_PATTERN.matcher(result.getOutput()[0]).matches())) {
+        // Check return code and length of returned strings
+        if ((result.getResult()) != 0 || (result.getOutput().length < 1)) {
             return true;
         }
+
+        // Look for error pattern
+        int index = 0;
+        while (index < result.getOutput().length) {
+            String line = result.getOutput()[index];
+            Matcher matcher = LTTngControlServiceConstants.ERROR_PATTERN.matcher(line);
+            if (matcher.matches()) {
+                return true;
+            }
+            index++;
+        }
+
         return false;
     }
 
     /**
      * Formats the output string as single string.
-     * 
-     * @param output
+     *
+     * @param result
      *            - output array
      * @return - the formatted output
      */
-    protected String formatOutput(ICommandResult result) {
+    public static String formatOutput(ICommandResult result) {
         if ((result == null) || result.getOutput() == null || result.getOutput().length == 0) {
             return ""; //$NON-NLS-1$
         }
@@ -818,7 +933,7 @@ public class LTTngControlService implements ILttngControlService {
 
     /**
      * Parses the domain information.
-     * 
+     *
      * @param output
      *            - a command output array
      * @param currentIndex
@@ -846,6 +961,8 @@ public class LTTngControlService implements ILttngControlService {
             String line = output[index];
 
             Matcher outerMatcher = LTTngControlServiceConstants.CHANNELS_SECTION_PATTERN.matcher(line);
+            Matcher noKernelChannelMatcher = LTTngControlServiceConstants.DOMAIN_NO_KERNEL_CHANNEL_PATTERN.matcher(line);
+            Matcher noUstChannelMatcher = LTTngControlServiceConstants.DOMAIN_NO_UST_CHANNEL_PATTERN.matcher(line);
             if (outerMatcher.matches()) {
                 IChannelInfo channelInfo = null;
                 while (index < output.length) {
@@ -865,26 +982,40 @@ public class LTTngControlService implements ILttngControlService {
 
                     } else if (LTTngControlServiceConstants.OVERWRITE_MODE_ATTRIBUTE.matcher(subLine).matches()) {
                         String value = getAttributeValue(subLine);
-                        channelInfo.setOverwriteMode(!LTTngControlServiceConstants.OVERWRITE_MODE_ATTRIBUTE_FALSE.equals(value));
+                        if (channelInfo != null) {
+                            channelInfo.setOverwriteMode(!LTTngControlServiceConstants.OVERWRITE_MODE_ATTRIBUTE_FALSE.equals(value));
+                        }
                     } else if (LTTngControlServiceConstants.SUBBUFFER_SIZE_ATTRIBUTE.matcher(subLine).matches()) {
-                        channelInfo.setSubBufferSize(Long.valueOf(getAttributeValue(subLine)));
+                        if (channelInfo != null) {
+                            channelInfo.setSubBufferSize(Long.valueOf(getAttributeValue(subLine)));
+                        }
 
                     } else if (LTTngControlServiceConstants.NUM_SUBBUFFERS_ATTRIBUTE.matcher(subLine).matches()) {
-                        channelInfo.setNumberOfSubBuffers(Integer.valueOf(getAttributeValue(subLine)));
+                        if (channelInfo != null) {
+                            channelInfo.setNumberOfSubBuffers(Integer.valueOf(getAttributeValue(subLine)));
+                        }
 
                     } else if (LTTngControlServiceConstants.SWITCH_TIMER_ATTRIBUTE.matcher(subLine).matches()) {
-                        channelInfo.setSwitchTimer(Long.valueOf(getAttributeValue(subLine)));
+                        if (channelInfo != null) {
+                            channelInfo.setSwitchTimer(Long.valueOf(getAttributeValue(subLine)));
+                        }
 
                     } else if (LTTngControlServiceConstants.READ_TIMER_ATTRIBUTE.matcher(subLine).matches()) {
-                        channelInfo.setReadTimer(Long.valueOf(getAttributeValue(subLine)));
+                        if (channelInfo != null) {
+                            channelInfo.setReadTimer(Long.valueOf(getAttributeValue(subLine)));
+                        }
 
                     } else if (LTTngControlServiceConstants.OUTPUT_ATTRIBUTE.matcher(subLine).matches()) {
-                        channelInfo.setOutputType(getAttributeValue(subLine));
+                        if (channelInfo != null) {
+                            channelInfo.setOutputType(getAttributeValue(subLine));
+                        }
 
                     } else if (LTTngControlServiceConstants.EVENT_SECTION_PATTERN.matcher(subLine).matches()) {
                         List<IEventInfo> events = new ArrayList<IEventInfo>();
                         index = parseEvents(output, index, events);
-                        channelInfo.setEvents(events);
+                        if (channelInfo != null) {
+                            channelInfo.setEvents(events);
+                        }
                         // we want to stay at the current index to be able to
                         // exit the domain
                         continue;
@@ -896,6 +1027,10 @@ public class LTTngControlService implements ILttngControlService {
                     }
                     index++;
                 }
+            } else if (noKernelChannelMatcher.matches() || noUstChannelMatcher.matches()) {
+                // domain indicates that no channels were found -> return
+                index++;
+                return index;
             }
             index++;
         }
@@ -904,7 +1039,7 @@ public class LTTngControlService implements ILttngControlService {
 
     /**
      * Parses the event information within a domain.
-     * 
+     *
      * @param output
      *            - a command output array
      * @param currentIndex
@@ -927,7 +1062,7 @@ public class LTTngControlService implements ILttngControlService {
             } else if (LTTngControlServiceConstants.DOMAIN_UST_GLOBAL_PATTERN.matcher(line).matches()) {
                 // end of domain
                 return index;
-            } 
+            }
 
             Matcher matcher = LTTngControlServiceConstants.EVENT_PATTERN.matcher(line);
             Matcher matcher2 = LTTngControlServiceConstants.WILDCARD_EVENT_PATTERN.matcher(line);
@@ -937,6 +1072,11 @@ public class LTTngControlService implements ILttngControlService {
                 eventInfo.setLogLevel(matcher.group(2).trim());
                 eventInfo.setEventType(matcher.group(3).trim());
                 eventInfo.setState(matcher.group(4));
+                String filter = matcher.group(5);
+                if (filter != null) {
+                    filter = filter.substring(1, filter.length() - 1); // remove '[' and ']'
+                    eventInfo.setFilterExpression(filter);
+                }
                 events.add(eventInfo);
                 index++;
             } else if (matcher2.matches()) {
@@ -944,7 +1084,12 @@ public class LTTngControlService implements ILttngControlService {
                 eventInfo.setLogLevel(TraceLogLevel.LEVEL_UNKNOWN);
                 eventInfo.setEventType(matcher2.group(2).trim());
                 eventInfo.setState(matcher2.group(3));
-                
+                String filter = matcher2.group(4);
+                if (filter != null) {
+                    filter = filter.substring(1, filter.length() - 1); // remove '[' and ']'
+                    eventInfo.setFilterExpression(filter);
+                }
+
                 if (eventInfo.getEventType() == TraceEventType.PROBE) {
                     IProbeEventInfo probeEvent = new ProbeEventInfo(eventInfo.getName());
                     probeEvent.setLogLevel(eventInfo.getLogLevel());
@@ -997,10 +1142,6 @@ public class LTTngControlService implements ILttngControlService {
             } else {
                 index++;
             }
-//            else if (line.matches(EVENT_NONE_PATTERN)) {
-                // do nothing
-//            } else 
-
         }
 
         return index;
@@ -1008,7 +1149,7 @@ public class LTTngControlService implements ILttngControlService {
 
     /**
      * Parses a line with attributes: <attribute Name>: <attribute value>
-     * 
+     *
      * @param line
      *            - attribute line to parse
      * @return the attribute value as string
@@ -1020,7 +1161,7 @@ public class LTTngControlService implements ILttngControlService {
 
     /**
      * Parses the event information within a provider.
-     * 
+     *
      * @param output
      *            - a command output array
      * @param currentIndex
@@ -1031,16 +1172,60 @@ public class LTTngControlService implements ILttngControlService {
      */
     protected int getProviderEventInfo(String[] output, int currentIndex, List<IBaseEventInfo> events) {
         int index = currentIndex;
+        IBaseEventInfo eventInfo = null;
         while (index < output.length) {
             String line = output[index];
             Matcher matcher = LTTngControlServiceConstants.PROVIDER_EVENT_PATTERN.matcher(line);
             if (matcher.matches()) {
-                // sched_kthread_stop (loglevel: TRACE_EMERG0) (type:
-                // tracepoint)
-                IBaseEventInfo eventInfo = new BaseEventInfo(matcher.group(1).trim());
+                // sched_kthread_stop (loglevel: TRACE_EMERG0) (type: tracepoint)
+                eventInfo = new BaseEventInfo(matcher.group(1).trim());
                 eventInfo.setLogLevel(matcher.group(2).trim());
                 eventInfo.setEventType(matcher.group(3).trim());
                 events.add(eventInfo);
+                index++;
+            } else if (LTTngControlServiceConstants.EVENT_FIELD_PATTERN.matcher(line).matches()) {
+                if (eventInfo != null) {
+                    List<IFieldInfo> fields = new ArrayList<IFieldInfo>();
+                    index = getFieldInfo(output, index, fields);
+                    eventInfo.setFields(fields);
+                } else {
+                    index++;
+                }
+            }
+            else if (LTTngControlServiceConstants.UST_PROVIDER_PATTERN.matcher(line).matches()) {
+                return index;
+            } else {
+                index++;
+            }
+        }
+        return index;
+    }
+
+
+    /**
+     * Parse a field's information.
+     *
+     * @param output
+     *            A command output array
+     * @param currentIndex
+     *            The current index in the command output array
+     * @param fields
+     *            List for returning the field information
+     * @return The new current index in the command output array
+     */
+    protected int getFieldInfo(String[] output, int currentIndex, List<IFieldInfo> fields) {
+        int index = currentIndex;
+        IFieldInfo fieldInfo = null;
+        while (index < output.length) {
+            String line = output[index];
+            Matcher matcher = LTTngControlServiceConstants.EVENT_FIELD_PATTERN.matcher(line);
+            if (matcher.matches()) {
+                // field: content (string)
+                fieldInfo = new FieldInfo(matcher.group(2).trim());
+                fieldInfo.setFieldType(matcher.group(3).trim());
+                fields.add(fieldInfo);
+            } else if (LTTngControlServiceConstants.PROVIDER_EVENT_PATTERN.matcher(line).matches()) {
+                return index;
             } else if (LTTngControlServiceConstants.UST_PROVIDER_PATTERN.matcher(line).matches()) {
                 return index;
             }
@@ -1050,7 +1235,7 @@ public class LTTngControlService implements ILttngControlService {
     }
 
     /**
-     * Formats a command parameter for the command execution i.e. adds quotes 
+     * Formats a command parameter for the command execution i.e. adds quotes
      * at the beginning and end if necessary.
      * @param parameter - parameter to format
      * @return formated parameter
@@ -1060,7 +1245,7 @@ public class LTTngControlService implements ILttngControlService {
             StringBuffer newString = new StringBuffer();
             newString.append(parameter);
 
-            if (parameter.contains(" ")) { //$NON-NLS-1$
+            if (parameter.contains(" ") || parameter.contains("*")) { //$NON-NLS-1$ //$NON-NLS-2$
                 newString.insert(0, "\""); //$NON-NLS-1$
                 newString.append("\""); //$NON-NLS-1$
             }
@@ -1105,7 +1290,7 @@ public class LTTngControlService implements ILttngControlService {
             }
             if (ControlPreferences.TRACE_CONTROL_VERBOSE_LEVEL_V_VERBOSE.equals(level)) {
                 return LTTngControlServiceConstants.OPTION_VERY_VERBOSE;
-            } 
+            }
             if (ControlPreferences.TRACE_CONTROL_VERBOSE_LEVEL_V_V_VERBOSE.equals(level)) {
                 return LTTngControlServiceConstants.OPTION_VERY_VERY_VERBOSE;
             }
@@ -1114,41 +1299,55 @@ public class LTTngControlService implements ILttngControlService {
     }
 
     /**
-     * Method that logs the command and command result if logging is enabled as well as forwards
-     * the command execution to the shell.
-     * @param command - the command to execute
-     * @param monitor - a progress monitor
+     * Method that logs the command and command result if logging is enabled as
+     * well as forwards the command execution to the shell.
+     *
+     * @param command
+     *            - the command to execute
+     * @param monitor
+     *            - a progress monitor
      * @return the command result
      * @throws ExecutionException
+     *             If the command fails
      */
-    protected ICommandResult executeCommand(String command, IProgressMonitor monitor) throws ExecutionException {
+    protected ICommandResult executeCommand(String command,
+            IProgressMonitor monitor) throws ExecutionException {
         return executeCommand(command, monitor, true);
     }
-    
+
     /**
-     * Method that logs the command and command result if logging is enabled as well as forwards
-     * the command execution to the shell.
-     * @param command - the command to execute
-     * @param monitor - a progress monitor
-     * @param - checkForError - true to verify command result, else false
+     * Method that logs the command and command result if logging is enabled as
+     * well as forwards the command execution to the shell.
+     *
+     * @param command
+     *            - the command to execute
+     * @param monitor
+     *            - a progress monitor
+     * @param checkForError
+     *            - true to verify command result, else false
      * @return the command result
-     * @throws ExecutionException in case of error result
+     * @throws ExecutionException
+     *             in case of error result
      */
-    protected ICommandResult executeCommand(String command, IProgressMonitor monitor, boolean checkForError) throws ExecutionException {
+    protected ICommandResult executeCommand(String command,
+            IProgressMonitor monitor, boolean checkForError)
+            throws ExecutionException {
         if (ControlPreferences.getInstance().isLoggingEnabled()) {
             ControlCommandLogger.log(command);
         }
 
-        ICommandResult result = fCommandShell.executeCommand(command.toString(), monitor);
-        
+        ICommandResult result = fCommandShell.executeCommand(
+                command.toString(), monitor);
+
         if (ControlPreferences.getInstance().isLoggingEnabled()) {
             ControlCommandLogger.log(formatOutput(result));
         }
 
-        if (isError(result)) {
-            throw new ExecutionException(Messages.TraceControl_CommandError + " " + command.toString() + "\n" + formatOutput(result)); //$NON-NLS-1$ //$NON-NLS-2$
+        if (checkForError && isError(result)) {
+            throw new ExecutionException(Messages.TraceControl_CommandError
+                    + " " + command.toString() + "\n" + formatOutput(result)); //$NON-NLS-1$ //$NON-NLS-2$
         }
-        
+
         return result;
     }
 }
This page took 0.038326 seconds and 5 git commands to generate.