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 {
*/
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
/** 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) {
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
* @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. */
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
* 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;
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. */
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;
}
}