Fix: remove JUL loglevel filtering from the agent
[lttng-ust.git] / liblttng-ust-jul / org / lttng / ust / jul / LTTngSessiondCmd2_4.java
index 4b893e0b596662a3ebfd2523fa6acd0577b1039d..6808326743a9b845965b0954c6ec93625d6dfc41 100644 (file)
@@ -20,9 +20,13 @@ package org.lttng.ust.jul;
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
+import java.lang.Object;
 import java.util.logging.Logger;
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.List;
+import java.util.Set;
 import java.util.Enumeration;
 
 public interface LTTngSessiondCmd2_4 {
@@ -31,6 +35,12 @@ public interface LTTngSessiondCmd2_4 {
         */
        final static int NAME_MAX = 255;
 
+       /*
+        * Size of a primitive type int in byte. Because you know, Java can't
+        * provide that since it does not makes sense...
+        */
+       final static int INT_SIZE = 4;
+
        public interface SessiondResponse {
                /**
                 * Gets a byte array of the command so that it may be streamed
@@ -56,7 +66,10 @@ public interface LTTngSessiondCmd2_4 {
                /** Enable logger by name. */
                CMD_ENABLE(2),
                /** Disable logger by name. */
-               CMD_DISABLE(3);
+               CMD_DISABLE(3),
+               /** Registration done */
+               CMD_REG_DONE(4);
+
                private int code;
 
                private lttng_jul_command(int c) {
@@ -106,15 +119,21 @@ public interface LTTngSessiondCmd2_4 {
        public class sessiond_enable_handler implements SessiondResponse, SessiondCommand {
                private final static int SIZE = 4;
                public String name;
+               public int lttngLogLevel;
+               public int lttngLogLevelType;
 
                /** Return status code to the session daemon. */
                public lttng_jul_ret_code code;
 
                @Override
                public void populate(byte[] data) {
+                       int data_offset = INT_SIZE * 2;
+
                        ByteBuffer buf = ByteBuffer.wrap(data);
                        buf.order(ByteOrder.LITTLE_ENDIAN);
-                       name = new String(data, 0, data.length);
+                       lttngLogLevel = buf.getInt();
+                       lttngLogLevelType = buf.getInt();
+                       name = new String(data, data_offset, data.length - data_offset);
                }
 
                @Override
@@ -133,18 +152,29 @@ public interface LTTngSessiondCmd2_4 {
                 * @return Event name as a string if the event is NOT found thus was
                 * not enabled.
                 */
-               public String execute(LTTngLogHandler handler) {
-                       Logger logger;
+               public void execute(LTTngLogHandler handler,
+                               Map<String, ArrayList<LTTngEvent>> eventMap, Set wildCardSet) {
+                       ArrayList<LTTngEvent> bucket;
+                       LTTngEvent event;
 
                        if (name == null) {
                                this.code = lttng_jul_ret_code.CODE_INVALID_CMD;
-                               return null;
+                               return;
                        }
 
                        /* Wild card to enable ALL logger. */
                        if (name.trim().equals("*")) {
                                String loggerName;
                                Enumeration loggers = handler.logManager.getLoggerNames();
+
+                               /* Add event to the wildcard set. */
+                               wildCardSet.add(new LTTngEvent(name.trim(), lttngLogLevel,
+                                                       lttngLogLevelType));
+
+                               /*
+                                * Create an event for each logger found and attach it to the
+                                * handler.
+                                */
                                while (loggers.hasMoreElements()) {
                                        loggerName = loggers.nextElement().toString();
                                        /* Somehow there is always an empty string at the end. */
@@ -152,36 +182,69 @@ public interface LTTngSessiondCmd2_4 {
                                                continue;
                                        }
 
-                                       logger = handler.logManager.getLogger(loggerName);
-                                       logger.addHandler(handler);
+                                       event = new LTTngEvent(loggerName, lttngLogLevel,
+                                                       lttngLogLevelType);
+                                       /* Attach event to Log handler to it can be traced. */
+                                       handler.attachEvent(event);
+
+                                       /*
+                                        * The agent timer call this function with eventMap set to
+                                        * null because it already has a reference to an existing
+                                        * event so is should not try to add a new one here.
+                                        */
+                                       if (eventMap != null) {
+                                               bucket = eventMap.get(loggerName);
+                                               if (bucket == null) {
+                                                       bucket = new ArrayList<LTTngEvent>();
+                                                       eventMap.put(loggerName, bucket);
+                                               }
+                                               bucket.add(event);
+                                       }
+                               }
+                       } else {
+                               event = new LTTngEvent(name.trim(), lttngLogLevel,
+                                               lttngLogLevelType);
+                               /* Attach event to Log handler to it can be traced. */
+                               handler.attachEvent(event);
+
+                               /*
+                                * The agent timer call this function with eventMap set to
+                                * null because it already has a reference to an existing
+                                * event so is should not try to add a new one here.
+                                */
+                               if (eventMap != null) {
+                                       bucket = eventMap.get(name.trim());
+                                       if (bucket == null) {
+                                               bucket = new ArrayList<LTTngEvent>();
+                                               eventMap.put(name.trim(), bucket);
+                                       }
+                                       bucket.add(event);
                                }
-                               this.code = lttng_jul_ret_code.CODE_SUCCESS_CMD;
-                               return null;
                        }
 
                        this.code = lttng_jul_ret_code.CODE_SUCCESS_CMD;
-                       logger = handler.logManager.getLogger(name.trim());
-                       if (logger != null) {
-                               logger.addHandler(handler);
-                               return null;
-                       } else {
-                               return new String(name);
-                       }
+                       return;
                }
        }
 
        public class sessiond_disable_handler implements SessiondResponse, SessiondCommand {
                private final static int SIZE = 4;
                public String name;
+               public int lttngLogLevel;
+               public int lttngLogLevelType;
 
                /** Return status code to the session daemon. */
                public lttng_jul_ret_code code;
 
                @Override
                public void populate(byte[] data) {
+                       int data_offset = INT_SIZE * 2;
+
                        ByteBuffer buf = ByteBuffer.wrap(data);
-                       buf.order(ByteOrder.BIG_ENDIAN);
-                       name = new String(data, 0, data.length);
+                       buf.order(ByteOrder.LITTLE_ENDIAN);
+                       lttngLogLevel = buf.getInt();
+                       lttngLogLevelType = buf.getInt();
+                       name = new String(data, data_offset, data.length - data_offset);
                }
 
                @Override
@@ -197,8 +260,10 @@ public interface LTTngSessiondCmd2_4 {
                 * Execute disable handler action which is to disable the given handler
                 * to the received name.
                 */
-               public void execute(LTTngLogHandler handler) {
-                       Logger logger;
+               public void execute(LTTngLogHandler handler,
+                               Map<String, ArrayList<LTTngEvent>> eventMap, Set wildCardSet) {
+                       ArrayList<LTTngEvent> bucket;
+                       LTTngEvent event;
 
                        if (name == null) {
                                this.code = lttng_jul_ret_code.CODE_INVALID_CMD;
@@ -209,6 +274,11 @@ public interface LTTngSessiondCmd2_4 {
                        if (name.trim().equals("*")) {
                                String loggerName;
                                Enumeration loggers = handler.logManager.getLoggerNames();
+
+                               /* Remove event from the wildcard set. */
+                               wildCardSet.remove(new LTTngEvent(name.trim(), lttngLogLevel,
+                                                       lttngLogLevelType));
+
                                while (loggers.hasMoreElements()) {
                                        loggerName = loggers.nextElement().toString();
                                        /* Somehow there is always an empty string at the end. */
@@ -216,20 +286,37 @@ public interface LTTngSessiondCmd2_4 {
                                                continue;
                                        }
 
-                                       logger = handler.logManager.getLogger(loggerName);
-                                       logger.removeHandler(handler);
+                                       event = new LTTngEvent(loggerName, lttngLogLevel,
+                                                       lttngLogLevelType);
+
+                                       bucket = eventMap.get(loggerName);
+                                       if (bucket != null) {
+                                               handler.detachEvent(event);
+                                               bucket.remove(event);
+                                               if (bucket.isEmpty() == true) {
+                                                       eventMap.remove(bucket);
+                                               }
+                                       }
                                }
                                this.code = lttng_jul_ret_code.CODE_SUCCESS_CMD;
-                               return;
-                       }
-
-                       logger = handler.logManager.getLogger(name.trim());
-                       if (logger == null) {
-                               this.code = lttng_jul_ret_code.CODE_UNK_LOGGER_NAME;
                        } else {
-                               logger.removeHandler(handler);
-                               this.code = lttng_jul_ret_code.CODE_SUCCESS_CMD;
+                               event = new LTTngEvent(this.name, lttngLogLevel,
+                                               lttngLogLevelType);
+
+                               bucket = eventMap.get(this.name);
+                               if (bucket != null) {
+                                       handler.detachEvent(event);
+                                       bucket.remove(event);
+                                       if (bucket.isEmpty() == true) {
+                                               eventMap.remove(bucket);
+                                       }
+                                       this.code = lttng_jul_ret_code.CODE_SUCCESS_CMD;
+                               } else {
+                                       this.code = lttng_jul_ret_code.CODE_UNK_LOGGER_NAME;
+                               }
                        }
+
+                       return;
                }
        }
 
This page took 0.025992 seconds and 4 git commands to generate.