lttng.control: Adding support for the LOG4J domain in the Control view
authorBruno Roy <bruno.roy@ericsson.com>
Wed, 20 Jul 2016 18:49:59 +0000 (14:49 -0400)
committerBernd Hufmann <bernd.hufmann@ericsson.com>
Thu, 4 Aug 2016 19:00:32 +0000 (15:00 -0400)
Adding the controls for the org.apache.log4j (LOG4J) loggers in the
Control view. Also implemented the visualization of those loggers in the
Control view.

Change-Id: Ia73bab1279ea4cc72527e8bee96d16d39aab9745
Signed-off-by: Bruno Roy <bruno.roy@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/77796
Reviewed-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
Tested-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
Reviewed-by: Hudson CI
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
29 files changed:
lttng/org.eclipse.tracecompass.lttng2.control.core/src/org/eclipse/tracecompass/internal/lttng2/control/core/model/IBaseLoggerInfo.java
lttng/org.eclipse.tracecompass.lttng2.control.core/src/org/eclipse/tracecompass/internal/lttng2/control/core/model/TraceLog4jLogLevel.java [new file with mode: 0644]
lttng/org.eclipse.tracecompass.lttng2.control.core/src/org/eclipse/tracecompass/internal/lttng2/control/core/model/impl/BaseLoggerInfo.java
lttng/org.eclipse.tracecompass.lttng2.control.ui.swtbot.tests/testfiles/CreateSessionTestLTTng2_8.cfg
lttng/org.eclipse.tracecompass.lttng2.control.ui.swtbot.tests/testfiles/Profile.cfg
lttng/org.eclipse.tracecompass.lttng2.control.ui.tests/testfiles/CreateSessionTestMi.cfg
lttng/org.eclipse.tracecompass.lttng2.control.ui.tests/testfiles/LTTngServiceMi3Test.cfg
lttng/org.eclipse.tracecompass.lttng2.control.ui.tests/testfiles/LTTngServiceMiTest.cfg
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/dialogs/EnableEventsDialog.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/dialogs/EnableLoggersComposite.java [new file with mode: 0644]
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/dialogs/EnableUstEventsComposite.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/dialogs/GetLoggerInfoDialog.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/dialogs/IGetLoggerInfoDialog.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/handlers/AssignLoggerHandler.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/handlers/BaseEnableEventHandler.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/handlers/ChangeLoggerStateHandler.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/handlers/DisableLoggerHandler.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/handlers/EnableChannelOnDomainHandler.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/handlers/EnableLoggerHandler.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/messages/Messages.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/messages/messages.properties
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/model/impl/BaseLoggerComponent.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/model/impl/TraceDomainComponent.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/model/impl/TraceLoggerComponent.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/property/BaseLoggerPropertySource.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/property/TraceLoggerPropertySource.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/service/LTTngControlService.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/service/LTTngControlServiceConstants.java
lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/service/LTTngControlServiceMI.java

