Inital code drop of logback-config.
[controller.git] / opendaylight / config / logback-config / src / main / java / org / opendaylight / controller / config / yang / logback / config / LogbackModuleFactory.java
diff --git a/opendaylight/config/logback-config/src/main/java/org/opendaylight/controller/config/yang/logback/config/LogbackModuleFactory.java b/opendaylight/config/logback-config/src/main/java/org/opendaylight/controller/config/yang/logback/config/LogbackModuleFactory.java
new file mode 100644 (file)
index 0000000..eb0c7da
--- /dev/null
@@ -0,0 +1,213 @@
+/**
+ * Generated file
+
+ * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ * Generated at: Wed Jul 17 15:26:45 CEST 2013
+ *
+ * Do not modifiy this file unless it is present under src/main directory
+ */
+package org.opendaylight.controller.config.yang.logback.config;
+
+import java.util.*;
+import java.util.Map.Entry;
+
+import org.apache.commons.lang3.StringUtils;
+import org.opendaylight.controller.config.api.DependencyResolver;
+import org.opendaylight.controller.config.api.ModuleIdentifier;
+import org.slf4j.LoggerFactory;
+
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.LoggerComparator;
+import ch.qos.logback.core.Appender;
+import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
+import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+
+/**
+*
+*/
+public class LogbackModuleFactory
+        extends
+        org.opendaylight.controller.config.yang.logback.config.AbstractLogbackModuleFactory {
+
+    private static final String INSTANCE_NAME = "singleton";
+    private Map<String, LoggerTO> loggersDTOs;
+    private Map<String, RollingFileAppenderTO> rollingDTOs;
+    private Map<String, ConsoleAppenderTO> consoleDTOs;
+
+    @Override
+    public LogbackModule instantiateModule(String instanceName,
+            DependencyResolver dependencyResolver) {
+        Preconditions.checkArgument(instanceName.equals(INSTANCE_NAME),
+                "There should be just one instance of logback, named "
+                        + INSTANCE_NAME);
+        prepareDTOs();
+        LogbackModule module = new LogbackModule(new ModuleIdentifier(
+                getImplementationName(), INSTANCE_NAME), dependencyResolver);
+        module.setConsoleAppenderTO(Lists.newArrayList(consoleDTOs.values()));
+        module.setRollingFileAppenderTO(Lists.newArrayList(rollingDTOs.values()));
+        module.setLoggerTO(Lists.newArrayList(loggersDTOs.values()));
+        return module;
+    }
+
+    @Override
+    public LogbackModule instantiateModule(String instanceName,
+            DependencyResolver dependencyResolver, LogbackModule oldModule,
+            AutoCloseable oldInstance) {
+        Preconditions.checkArgument(instanceName.equals(INSTANCE_NAME),
+                "There should be just one instance of logback, named "
+                        + INSTANCE_NAME);
+        prepareDTOs();
+        LogbackModule module = new LogbackModule(new ModuleIdentifier(
+                getImplementationName(), INSTANCE_NAME), dependencyResolver,
+                oldModule, oldInstance);
+        module.setConsoleAppenderTO(Lists.newArrayList(consoleDTOs.values()));
+        /*
+         * module.setJCloudsAppender(Lists.newArrayList(jcloudsDTOs.values()));
+         */
+        module.setRollingFileAppenderTO(Lists.newArrayList(rollingDTOs.values()));
+        module.setLoggerTO(Lists.newArrayList(loggersDTOs.values()));
+        return module;
+    }
+
+    private void prepareDTOs() {
+        LoggerContext context = (LoggerContext) LoggerFactory
+                .getILoggerFactory();
+        this.loggersDTOs = prepareLoggersDTOs(context);
+        prepareAppendersDTOs(context);
+    }
+
+    private void prepareAppendersDTOs(LoggerContext context) {
+        this.rollingDTOs = new HashMap<>();
+        this.consoleDTOs = new HashMap<>();
+        ch.qos.logback.core.rolling.RollingFileAppender<ILoggingEvent> rollingApp;
+        ch.qos.logback.core.ConsoleAppender<ILoggingEvent> consoleApp;
+        Map<Logger, List<Appender<ILoggingEvent>>> appendersAll = new HashMap<>();
+        for (Logger log : context.getLoggerList()) {
+            List<Appender<ILoggingEvent>> appenders = new ArrayList<>();
+            Iterator<Appender<ILoggingEvent>> iter = log.iteratorForAppenders();
+            while (iter.hasNext()) {
+                Appender<ILoggingEvent> element = iter.next();
+                appenders.add(element);
+            }
+            appendersAll.put(log, appenders);
+        }
+        for (List<ch.qos.logback.core.Appender<ILoggingEvent>> appEntry : appendersAll.values()) {
+            for (ch.qos.logback.core.Appender<ILoggingEvent> appender : appEntry) {
+                if (appender instanceof ch.qos.logback.core.rolling.RollingFileAppender<?>) {
+                    RollingFileAppenderTO app = new RollingFileAppenderTO();
+                    rollingApp = (ch.qos.logback.core.rolling.RollingFileAppender< ILoggingEvent >) appender;
+                    app.setAppend(rollingApp.isAppend());
+                    PatternLayoutEncoder encoder = (PatternLayoutEncoder) rollingApp
+                            .getEncoder();
+                    app.setEncoderPattern(encoder.getPattern());
+                    app.setFileName(rollingApp.getFile());
+                    FixedWindowRollingPolicy rollingPolicy = (FixedWindowRollingPolicy) rollingApp
+                            .getRollingPolicy();
+                    app.setMaxIndex(rollingPolicy.getMaxIndex());
+                    app.setMinIndex(rollingPolicy.getMinIndex());
+                    SizeBasedTriggeringPolicy<ILoggingEvent> triggeringPolicy = (SizeBasedTriggeringPolicy<ILoggingEvent>) rollingApp
+                            .getTriggeringPolicy();
+                    app.setMaxFileSize(triggeringPolicy.getMaxFileSize());
+                    app.setFileNamePattern(rollingPolicy.getFileNamePattern());
+                    app.setName(rollingApp.getName());
+                    this.rollingDTOs.put(rollingApp.getName(), app);
+                }
+                if (appender instanceof ch.qos.logback.core.ConsoleAppender<?>) {
+                    ConsoleAppenderTO app = new ConsoleAppenderTO();
+                    consoleApp = (ch.qos.logback.core.ConsoleAppender<ILoggingEvent>) appender;
+                    consoleApp.getCopyOfAttachedFiltersList();
+                    PatternLayoutEncoder encoder = (PatternLayoutEncoder) consoleApp
+                            .getEncoder();
+                    app.setEncoderPattern(encoder.getPattern());
+                    app.setName(consoleApp.getName());
+                    app.setThresholdFilter(context.getLogger(
+                            Logger.ROOT_LOGGER_NAME).getEffectiveLevel().levelStr);
+                    this.consoleDTOs.put(consoleApp.getName(), app);
+                }
+            }
+        }
+    }
+
+    private Map<String, LoggerTO> prepareLoggersDTOs(
+            LoggerContext context) {
+        Map<String, LoggerTO> DTOs = new HashMap<>();
+        List<String> appenders = new ArrayList<>();
+        List<org.slf4j.Logger> loggersToBeAdd = removeUnusableLoggers(
+                context.getLoggerList(),
+                context.getLogger(Logger.ROOT_LOGGER_NAME));
+        for (org.slf4j.Logger log : loggersToBeAdd) {
+            LoggerTO logger = new LoggerTO();
+            if (((Logger) log).getLevel() != null)
+                logger.setLevel(((Logger) log).getLevel().levelStr);
+            else
+                logger.setLevel(((Logger) log).getEffectiveLevel().levelStr);
+            logger.setLoggerName(log.getName());
+            Iterator<Appender<ILoggingEvent>> iter = ((Logger) log)
+                    .iteratorForAppenders();
+            while (iter.hasNext()) {
+                Appender<ILoggingEvent> element = iter.next();
+                appenders.add(element.getName());
+            }
+            logger.setAppenders(appenders);
+            DTOs.put(log.getName(), logger);
+            appenders = new ArrayList<>();
+
+        }
+        return DTOs;
+    }
+
+    private List<org.slf4j.Logger> removeUnusableLoggers(
+            List<Logger> loggerList, Logger rootLogger) {
+        Collections.sort(loggerList, new LoggerComparator());
+        Map<String, org.slf4j.Logger> loggersToReturn = new HashMap<>();
+
+        for (org.slf4j.Logger log : loggerList) {
+            boolean shouldAdd = true;
+            for (Entry<String, org.slf4j.Logger> entry : loggersToReturn
+                    .entrySet()) {
+                if (StringUtils.contains(log.getName(), entry.getKey())) {
+                    if (((Logger) log).getLevel() != null
+                            && ((Logger) log).getLevel().equals(
+                                    ((Logger) entry.getValue()).getLevel())
+                            && !((Logger) log).iteratorForAppenders().hasNext()) {
+                        shouldAdd = false;
+                        break;
+                    }
+                    if (((Logger) log).getLevel() == null
+                            && ((Logger) log).getEffectiveLevel().equals(
+                                    ((Logger) entry.getValue())
+                                            .getEffectiveLevel())
+                            && !((Logger) log).iteratorForAppenders().hasNext()) {
+                        shouldAdd = false;
+                        break;
+                    }
+                }
+                if (((Logger) log).getLevel() != null
+                        && ((Logger) log).getLevel().equals(
+                                rootLogger.getLevel())
+                        && !((Logger) log).iteratorForAppenders().hasNext()) {
+                    shouldAdd = false;
+                    break;
+                }
+                if (((Logger) log).getLevel() == null
+                        && ((Logger) log).getEffectiveLevel().equals(
+                                rootLogger.getEffectiveLevel())
+                        && !((Logger) log).iteratorForAppenders().hasNext()) {
+                    shouldAdd = false;
+                    break;
+                }
+            }
+            if (shouldAdd) {
+                loggersToReturn.put(log.getName(), log);
+            }
+        }
+        return Lists.newArrayList(loggersToReturn.values());
+    }
+
+}