tmf: lttngControl: mi: support of domain, channel and event listing
authorJonathan Rajotte Julien <jonathan.rajotte-julien@ericsson.com>
Tue, 5 Aug 2014 20:58:44 +0000 (16:58 -0400)
committerBernd Hufmann <bernd.hufmann@ericsson.com>
Wed, 27 Aug 2014 15:33:36 +0000 (11:33 -0400)
Change-Id: Ia99caf1588c63160e7212d7efb7a61536bec617e
Signed-off-by: Jonathan Rajotte Julien <jonathan.rajotte-julien@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/31069
Tested-by: Hudson CI
Reviewed-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
Tested-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
org.eclipse.linuxtools.lttng2.control.ui/src/org/eclipse/linuxtools/internal/lttng2/control/ui/views/messages/Messages.java
org.eclipse.linuxtools.lttng2.control.ui/src/org/eclipse/linuxtools/internal/lttng2/control/ui/views/messages/messages.properties
org.eclipse.linuxtools.lttng2.control.ui/src/org/eclipse/linuxtools/internal/lttng2/control/ui/views/service/LTTngControlServiceConstants.java
org.eclipse.linuxtools.lttng2.control.ui/src/org/eclipse/linuxtools/internal/lttng2/control/ui/views/service/LTTngControlServiceMI.java