index 688f4e9a8c3516fab2f1cf1949be9f4c88bcd334..48658f1d405bfdf1c3b7d88733134cbbd3483f9c 100644 (file)
@@ -21,7 +21,7 @@ public interface IBaseLoggerInfo extends ITraceInfo {
     /**
      * @return the trace logger log level
      */
-    TraceJulLogLevel getLogLevel();
+    ITraceLogLevel getLogLevel();
 
     /**
      * Sets the trace logger log level to the given level
@@ -29,7 +29,7 @@ public interface IBaseLoggerInfo extends ITraceInfo {
      * @param level
      *            logger log level to set
      */
-    void setLogLevel(TraceJulLogLevel level);
+    void setLogLevel(ITraceLogLevel level);
 
     /**
      * Sets the trace logger log level to the level specified by the given name.
diff --git a/lttng/org.eclipse.tracecompass.lttng2.control.core/src/org/eclipse/tracecompass/internal/lttng2/control/core/model/TraceLog4jLogLevel.java b/lttng/org.eclipse.tracecompass.lttng2.control.core/src/org/eclipse/tracecompass/internal/lttng2/control/core/model/TraceLog4jLogLevel.java
new file mode 100644 (file)
index 0000000..52df865
--- /dev/null
@@ -0,0 +1,98 @@
+/**********************************************************************
+ * Copyright (c) 2016 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:
+ *   Bruno Roy - Initial API and implementation
+ *********************************************************************/
+package org.eclipse.tracecompass.internal.lttng2.control.core.model;
+
+/**
+ * Log Level for Log4j enumeration.
+ *
+ * @author Bruno Roy
+ */
+@SuppressWarnings("nls")
+public enum TraceLog4jLogLevel implements ITraceLogLevel{
+
+    // ------------------------------------------------------------------------
+    // Enum definition
+    // ------------------------------------------------------------------------
+    /** Log level off */
+    LOG4J_OFF("Off"),
+    /** Log level fatal */
+    LOG4J_FATAL("Fatal"),
+    /** Log level error */
+    LOG4J_ERROR("Error"),
+    /** Log level warn */
+    LOG4J_WARN("Warn"),
+    /** Log level info */
+    LOG4J_INFO("Info"),
+    /** Log level debug */
+    LOG4J_DEBUG("Debug"),
+    /** Log level trace */
+    LOG4J_TRACE("Trace"),
+    /** Log level all */
+    LOG4J_ALL("All"),
+    /** Log level unknown */
+    LEVEL_UNKNOWN("LEVEL_UNKNOWN");
+
+
+    // ------------------------------------------------------------------------
+    // Attributes
+    // ------------------------------------------------------------------------
+    /**
+     * Name of enum.
+     */
+    private final String fInName;
+
+    // ------------------------------------------------------------------------
+    // Constuctors
+    // ------------------------------------------------------------------------
+
+    /**
+     * Private constructor
+     *
+     * @param name
+     *            the name of state
+     */
+    private TraceLog4jLogLevel(String name) {
+        fInName = name;
+    }
+
+    // ------------------------------------------------------------------------
+    // Accessors
+    // ------------------------------------------------------------------------
+
+    @Override
+    public String getInName() {
+        return fInName;
+    }
+
+    // ------------------------------------------------------------------------
+    // Utility
+    // ------------------------------------------------------------------------
+    /**
+     * Return the corresponding {@link TraceLog4jLogLevel} to String "name"
+     *
+     * @param name
+     *            String to compare to retrieve the good {@link TraceLog4jLogLevel}
+     * @return the corresponding {@link TraceLog4jLogLevel}
+     */
+    public static TraceLog4jLogLevel valueOfString(String name) {
+        if (name == null) {
+            throw new IllegalArgumentException();
+        }
+        for (TraceLog4jLogLevel tllevel : TraceLog4jLogLevel.values()) {
+            if (tllevel.name().equals(name)) {
+                return tllevel;
+            }
+        }
+        // No match
+        return LEVEL_UNKNOWN;
+    }
+}
index 25b4d25c2d810b8681fe5280286b9d8e50a4ec79..da456ae6dc8bf2cf78c682d593a801001b267ff1 100644 (file)
@@ -12,6 +12,7 @@
 package org.eclipse.tracecompass.internal.lttng2.control.core.model.impl;
 
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.IBaseLoggerInfo;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceJulLogLevel;
 
@@ -29,7 +30,7 @@ public class BaseLoggerInfo extends TraceInfo implements IBaseLoggerInfo {
     /**
      * The trace log level.
      */
-    private TraceJulLogLevel fLogLevel = TraceJulLogLevel.LEVEL_UNKNOWN;
+    private ITraceLogLevel fLogLevel = TraceJulLogLevel.LEVEL_UNKNOWN;
     /**
      * The logger domain.
      */
@@ -65,12 +66,12 @@ public class BaseLoggerInfo extends TraceInfo implements IBaseLoggerInfo {
     // ------------------------------------------------------------------------
 
     @Override
-    public TraceJulLogLevel getLogLevel() {
+    public ITraceLogLevel getLogLevel() {
         return fLogLevel;
     }
 
     @Override
-    public void setLogLevel(TraceJulLogLevel level) {
+    public void setLogLevel(ITraceLogLevel level) {
         fLogLevel = level;
     }
 
@@ -132,5 +133,4 @@ public class BaseLoggerInfo extends TraceInfo implements IBaseLoggerInfo {
     public void setDomain(TraceDomainType domain) {
         fDomain = domain;
     }
-
 }
index c796f16ae3936764119ac1d96d63495c4f7e6c66..61dd7039937b15bf08ae1d397aa4e4cc4e47d7b3 100644 (file)
@@ -51,6 +51,16 @@ lttng --mi xml list -j
 <command xmlns="http://lttng.org/xml/ns/lttng-mi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://lttng.org/xml/ns/lttng-mi http://lttng.org/xml/schemas/lttng-mi/3/lttng-mi-3.0.xsd" schemaVersion="3.0"><name>list</name><output><domains><domain><type>JUL</type><buffer_type>PER_PID</buffer_type><pids><pid><id>18275</id><name>java</name><events><event><name>anotherLogger</name><type>TRACEPOINT</type><enabled>true</enabled><loglevel>UNKNOWN</loglevel><loglevel_type>ALL</loglevel_type></event><event><name>logger</name><type>TRACEPOINT</type><enabled>true</enabled><loglevel>UNKNOWN</loglevel><loglevel_type>ALL</loglevel_type></event><event><name>global</name><type>TRACEPOINT</type><enabled>true</enabled><loglevel>UNKNOWN</loglevel><loglevel_type>ALL</loglevel_type></event></events></pid></pids></domain></domains></output></command>
 </COMMAND_OUTPUT>
 <COMMAND_INPUT>
+lttng --mi xml list -l
+</COMMAND_INPUT>
+<COMMAND_RESULT>
+0
+</COMMAND_RESULT>
+<COMMAND_OUTPUT>
+<?xml version="1.0" encoding="UTF-8"?>
+<command xmlns="http://lttng.org/xml/ns/lttng-mi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://lttng.org/xml/ns/lttng-mi http://lttng.org/xml/schemas/lttng-mi/3/lttng-mi-3.0.xsd" schemaVersion="3.0"><name>list</name><output><domains><domain><type>LOG4J</type><buffer_type>PER_PID</buffer_type><pids><pid><id>5600</id><name>java</name><events><event><name>Test</name><type>TRACEPOINT</type><enabled>true</enabled><loglevel>UNKNOWN</loglevel><loglevel_type>ALL</loglevel_type><exclusions/></event></events></pid></pids></domain></domains></output></command>
+</COMMAND_OUTPUT>
+<COMMAND_INPUT>
 lttng --mi xml list
 </COMMAND_INPUT>
 <COMMAND_RESULT>
index 9509a2eb0c41b8f139a018ff752f3da32c376fca..a5e38c74989b9350fb8420de354d6c1eb9166c34 100644 (file)
@@ -51,6 +51,16 @@ lttng --mi xml list -j
 <command><name>list</name><output><domains><domain><type>JUL</type><buffer_type>PER_PID</buffer_type><pids><pid><id>18275</id><name>java</name><events><event><name>anotherLogger</name><type>TRACEPOINT</type><enabled>true</enabled><loglevel>UNKNOWN</loglevel><loglevel_type>ALL</loglevel_type></event><event><name>logger</name><type>TRACEPOINT</type><enabled>true</enabled><loglevel>UNKNOWN</loglevel><loglevel_type>ALL</loglevel_type></event><event><name>global</name><type>TRACEPOINT</type><enabled>true</enabled><loglevel>UNKNOWN</loglevel><loglevel_type>ALL</loglevel_type></event></events></pid></pids></domain></domains></output></command>
 </COMMAND_OUTPUT>
 <COMMAND_INPUT>
+lttng --mi xml list -l
+</COMMAND_INPUT>
+<COMMAND_RESULT>
+0
+</COMMAND_RESULT>
+<COMMAND_OUTPUT>
+<?xml version="1.0" encoding="UTF-8"?>
+<command><name>list</name><output><domains><domain><type>LOG4J</type><buffer_type>PER_PID</buffer_type><pids><pid><id>18332</id><name>java</name><events><event><name>Test</name><type>TRACEPOINT</type><enabled>true</enabled><filter>false</filter><loglevel>UNKNOWN</loglevel><loglevel_type>ALL</loglevel_type><exclusion>false</exclusion></event></events></pid></pids></domain></domains></output></command>
+</COMMAND_OUTPUT>
+<COMMAND_INPUT>
 lttng --mi xml list
 </COMMAND_INPUT>
 <COMMAND_RESULT>
@@ -142,6 +152,16 @@ lttng --mi xml list -j
 <command><name>list</name><output><domains><domain><type>JUL</type><buffer_type>PER_PID</buffer_type><pids><pid><id>18275</id><name>java</name><events><event><name>anotherLogger</name><type>TRACEPOINT</type><enabled>true</enabled><loglevel>UNKNOWN</loglevel><loglevel_type>ALL</loglevel_type></event><event><name>logger</name><type>TRACEPOINT</type><enabled>true</enabled><loglevel>UNKNOWN</loglevel><loglevel_type>ALL</loglevel_type></event><event><name>global</name><type>TRACEPOINT</type><enabled>true</enabled><loglevel>UNKNOWN</loglevel><loglevel_type>ALL</loglevel_type></event></events></pid></pids></domain></domains></output></command>
 </COMMAND_OUTPUT>
 <COMMAND_INPUT>
+lttng --mi xml list -l
+</COMMAND_INPUT>
+<COMMAND_RESULT>
+0
+</COMMAND_RESULT>
+<COMMAND_OUTPUT>
+<?xml version="1.0" encoding="UTF-8"?>
+<command><name>list</name><output><domains><domain><type>LOG4J</type><buffer_type>PER_PID</buffer_type><pids><pid><id>18332</id><name>java</name><events><event><name>Test</name><type>TRACEPOINT</type><enabled>true</enabled><filter>false</filter><loglevel>UNKNOWN</loglevel><loglevel_type>ALL</loglevel_type><exclusion>false</exclusion></event></events></pid></pids></domain></domains></output></command>
+</COMMAND_OUTPUT>
+<COMMAND_INPUT>
 lttng --mi xml list
 </COMMAND_INPUT>
 <COMMAND_RESULT>
index 07394e455861620c43e0df3edf67cfe72adb5cf5..418e1b43f39722e9cbf462718787777b57b64c27 100644 (file)
@@ -268,6 +268,43 @@ lttng --mi xml list -j
     </output>
 </command>
 </COMMAND_OUTPUT>
+<COMMAND_INPUT>
+lttng --mi xml list -l
+</COMMAND_INPUT>
+<COMMAND_RESULT>
+0
+</COMMAND_RESULT>
+<COMMAND_OUTPUT>
+<?xml version="1.0" encoding="UTF-8"?>
+<command>
+    <name>list</name>
+    <output>
+        <domains>
+            <domain>
+                <type>LOG4J</type>
+                <buffer_type>PER_PID</buffer_type>
+                <pids>
+                    <pid>
+                        <id>18332</id>
+                        <name>java</name>
+                        <events>
+                            <event>
+                                <name>Test</name>
+                                <type>TRACEPOINT</type>
+                                <enabled>true</enabled>
+                                <filter>false</filter>
+                                <loglevel>UNKNOWN</loglevel>
+                                <loglevel_type>ALL</loglevel_type>
+                                <exclusion>false</exclusion>
+                            </event>
+                        </events>
+                    </pid>
+                </pids>
+            </domain>
+        </domains>
+    </output>
+</command>
+</COMMAND_OUTPUT>
 </SCENARIO>
 
 ####################################################################
index d42d7449b455fc196f1391565d4028afc441e447..b4455d97c081efe64276db2763c911c75d5a4ab9 100644 (file)
@@ -875,6 +875,42 @@ lttng --mi xml list -j
     </output>
 </command>
 </COMMAND_OUTPUT>
+<COMMAND_INPUT>
+lttng --mi xml list -l
+</COMMAND_INPUT>
+<COMMAND_RESULT>
+0
+</COMMAND_RESULT>
+<COMMAND_OUTPUT>
+<?xml version="1.0" encoding="UTF-8"?>
+<command xmlns="http://lttng.org/xml/ns/lttng-mi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://lttng.org/xml/ns/lttng-mi http://lttng.org/xml/schemas/lttng-mi/3/lttng-mi-3.0.xsd" schemaVersion="3.0">
+  <name>list</name>
+  <output>
+    <domains>
+      <domain>
+        <type>LOG4J</type>
+        <buffer_type>PER_PID</buffer_type>
+        <pids>
+          <pid>
+            <id>5600</id>
+            <name>java</name>
+            <events>
+              <event>
+                <name>Test</name>
+                <type>TRACEPOINT</type>
+                <enabled>true</enabled>
+                <loglevel>UNKNOWN</loglevel>
+                <loglevel_type>ALL</loglevel_type>
+                <exclusions />
+              </event>
+            </events>
+          </pid>
+        </pids>
+      </domain>
+    </domains>
+  </output>
+</command>
+</COMMAND_OUTPUT>
 </SCENARIO>
 
 ####################################################################
@@ -926,6 +962,42 @@ lttng --mi xml list -j
     </output>
 </command>
 </COMMAND_OUTPUT>
+<COMMAND_INPUT>
+lttng --mi xml list -l
+</COMMAND_INPUT>
+<COMMAND_RESULT>
+0
+</COMMAND_RESULT>
+<COMMAND_OUTPUT>
+<?xml version="1.0" encoding="UTF-8"?>
+<command xmlns="http://lttng.org/xml/ns/lttng-mi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://lttng.org/xml/ns/lttng-mi http://lttng.org/xml/schemas/lttng-mi/3/lttng-mi-3.0.xsd" schemaVersion="3.0">
+  <name>list</name>
+  <output>
+    <domains>
+      <domain>
+        <type>LOG4J</type>
+        <buffer_type>PER_PID</buffer_type>
+        <pids>
+          <pid>
+            <id>5600</id>
+            <name>java</name>
+            <events>
+              <event>
+                <name>Test</name>
+                <type>TRACEPOINT</type>
+                <enabled>true</enabled>
+                <loglevel>UNKNOWN</loglevel>
+                <loglevel_type>ALL</loglevel_type>
+                <exclusions />
+              </event>
+            </events>
+          </pid>
+        </pids>
+      </domain>
+    </domains>
+  </output>
+</command>
+</COMMAND_OUTPUT>
 </SCENARIO>
 
 ####################################################################
@@ -1115,6 +1187,42 @@ lttng --mi xml list -j
     </output>
 </command>
 </COMMAND_OUTPUT>
+<COMMAND_INPUT>
+lttng --mi xml list -l
+</COMMAND_INPUT>
+<COMMAND_RESULT>
+0
+</COMMAND_RESULT>
+<COMMAND_OUTPUT>
+<?xml version="1.0" encoding="UTF-8"?>
+<command xmlns="http://lttng.org/xml/ns/lttng-mi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://lttng.org/xml/ns/lttng-mi http://lttng.org/xml/schemas/lttng-mi/3/lttng-mi-3.0.xsd" schemaVersion="3.0">
+  <name>list</name>
+  <output>
+    <domains>
+      <domain>
+        <type>LOG4J</type>
+        <buffer_type>PER_PID</buffer_type>
+        <pids>
+          <pid>
+            <id>5600</id>
+            <name>java</name>
+            <events>
+              <event>
+                <name>Test</name>
+                <type>TRACEPOINT</type>
+                <enabled>true</enabled>
+                <loglevel>UNKNOWN</loglevel>
+                <loglevel_type>ALL</loglevel_type>
+                <exclusions />
+              </event>
+            </events>
+          </pid>
+        </pids>
+      </domain>
+    </domains>
+  </output>
+</command>
+</COMMAND_OUTPUT>
 </SCENARIO>
 ####################################################################
 # Scenario: Test "lttng create <session>
index 15fbf8d01d94a4f1315305e570a86e3cc9020383..bcf10ba42edba2073abb96c6740f174a076b411d 100644 (file)
@@ -800,6 +800,43 @@ lttng --mi xml list -j
     </output>
 </command>
 </COMMAND_OUTPUT>
+<COMMAND_INPUT>
+lttng --mi xml list -l
+</COMMAND_INPUT>
+<COMMAND_RESULT>
+0
+</COMMAND_RESULT>
+<COMMAND_OUTPUT>
+<?xml version="1.0" encoding="UTF-8"?>
+<command>
+    <name>list</name>
+    <output>
+        <domains>
+            <domain>
+                <type>LOG4J</type>
+                <buffer_type>PER_PID</buffer_type>
+                <pids>
+                    <pid>
+                        <id>18332</id>
+                        <name>java</name>
+                        <events>
+                            <event>
+                                <name>Test</name>
+                                <type>TRACEPOINT</type>
+                                <enabled>true</enabled>
+                                <filter>false</filter>
+                                <loglevel>UNKNOWN</loglevel>
+                                <loglevel_type>ALL</loglevel_type>
+                                <exclusion>false</exclusion>
+                            </event>
+                        </events>
+                    </pid>
+                </pids>
+            </domain>
+        </domains>
+    </output>
+</command>
+</COMMAND_OUTPUT>
 </SCENARIO>
 
 ####################################################################
@@ -849,6 +886,43 @@ lttng --mi xml list -j
     </output>
 </command>
 </COMMAND_OUTPUT>
+<COMMAND_INPUT>
+lttng --mi xml list -l
+</COMMAND_INPUT>
+<COMMAND_RESULT>
+0
+</COMMAND_RESULT>
+<COMMAND_OUTPUT>
+<?xml version="1.0" encoding="UTF-8"?>
+<command>
+    <name>list</name>
+    <output>
+        <domains>
+            <domain>
+                <type>LOG4J</type>
+                <buffer_type>PER_PID</buffer_type>
+                <pids>
+                    <pid>
+                        <id>18332</id>
+                        <name>java</name>
+                        <events>
+                            <event>
+                                <name>Test</name>
+                                <type>TRACEPOINT</type>
+                                <enabled>true</enabled>
+                                <filter>false</filter>
+                                <loglevel>UNKNOWN</loglevel>
+                                <loglevel_type>ALL</loglevel_type>
+                                <exclusion>false</exclusion>
+                            </event>
+                        </events>
+                    </pid>
+                </pids>
+            </domain>
+        </domains>
+    </output>
+</command>
+</COMMAND_OUTPUT>
 </SCENARIO>
 
 ####################################################################
@@ -1044,6 +1118,43 @@ lttng --mi xml list -j
     </output>
 </command>
 </COMMAND_OUTPUT>
+<COMMAND_INPUT>
+lttng --mi xml list -l
+</COMMAND_INPUT>
+<COMMAND_RESULT>
+0
+</COMMAND_RESULT>
+<COMMAND_OUTPUT>
+<?xml version="1.0" encoding="UTF-8"?>
+<command>
+    <name>list</name>
+    <output>
+        <domains>
+            <domain>
+                <type>LOG4J</type>
+                <buffer_type>PER_PID</buffer_type>
+                <pids>
+                    <pid>
+                        <id>18332</id>
+                        <name>java</name>
+                        <events>
+                            <event>
+                                <name>Test</name>
+                                <type>TRACEPOINT</type>
+                                <enabled>true</enabled>
+                                <filter>false</filter>
+                                <loglevel>UNKNOWN</loglevel>
+                                <loglevel_type>ALL</loglevel_type>
+                                <exclusion>false</exclusion>
+                            </event>
+                        </events>
+                    </pid>
+                </pids>
+            </domain>
+        </domains>
+    </output>
+</command>
+</COMMAND_OUTPUT>
 </SCENARIO>
 ####################################################################
 # Scenario: Test "lttng create <session>
index 2f967ae7a72b9ac0f61e7aca88d4fc1ba2c6b439..4f3b9c971152eb6a430299aacc3fdd2d23d875da 100644 (file)
@@ -27,9 +27,9 @@ import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Group;
 import org.eclipse.swt.widgets.Shell;
-import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.Activator;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.views.messages.Messages;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceDomainComponent;
@@ -71,7 +71,11 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
     /**
      * The composite with widgets for collecting information about JUL events.
      */
-    private EnableJulEventsComposite fJulComposite;
+    private EnableLoggersComposite fJulComposite;
+    /**
+     * The composite with widgets for collecting information about LOG4J events.
+     */
+    private EnableLoggersComposite fLog4jComposite;
     /**
      * Radio button for selecting kernel domain.
      */
@@ -84,6 +88,10 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
      * Radio button for selecting JUL domain.
      */
     private Button fJulButton;
+    /**
+     * Radio button for selecting LOG4J domain.
+     */
+    private Button fLog4jButton;
     /**
      * The referenced trace provider group containing the kernel provider and UST
      * provider component which contains a list of available tracepoints.
@@ -125,6 +133,7 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
         case UST:
             return fUstComposite.isAllTracePoints();
         case LOG4J:
+            return fLog4jComposite.isAllTracePoints();
         case PYTHON:
         case UNKNOWN:
         default:
@@ -136,14 +145,14 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
     public boolean isTracepoints() {
         switch (fDomain) {
         case JUL:
+        case LOG4J:
+        case PYTHON:
             // Loggers are always TRACEPOINT
             return true;
         case KERNEL:
             return fKernelComposite.isTracepoints();
         case UST:
             return fUstComposite.isTracepoints();
-        case LOG4J:
-        case PYTHON:
         case UNKNOWN:
         default:
             return false;
@@ -160,6 +169,7 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
         case JUL:
             return fJulComposite.isAllTracePoints();
         case LOG4J:
+            return fLog4jComposite.isAllTracePoints();
         case PYTHON:
         case UNKNOWN:
         default:
@@ -193,6 +203,7 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
         case UST:
             return fUstComposite.getEventNames();
         case LOG4J:
+            return fLog4jComposite.getEventNames();
         case PYTHON:
         case UNKNOWN:
         default:
@@ -274,6 +285,7 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
         case UST:
             return fUstComposite.isLogLevel();
         case LOG4J:
+            return fLog4jComposite.isLogLevel();
         case PYTHON:
         case UNKNOWN:
         default:
@@ -291,6 +303,7 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
         case UST:
             return fUstComposite.getLogLevelType();
         case LOG4J:
+            return fLog4jComposite.getLogLevelType();
         case PYTHON:
         case UNKNOWN:
         default:
@@ -308,6 +321,7 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
         case UST:
             return fUstComposite.getLogLevel();
         case LOG4J:
+            return fLog4jComposite.getLogLevel();
         case PYTHON:
         case UNKNOWN:
         default:
@@ -387,7 +401,7 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
         // ------------------------------------------------------------------------
         Group domainGroup = new Group(fDialogComposite, SWT.SHADOW_NONE);
         domainGroup.setText(Messages.TraceControl_DomainDisplayName);
-        layout = new GridLayout(3, true);
+        layout = new GridLayout(4, true);
         domainGroup.setLayout(layout);
 
         fKernelButton = new Button(domainGroup, SWT.RADIO);
@@ -396,6 +410,8 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
         fUstButton.setText(Messages.TraceControl_UstDisplayName);
         fJulButton = new Button(domainGroup, SWT.RADIO);
         fJulButton.setText(Messages.TraceControl_JULDomainDisplayName);
+        fLog4jButton = new Button(domainGroup, SWT.RADIO);
+        fLog4jButton.setText(Messages.TraceControl_LOG4JDomainDisplayName);
 
         switch (fDomain) {
         case KERNEL:
@@ -408,6 +424,8 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
             fJulButton.setSelection(true);
             break;
         case LOG4J:
+            fLog4jButton.setSelection(true);
+            break;
         case PYTHON:
         case UNKNOWN:
         default:
@@ -418,10 +436,12 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
             fKernelButton.setEnabled(false);
             fUstButton.setEnabled(false);
             fJulButton.setEnabled(false);
+            fLog4jButton.setEnabled(false);
         } else if ((fProviderGroup != null) && (!fProviderGroup.hasKernelProvider())) {
             fKernelButton.setEnabled(false);
             fUstButton.setEnabled(true);
             fJulButton.setEnabled(true);
+            fLog4jButton.setEnabled(true);
         }
 
         // layout widgets
@@ -439,6 +459,7 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
         fUstComposite = null;
         fKernelComposite = null;
         fJulComposite = null;
+        fLog4jComposite = null;
 
         switch (fDomain) {
         case KERNEL:
@@ -451,6 +472,8 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
             createJulComposite();
             break;
         case LOG4J:
+            createLog4jComposite();
+            break;
         case PYTHON:
         case UNKNOWN:
         default:
@@ -490,6 +513,16 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
             }
         });
 
+        fLog4jButton.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                if (fLog4jButton.getSelection()) {
+                    disposeAllComposite();
+                    createLog4jComposite();
+                    fDialogComposite.layout();
+                }
+            }
+        });
 
         getShell().setMinimumSize(new Point(550, 850));
 
@@ -511,6 +544,8 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
             fDomain = TraceDomainType.UST;
         } else if (fJulButton.getSelection()) {
             fDomain = TraceDomainType.JUL;
+        } else if (fLog4jButton.getSelection()) {
+            fDomain= TraceDomainType.LOG4J;
         }
 
         // Validate kernel composite in case of kernel domain
@@ -528,6 +563,11 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
             return;
         }
 
+        // Validate LOG4J composite in case of JUL domain
+        if (fLog4jComposite != null && !fLog4jComposite.isValid()) {
+            return;
+        }
+
         // validation successful -> call super.okPressed()
         super.okPressed();
     }
@@ -543,6 +583,7 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
         disposeKernelComposite();
         disposeUstComposite();
         disposeJulComposite();
+        disposeLog4jComposite();
     }
 
     /**
@@ -593,13 +634,12 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
         }
     }
 
-
     /**
      * Creates the JUL composite (if not existing)
      */
     private void createJulComposite() {
         if (fJulComposite == null) {
-            fJulComposite = new EnableJulEventsComposite(fDialogComposite, SWT.NONE, fProviderGroup);
+            fJulComposite = new EnableLoggersComposite(fDialogComposite, SWT.NONE, fProviderGroup, TraceDomainType.JUL);
             GridLayout layout = new GridLayout(1, true);
             fJulComposite.setLayout(layout);
             fJulComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
@@ -618,4 +658,27 @@ public class EnableEventsDialog extends Dialog implements IEnableEventsDialog  {
         }
     }
 
+    /**
+     * Creates the LOG4J composite (if not existing)
+     */
+    private void createLog4jComposite() {
+        if (fLog4jComposite == null) {
+            fLog4jComposite = new EnableLoggersComposite(fDialogComposite, SWT.NONE, fProviderGroup, TraceDomainType.LOG4J);
+            GridLayout layout = new GridLayout(1, true);
+            fLog4jComposite.setLayout(layout);
+            fLog4jComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+            fLog4jComposite.createContent();
+        }
+    }
+
+    /**
+     * Disposes the LOG4J composite (if existing)
+     */
+    private void disposeLog4jComposite() {
+        if (fLog4jComposite != null) {
+            fLog4jComposite.dispose();
+            fLog4jComposite = null;
+        }
+    }
 }
diff --git a/lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/dialogs/EnableLoggersComposite.java b/lttng/org.eclipse.tracecompass.lttng2.control.ui/src/org/eclipse/tracecompass/internal/lttng2/control/ui/views/dialogs/EnableLoggersComposite.java
new file mode 100644 (file)
index 0000000..e76fb80
--- /dev/null
@@ -0,0 +1,507 @@
+/**********************************************************************
+ * Copyright (c) 2016 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:
+ *   Bruno Roy - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.tracecompass.internal.lttng2.control.ui.views.dialogs;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceJulLogLevel;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceLog4jLogLevel;
+import org.eclipse.tracecompass.internal.lttng2.control.ui.views.messages.Messages;
+import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.ITraceControlComponent;
+import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.BaseLoggerComponent;
+import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TargetNodeComponent;
+import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceControlContentProvider;
+import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceControlLabelProvider;
+import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceProviderGroup;
+import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.UstProviderComponent;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * A composite for collecting information about loggers to be enabled.
+ *
+ * @author Bruno Roy
+ */
+public class EnableLoggersComposite extends Composite implements IBaseEnableUstEvents {
+
+    // ------------------------------------------------------------------------
+    // Constants
+    // ------------------------------------------------------------------------
+
+    private enum GroupEnum { LOGGERS }
+
+    // ------------------------------------------------------------------------
+    // Attributes
+    // ------------------------------------------------------------------------
+
+    /**
+     * The referenced trace provider group containing the loggers providers
+     * component which contains a list of available tracepoints.
+     */
+    private final TraceProviderGroup fProviderGroup;
+    /**
+     * A button to enable/disable the loggers group
+     */
+    private Button fLoggersActivateButton;
+    /**
+     * A tree viewer for displaying and selection of available loggers.
+     */
+    private CheckboxTreeViewer fLoggersViewer;
+    /**
+     * The flag indicating that loggers are selected.
+     */
+    private boolean fIsLoggers;
+    /**
+     * The list of loggers to be enabled.
+     */
+    private List<String> fLoggers;
+    /**
+     * A button to enable/disable the log level group
+     */
+    private Button fLogLevelActivateButton;
+    /**
+     * A Combo box for selecting the log level.
+     */
+    private CCombo fLogLevelCombo;
+    /**
+     * A button for selecting the log level (range 0 to level).
+     */
+    private Button fLogLevelButton;
+    /**
+     * A button for selecting the specified log level only.
+     */
+    private Button fLogLevelOnlyButton;
+    /**
+     * The flag indicating that all log level are selected.
+     */
+    private boolean fIsLogLevel;
+    /**
+     * The flag indicating that all loggers (across providers) are selected.
+     */
+    private boolean fIsAllLoggers;
+    /**
+     * The type of the log level (loglevel or loglevel-only)
+     */
+    private LogLevelType fLogLevelType;
+    /**
+     * The selected log level.
+     */
+    private ITraceLogLevel fLogLevel;
+    /**
+     * The domain of the loggers.
+     */
+    private final TraceDomainType fDomain;
+
+    // ------------------------------------------------------------------------
+    // Constructors
+    // ------------------------------------------------------------------------
+    /**
+     * Constructor
+     *
+     * @param parent
+     *            a parent composite
+     * @param style
+     *            a composite style
+     * @param providerGroup
+     *            the trace provider group
+     * @param domain
+     *            the domain of the loggers
+     */
+    public EnableLoggersComposite(Composite parent, int style, TraceProviderGroup providerGroup, TraceDomainType domain) {
+        super(parent, style);
+        fProviderGroup = providerGroup;
+        fDomain = domain;
+    }
+
+    // ------------------------------------------------------------------------
+    // Accessors
+    // ------------------------------------------------------------------------
+
+    @Override
+    public ITraceLogLevel getLogLevel() {
+        return fLogLevel;
+    }
+
+    @Override
+    public LogLevelType getLogLevelType() {
+        return fLogLevelType;
+    }
+
+    @Override
+    public boolean isAllTracePoints() {
+        return fIsAllLoggers;
+    }
+
+    @Override
+    public List<String> getEventNames() {
+        return new ArrayList<>(fLoggers);
+    }
+
+    @Override
+    public boolean isLogLevel() {
+        return fIsLogLevel;
+    }
+
+    // ------------------------------------------------------------------------
+    // Operations
+    // ------------------------------------------------------------------------
+
+    /**
+     * Create the contents of this event composite
+     */
+    public void createContent() {
+
+        // Logger group
+        createLoggersGroup();
+
+        // Log Level Group
+        createLogLevelGroup();
+
+        // Set default enablements
+        setEnablements(GroupEnum.LOGGERS);
+    }
+
+    /**
+     * Validates the loggers composite input data.
+     *
+     * @return true if configured data is valid and can be retrieved.
+     */
+    public boolean isValid() {
+
+        fIsLoggers = fLoggersActivateButton.getSelection();
+        fIsLogLevel = fLogLevelActivateButton.getSelection();
+
+        // Initialize loggers fields
+        fLoggers = new ArrayList<>();
+        if (fIsLoggers) {
+            Set<String> set = new HashSet<>();
+            Object[] checkedElements = fLoggersViewer.getCheckedElements();
+            int totalNbEvents = 0;
+            for (int i = 0; i < checkedElements.length; i++) {
+                ITraceControlComponent component = (ITraceControlComponent) checkedElements[i];
+                if (component instanceof BaseLoggerComponent) {
+                    totalNbEvents++;
+                    if (!set.contains(component.getName())) {
+                        set.add(component.getName());
+                        fLoggers.add(component.getName());
+                    }
+                }
+
+            }
+
+            // verify if all events are selected
+            int nbLoggers = 0;
+            List<ITraceControlComponent> comps = fProviderGroup.getChildren(UstProviderComponent.class);
+            for (ITraceControlComponent comp : comps) {
+                // We want the children of each UST provider
+                ITraceControlComponent[] events = comp.getChildren();
+                for (ITraceControlComponent event : events) {
+                    if (event instanceof BaseLoggerComponent && fDomain.equals(((BaseLoggerComponent)event).getDomain())) {
+                        nbLoggers++;
+                    }
+                }
+
+            }
+            fIsAllLoggers = nbLoggers == totalNbEvents;
+        }
+
+        // initialize log level event name string
+        fLogLevelType = LogLevelType.LOGLEVEL_NONE;
+        if (fIsLogLevel) {
+            if (fLogLevelButton.getSelection()) {
+                fLogLevelType = LogLevelType.LOGLEVEL;
+            } else if (fLogLevelOnlyButton.getSelection()) {
+                fLogLevelType = LogLevelType.LOGLEVEL_ONLY;
+            }
+
+            ITraceLogLevel[] levels = getLogLevelNames();
+            int id = fLogLevelCombo.getSelectionIndex();
+
+            if (id < 0) {
+                MessageDialog.openError(getShell(),
+                        Messages.TraceControl_EnableLoggersDialogTitle,
+                        Messages.TraceControl_InvalidLogLevel);
+
+                return false;
+            }
+
+            if (fLoggers.isEmpty()) {
+                MessageDialog.openError(getShell(),
+                        Messages.TraceControl_EnableLoggersDialogTitle,
+                        Messages.TraceControl_InvalidLogger);
+
+                return false;
+            }
+            if (levels != null) {
+                fLogLevel = levels[id];
+            }
+        }
+
+        // validation successful -> call super.okPressed()
+        return true;
+    }
+
+    // ------------------------------------------------------------------------
+    // Helper methods
+    // ------------------------------------------------------------------------
+
+    private ITraceLogLevel[] getLogLevelNames() {
+        switch (fDomain) {
+        case JUL:
+            return TraceJulLogLevel.values();
+        case LOG4J:
+            return TraceLog4jLogLevel.values();
+            //$CASES-OMITTED$
+        default:
+            return null;
+        }
+    }
+
+    /**
+     * Creates loggers group.
+     */
+    private void createLoggersGroup() {
+        // Create the loggers group
+        Group loggersMainGroup = new Group(this, SWT.SHADOW_NONE);
+        loggersMainGroup.setText(Messages.TraceControl_EnableEventsLoggerGroupName);
+        GridLayout layout = new GridLayout(2, false);
+        loggersMainGroup.setLayout(layout);
+        GridData data = new GridData(GridData.FILL_BOTH);
+        loggersMainGroup.setLayoutData(data);
+
+        // Create the Select button
+        Composite buttonComposite = new Composite(loggersMainGroup, SWT.NONE);
+        layout = new GridLayout(1, true);
+        buttonComposite.setLayout(layout);
+        data = new GridData(SWT.BEGINNING, SWT.CENTER, false, true);
+        buttonComposite.setLayoutData(data);
+
+        fLoggersActivateButton = new Button(buttonComposite, SWT.RADIO);
+        fLoggersActivateButton.setText(Messages.TraceControl_EnableGroupSelectionName);
+        data = new GridData(GridData.FILL_HORIZONTAL);
+        fLoggersActivateButton.setLayoutData(data);
+        fLoggersActivateButton.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                setEnablements(GroupEnum.LOGGERS);
+            }
+        });
+
+        // Create the group for the tree
+        Group loggersGroup = new Group(loggersMainGroup, SWT.SHADOW_NONE);
+        layout = new GridLayout(1, true);
+        loggersGroup.setLayout(layout);
+        data = new GridData(GridData.FILL_BOTH);
+        loggersGroup.setLayoutData(data);
+        new FilteredTree(loggersGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, new PatternFilter(), true) {
+            @Override
+            protected TreeViewer doCreateTreeViewer(Composite aparent, int style) {
+                fLoggersViewer = new CheckboxTreeViewer(aparent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+                fLoggersViewer.getTree().setToolTipText(Messages.TraceControl_EnableEventsLoggerTreeTooltip);
+                fLoggersViewer.setContentProvider(new LoggersContentProvider());
+
+                fLoggersViewer.setLabelProvider(new LoggersLabelProvider());
+                fLoggersViewer.addCheckStateListener(new LoggersCheckStateListener());
+
+                fLoggersViewer.setInput(fProviderGroup.getParent());
+                fLoggersViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+                return fLoggersViewer;
+            }
+        };
+    }
+
+    /**
+     * Creates log level group.
+     */
+    private void createLogLevelGroup() {
+        Group logLevelMainGroup = new Group(this, SWT.SHADOW_NONE);
+        logLevelMainGroup.setText(Messages.TraceControl_EnableEventsLogLevelGroupName);
+        GridLayout layout = new GridLayout(2, false);
+        logLevelMainGroup.setLayout(layout);
+        GridData data = new GridData(GridData.FILL_HORIZONTAL);
+        logLevelMainGroup.setLayoutData(data);
+
+        Composite buttonComposite = new Composite(logLevelMainGroup, SWT.NONE);
+        layout = new GridLayout(1, false);
+        buttonComposite.setLayout(layout);
+        data = new GridData(SWT.BEGINNING, SWT.CENTER, false, true);
+        buttonComposite.setLayoutData(data);
+
+        fLogLevelActivateButton = new Button(buttonComposite, SWT.CHECK);
+        fLogLevelActivateButton.setText(Messages.TraceControl_EnableGroupSelectionName);
+        fLogLevelActivateButton.setSelection(false);
+        data = new GridData(GridData.FILL_HORIZONTAL);
+        fLogLevelActivateButton.setLayoutData(data);
+        fLogLevelActivateButton.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                fLogLevelCombo.setEnabled(fLogLevelActivateButton.getSelection());
+                fLogLevelButton.setEnabled(fLogLevelActivateButton.getSelection());
+                fLogLevelOnlyButton.setEnabled(fLogLevelActivateButton.getSelection());
+            }
+        });
+
+        Group logLevelGroup = new Group(logLevelMainGroup, SWT.SHADOW_NONE);
+        layout = new GridLayout(2, true);
+        logLevelGroup.setLayout(layout);
+        logLevelGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+        fLogLevelButton = new Button(logLevelGroup, SWT.RADIO);
+        fLogLevelButton.setText(Messages.TraceControl_EnableEventsLogLevelTypeName);
+        fLogLevelButton.setToolTipText(Messages.TraceControl_EnableEventsLogLevelTypeTooltip);
+        data = new GridData(GridData.FILL_BOTH);
+        fLogLevelButton.setLayoutData(data);
+        fLogLevelButton.setSelection(true);
+
+        fLogLevelOnlyButton = new Button(logLevelGroup, SWT.RADIO);
+        fLogLevelOnlyButton.setText(Messages.TraceControl_EnableEventsLogLevelOnlyTypeName);
+        fLogLevelOnlyButton.setToolTipText(Messages.TraceControl_EnableEventsLogLevelOnlyTypeTooltip);
+        data = new GridData(GridData.FILL_BOTH);
+        fLogLevelButton.setLayoutData(data);
+
+        fLogLevelCombo = new CCombo(logLevelGroup, SWT.READ_ONLY);
+        ITraceLogLevel[] levels = getLogLevelNames();
+        if (levels != null) {
+            String[] levelNames = new String[levels.length - 1];
+            int k = 0;
+            for (int i = 0; i < levels.length; i++) {
+                if (levels[i] != TraceJulLogLevel.LEVEL_UNKNOWN &&
+                    levels[i] != TraceLog4jLogLevel.LEVEL_UNKNOWN) {
+                    levelNames[k++] = levels[i].getInName();
+                }
+            }
+            fLogLevelCombo.setItems(levelNames);
+        }
+
+        fLogLevelCombo.setToolTipText(Messages.TraceControl_EnableEventsLogLevelTooltip);
+        data = new GridData(GridData.FILL_HORIZONTAL);
+        data.horizontalSpan = 4;
+        fLogLevelCombo.setLayoutData(data);
+
+        // By default the combo box and the buttons are not enabled
+        fLogLevelCombo.setEnabled(false);
+        fLogLevelButton.setEnabled(false);
+        fLogLevelOnlyButton.setEnabled(false);
+
+    }
+
+    /**
+     * Enable/selects widgets depending on the group specified.
+     *
+     * @param group
+     *            group to enable.
+     */
+    private void setEnablements(GroupEnum group) {
+
+        // Enable/disable trace point items
+        fLoggersActivateButton.setSelection(group == GroupEnum.LOGGERS);
+        fLoggersViewer.getTree().setEnabled(group == GroupEnum.LOGGERS);
+    }
+
+    /**
+     * Content provider for the loggers tree.
+     */
+    public final class LoggersContentProvider extends TraceControlContentProvider {
+        @Override
+        public Object[] getChildren(Object parentElement) {
+            if (parentElement instanceof TargetNodeComponent) {
+                List<ITraceControlComponent> children = ((ITraceControlComponent) parentElement).getChildren(TraceProviderGroup.class);
+                return children.toArray(new ITraceControlComponent[children.size()]);
+            }
+            if (parentElement instanceof TraceProviderGroup) {
+                List<ITraceControlComponent> ustProviderChildren = ((ITraceControlComponent) parentElement).getChildren(UstProviderComponent.class)
+                        .stream().filter(comp -> ((UstProviderComponent) comp).getLoggerComponents(fDomain).size() > 0)
+                        .collect(Collectors.toList());
+                return ustProviderChildren.toArray(new ITraceControlComponent[ustProviderChildren.size()]);
+            }
+            if (parentElement instanceof UstProviderComponent) {
+                List<ITraceControlComponent> loggers = ((UstProviderComponent) parentElement).getLoggerComponents(fDomain);
+                return loggers.toArray(new ITraceControlComponent[loggers.size()]);
+            }
+            return new Object[0];
+        }
+    }
+
+    /**
+     * Content label for the loggers tree.
+     */
+    public static final class LoggersLabelProvider extends TraceControlLabelProvider {
+        @Override
+        public Image getImage(Object element) {
+            return null;
+        }
+
+        @Override
+        public String getText(Object element) {
+            if ((element != null) && (element instanceof TraceProviderGroup)) {
+                return Messages.TraceControl_EnableEventsTreeAllLabel;
+            }
+
+            if ((element != null) && (element instanceof UstProviderComponent)) {
+                return Messages.TraceControl_EnableEventsTreeAllLabel + " - " + ((UstProviderComponent)element).getName(); //$NON-NLS-1$
+            }
+            return super.getText(element);
+        }
+    }
+
+    /**
+     * Check state listener for the loggers tree.
+     */
+    public final class LoggersCheckStateListener implements ICheckStateListener {
+        @Override
+        public void checkStateChanged(CheckStateChangedEvent event) {
+            if (event.getChecked()) {
+                if (event.getElement() instanceof TraceProviderGroup) {
+                    fLoggersViewer.setSubtreeChecked(event.getElement(), true);
+                }
+                if (event.getElement() instanceof UstProviderComponent) {
+                    fLoggersViewer.setSubtreeChecked(event.getElement(), true);
+                }
+            } else {
+                if (event.getElement() instanceof TraceProviderGroup) {
+                    fLoggersViewer.setSubtreeChecked(event.getElement(), true);
+                }
+                if (event.getElement() instanceof UstProviderComponent) {
+                    ITraceControlComponent component = (ITraceControlComponent) event.getElement();
+                    fLoggersViewer.setSubtreeChecked(event.getElement(), false);
+                    fLoggersViewer.setChecked(component.getParent(), false);
+                } else {
+                    ITraceControlComponent component = (ITraceControlComponent) event.getElement();
+                    fLoggersViewer.setChecked(component.getParent(), false);
+                    fLoggersViewer.setChecked(component.getParent().getParent(), false);
+                }
+            }
+        }
+    }
+}
index c415fe6fc4e24410bbb3a5f80bd25d4c43b03077..3f3739e731cde98109b2f0d8e0a63a04ba330f6e 100644 (file)
@@ -300,7 +300,7 @@ public class EnableUstEventsComposite extends Composite implements IEnableUstEve
             List<ITraceControlComponent> comps = fProviderGroup.getChildren(UstProviderComponent.class);
             for (ITraceControlComponent comp : comps) {
                 List<ITraceControlComponent> children = comp.getChildren(BaseEventComponent.class);
-                nbUstEvents = children.size();
+                nbUstEvents += children.size();
             }
             fIsAllTracepoints = (nbUstEvents == totalNbEvents);
         }
