1 /**********************************************************************
2 * Copyright (c) 2012, 2013 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Bernd Hufmann - Initial API and implementation
11 * Bernd Hufmann - Updated for support of LTTng Tools 2.1
12 **********************************************************************/
13 package org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.service
;
15 import java
.util
.ArrayList
;
16 import java
.util
.Iterator
;
17 import java
.util
.List
;
18 import java
.util
.regex
.Matcher
;
20 import org
.eclipse
.core
.commands
.ExecutionException
;
21 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
22 import org
.eclipse
.core
.runtime
.NullProgressMonitor
;
23 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.IBaseEventInfo
;
24 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.IChannelInfo
;
25 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.IDomainInfo
;
26 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.IEventInfo
;
27 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.IFieldInfo
;
28 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.IProbeEventInfo
;
29 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.ISessionInfo
;
30 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.IUstProviderInfo
;
31 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.LogLevelType
;
32 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.TraceEventType
;
33 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.TraceLogLevel
;
34 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.impl
.BaseEventInfo
;
35 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.impl
.ChannelInfo
;
36 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.impl
.DomainInfo
;
37 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.impl
.EventInfo
;
38 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.impl
.FieldInfo
;
39 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.impl
.ProbeEventInfo
;
40 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.impl
.SessionInfo
;
41 import org
.eclipse
.linuxtools
.internal
.lttng2
.core
.control
.model
.impl
.UstProviderInfo
;
42 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.logging
.ControlCommandLogger
;
43 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.messages
.Messages
;
44 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.preferences
.ControlPreferences
;
45 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.remote
.ICommandResult
;
46 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.remote
.ICommandShell
;
47 import org
.osgi
.framework
.Version
;
51 * Service for sending LTTng trace control commands to remote host.
54 * @author Bernd Hufmann
56 public class LTTngControlService
implements ILttngControlService
{
58 // ------------------------------------------------------------------------
60 // ------------------------------------------------------------------------
62 * The command shell implementation
64 protected ICommandShell fCommandShell
= null;
69 protected Version fVersion
= null;
71 // ------------------------------------------------------------------------
73 // ------------------------------------------------------------------------
79 * - the command shell implementation to use
81 public LTTngControlService(ICommandShell shell
) {
82 fCommandShell
= shell
;
85 // ------------------------------------------------------------------------
87 // ------------------------------------------------------------------------
90 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#getVersion()
93 public String
getVersion() {
94 if (fVersion
== null) {
95 return "Unknown"; //$NON-NLS-1$
97 return fVersion
.toString();
101 * Sets the version of the LTTng 2.0 control service.
102 * @param version - a version to set
104 public void setVersion(String version
) {
105 fVersion
= new Version(version
);
110 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#isVersionSupported(java.lang.String)
113 public boolean isVersionSupported(String version
) {
114 Version tmp
= new Version(version
);
115 return (fVersion
!= null && fVersion
.compareTo(tmp
) >= 0) ?
true : false;
118 // ------------------------------------------------------------------------
120 // ------------------------------------------------------------------------
126 * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
127 * #getSessionNames(org.eclipse.core.runtime.IProgressMonitor)
130 public String
[] getSessionNames(IProgressMonitor monitor
) throws ExecutionException
{
131 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_LIST
);
133 ICommandResult result
= executeCommand(command
.toString(), monitor
);
136 // Available tracing sessions:
137 // 1) mysession1 (/home/user/lttng-traces/mysession1-20120123-083928) [inactive]
138 // 2) mysession (/home/user/lttng-traces/mysession-20120123-083318) [inactive]
140 // Use lttng list <session_name> for more details
142 ArrayList
<String
> retArray
= new ArrayList
<String
>();
144 while (index
< result
.getOutput().length
) {
145 String line
= result
.getOutput()[index
];
146 Matcher matcher
= LTTngControlServiceConstants
.SESSION_PATTERN
.matcher(line
);
147 if (matcher
.matches()) {
148 retArray
.add(matcher
.group(2).trim());
152 return retArray
.toArray(new String
[retArray
.size()]);
159 * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
160 * #getSession(java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
163 public ISessionInfo
getSession(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
164 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_LIST
, sessionName
);
165 ICommandResult result
= executeCommand(command
.toString(), monitor
);
170 // Tracing session mysession2: [inactive]
171 // Trace path: /home/eedbhu/lttng-traces/mysession2-20120123-110330
172 ISessionInfo sessionInfo
= new SessionInfo(sessionName
);
174 while (index
< result
.getOutput().length
) {
175 // Tracing session mysession2: [inactive]
176 // Trace path: /home/eedbhu/lttng-traces/mysession2-20120123-110330
178 // === Domain: Kernel ===
180 String line
= result
.getOutput()[index
];
181 Matcher matcher
= LTTngControlServiceConstants
.TRACE_SESSION_PATTERN
.matcher(line
);
182 if (matcher
.matches()) {
183 sessionInfo
.setSessionState(matcher
.group(2));
188 matcher
= LTTngControlServiceConstants
.TRACE_NETWORK_PATH_PATTERN
.matcher(line
);
189 if (matcher
.matches()) {
190 sessionInfo
.setStreamedTrace(true);
193 matcher
= LTTngControlServiceConstants
.TRACE_SESSION_PATH_PATTERN
.matcher(line
);
194 if (matcher
.matches()) {
195 sessionInfo
.setSessionPath(matcher
.group(1).trim());
200 matcher
= LTTngControlServiceConstants
.DOMAIN_KERNEL_PATTERN
.matcher(line
);
201 if (matcher
.matches()) {
203 IDomainInfo domainInfo
= new DomainInfo(Messages
.TraceControl_KernelDomainDisplayName
);
206 ArrayList
<IChannelInfo
> channels
= new ArrayList
<IChannelInfo
>();
207 index
= parseDomain(result
.getOutput(), index
, channels
);
209 if (channels
.size() > 0) {
211 sessionInfo
.addDomain(domainInfo
);
214 domainInfo
.setChannels(channels
);
217 domainInfo
.setIsKernel(true);
222 matcher
= LTTngControlServiceConstants
.DOMAIN_UST_GLOBAL_PATTERN
.matcher(line
);
223 if (matcher
.matches()) {
224 IDomainInfo domainInfo
= new DomainInfo(Messages
.TraceControl_UstGlobalDomainDisplayName
);
227 ArrayList
<IChannelInfo
> channels
= new ArrayList
<IChannelInfo
>();
228 index
= parseDomain(result
.getOutput(), index
, channels
);
230 if (channels
.size() > 0) {
232 sessionInfo
.addDomain(domainInfo
);
235 domainInfo
.setChannels(channels
);
238 domainInfo
.setIsKernel(false);
251 * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
252 * #getKernelProvider(org.eclipse.core.runtime.IProgressMonitor)
255 public List
<IBaseEventInfo
> getKernelProvider(IProgressMonitor monitor
) throws ExecutionException
{
256 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_LIST_KERNEL
);
257 ICommandResult result
= executeCommand(command
.toString(), monitor
, false);
259 List
<IBaseEventInfo
> events
= new ArrayList
<IBaseEventInfo
>();
261 if (result
.getOutput() != null) {
262 // Ignore the following 2 cases:
263 // Spawning a session daemon
264 // Error: Unable to list kernel events
266 // Error: Unable to list kernel events
269 while (index
< result
.getOutput().length
) {
270 String line
= result
.getOutput()[index
];
271 Matcher matcher
= LTTngControlServiceConstants
.LIST_KERNEL_NO_KERNEL_PROVIDER_PATTERN
.matcher(line
);
272 if (matcher
.matches()) {
279 if (isError(result
)) {
280 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + formatOutput(result
)); //$NON-NLS-1$ //$NON-NLS-2$
285 // sched_kthread_stop (type: tracepoint)
286 getProviderEventInfo(result
.getOutput(), 0, events
);
294 * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
298 public List
<IUstProviderInfo
> getUstProvider() throws ExecutionException
{
299 return getUstProvider(new NullProgressMonitor());
306 * org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService
307 * #getUstProvider(org.eclipse.core.runtime.IProgressMonitor)
310 public List
<IUstProviderInfo
> getUstProvider(IProgressMonitor monitor
) throws ExecutionException
{
311 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_LIST_UST
);
313 if (isVersionSupported("2.1.0")) { //$NON-NLS-1$
314 command
.append(LTTngControlServiceConstants
.OPTION_FIELDS
);
317 ICommandResult result
= executeCommand(command
.toString(), monitor
, false);
318 List
<IUstProviderInfo
> allProviders
= new ArrayList
<IUstProviderInfo
>();
320 // Workaround for versions 2.0.x which causes a segmentation fault for this command
321 // if LTTng Tools is compiled without UST support.
322 if (!isVersionSupported("2.1.0") && (result
.getResult() != 0)) { //$NON-NLS-1$
326 if (result
.getOutput() != null) {
327 // Ignore the following 2 cases:
328 // Spawning a session daemon
329 // Error: Unable to list UST events: Listing UST events failed
331 // Error: Unable to list UST events: Listing UST events failed
334 while (index
< result
.getOutput().length
) {
335 String line
= result
.getOutput()[index
];
336 Matcher matcher
= LTTngControlServiceConstants
.LIST_UST_NO_UST_PROVIDER_PATTERN
.matcher(line
);
337 if (matcher
.matches()) {
344 if (isError(result
)) {
345 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + formatOutput(result
)); //$NON-NLS-1$ //$NON-NLS-2$
348 // Note that field print-outs exists for version >= 2.1.0
354 // /home/user/git/lttng-ust/tests/hello.cxx/.libs/lt-hello
355 // ust_tests_hello:tptest_sighandler (loglevel: TRACE_EMERG0) (type:
357 // ust_tests_hello:tptest (loglevel: TRACE_EMERG0) (type: tracepoint)
358 // field: doublefield (float)
359 // field: floatfield (float)
360 // field: stringfield (string)
363 // /home/user/git/lttng-ust/tests/hello.cxx/.libs/lt-hello
364 // ust_tests_hello:tptest_sighandler (loglevel: TRACE_EMERG0) (type:
366 // ust_tests_hello:tptest (loglevel: TRACE_EMERG0) (type: tracepoint)
367 // field: doublefield (float)
368 // field: floatfield (float)
369 // field: stringfield (string)
371 IUstProviderInfo provider
= null;
374 while (index
< result
.getOutput().length
) {
375 String line
= result
.getOutput()[index
];
376 Matcher matcher
= LTTngControlServiceConstants
.UST_PROVIDER_PATTERN
.matcher(line
);
377 if (matcher
.matches()) {
378 provider
= new UstProviderInfo(matcher
.group(2).trim());
379 provider
.setPid(Integer
.valueOf(matcher
.group(1).trim()));
380 List
<IBaseEventInfo
> events
= new ArrayList
<IBaseEventInfo
>();
381 index
= getProviderEventInfo(result
.getOutput(), ++index
, events
);
382 provider
.setEvents(events
);
383 allProviders
.add(provider
);
393 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#createSession(java.lang.String, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
396 public ISessionInfo
createSession(String sessionName
, String sessionPath
, IProgressMonitor monitor
) throws ExecutionException
{
398 String newName
= formatParameter(sessionName
);
399 String newPath
= formatParameter(sessionPath
);
401 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_CREATE_SESSION
, newName
);
403 if (newPath
!= null && !"".equals(newPath
)) { //$NON-NLS-1$
404 command
.append(LTTngControlServiceConstants
.OPTION_OUTPUT_PATH
);
405 command
.append(newPath
);
408 ICommandResult result
= executeCommand(command
.toString(), monitor
);
410 //Session myssession2 created.
411 //Traces will be written in /home/user/lttng-traces/myssession2-20120209-095418
412 String
[] output
= result
.getOutput();
414 // Get and session name and path
419 while (index
< output
.length
) {
420 String line
= output
[index
];
421 Matcher nameMatcher
= LTTngControlServiceConstants
.CREATE_SESSION_NAME_PATTERN
.matcher(line
);
422 Matcher pathMatcher
= LTTngControlServiceConstants
.CREATE_SESSION_PATH_PATTERN
.matcher(line
);
423 if (nameMatcher
.matches()) {
424 name
= String
.valueOf(nameMatcher
.group(1).trim());
425 } else if (pathMatcher
.matches()) {
426 path
= String
.valueOf(pathMatcher
.group(1).trim());
431 // Verify session name
432 if ((name
== null) || (!"".equals(sessionName
) && !name
.equals(sessionName
))) { //$NON-NLS-1$
433 // Unexpected name returned
434 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
+ "\n" + //$NON-NLS-1$ //$NON-NLS-2$
435 Messages
.TraceControl_UnexpectedNameError
+ ": " + name
); //$NON-NLS-1$
438 SessionInfo sessionInfo
= new SessionInfo(name
);
440 // Verify session path
441 if ((path
== null) || ((sessionPath
!= null) && (!path
.contains(sessionPath
)))) {
443 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
+ "\n" + //$NON-NLS-1$ //$NON-NLS-2$
444 Messages
.TraceControl_UnexpectedPathError
+ ": " + name
); //$NON-NLS-1$
447 sessionInfo
.setSessionPath(path
);
455 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#createSession(java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
458 public ISessionInfo
createSession(String sessionName
, String networkUrl
, String controlUrl
, String dataUrl
, IProgressMonitor monitor
) throws ExecutionException
{
460 String newName
= formatParameter(sessionName
);
461 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_CREATE_SESSION
, newName
);
463 if (networkUrl
!= null) {
464 command
.append(LTTngControlServiceConstants
.OPTION_NETWORK_URL
);
465 command
.append(networkUrl
);
467 command
.append(LTTngControlServiceConstants
.OPTION_CONTROL_URL
);
468 command
.append(controlUrl
);
470 command
.append(LTTngControlServiceConstants
.OPTION_DATA_URL
);
471 command
.append(dataUrl
);
474 ICommandResult result
= executeCommand(command
.toString(), monitor
);
477 String
[] output
= result
.getOutput();
479 // Get and session name and path
484 while (index
< output
.length
) {
485 String line
= output
[index
];
486 Matcher nameMatcher
= LTTngControlServiceConstants
.CREATE_SESSION_NAME_PATTERN
.matcher(line
);
487 Matcher pathMatcher
= LTTngControlServiceConstants
.CREATE_SESSION_PATH_PATTERN
.matcher(line
);
489 if (nameMatcher
.matches()) {
490 name
= String
.valueOf(nameMatcher
.group(1).trim());
491 } else if (pathMatcher
.matches() && (networkUrl
!= null)) {
492 path
= String
.valueOf(pathMatcher
.group(1).trim());
497 // Verify session name
498 if ((name
== null) || (!"".equals(sessionName
) && !name
.equals(sessionName
))) { //$NON-NLS-1$
499 // Unexpected name returned
500 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
+ "\n" + //$NON-NLS-1$ //$NON-NLS-2$
501 Messages
.TraceControl_UnexpectedNameError
+ ": " + name
); //$NON-NLS-1$
504 SessionInfo sessionInfo
= new SessionInfo(name
);
506 sessionInfo
.setStreamedTrace(true);
508 // Verify session path
509 if (networkUrl
!= null) {
512 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
+ "\n" + //$NON-NLS-1$ //$NON-NLS-2$
513 Messages
.TraceControl_UnexpectedPathError
+ ": " + name
); //$NON-NLS-1$
516 sessionInfo
.setSessionPath(path
);
518 // Check file protocol
519 Matcher matcher
= LTTngControlServiceConstants
.TRACE_FILE_PROTOCOL_PATTERN
.matcher(path
);
520 if (matcher
.matches()) {
521 sessionInfo
.setStreamedTrace(false);
524 // When using controlUrl and dataUrl the full session path is not known yet
525 // and will be set later on when listing the session
531 public void destroySession(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
532 String newName
= formatParameter(sessionName
);
534 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_DESTROY_SESSION
, newName
);
536 ICommandResult result
= executeCommand(command
.toString(), monitor
, false);
537 String
[] output
= result
.getOutput();
539 boolean isError
= isError(result
);
540 if (isError
&& (output
!= null)) {
542 while (index
< output
.length
) {
543 String line
= output
[index
];
544 Matcher matcher
= LTTngControlServiceConstants
.SESSION_NOT_FOUND_ERROR_PATTERN
.matcher(line
);
545 if (matcher
.matches()) {
546 // Don't treat this as an error
554 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + formatOutput(result
)); //$NON-NLS-1$ //$NON-NLS-2$
557 //Session <sessionName> destroyed
562 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#startSession(java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
565 public void startSession(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
567 String newSessionName
= formatParameter(sessionName
);
569 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_START_SESSION
, newSessionName
);
571 executeCommand(command
.toString(), monitor
);
573 //Session <sessionName> started
578 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#stopSession(java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
581 public void stopSession(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
582 String newSessionName
= formatParameter(sessionName
);
583 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_STOP_SESSION
, newSessionName
);
585 executeCommand(command
.toString(), monitor
);
587 //Session <sessionName> stopped
593 * @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)
596 public void enableChannels(String sessionName
, List
<String
> channelNames
, boolean isKernel
, IChannelInfo info
, IProgressMonitor monitor
) throws ExecutionException
{
598 // no channels to enable
599 if (channelNames
.isEmpty()) {
603 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_CHANNEL
);
605 for (Iterator
<String
> iterator
= channelNames
.iterator(); iterator
.hasNext();) {
606 String channel
= iterator
.next();
607 command
.append(channel
);
608 if (iterator
.hasNext()) {
614 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
616 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
619 String newSessionName
= formatParameter(sessionName
);
620 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
621 command
.append(newSessionName
);
624 // --discard Discard event when buffers are full (default)
626 // --overwrite Flight recorder mode
627 if (info
.isOverwriteMode()) {
628 command
.append(LTTngControlServiceConstants
.OPTION_OVERWRITE
);
630 // --subbuf-size SIZE Subbuffer size in bytes
631 // (default: 4096, kernel default: 262144)
632 command
.append(LTTngControlServiceConstants
.OPTION_SUB_BUFFER_SIZE
);
633 command
.append(String
.valueOf(info
.getSubBufferSize()));
635 // --num-subbuf NUM Number of subbufers
636 // (default: 8, kernel default: 4)
637 command
.append(LTTngControlServiceConstants
.OPTION_NUM_SUB_BUFFERS
);
638 command
.append(String
.valueOf(info
.getNumberOfSubBuffers()));
640 // --switch-timer USEC Switch timer interval in usec (default: 0)
641 command
.append(LTTngControlServiceConstants
.OPTION_SWITCH_TIMER
);
642 command
.append(String
.valueOf(info
.getSwitchTimer()));
644 // --read-timer USEC Read timer interval in usec (default: 200)
645 command
.append(LTTngControlServiceConstants
.OPTION_READ_TIMER
);
646 command
.append(String
.valueOf(info
.getReadTimer()));
649 executeCommand(command
.toString(), monitor
);
655 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#disableChannel(java.lang.String, java.util.List, org.eclipse.core.runtime.IProgressMonitor)
658 public void disableChannels(String sessionName
, List
<String
> channelNames
, boolean isKernel
, IProgressMonitor monitor
) throws ExecutionException
{
660 // no channels to enable
661 if (channelNames
.isEmpty()) {
665 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_DISABLE_CHANNEL
);
667 for (Iterator
<String
> iterator
= channelNames
.iterator(); iterator
.hasNext();) {
668 String channel
= iterator
.next();
669 command
.append(channel
);
670 if (iterator
.hasNext()) {
676 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
678 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
681 String newSessionName
= formatParameter(sessionName
);
682 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
683 command
.append(newSessionName
);
685 executeCommand(command
.toString(), monitor
);
690 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#enableEvents(java.lang.String, java.lang.String, java.util.List, boolean, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
693 public void enableEvents(String sessionName
, String channelName
, List
<String
> eventNames
, boolean isKernel
, String filterExpression
, IProgressMonitor monitor
) throws ExecutionException
{
695 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_EVENT
);
697 if (eventNames
== null || eventNames
.isEmpty()) {
698 command
.append(LTTngControlServiceConstants
.OPTION_ALL
);
701 StringBuffer eventNameParameter
= new StringBuffer();
702 for (Iterator
<String
> iterator
= eventNames
.iterator(); iterator
.hasNext();) {
703 String event
= iterator
.next();
704 eventNameParameter
.append(event
);
705 if (iterator
.hasNext()) {
706 eventNameParameter
.append(',');
709 command
.append(formatParameter(eventNameParameter
.toString()));
713 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
715 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
718 String newSessionName
= formatParameter(sessionName
);
720 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
721 command
.append(newSessionName
);
723 if (channelName
!= null) {
724 command
.append(LTTngControlServiceConstants
.OPTION_CHANNEL
);
725 command
.append(channelName
);
728 command
.append(LTTngControlServiceConstants
.OPTION_TRACEPOINT
);
730 if (filterExpression
!= null) {
731 command
.append(LTTngControlServiceConstants
.OPTION_FILTER
);
732 command
.append('\'');
733 command
.append(filterExpression
);
734 command
.append('\'');
737 executeCommand(command
.toString(), monitor
);
743 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#enableSyscalls(java.lang.String, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
746 public void enableSyscalls(String sessionName
, String channelName
, IProgressMonitor monitor
) throws ExecutionException
{
748 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_EVENT
);
750 command
.append(LTTngControlServiceConstants
.OPTION_ALL
);
751 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
753 String newSessionName
= formatParameter(sessionName
);
755 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
756 command
.append(newSessionName
);
758 if (channelName
!= null) {
759 command
.append(LTTngControlServiceConstants
.OPTION_CHANNEL
);
760 command
.append(channelName
);
763 command
.append(LTTngControlServiceConstants
.OPTION_SYSCALL
);
765 executeCommand(command
.toString(), monitor
);
770 * @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)
773 public void enableProbe(String sessionName
, String channelName
, String eventName
, boolean isFunction
, String probe
, IProgressMonitor monitor
) throws ExecutionException
{
774 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_EVENT
);
776 command
.append(eventName
);
777 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
779 String newSessionName
= formatParameter(sessionName
);
780 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
781 command
.append(newSessionName
);
783 if (channelName
!= null) {
784 command
.append(LTTngControlServiceConstants
.OPTION_CHANNEL
);
785 command
.append(channelName
);
788 command
.append(LTTngControlServiceConstants
.OPTION_FUNCTION_PROBE
);
790 command
.append(LTTngControlServiceConstants
.OPTION_PROBE
);
793 command
.append(probe
);
795 executeCommand(command
.toString(), monitor
);
800 * @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.core.control.model.LogLevelType, org.eclipse.linuxtools.internal.lttng2.core.control.model.TraceLogLevel, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
803 public void enableLogLevel(String sessionName
, String channelName
, String eventName
, LogLevelType logLevelType
, TraceLogLevel level
, String filterExpression
, IProgressMonitor monitor
) throws ExecutionException
{
804 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_EVENT
);
806 command
.append(eventName
);
807 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
809 String newSessionName
= formatParameter(sessionName
);
810 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
811 command
.append(newSessionName
);
813 if (channelName
!= null) {
814 command
.append(LTTngControlServiceConstants
.OPTION_CHANNEL
);
815 command
.append(channelName
);
818 if (logLevelType
== LogLevelType
.LOGLEVEL
) {
819 command
.append(LTTngControlServiceConstants
.OPTION_LOGLEVEL
);
820 } else if (logLevelType
== LogLevelType
.LOGLEVEL_ONLY
) {
821 command
.append(LTTngControlServiceConstants
.OPTION_LOGLEVEL_ONLY
);
826 command
.append(level
.getInName());
828 executeCommand(command
.toString(), monitor
);
835 * @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)
838 public void disableEvent(String sessionName
, String channelName
, List
<String
> eventNames
, boolean isKernel
, IProgressMonitor monitor
) throws ExecutionException
{
839 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_DISABLE_EVENT
);
841 if (eventNames
== null) {
842 command
.append(LTTngControlServiceConstants
.OPTION_ALL
);
844 // no events to disable
845 if (eventNames
.isEmpty()) {
849 StringBuffer eventNameParameter
= new StringBuffer();
850 for (Iterator
<String
> iterator
= eventNames
.iterator(); iterator
.hasNext();) {
851 String event
= iterator
.next();
852 eventNameParameter
.append(event
);
853 if (iterator
.hasNext()) {
854 eventNameParameter
.append(',');
857 command
.append(formatParameter(eventNameParameter
.toString()));
861 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
863 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
866 String newSessionName
= formatParameter(sessionName
);
867 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
868 command
.append(newSessionName
);
870 if (channelName
!= null) {
871 command
.append(LTTngControlServiceConstants
.OPTION_CHANNEL
);
872 command
.append(channelName
);
875 executeCommand(command
.toString(), monitor
);
880 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#getContexts(org.eclipse.core.runtime.IProgressMonitor)
883 public List
<String
> getContextList(IProgressMonitor monitor
) throws ExecutionException
{
885 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ADD_CONTEXT
, LTTngControlServiceConstants
.OPTION_HELP
);
887 ICommandResult result
= executeCommand(command
.toString(), monitor
);
889 String
[] output
= result
.getOutput();
891 List
<String
> contexts
= new ArrayList
<String
>(0);
894 boolean inList
= false;
895 while (index
< output
.length
) {
896 String line
= result
.getOutput()[index
];
898 Matcher startMatcher
= LTTngControlServiceConstants
.ADD_CONTEXT_HELP_CONTEXTS_INTRO
.matcher(line
);
899 Matcher endMatcher
= LTTngControlServiceConstants
.ADD_CONTEXT_HELP_CONTEXTS_END_LINE
.matcher(line
);
901 if (startMatcher
.matches()) {
903 } else if (endMatcher
.matches()) {
905 } else if (inList
== true) {
906 String
[] tmp
= line
.split(","); //$NON-NLS-1$
907 for (int i
= 0; i
< tmp
.length
; i
++) {
908 contexts
.add(tmp
[i
].trim());
918 * @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)
921 public void addContexts(String sessionName
, String channelName
, String eventName
, boolean isKernel
, List
<String
> contextNames
, IProgressMonitor monitor
) throws ExecutionException
{
922 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ADD_CONTEXT
);
924 String newSessionName
= formatParameter(sessionName
);
925 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
926 command
.append(newSessionName
);
928 if (channelName
!= null) {
929 command
.append(LTTngControlServiceConstants
.OPTION_CHANNEL
);
930 command
.append(channelName
);
933 if (eventName
!= null) {
934 command
.append(LTTngControlServiceConstants
.OPTION_EVENT
);
935 command
.append(eventName
);
939 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
941 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
944 for (Iterator
<String
> iterator
= contextNames
.iterator(); iterator
.hasNext();) {
945 String context
= iterator
.next();
946 command
.append(LTTngControlServiceConstants
.OPTION_CONTEXT_TYPE
);
947 command
.append(context
);
950 executeCommand(command
.toString(), monitor
);
956 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.service.ILttngControlService#calibrate(boolean, org.eclipse.core.runtime.IProgressMonitor)
959 public void calibrate(boolean isKernel
, IProgressMonitor monitor
) throws ExecutionException
{
960 // String newSessionName = formatParameter(sessionName);
961 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_CALIBRATE
);
963 // command.append(OPTION_SESSION);
964 // command.append(newSessionName);
967 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
969 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
972 command
.append(LTTngControlServiceConstants
.OPTION_FUNCTION_PROBE
);
974 executeCommand(command
.toString(), monitor
);
977 // ------------------------------------------------------------------------
979 // ------------------------------------------------------------------------
981 * Checks if command result is an error result.
984 * - the command result to check
985 * @return true if error else false
987 protected boolean isError(ICommandResult result
) {
988 // Check return code and length of returned strings
989 if ((result
.getResult()) != 0 || (result
.getOutput().length
< 1)) {
993 // Look for error pattern
995 while (index
< result
.getOutput().length
) {
996 String line
= result
.getOutput()[index
];
997 Matcher matcher
= LTTngControlServiceConstants
.ERROR_PATTERN
.matcher(line
);
998 if (matcher
.matches()) {
1008 * Formats the output string as single string.
1012 * @return - the formatted output
1014 public static String
formatOutput(ICommandResult result
) {
1015 if ((result
== null) || result
.getOutput() == null || result
.getOutput().length
== 0) {
1016 return ""; //$NON-NLS-1$
1018 String
[] output
= result
.getOutput();
1019 StringBuffer ret
= new StringBuffer();
1020 ret
.append("Return Value: "); //$NON-NLS-1$
1021 ret
.append(result
.getResult());
1022 ret
.append("\n"); //$NON-NLS-1$
1023 for (int i
= 0; i
< output
.length
; i
++) {
1024 ret
.append(output
[i
] + "\n"); //$NON-NLS-1$
1026 return ret
.toString();
1030 * Parses the domain information.
1033 * - a command output array
1034 * @param currentIndex
1035 * - current index in command output array
1037 * - list for returning channel information
1038 * @return the new current index in command output array
1040 protected int parseDomain(String
[] output
, int currentIndex
, List
<IChannelInfo
> channels
) {
1041 int index
= currentIndex
;
1045 // - channnel1: [enabled]
1048 // overwrite mode: 0
1049 // subbufers size: 262144
1050 // number of subbufers: 4
1051 // switch timer interval: 0
1052 // read timer interval: 200
1055 while (index
< output
.length
) {
1056 String line
= output
[index
];
1058 Matcher outerMatcher
= LTTngControlServiceConstants
.CHANNELS_SECTION_PATTERN
.matcher(line
);
1059 Matcher noKernelChannelMatcher
= LTTngControlServiceConstants
.DOMAIN_NO_KERNEL_CHANNEL_PATTERN
.matcher(line
);
1060 Matcher noUstChannelMatcher
= LTTngControlServiceConstants
.DOMAIN_NO_UST_CHANNEL_PATTERN
.matcher(line
);
1061 if (outerMatcher
.matches()) {
1062 IChannelInfo channelInfo
= null;
1063 while (index
< output
.length
) {
1064 String subLine
= output
[index
];
1066 Matcher innerMatcher
= LTTngControlServiceConstants
.CHANNEL_PATTERN
.matcher(subLine
);
1067 if (innerMatcher
.matches()) {
1068 channelInfo
= new ChannelInfo(""); //$NON-NLS-1$
1070 channelInfo
.setName(innerMatcher
.group(1));
1072 // get channel enablement
1073 channelInfo
.setState(innerMatcher
.group(2));
1076 channels
.add(channelInfo
);
1078 } else if (LTTngControlServiceConstants
.OVERWRITE_MODE_ATTRIBUTE
.matcher(subLine
).matches()) {
1079 String value
= getAttributeValue(subLine
);
1080 if (channelInfo
!= null) {
1081 channelInfo
.setOverwriteMode(!LTTngControlServiceConstants
.OVERWRITE_MODE_ATTRIBUTE_FALSE
.equals(value
));
1083 } else if (LTTngControlServiceConstants
.SUBBUFFER_SIZE_ATTRIBUTE
.matcher(subLine
).matches()) {
1084 if (channelInfo
!= null) {
1085 channelInfo
.setSubBufferSize(Long
.valueOf(getAttributeValue(subLine
)));
1088 } else if (LTTngControlServiceConstants
.NUM_SUBBUFFERS_ATTRIBUTE
.matcher(subLine
).matches()) {
1089 if (channelInfo
!= null) {
1090 channelInfo
.setNumberOfSubBuffers(Integer
.valueOf(getAttributeValue(subLine
)));
1093 } else if (LTTngControlServiceConstants
.SWITCH_TIMER_ATTRIBUTE
.matcher(subLine
).matches()) {
1094 if (channelInfo
!= null) {
1095 channelInfo
.setSwitchTimer(Long
.valueOf(getAttributeValue(subLine
)));
1098 } else if (LTTngControlServiceConstants
.READ_TIMER_ATTRIBUTE
.matcher(subLine
).matches()) {
1099 if (channelInfo
!= null) {
1100 channelInfo
.setReadTimer(Long
.valueOf(getAttributeValue(subLine
)));
1103 } else if (LTTngControlServiceConstants
.OUTPUT_ATTRIBUTE
.matcher(subLine
).matches()) {
1104 if (channelInfo
!= null) {
1105 channelInfo
.setOutputType(getAttributeValue(subLine
));
1108 } else if (LTTngControlServiceConstants
.EVENT_SECTION_PATTERN
.matcher(subLine
).matches()) {
1109 List
<IEventInfo
> events
= new ArrayList
<IEventInfo
>();
1110 index
= parseEvents(output
, index
, events
);
1111 if (channelInfo
!= null) {
1112 channelInfo
.setEvents(events
);
1114 // we want to stay at the current index to be able to
1117 } else if (LTTngControlServiceConstants
.DOMAIN_KERNEL_PATTERN
.matcher(subLine
).matches()) {
1120 } else if (LTTngControlServiceConstants
.DOMAIN_UST_GLOBAL_PATTERN
.matcher(subLine
).matches()) {
1125 } else if (noKernelChannelMatcher
.matches() || noUstChannelMatcher
.matches()) {
1126 // domain indicates that no channels were found -> return
1136 * Parses the event information within a domain.
1139 * - a command output array
1140 * @param currentIndex
1141 * - current index in command output array
1143 * - list for returning event information
1144 * @return the new current index in command output array
1146 protected int parseEvents(String
[] output
, int currentIndex
, List
<IEventInfo
> events
) {
1147 int index
= currentIndex
;
1149 while (index
< output
.length
) {
1150 String line
= output
[index
];
1151 if (LTTngControlServiceConstants
.CHANNEL_PATTERN
.matcher(line
).matches()) {
1154 } else if (LTTngControlServiceConstants
.DOMAIN_KERNEL_PATTERN
.matcher(line
).matches()) {
1157 } else if (LTTngControlServiceConstants
.DOMAIN_UST_GLOBAL_PATTERN
.matcher(line
).matches()) {
1162 Matcher matcher
= LTTngControlServiceConstants
.EVENT_PATTERN
.matcher(line
);
1163 Matcher matcher2
= LTTngControlServiceConstants
.WILDCARD_EVENT_PATTERN
.matcher(line
);
1165 if (matcher
.matches()) {
1166 IEventInfo eventInfo
= new EventInfo(matcher
.group(1).trim());
1167 eventInfo
.setLogLevel(matcher
.group(2).trim());
1168 eventInfo
.setEventType(matcher
.group(3).trim());
1169 eventInfo
.setState(matcher
.group(4));
1170 String filter
= matcher
.group(5);
1171 if (filter
!= null) {
1172 filter
= filter
.substring(1, filter
.length() - 1); // remove '[' and ']'
1173 eventInfo
.setFilterExpression(filter
);
1175 events
.add(eventInfo
);
1177 } else if (matcher2
.matches()) {
1178 IEventInfo eventInfo
= new EventInfo(matcher2
.group(1).trim());
1179 eventInfo
.setLogLevel(TraceLogLevel
.LEVEL_UNKNOWN
);
1180 eventInfo
.setEventType(matcher2
.group(2).trim());
1181 eventInfo
.setState(matcher2
.group(3));
1182 String filter
= matcher2
.group(4);
1183 if (filter
!= null) {
1184 filter
= filter
.substring(1, filter
.length() - 1); // remove '[' and ']'
1185 eventInfo
.setFilterExpression(filter
);
1188 if (eventInfo
.getEventType() == TraceEventType
.PROBE
) {
1189 IProbeEventInfo probeEvent
= new ProbeEventInfo(eventInfo
.getName());
1190 probeEvent
.setLogLevel(eventInfo
.getLogLevel());
1191 probeEvent
.setEventType(eventInfo
.getEventType());
1192 probeEvent
.setState(eventInfo
.getState());
1194 // Overwrite eventinfo
1195 eventInfo
= probeEvent
;
1197 // myevent2 (type: probe) [enabled]
1199 // myevent0 (type: probe) [enabled]
1201 // symbol: init_post
1203 while (index
< output
.length
) {
1204 String probeLine
= output
[index
];
1206 Matcher addrMatcher
= LTTngControlServiceConstants
.PROBE_ADDRESS_PATTERN
.matcher(probeLine
);
1207 Matcher offsetMatcher
= LTTngControlServiceConstants
.PROBE_OFFSET_PATTERN
.matcher(probeLine
);
1208 Matcher symbolMatcher
= LTTngControlServiceConstants
.PROBE_SYMBOL_PATTERN
.matcher(probeLine
);
1209 if (addrMatcher
.matches()) {
1210 String addr
= addrMatcher
.group(2).trim();
1211 probeEvent
.setAddress(addr
);
1212 } else if (offsetMatcher
.matches()) {
1213 String offset
= offsetMatcher
.group(2).trim();
1214 probeEvent
.setOffset(offset
);
1215 } else if (symbolMatcher
.matches()) {
1216 String symbol
= symbolMatcher
.group(2).trim();
1217 probeEvent
.setSymbol(symbol
);
1218 } else if ((LTTngControlServiceConstants
.EVENT_PATTERN
.matcher(probeLine
).matches()) || (LTTngControlServiceConstants
.WILDCARD_EVENT_PATTERN
.matcher(probeLine
).matches())) {
1220 } else if (LTTngControlServiceConstants
.CHANNEL_PATTERN
.matcher(probeLine
).matches()) {
1222 } else if (LTTngControlServiceConstants
.DOMAIN_KERNEL_PATTERN
.matcher(probeLine
).matches()) {
1225 } else if (LTTngControlServiceConstants
.DOMAIN_UST_GLOBAL_PATTERN
.matcher(probeLine
).matches()) {
1231 events
.add(eventInfo
);
1233 events
.add(eventInfo
);
1240 // else if (line.matches(EVENT_NONE_PATTERN)) {
1250 * Parses a line with attributes: <attribute Name>: <attribute value>
1253 * - attribute line to parse
1254 * @return the attribute value as string
1256 protected String
getAttributeValue(String line
) {
1257 String
[] temp
= line
.split("\\: "); //$NON-NLS-1$
1262 * Parses the event information within a provider.
1265 * - a command output array
1266 * @param currentIndex
1267 * - current index in command output array
1269 * - list for returning event information
1270 * @return the new current index in command output array
1272 protected int getProviderEventInfo(String
[] output
, int currentIndex
, List
<IBaseEventInfo
> events
) {
1273 int index
= currentIndex
;
1274 IBaseEventInfo eventInfo
= null;
1275 while (index
< output
.length
) {
1276 String line
= output
[index
];
1277 Matcher matcher
= LTTngControlServiceConstants
.PROVIDER_EVENT_PATTERN
.matcher(line
);
1278 if (matcher
.matches()) {
1279 // sched_kthread_stop (loglevel: TRACE_EMERG0) (type: tracepoint)
1280 eventInfo
= new BaseEventInfo(matcher
.group(1).trim());
1281 eventInfo
.setLogLevel(matcher
.group(2).trim());
1282 eventInfo
.setEventType(matcher
.group(3).trim());
1283 events
.add(eventInfo
);
1285 } else if (LTTngControlServiceConstants
.EVENT_FIELD_PATTERN
.matcher(line
).matches()) {
1286 if (eventInfo
!= null) {
1287 List
<IFieldInfo
> fields
= new ArrayList
<IFieldInfo
>();
1288 index
= getFieldInfo(output
, index
, fields
);
1289 eventInfo
.setFields(fields
);
1294 else if (LTTngControlServiceConstants
.UST_PROVIDER_PATTERN
.matcher(line
).matches()) {
1305 * Parse a field's information.
1308 * A command output array
1309 * @param currentIndex
1310 * The current index in the command output array
1312 * List for returning the field information
1313 * @return The new current index in the command output array
1315 protected int getFieldInfo(String
[] output
, int currentIndex
, List
<IFieldInfo
> fields
) {
1316 int index
= currentIndex
;
1317 IFieldInfo fieldInfo
= null;
1318 while (index
< output
.length
) {
1319 String line
= output
[index
];
1320 Matcher matcher
= LTTngControlServiceConstants
.EVENT_FIELD_PATTERN
.matcher(line
);
1321 if (matcher
.matches()) {
1322 // field: content (string)
1323 fieldInfo
= new FieldInfo(matcher
.group(2).trim());
1324 fieldInfo
.setFieldType(matcher
.group(3).trim());
1325 fields
.add(fieldInfo
);
1326 } else if (LTTngControlServiceConstants
.PROVIDER_EVENT_PATTERN
.matcher(line
).matches()) {
1328 } else if (LTTngControlServiceConstants
.UST_PROVIDER_PATTERN
.matcher(line
).matches()) {
1337 * Formats a command parameter for the command execution i.e. adds quotes
1338 * at the beginning and end if necessary.
1339 * @param parameter - parameter to format
1340 * @return formated parameter
1342 protected String
formatParameter(String parameter
) {
1343 if (parameter
!= null) {
1344 StringBuffer newString
= new StringBuffer();
1345 newString
.append(parameter
);
1347 if (parameter
.contains(" ") || parameter
.contains("*")) { //$NON-NLS-1$ //$NON-NLS-2$
1348 newString
.insert(0, "\""); //$NON-NLS-1$
1349 newString
.append("\""); //$NON-NLS-1$
1351 return newString
.toString();
1357 * @param strings array of string that makes up a command line
1358 * @return string buffer with created command line
1360 protected StringBuffer
createCommand(String
... strings
) {
1361 StringBuffer command
= new StringBuffer();
1362 command
.append(LTTngControlServiceConstants
.CONTROL_COMMAND
);
1363 command
.append(getTracingGroupOption());
1364 command
.append(getVerboseOption());
1365 for (String string
: strings
) {
1366 command
.append(string
);
1372 * @return the tracing group option if configured in the preferences
1374 protected String
getTracingGroupOption() {
1375 if (!ControlPreferences
.getInstance().isDefaultTracingGroup() && !ControlPreferences
.getInstance().getTracingGroup().equals("")) { //$NON-NLS-1$
1376 return LTTngControlServiceConstants
.OPTION_TRACING_GROUP
+ ControlPreferences
.getInstance().getTracingGroup();
1378 return ""; //$NON-NLS-1$
1382 * @return the verbose option as configured in the preferences
1384 protected String
getVerboseOption() {
1385 if (ControlPreferences
.getInstance().isLoggingEnabled()) {
1386 String level
= ControlPreferences
.getInstance().getVerboseLevel();
1387 if (ControlPreferences
.TRACE_CONTROL_VERBOSE_LEVEL_VERBOSE
.equals(level
)) {
1388 return LTTngControlServiceConstants
.OPTION_VERBOSE
;
1390 if (ControlPreferences
.TRACE_CONTROL_VERBOSE_LEVEL_V_VERBOSE
.equals(level
)) {
1391 return LTTngControlServiceConstants
.OPTION_VERY_VERBOSE
;
1393 if (ControlPreferences
.TRACE_CONTROL_VERBOSE_LEVEL_V_V_VERBOSE
.equals(level
)) {
1394 return LTTngControlServiceConstants
.OPTION_VERY_VERY_VERBOSE
;
1397 return ""; //$NON-NLS-1$
1401 * Method that logs the command and command result if logging is enabled as
1402 * well as forwards the command execution to the shell.
1405 * - the command to execute
1407 * - a progress monitor
1408 * @return the command result
1409 * @throws ExecutionException
1410 * If the command fails
1412 protected ICommandResult
executeCommand(String command
,
1413 IProgressMonitor monitor
) throws ExecutionException
{
1414 return executeCommand(command
, monitor
, true);
1418 * Method that logs the command and command result if logging is enabled as
1419 * well as forwards the command execution to the shell.
1422 * - the command to execute
1424 * - a progress monitor
1425 * @param checkForError
1426 * - true to verify command result, else false
1427 * @return the command result
1428 * @throws ExecutionException
1429 * in case of error result
1431 protected ICommandResult
executeCommand(String command
,
1432 IProgressMonitor monitor
, boolean checkForError
)
1433 throws ExecutionException
{
1434 if (ControlPreferences
.getInstance().isLoggingEnabled()) {
1435 ControlCommandLogger
.log(command
);
1438 ICommandResult result
= fCommandShell
.executeCommand(
1439 command
.toString(), monitor
);
1441 if (ControlPreferences
.getInstance().isLoggingEnabled()) {
1442 ControlCommandLogger
.log(formatOutput(result
));
1445 if (checkForError
&& isError(result
)) {
1446 throw new ExecutionException(Messages
.TraceControl_CommandError
1447 + " " + command
.toString() + "\n" + formatOutput(result
)); //$NON-NLS-1$ //$NON-NLS-2$