index 512fafe485938fd7dd298f89db1637412bc41107..1b2a06513e24d24d8f9904cfcd3bdb1fcba88334 100644 (file)
@@ -262,6 +262,7 @@ public final class Messages extends NLS {
     public static String TraceControl_KernelDomainDisplayName;
     public static String TraceControl_UstDisplayName;
     public static String TraceControl_UstGlobalDomainDisplayName;
+    public static String TraceControl_UnknownDomainDisplayName;
     public static String TraceControl_JULDomainDisplayName;
     public static String TraceControl_AllSessionsDisplayName;
     public static String TraceControl_SessionDisplayName;
index 41617a882a2d415466eb81d4c1f47912493f06dc..a82547ebe74be0eca331675d8e4cd58432b38dc6 100644 (file)
@@ -251,6 +251,7 @@ TraceControl_KernelDomainDisplayName=Kernel
 TraceControl_JULDomainDisplayName=JUL
 TraceControl_UstGlobalDomainDisplayName=UST global
 TraceControl_UstDisplayName=UST
+TraceControl_UnknownDomainDisplayName=Unknown domain
 TraceControl_AllSessionsDisplayName=Sessions
 TraceControl_SessionDisplayName=Session
 TraceControl_DomainDisplayName=Domain
index 44e9b0eab0f83c6fb6c44e7599a796da09a65024..f4b6d10d7873e6403ddf42cf1d87db5f6a518371 100644 (file)
@@ -379,6 +379,10 @@ public interface LTTngControlServiceConstants {
      * Pattern to match indicating false for overwrite mode
      */
     static final String OVERWRITE_MODE_ATTRIBUTE_FALSE = "0"; //$NON-NLS-1$
+    /**
+     * Pattern to match indicating false for overwrite mode in machine interface mode
+     */
+    static final String OVERWRITE_MODE_ATTRIBUTE_FALSE_MI = "DISCARD"; //$NON-NLS-1$
     /**
      * Pattern to match for channel (sub-buffer size) information (lttng list <session>)
      */
index 2c1304637de30ed6c570802c3a0a2f3401424ff9..2ab11b6f92dd43c06f0d1711a317c8103d9acfb7 100644 (file)
@@ -28,14 +28,24 @@ import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.IBaseEventInfo;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.IChannelInfo;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.IDomainInfo;
+import org.eclipse.linuxtools.internal.lttng2.control.core.model.IEventInfo;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.IFieldInfo;
+import org.eclipse.linuxtools.internal.lttng2.control.core.model.IProbeEventInfo;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.ISessionInfo;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.ISnapshotInfo;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.IUstProviderInfo;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.LogLevelType;
+import org.eclipse.linuxtools.internal.lttng2.control.core.model.TraceDomainType;
+import org.eclipse.linuxtools.internal.lttng2.control.core.model.TraceEnablement;
+import org.eclipse.linuxtools.internal.lttng2.control.core.model.TraceEventType;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.TraceLogLevel;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.impl.BaseEventInfo;
+import org.eclipse.linuxtools.internal.lttng2.control.core.model.impl.BufferType;
+import org.eclipse.linuxtools.internal.lttng2.control.core.model.impl.ChannelInfo;
+import org.eclipse.linuxtools.internal.lttng2.control.core.model.impl.DomainInfo;
+import org.eclipse.linuxtools.internal.lttng2.control.core.model.impl.EventInfo;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.impl.FieldInfo;
+import org.eclipse.linuxtools.internal.lttng2.control.core.model.impl.ProbeEventInfo;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.impl.SessionInfo;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.impl.SnapshotInfo;
 import org.eclipse.linuxtools.internal.lttng2.control.core.model.impl.UstProviderInfo;
@@ -272,13 +282,151 @@ public class LTTngControlServiceMI extends LTTngControlService {
     }
 
     /**
-     * @param domain
+     * Parse a raw domain XML node to a IDomainInfo object
+     *
+     * @param rawDomain
      *            a domain xml node
-     * @return {@link IDomainInfo}
+     * @return a populated {@link DomainInfo} object
+     * @throws ExecutionException
+     *             when missing required xml element (type)
      */
-    protected IDomainInfo parseDomain(Node domain) {
-        // TODO JRJ - STUB
-        return null;
+    protected IDomainInfo parseDomain(Node rawDomain) throws ExecutionException {
+        IDomainInfo domain = null;
+        // Get the type
+        Node rawType = getFirstOf(rawDomain.getChildNodes(), MIStrings.TYPE);
+        if (rawType == null) {
+            throw new ExecutionException(Messages.TraceControl_MiMissingRequiredError);
+        }
+        String rawTypeString = rawType.getTextContent().toLowerCase();
+        TraceDomainType domainType = TraceDomainType.valueOfString(rawTypeString);
+        switch (domainType) {
+        case KERNEL:
+            domain = new DomainInfo(Messages.TraceControl_KernelProviderDisplayName);
+            domain.setIsKernel(true);
+            break;
+        case UST:
+            domain = new DomainInfo(Messages.TraceControl_UstGlobalDomainDisplayName);
+            domain.setIsKernel(false);
+            break;
+        case JUL:
+            /**
+             * TODO: Support for JUL JUL substructure and semantic is not the
+             * same as a regular UST or Kernel Domain There is no channel under
+             * JUL domain only events. The channel is activated in UST Channel
+             */
+            domain = new DomainInfo(Messages.TraceControl_JULDomainDisplayName);
+            domain.setIsKernel(false);
+            break;
+        case UNKNOWN:
+            domain = new DomainInfo(Messages.TraceControl_UnknownDomainDisplayName);
+            domain.setIsKernel(false);
+            break;
+        default:
+            throw new ExecutionException(Messages.TraceControl_MiInvalidElementError);
+        }
+
+        NodeList rawInfos = rawDomain.getChildNodes();
+        for (int i = 0; i < rawInfos.getLength(); i++) {
+            Node rawInfo = rawInfos.item(i);
+            switch (rawInfo.getNodeName()) {
+            case MIStrings.BUFFER_TYPE:
+                BufferType bufferType = BufferType.valueOfString(rawInfo.getTextContent());
+                domain.setBufferType(bufferType);
+                break;
+            case MIStrings.CHANNELS:
+                ArrayList<IChannelInfo> channels = new ArrayList<>();
+                parseChannels(rawInfo.getChildNodes(), channels);
+                if (channels.size() > 0) {
+                    domain.setChannels(channels);
+                }
+                break;
+            default:
+                break;
+            }
+        }
+
+        return domain;
+    }
+
+    /**
+     * Parse a list of raw channel XML node into an ArrayList of IChannelInfo
+     *
+     * @param rawChannes
+     *            List of raw channel XML node
+     * @param channels
+     *            the parsed channels list
+     * @throws ExecutionException
+     *             when missing required xml element (type)
+     */
+    private static void parseChannels(NodeList rawChannels, ArrayList<IChannelInfo> channels) throws ExecutionException {
+        IChannelInfo channel = null;
+        for (int i = 0; i < rawChannels.getLength(); i++) {
+            Node rawChannel = rawChannels.item(i);
+            if (rawChannel.getNodeName().equalsIgnoreCase(MIStrings.CHANNEL)) {
+                channel = new ChannelInfo(""); //$NON-NLS-1$
+
+                // Populate the channel
+                NodeList rawInfos = rawChannel.getChildNodes();
+                Node rawInfo = null;
+                for (int j = 0; j < rawInfos.getLength(); j++) {
+                    rawInfo = rawInfos.item(j);
+                    switch (rawInfo.getNodeName()) {
+                    case MIStrings.NAME:
+                        channel.setName(rawInfo.getTextContent());
+                        break;
+                    case MIStrings.ENABLED:
+                        channel.setState(TraceEnablement.valueOfString(rawInfo.getTextContent()));
+                        break;
+                    case MIStrings.EVENTS:
+                        List<IEventInfo> events = new ArrayList<>();
+                        getEventInfo(rawInfo.getChildNodes(), events);
+                        channel.setEvents(events);
+                        break;
+                    case MIStrings.ATTRIBUTES:
+                        NodeList rawAttributes = rawInfo.getChildNodes();
+                        for (int k = 0; k < rawAttributes.getLength(); k++) {
+                            Node attribute = rawAttributes.item(k);
+                            switch (attribute.getNodeName()) {
+                            case MIStrings.OVERWRITE_MODE:
+                                channel.setOverwriteMode(!LTTngControlServiceConstants.OVERWRITE_MODE_ATTRIBUTE_FALSE_MI.equalsIgnoreCase(attribute.getTextContent()));
+                                break;
+                            case MIStrings.SUBBUF_SIZE:
+                                channel.setSubBufferSize(Long.valueOf(attribute.getTextContent()));
+                                break;
+                            case MIStrings.NUM_SUBBUF:
+                                channel.setNumberOfSubBuffers(Integer.valueOf(attribute.getTextContent()));
+                                break;
+                            case MIStrings.SWITCH_TIMER_INTERVAL:
+                                channel.setSwitchTimer(Long.valueOf(attribute.getTextContent()));
+                                break;
+                            case MIStrings.READ_TIMER_INTERVAL:
+                                channel.setReadTimer(Long.valueOf(attribute.getTextContent()));
+                                break;
+                            case MIStrings.OUTPUT_TYPE:
+                                channel.setOutputType(attribute.getTextContent());
+                                break;
+                            case MIStrings.TRACEFILE_SIZE:
+                                channel.setMaxSizeTraceFiles(Integer.parseInt(attribute.getTextContent()));
+                                break;
+                            case MIStrings.TRACEFILE_COUNT:
+                                channel.setMaxNumberTraceFiles(Integer.parseInt(attribute.getTextContent()));
+                                break;
+                            case MIStrings.LIVE_TIMER_INTERVAL:
+                                // TODO: currently not supported by tmf
+                                break;
+                            default:
+                                break;
+                            }
+                        }
+                        break;
+                    default:
+                        break;
+                    }
+                }
+                channels.add(channel);
+            }
+        }
+
     }
 
     @Override
@@ -299,7 +447,7 @@ public class LTTngControlServiceMI extends LTTngControlService {
 
         Document document = getDocumentFromStrings(result.getOutput());
         NodeList rawEvents = document.getElementsByTagName(MIStrings.EVENT);
-        parseXmlEvents(rawEvents, events);
+        getBaseEventInfo(rawEvents, events);
         return events;
     }
 
@@ -341,7 +489,7 @@ public class LTTngControlServiceMI extends LTTngControlService {
                 case MIStrings.EVENTS:
                     List<IBaseEventInfo> events = new ArrayList<>();
                     NodeList rawEvents = info.getChildNodes();
-                    parseXmlEvents(rawEvents, events);
+                    getBaseEventInfo(rawEvents, events);
                     providerInfo.setEvents(events);
                     break;
                 default:
@@ -467,20 +615,20 @@ public class LTTngControlServiceMI extends LTTngControlService {
     }
 
     /**
-     * @param xmlEvents
-     *            a Node list of xml event element
+     * @param xmlBaseEvents
+     *            a Node list of base xml event element
      * @param events
      *            list of event generated by the parsing of the xml event
      *            element
      * @throws ExecutionException
      *             when a raw event is not a complete/valid xml event
      */
-    protected void parseXmlEvents(NodeList xmlEvents, List<IBaseEventInfo> events) throws ExecutionException {
+    private static void getBaseEventInfo(NodeList xmlBaseEvents, List<IBaseEventInfo> events) throws ExecutionException {
         IBaseEventInfo eventInfo = null;
-        for (int i = 0; i < xmlEvents.getLength(); i++) {
-            NodeList rawInfos = xmlEvents.item(i).getChildNodes();
+        for (int i = 0; i < xmlBaseEvents.getLength(); i++) {
+            NodeList rawInfos = xmlBaseEvents.item(i).getChildNodes();
             // Search for name
-            if (xmlEvents.item(i).getNodeName().equalsIgnoreCase(MIStrings.EVENT)) {
+            if (xmlBaseEvents.item(i).getNodeName().equalsIgnoreCase(MIStrings.EVENT)) {
                 Node rawName = getFirstOf(rawInfos, MIStrings.NAME);
                 if (rawName == null) {
                     throw new ExecutionException(Messages.TraceControl_MiMissingRequiredError);
@@ -511,6 +659,122 @@ public class LTTngControlServiceMI extends LTTngControlService {
         }
     }
 
+    /**
+     * @param xmlBaseEvents
+     *            a Node list of xml event element linked to a session
+     * @param events
+     *            list of event generated by the parsing of the xml event
+     *            element
+     * @throws ExecutionException
+     *             when a raw event is not a complete/valid xml event
+     */
+    static void getEventInfo(NodeList xmlEvents, List<IEventInfo> events) throws ExecutionException {
+        IEventInfo eventInfo = null;
+        for (int i = 0; i < xmlEvents.getLength(); i++) {
+            NodeList rawInfos = xmlEvents.item(i).getChildNodes();
+            // Search for name
+            if (xmlEvents.item(i).getNodeName().equalsIgnoreCase(MIStrings.EVENT)) {
+                Node rawName = getFirstOf(rawInfos, MIStrings.NAME);
+                if (rawName == null) {
+                    throw new ExecutionException(Messages.TraceControl_MiMissingRequiredError);
+                }
+
+                eventInfo = new EventInfo(rawName.getTextContent());
+
+                // Basic information
+                for (int j = 0; j < rawInfos.getLength(); j++) {
+                    Node infoNode = rawInfos.item(j);
+                    switch (infoNode.getNodeName()) {
+                    case MIStrings.TYPE:
+                        eventInfo.setEventType(infoNode.getTextContent());
+                        break;
+                    case MIStrings.LOGLEVEL_TYPE:
+                        eventInfo.setLogLevelType(LogLevelType.valueOfString(infoNode.getTextContent()));
+                        break;
+                    case MIStrings.LOGLEVEL:
+                        eventInfo.setLogLevel(TraceLogLevel.valueOfString(infoNode.getTextContent()));
+                        break;
+                    case MIStrings.ENABLED:
+                        eventInfo.setState(TraceEnablement.valueOfString(infoNode.getTextContent()));
+                        break;
+                    case MIStrings.FILTER:
+                        // TODO
+                        // See bug 334 http://bugs.lttng.org/issues/334 from
+                        // LTTng
+                        // For now we emulate the a behavior, and simply put
+                        // "with filter"
+                        eventInfo.setFilterExpression("with filter"); //$NON-NLS-1$
+                        break;
+                    case MIStrings.EXCLUSION:
+                        // TODO:Currently not supported by tmf
+                        // ExclusionS element is ignored
+                        break;
+                    default:
+                        break;
+                    }
+                }
+
+                boolean isProbeFunction = (eventInfo.getEventType().equals(TraceEventType.PROBE)) || (eventInfo.getEventType().equals(TraceEventType.FUNCTION));
+                if (isProbeFunction) {
+                    IProbeEventInfo probeEvent = new ProbeEventInfo(eventInfo);
+                    eventInfo = probeEvent;
+                    // get attributes
+                    Node rawAttributes = getFirstOf(rawInfos, MIStrings.ATTRIBUTES);
+                    if (rawAttributes == null) {
+                        throw new ExecutionException(Messages.TraceControl_MiMissingRequiredError);
+                    }
+
+                    Node rawDataNode = null;
+                    switch (probeEvent.getEventType()) {
+                    case PROBE:
+                        rawDataNode = getFirstOf(rawAttributes.getChildNodes(), MIStrings.PROBE_ATTRIBUTES);
+                        break;
+                    case FUNCTION:
+                        rawDataNode = getFirstOf(rawAttributes.getChildNodes(), MIStrings.FUNCTION_ATTRIBUTES);
+                        break;
+                    case SYSCALL:
+                    case TRACEPOINT:
+                    case UNKNOWN:
+                    default:
+                        throw new ExecutionException(Messages.TraceControl_MiInvalidElementError);
+                    }
+
+                    if (rawDataNode == null) {
+                        throw new ExecutionException(Messages.TraceControl_MiInvalidElementError);
+                    }
+
+                    // Extract info
+                    NodeList rawDatas = rawDataNode.getChildNodes();
+                    for (int j = 0; j < rawDatas.getLength(); j++) {
+                        Node rawData = rawDatas.item(j);
+                        switch (rawData.getNodeName()) {
+                        case MIStrings.SYMBOL_NAME:
+                            probeEvent.setSymbol(rawData.getTextContent());
+                            break;
+                        case MIStrings.ADDRESS:
+                            probeEvent.setAddress(rawData.getTextContent());
+                            break;
+                        case MIStrings.OFFSET:
+                            probeEvent.setOffset(rawData.getTextContent());
+                            break;
+                        default:
+                            break;
+                        }
+                    }
+                }
+
+                // Syscalls does not have name.
+                // Let put one to make sure this is user friendly via UI
+                if (eventInfo.getEventType().equals(TraceEventType.SYSCALL)) {
+                    eventInfo.setName(TraceEventType.SYSCALL.getInName());
+                }
+
+                // Add the event
+                events.add(eventInfo);
+            }
+        }
+    }
+
     /**
      * @param fieldsList
      *            a list of xml event_field element
This page took 0.031067 seconds and 5 git commands to generate.