index bc27fabf522ef0b399e3013c3f164e769d50892e..f07607f2b1c4533bb648017f632efba98b483cd2 100644 (file)
@@ -25,7 +25,11 @@ import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Group;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceJulLogLevel;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceLog4jLogLevel;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceLogLevel;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.Activator;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.views.messages.Messages;
 
@@ -54,11 +58,15 @@ public class GetLoggerInfoDialog extends BaseGetInfoDialog implements IGetLogger
     /**
      * The selected log level.
      */
-    private TraceJulLogLevel fLogLevel;
+    private ITraceLogLevel fLogLevel;
     /**
      * The type of the log level (loglevel or loglevel-only)
      */
     private LogLevelType fLogLevelType;
+    /**
+     * The logger domain type ({@link TraceDomainType})
+     */
+    private TraceDomainType fLoggerDomain = TraceDomainType.UNKNOWN;
 
     // ------------------------------------------------------------------------
     // Constructors
@@ -77,7 +85,7 @@ public class GetLoggerInfoDialog extends BaseGetInfoDialog implements IGetLogger
     // Accessors
     // ------------------------------------------------------------------------
     @Override
-    public TraceJulLogLevel getLogLevel() {
+    public ITraceLogLevel getLogLevel() {
         return fLogLevel;
     }
     @Override
@@ -85,6 +93,12 @@ public class GetLoggerInfoDialog extends BaseGetInfoDialog implements IGetLogger
         return fLogLevelType;
     }
 
+    @Override
+    public void setLoggerDomain(TraceDomainType domain) {
+        fLoggerDomain = domain;
+
+    }
+
     // ------------------------------------------------------------------------
     // Operations
     // ------------------------------------------------------------------------
@@ -138,14 +152,34 @@ public class GetLoggerInfoDialog extends BaseGetInfoDialog implements IGetLogger
         data = new GridData(GridData.FILL_BOTH);
         fLogLevelButton.setLayoutData(data);
 
-        TraceJulLogLevel[] levels = TraceJulLogLevel.values();
-
-        String[] levelNames = new String[levels.length - 1];
-        int k = 0;
-        for (int i = 0; i < levels.length; i++) {
-            if (levels[i] != TraceJulLogLevel.LEVEL_UNKNOWN) {
-                levelNames[k++] = levels[i].getInName();
+        ITraceLogLevel[] levels = null;
+        String[] levelNames  = null;
+        switch (fLoggerDomain) {
+        case JUL:
+            levels = TraceJulLogLevel.values();
+
+            levelNames = new String[levels.length - 1];
+            int k = 0;
+            for (int i = 0; i < levels.length; i++) {
+                if (levels[i] != TraceJulLogLevel.LEVEL_UNKNOWN) {
+                    levelNames[k++] = levels[i].getInName();
+                }
             }
+            break;
+        case LOG4J:
+            levels = TraceLog4jLogLevel.values();
+
+            levelNames = new String[levels.length - 1];
+            int l = 0;
+            for (int i = 0; i < levels.length; i++) {
+                if (levels[i] != TraceLog4jLogLevel.LEVEL_UNKNOWN) {
+                    levelNames[l++] = levels[i].getInName();
+                }
+            }
+            break;
+            //$CASES-OMITTED$
+        default:
+            break;
         }
 
         fLogLevelCombo = new CCombo(logLevelGroup, SWT.READ_ONLY);
@@ -160,7 +194,6 @@ public class GetLoggerInfoDialog extends BaseGetInfoDialog implements IGetLogger
         fLogLevelButton.setEnabled(false);
         fLogLevelOnlyButton.setEnabled(false);
 
-
         getShell().setMinimumSize(new Point(300, 200));
 
         return dialogComposite;
@@ -179,11 +212,23 @@ public class GetLoggerInfoDialog extends BaseGetInfoDialog implements IGetLogger
         fSessionIndex = fSessionsCombo.getSelectionIndex();
 
         fLogLevel = null;
-        // If nothing is selected in the combo box that means that all the
-        // loglevels should be enabled.
+        // If nothing is selected in the combo box that means that all the loglevels should be enabled.
         if (!fLogLevelCombo.getText().isEmpty()) {
-            TraceJulLogLevel[] levels = TraceJulLogLevel.values();
+            ITraceLogLevel[] levels;
             int id = fLogLevelCombo.getSelectionIndex();
+            switch (fLoggerDomain) {
+            case JUL:
+                levels = TraceJulLogLevel.values();
+                break;
+            case LOG4J:
+                levels = TraceLog4jLogLevel.values();
+                break;
+                //$CASES-OMITTED$
+            default:
+                levels = TraceLogLevel.values();
+                break;
+            }
+            fLogLevel = levels[id];
 
             if (id < 0) {
                 MessageDialog.openError(getShell(),
@@ -197,8 +242,6 @@ public class GetLoggerInfoDialog extends BaseGetInfoDialog implements IGetLogger
             } else if (fLogLevelOnlyButton.getSelection()) {
                 fLogLevelType = LogLevelType.LOGLEVEL_ONLY;
             }
-
-            fLogLevel = levels[id];
         }
         super.okPressed();
     }
index 7a9693e5fe35d1c28b4e9489a3b36eefbc2154c7..7e07f85b05e696f08eebe14b6656f6012719b8f4 100644 (file)
@@ -13,6 +13,7 @@ package org.eclipse.tracecompass.internal.lttng2.control.ui.views.dialogs;
 
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType;
 
 /**
  * Interface for a dialog box for collecting information about the loggers to enable.
@@ -34,4 +35,10 @@ public interface IGetLoggerInfoDialog  extends IBaseGetInfoDialog {
      * @return a log level
      */
     ITraceLogLevel getLogLevel();
+
+    /**
+     * Sets the logger domain type
+     * @param domain - the domain type ({@link TraceDomainType})
+     */
+    void setLoggerDomain(TraceDomainType domain);
 }
index 564c24a2c28a6db286d3edd3823ea1a7fd70f6cf..39b21a9cd8694d323656ed8bfa1ebedcbba9c032 100644 (file)
@@ -76,10 +76,10 @@ public class AssignLoggerHandler extends BaseControlViewHandler {
         }
         final Parameter param = tmpParam;
 
-        // Open dialog box to retrieve the session and channel where the events
-        // should be enabled in.
+        // Open dialog box to retrieve the session and channel where the events should be enabled in.
         final GetLoggerInfoDialog dialog = TraceControlDialogFactory.getInstance().getGetLoggerInfoDialog();
         dialog.setSessions(param.getSessions());
+        dialog.setLoggerDomain(param.getLoggerDomain());
 
         if (dialog.open() != Window.OK) {
             return null;
@@ -101,9 +101,9 @@ public class AssignLoggerHandler extends BaseControlViewHandler {
 
                     // enable events on default channel
                     if (dialog.getLogLevel() != null) {
-                        session.enableLogLevel(loggerNames, dialog.getLogLevelType(), dialog.getLogLevel(), null, TraceDomainType.JUL, monitor);
+                        session.enableLogLevel(loggerNames, dialog.getLogLevelType(), dialog.getLogLevel(), null, param.getLoggerDomain(), monitor);
                     } else {
-                        session.enableEvents(loggerNames, TraceDomainType.JUL, null, null, monitor);
+                        session.enableEvents(loggerNames, param.getLoggerDomain(), null, null, monitor);
                     }
 
                 } catch (ExecutionException e) {
@@ -149,14 +149,13 @@ public class AssignLoggerHandler extends BaseControlViewHandler {
                 if (element instanceof BaseLoggerComponent) {
                     BaseLoggerComponent logger = (BaseLoggerComponent) element;
 
-                    // The domain is always going to be UST for loggers
-                    domain = TraceDomainType.UST;
-
-                    // TODO: Add some logic when more loggers are added to
-                    // determine if the multiple selection is OK, only loggers
-                    // from the same type should be able to be enabled at the
-                    // same time
-                    // check AssignEventHandler for reference
+                    // The loggers have to be the same domain (multiple selection)
+                    if (domain == null) {
+                        domain = logger.getDomain();
+                    } else if (!domain.equals(logger.getDomain())){
+                        loggers.clear();
+                        break;
+                    }
 
                     // Add BaseLoggerComponents
                     loggers.add(logger);
@@ -252,5 +251,14 @@ public class AssignLoggerHandler extends BaseControlViewHandler {
         public List<BaseLoggerComponent> getLoggers() {
             return fLoggers;
         }
+
+        /**
+         * Return the logger domain ({@link TraceDomainType})
+         *
+         * @return - the logger domain ({@link TraceDomainType})
+         */
+        public TraceDomainType getLoggerDomain() {
+            return fDomain;
+        }
     }
 }
index b1d443def1513117703ebb30b04de1a3d17440e8..35943d851ce17a2bb3506bc05ab731f027685917 100644 (file)
@@ -180,6 +180,7 @@ public abstract class BaseEnableEventHandler extends BaseControlViewHandler {
                 Exception error = null;
                 try {
                     String filter = dialog.getFilterExpression();
+                    List<String> eventNames = null;
                     switch (dialog.getDomain()) {
                     case KERNEL:
                     case UST:
@@ -190,7 +191,7 @@ public abstract class BaseEnableEventHandler extends BaseControlViewHandler {
                             if (dialog.isAllTracePoints()) {
                                 enableEvents(param, null, dialog.getDomain(), filter, dialog.getExcludedEvents(), monitor);
                             } else {
-                                List<String> eventNames = dialog.getEventNames();
+                                eventNames = dialog.getEventNames();
                                 if (!eventNames.isEmpty()) {
                                     enableEvents(param, eventNames, dialog.getDomain(), filter, dialog.getExcludedEvents(), monitor);
                                 }
@@ -222,7 +223,7 @@ public abstract class BaseEnableEventHandler extends BaseControlViewHandler {
 
                         // Enable event using a wildcard
                         if (dialog.isWildcard()) {
-                            List<String> eventNames = dialog.getEventNames();
+                            eventNames = dialog.getEventNames();
                             eventNames.add(dialog.getWildcard());
 
                             if (!eventNames.isEmpty()) {
@@ -236,8 +237,9 @@ public abstract class BaseEnableEventHandler extends BaseControlViewHandler {
                         }
                         break;
                     case JUL:
-                        List<String> eventNames = dialog.getEventNames();
-                        if (dialog.isAllTracePoints()) {
+                    case LOG4J:
+                        eventNames = dialog.getEventNames();
+                        if (dialog.isAllEvents()) {
                             eventNames = null;
                         }
                         if (dialog.isLogLevel()) {
@@ -250,7 +252,6 @@ public abstract class BaseEnableEventHandler extends BaseControlViewHandler {
                     default:
                         break;
                     }
-
                 } catch (ExecutionException e) {
                     error = e;
                 }
index 90fd25771d424289f4772072af1894918c957529..3aad41d4e0d0bfc2128470358f9020724978510f 100644 (file)
@@ -23,9 +23,9 @@ import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceEnablement;
-import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceJulLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.Activator;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.views.ControlView;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.views.messages.Messages;
@@ -78,7 +78,7 @@ public abstract class ChangeLoggerStateHandler extends BaseControlViewHandler {
      * @throws ExecutionException
      *             If the command fails
      */
-    protected abstract void changeState(TraceDomainComponent domain, List<String> loggerNames, TraceJulLogLevel logLevel, LogLevelType logLevelType, IProgressMonitor monitor) throws ExecutionException;
+    protected abstract void changeState(TraceDomainComponent domain, List<String> loggerNames, ITraceLogLevel logLevel, LogLevelType logLevelType, IProgressMonitor monitor) throws ExecutionException;
 
     @Override
     public Object execute(ExecutionEvent event) throws ExecutionException {
@@ -160,7 +160,7 @@ public abstract class ChangeLoggerStateHandler extends BaseControlViewHandler {
         ISelection selection = page.getSelection(ControlView.ID);
 
         TraceDomainComponent domain = null;
-        TraceJulLogLevel logLevel = null;
+        ITraceLogLevel logLevel = null;
         LogLevelType logLevelType = null;
         List<TraceLoggerComponent> loggers = new ArrayList<>();
 
@@ -256,7 +256,7 @@ public abstract class ChangeLoggerStateHandler extends BaseControlViewHandler {
         /**
          * The log level.
          */
-        private final TraceJulLogLevel fLogLevel;
+        private final ITraceLogLevel fLogLevel;
         /**
          * The log level type.
          */
@@ -274,7 +274,7 @@ public abstract class ChangeLoggerStateHandler extends BaseControlViewHandler {
          * @param logLevelType
          *            the log level type
          */
-        public Parameter(TraceDomainComponent domain, List<TraceLoggerComponent> loggers, TraceJulLogLevel logLevel, LogLevelType logLevelType) {
+        public Parameter(TraceDomainComponent domain, List<TraceLoggerComponent> loggers, ITraceLogLevel logLevel, LogLevelType logLevelType) {
             fDomain = domain;
             fLoggers.addAll(loggers);
             fLogLevel = logLevel;
@@ -315,7 +315,7 @@ public abstract class ChangeLoggerStateHandler extends BaseControlViewHandler {
         /**
          * @return the log level.
          */
-        public TraceJulLogLevel getLogLevel() {
+        public ITraceLogLevel getLogLevel() {
             return fLogLevel;
         }
     }
index d86883a45cbfb9117aee000d7fa46fa6c5e4b932..0b13a1ba118186d67c72cf432b2da9d2dcce61b2 100644 (file)
@@ -15,9 +15,9 @@ import java.util.List;
 
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceEnablement;
-import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceJulLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceDomainComponent;
 
 /**
@@ -43,7 +43,7 @@ public class DisableLoggerHandler extends ChangeLoggerStateHandler {
     // ------------------------------------------------------------------------
 
     @Override
-    protected void changeState(TraceDomainComponent domain, List<String> loggerNames, TraceJulLogLevel logLevel, LogLevelType logLevelType, IProgressMonitor monitor) throws ExecutionException {
+    protected void changeState(TraceDomainComponent domain, List<String> loggerNames, ITraceLogLevel logLevel, LogLevelType logLevelType, IProgressMonitor monitor) throws ExecutionException {
         domain.disableLoggers(loggerNames, monitor);
     }
 }
index a1e9e5994e769705a6fd99b8b2d845b6fc1c4be7..d7b78e27b5093bfe89a5d23b6bc9b8a3c7d760f3 100644 (file)
@@ -92,8 +92,10 @@ public class EnableChannelOnDomainHandler extends BaseEnableChannelHandler {
 
         boolean isEnabled = domain != null;
 
-        // If it's a JUL domain, the enable channel is disabled.
-        if ((domain != null) && TraceDomainType.JUL.equals(domain.getDomain())) {
+        // If it's a logger domain (JUL, LOG4J, Python), the enable channel is disabled.
+        if ((domain != null) && (TraceDomainType.JUL.equals(domain.getDomain()) ||
+                                 TraceDomainType.LOG4J.equals(domain.getDomain()) ||
+                                 TraceDomainType.PYTHON.equals(domain.getDomain()))) {
             isEnabled = false;
         }
 
index 01e6c460130fceba5805f5bdc4c421032cd4ba0e..b6956fa2ab8fcb98d8d7c4f8bbd9a799b16c9f79 100644 (file)
@@ -15,10 +15,9 @@ import java.util.List;
 
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType;
-import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceEnablement;
-import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceJulLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceDomainComponent;
 
 /**
@@ -42,13 +41,13 @@ public class EnableLoggerHandler extends ChangeLoggerStateHandler {
     // ------------------------------------------------------------------------
 
     @Override
-    protected void changeState(TraceDomainComponent domain, List<String> loggerNames, TraceJulLogLevel logLevel, LogLevelType logLevelType, IProgressMonitor monitor) throws ExecutionException {
+    protected void changeState(TraceDomainComponent domain, List<String> loggerNames, ITraceLogLevel logLevel, LogLevelType logLevelType, IProgressMonitor monitor) throws ExecutionException {
         // This conditional statement makes it possible to enable the same logger multiple
         // times with different log levels (with the right-click enable, directly on the logger)
         if (logLevelType.equals(LogLevelType.LOGLEVEL_ALL)) {
             domain.enableEvents(loggerNames, null, null, monitor);
         } else {
-            domain.enableLogLevel(loggerNames, logLevelType, logLevel, null, TraceDomainType.JUL, monitor);
+            domain.enableLogLevel(loggerNames, logLevelType, logLevel, null, domain.getDomain(), monitor);
         }
     }
 }
index e8555de54f5ec211e2bd5c99e1541e535ce83452..d14de4be4fae52ef6eb207a52c0b699798c0444b 100644 (file)
@@ -262,6 +262,7 @@ public final class Messages extends NLS {
     public static String TraceControl_UstGlobalDomainDisplayName;
     public static String TraceControl_UnknownDomainDisplayName;
     public static String TraceControl_JULDomainDisplayName;
+    public static String TraceControl_LOG4JDomainDisplayName;
     public static String TraceControl_AllSessionsDisplayName;
     public static String TraceControl_SessionDisplayName;
     public static String TraceControl_DomainDisplayName;
@@ -293,6 +294,7 @@ public final class Messages extends NLS {
     public static String TraceControl_OpenConnectionTo;
     public static String TraceControl_LoggerNamePropertyName;
     public static String TraceControl_LoggerTypePropertyName;
+    public static String TraceControl_LoggerDomainPropertyName;
 
     public static String TraceControl_OverwriteModePropertyName;
     public static String TraceControl_SubBufferSizePropertyName;
index c0643f970bd15ff7e3a61ef07144cbcbc3c56c55..83091ec97d220ed9e5c6ef92db100697514ab100 100644 (file)
@@ -214,7 +214,7 @@ TraceControl_EnableEventsFucntionGroupName=Dynamic Function Entry/Return Probe
 TraceControl_EnableEventsFunctionEventNameTooltip=The name of the event for enabling a dynamic function entry/return probe
 TraceControl_EnableEventsFunctionNameLabel=Function
 TraceControl_EnableEventsLoggerGroupName=Loggers
-TraceControl_EnableEventsLoggerTreeTooltip=List of available JUL loggers
+TraceControl_EnableEventsLoggerTreeTooltip=List of available loggers
 
 TraceControl_EnableEventsWildcardGroupName=Wildcard
 TraceControl_EnableEventsWildcardLabel=Wildcard
@@ -247,6 +247,7 @@ TraceControl_ImportDialogStreamedTraceNotificationToggle=Do not warn me again
 # Tree structure strings
 TraceControl_KernelDomainDisplayName=Kernel
 TraceControl_JULDomainDisplayName=JUL
+TraceControl_LOG4JDomainDisplayName=LOG4J
 TraceControl_UstGlobalDomainDisplayName=UST global
 TraceControl_UstDisplayName=UST
 TraceControl_UnknownDomainDisplayName=Unknown domain
@@ -305,6 +306,7 @@ TraceControl_MaxNumTraceFilesPropertyName=Maximum number of trace files
 TraceControl_ConfigureMetadataChannelName=Configure metadata channel
 TraceControl_LoggerNamePropertyName=Logger Name
 TraceControl_LoggerTypePropertyName=Logger Type
+TraceControl_LoggerDomainPropertyName=Logger Domain
 
 # Preferences
 TraceControl_TracingGroupPreference=&Tracing Group
index 3ff637ac2e38edaf748bf5b62766cf8e17ae43fc..e3903bcd82ea2645e56325a7bdf2df6514e58dc2 100644 (file)
@@ -13,8 +13,8 @@ package org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl;
 
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.IBaseLoggerInfo;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.ILoggerInfo;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType;
-import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceJulLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.impl.LoggerInfo;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.ITraceControlComponent;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.views.property.BaseLoggerPropertySource;
@@ -77,7 +77,7 @@ public class BaseLoggerComponent extends TraceControlComponent {
     /**
      * @return the trace logger log level
      */
-    public TraceJulLogLevel getLogLevel() {
+    public ITraceLogLevel getLogLevel() {
         return fLoggerInfo.getLogLevel();
     }
 
@@ -87,7 +87,7 @@ public class BaseLoggerComponent extends TraceControlComponent {
      * @param level
      *            event log level to set
      */
-    public void setLogLevel(TraceJulLogLevel level) {
+    public void setLogLevel(ITraceLogLevel level) {
         fLoggerInfo.setLogLevel(level);
     }
 
index de167b4ee7f6c5f0f01736c2921f2465dbbcd7df..d089fadf3e9bbcfb8f893850b513c1cc2f0439fe 100644 (file)
@@ -84,9 +84,8 @@ public class TraceDomainComponent extends TraceControlComponent {
             addChild(channel);
         }
 
-        // Since the loggers are not in a channel in the JUL domain, the loggers
-        // won't be added by the previous loop.
-        if (TraceDomainType.JUL.equals(domainInfo.getDomain())) {
+        // Since the loggers are not in a channel, the loggers won't be added by the previous loop
+        if (TraceDomainType.JUL.equals(domainInfo.getDomain()) || TraceDomainType.LOG4J.equals(domainInfo.getDomain())) {
             List<ILoggerInfo> loggers = fDomainInfo.getLoggers();
             for (ILoggerInfo loggerInfo : loggers) {
                 TraceLoggerComponent logger = new TraceLoggerComponent(loggerInfo.getName(), this);
index 7ffa631466e7e2ca1f7a6b9fcbf9b55ecf7e2a12..141f55fad90119e094bcc724d30ef77dac4f0024 100644 (file)
@@ -13,10 +13,10 @@ package org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl;
 
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.ILoggerInfo;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceEnablement;
-import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceJulLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.impl.LoggerInfo;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.Activator;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.views.messages.Messages;
@@ -136,7 +136,7 @@ public class TraceLoggerComponent extends TraceControlComponent {
     /**
      * @return the trace logger log level
      */
-    public TraceJulLogLevel getLogLevel() {
+    public ITraceLogLevel getLogLevel() {
         return fLoggerInfo.getLogLevel();
     }
 
@@ -146,7 +146,7 @@ public class TraceLoggerComponent extends TraceControlComponent {
      * @param level
      *            logger log level to set
      */
-    public void setLogLevel(TraceJulLogLevel level) {
+    public void setLogLevel(ITraceLogLevel level) {
         fLoggerInfo.setLogLevel(level);
     }
 
index 40f5c66f8976b27b8d37e4925abde06efb50bd1b..38fa634556ffab1b56803b6cba388d1c0c767ea2 100644 (file)
@@ -35,10 +35,18 @@ public class BaseLoggerPropertySource extends BasePropertySource {
      * The base logger 'name' property ID.
      */
     public static final String BASE_LOGGER_NAME_PROPERTY_ID = "base.logger.name"; //$NON-NLS-1$
+    /**
+     * The base logger 'domain' property ID.
+     */
+    public static final String BASE_LOGGER_DOMAIN_PROPERTY_ID = "base.logger.domain"; //$NON-NLS-1$
     /**
      *  The base logger 'name' property name.
      */
     public static final String BASE_LOGGER_NAME_PROPERTY_NAME = Messages.TraceControl_LoggerNamePropertyName;
+    /**
+     * The base logger 'domain' property name.
+     */
+    public static final String BASE_LOGGER_DOMAIN_PROPERTY_NAME = Messages.TraceControl_LoggerDomainPropertyName;
 
     // ------------------------------------------------------------------------
     // Attributes
@@ -69,6 +77,7 @@ public class BaseLoggerPropertySource extends BasePropertySource {
     public IPropertyDescriptor[] getPropertyDescriptors() {
         List<IPropertyDescriptor> list = new ArrayList<> ();
         list.add(new ReadOnlyTextPropertyDescriptor(BASE_LOGGER_NAME_PROPERTY_ID, BASE_LOGGER_NAME_PROPERTY_NAME));
+        list.add(new ReadOnlyTextPropertyDescriptor(BASE_LOGGER_DOMAIN_PROPERTY_ID, BASE_LOGGER_DOMAIN_PROPERTY_NAME));
         return list.toArray(new IPropertyDescriptor[list.size()]);
     }
 
@@ -76,6 +85,8 @@ public class BaseLoggerPropertySource extends BasePropertySource {
     public Object getPropertyValue(Object id) {
         if(BASE_LOGGER_NAME_PROPERTY_ID.equals(id)) {
             return fBaseLogger.getName();
+        } else if (BASE_LOGGER_DOMAIN_PROPERTY_ID.equals(id)) {
+            return fBaseLogger.getDomain().name();
         }
         return null;
     }
index 005737bb4e8fa0fce9e49c20bd64f9903e796e91..5ffb8ef2ce9779e74666748d00b2979b2aca9863 100644 (file)
@@ -16,6 +16,7 @@ import java.util.List;
 
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceJulLogLevel;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceLog4jLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.views.messages.Messages;
 import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceLoggerComponent;
 import org.eclipse.tracecompass.tmf.ui.properties.ReadOnlyTextPropertyDescriptor;
@@ -89,7 +90,7 @@ public class TraceLoggerPropertySource extends BasePropertySource {
         List<IPropertyDescriptor> list = new ArrayList<>();
         list.add(new ReadOnlyTextPropertyDescriptor(TRACE_LOGGER_NAME_PROPERTY_ID, TRACE_LOGGER_NAME_PROPERTY_NAME));
         list.add(new ReadOnlyTextPropertyDescriptor(TRACE_LOGGER_STATE_PROPERTY_ID, TRACE_LOGGER_STATE_PROPERTY_NAME));
-        if (!fLogger.getLogLevel().equals(TraceJulLogLevel.LEVEL_UNKNOWN)) {
+        if (!fLogger.getLogLevel().equals(TraceJulLogLevel.LEVEL_UNKNOWN) || !fLogger.getLogLevel().equals(TraceLog4jLogLevel.LEVEL_UNKNOWN)) {
             list.add(new ReadOnlyTextPropertyDescriptor(TRACE_LOGGER_LOGLEVEL_PROPERTY_ID, TRACE_LOGGER_LOGLEVEL_PROPERTY_NAME));
         }
         return list.toArray(new IPropertyDescriptor[list.size()]);
@@ -99,16 +100,14 @@ public class TraceLoggerPropertySource extends BasePropertySource {
     public Object getPropertyValue(Object id) {
         if (TRACE_LOGGER_NAME_PROPERTY_ID.equals(id)) {
             return fLogger.getName();
-        }
-        if (TRACE_LOGGER_LOGLEVEL_PROPERTY_ID.equals(id)) {
+        } else if (TRACE_LOGGER_LOGLEVEL_PROPERTY_ID.equals(id)) {
             StringBuffer buffer = new StringBuffer();
-            if (fLogger.getLogLevelType() != LogLevelType.LOGLEVEL_NONE) {
+            if (!fLogger.getLogLevelType().equals(LogLevelType.LOGLEVEL_NONE)) {
                 buffer.append(fLogger.getLogLevelType().getShortName()).append(' ');
             }
-            buffer.append(fLogger.getLogLevel().name());
+            buffer.append(fLogger.getLogLevel().getInName());
             return buffer.toString();
-        }
-        if (TRACE_LOGGER_STATE_PROPERTY_ID.equals(id)) {
+        } else if (TRACE_LOGGER_STATE_PROPERTY_ID.equals(id)) {
             return fLogger.getState().name();
         }
         return null;
index e63c5ce9436db256ebfe5377b22ceacdb8c671a5..7a54fae731430d9bee357573fa31ef81853f0911 100644 (file)
@@ -1074,7 +1074,9 @@ public class LTTngControlService implements ILttngControlService {
         case JUL:
             return LTTngControlServiceConstants.OPTION_JUL;
         case LOG4J:
+            return LTTngControlServiceConstants.OPTION_LOG4J;
         case PYTHON:
+            return LTTngControlServiceConstants.OPTION_PYTHON;
         case UNKNOWN:
         default:
             return TraceDomainType.UNKNOWN.name();
index 746add39bc571d6e072d5bb9c23f0c7f9dd27709..c347bd4d9c6ec5e6b93e506d4dd80c3eb9f508ef 100644 (file)
@@ -198,6 +198,14 @@ public interface LTTngControlServiceConstants {
      * Command line option for JUL tracer.
      */
     String OPTION_JUL = "-j"; //$NON-NLS-1$
+    /**
+     * Command line option for log4j tracer.
+     */
+    String OPTION_LOG4J = "-l"; //$NON-NLS-1$
+    /**
+     * Command line option for python tracer.
+     */
+    String OPTION_PYTHON = "-p"; //$NON-NLS-1$
     /**
      * Command line option for specifying a session.
      */
index 32aa890e26ca28051149f0f61afbb2b1887eb66d..b1e48c3d4e31e21dc2f7ae4e2c1a064588313842 100644 (file)
@@ -51,6 +51,7 @@ import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainTy
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceEnablement;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceEventType;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceJulLogLevel;
+import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceLog4jLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceLogLevel;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.impl.BaseEventInfo;
 import org.eclipse.tracecompass.internal.lttng2.control.core.model.impl.BufferType;
@@ -385,14 +386,13 @@ public class LTTngControlServiceMI extends LTTngControlService {
             domain.setDomain(TraceDomainType.UST);
             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.setDomain(TraceDomainType.JUL);
             break;
+        case LOG4J:
+            domain = new DomainInfo(Messages.TraceControl_LOG4JDomainDisplayName);
+            domain.setDomain(TraceDomainType.LOG4J);
+            break;
         case UNKNOWN:
             domain = new DomainInfo(Messages.TraceControl_UnknownDomainDisplayName);
             domain.setDomain(TraceDomainType.UNKNOWN);
@@ -661,41 +661,9 @@ public class LTTngControlServiceMI extends LTTngControlService {
             allProviders.add(providerInfo);
         }
 
-        // Getting the loggers information since those are under the UST provider
-        ICommandInput commandJul = createCommand(LTTngControlServiceConstants.COMMAND_LIST, LTTngControlServiceConstants.OPTION_JUL);
-        // Execute JUL listing
-        ICommandResult resultJul = executeCommand(commandJul, monitor, false);
-
-        if (isError(resultJul)) {
-            throw new ExecutionException(Messages.TraceControl_CommandError + commandJul.toString());
-        }
-
-        Document documentJul = getDocumentFromStrings(resultJul.getOutput(), fDocumentBuilder);
-        NodeList rawProvidersJul = documentJul.getElementsByTagName(MIStrings.PID);
-
-        for (int i = 0; i < rawProvidersJul.getLength(); i++) {
-            Node provider = rawProvidersJul.item(i);
-            Node name = getFirstOf(provider.getChildNodes(), MIStrings.NAME);
-            if (name == null) {
-                throw new ExecutionException(Messages.TraceControl_MiInvalidProviderError);
-            }
-
-            Node id = getFirstOf(provider.getChildNodes(), MIStrings.PID_ID);
+        getUstProviderLoggers(allProviders, TraceDomainType.JUL, monitor);
+        getUstProviderLoggers(allProviders, TraceDomainType.LOG4J, monitor);
 
-            if (id != null) {
-                for (int k = 0; k < allProviders.size(); k++) {
-                    if (allProviders.get(k).getPid() == Integer.parseInt(id.getTextContent())) {
-                        Node events = getFirstOf(provider.getChildNodes(), MIStrings.EVENTS);
-                        if (events != null) {
-                            List<ILoggerInfo> loggers = new ArrayList<>();
-                            NodeList rawEvents = events.getChildNodes();
-                            getLoggerInfo(rawEvents, loggers, TraceDomainType.JUL);
-                            allProviders.get(k).setLoggers(loggers);
-                        }
-                    }
-                }
-            }
-        }
         return allProviders;
     }
 
@@ -1042,7 +1010,17 @@ public class LTTngControlServiceMI extends LTTngControlService {
                         loggerInfo.setLogLevelType(LogLevelType.valueOfString(infoNode.getTextContent()));
                         break;
                     case MIStrings.LOGLEVEL:
-                        loggerInfo.setLogLevel(TraceJulLogLevel.valueOfString(infoNode.getTextContent()));
+                        switch (domain) {
+                        case JUL:
+                            loggerInfo.setLogLevel(TraceJulLogLevel.valueOfString(infoNode.getTextContent()));
+                            break;
+                        case LOG4J:
+                            loggerInfo.setLogLevel(TraceLog4jLogLevel.valueOfString(infoNode.getTextContent()));
+                            break;
+                            //$CASES-OMITTED$
+                        default:
+                            break;
+                        }
                         break;
                     case MIStrings.ENABLED:
                         loggerInfo.setState(TraceEnablement.valueOfString(infoNode.getTextContent()));
@@ -1115,6 +1093,72 @@ public class LTTngControlServiceMI extends LTTngControlService {
         return node;
     }
 
+    /**
+     * Retrieve the loggers of a certain domain type for the UST provider.
+     *
+     * @param allProviders
+     *            the list of UST providers
+     * @param domain
+     *            the loggers domain
+     * @param monitor
+     *            progress monitor
+     * @throws ExecutionException
+     */
+    private void getUstProviderLoggers(List<IUstProviderInfo> allProviders, TraceDomainType domain, IProgressMonitor monitor) throws ExecutionException {
+        // Getting the loggers information since those are under the UST provider
+        ICommandInput command = createCommand(LTTngControlServiceConstants.COMMAND_LIST);
+        switch (domain) {
+        case JUL:
+            command.add(LTTngControlServiceConstants.OPTION_JUL);
+            break;
+        case LOG4J:
+            command.add(LTTngControlServiceConstants.OPTION_LOG4J);
+            break;
+        case PYTHON:
+            command.add(LTTngControlServiceConstants.OPTION_PYTHON);
+            break;
+            //$CASES-OMITTED$
+        default:
+            break;
+        }
+        // Execute listing
+        ICommandResult result = executeCommand(command, monitor, false);
+
+        if (isError(result)) {
+            throw new ExecutionException(Messages.TraceControl_CommandError + command.toString());
+        }
+
+        Document document = getDocumentFromStrings(result.getOutput(), fDocumentBuilder);
+        NodeList rawProviders = document.getElementsByTagName(MIStrings.PID);
+
+        for (int i = 0; i < rawProviders.getLength(); i++) {
+            Node provider = rawProviders.item(i);
+            Node name = getFirstOf(provider.getChildNodes(), MIStrings.NAME);
+            if (name == null) {
+                throw new ExecutionException(Messages.TraceControl_MiInvalidProviderError);
+            }
+
+            Node id = getFirstOf(provider.getChildNodes(), MIStrings.PID_ID);
+
+            if (id != null) {
+                for (int k = 0; k < allProviders.size(); k++) {
+                    if (allProviders.get(k).getPid() == Integer.parseInt(id.getTextContent())) {
+                        Node events = getFirstOf(provider.getChildNodes(), MIStrings.EVENTS);
+                        if (events != null) {
+                            List<ILoggerInfo> loggers = new ArrayList<>();
+                            NodeList rawEvents = events.getChildNodes();
+                            getLoggerInfo(rawEvents, loggers, domain);
+                            for (ILoggerInfo logger : loggers) {
+                                logger.setDomain(domain);
+                            }
+                            allProviders.get(k).setLoggers(loggers);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     @Override
     public @NonNull List<String> getContextList(IProgressMonitor monitor) throws ExecutionException {
         if (!isVersionSupported("2.8.0")) { //$NON-NLS-1$
This page took 0.056828 seconds and 5 git commands to generate.