732161d463856d338e379fd4f1be29d14c7b7be8
[controller.git] / opendaylight / config / logback-config / src / main / java / org / opendaylight / controller / config / yang / logback / config / LogbackModuleFactory.java
1 /**
2  * Generated file
3
4  * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
5  * Generated at: Wed Jul 17 15:26:45 CEST 2013
6  *
7  * Do not modifiy this file unless it is present under src/main directory
8  */
9 package org.opendaylight.controller.config.yang.logback.config;
10
11 import java.util.*;
12 import java.util.Map.Entry;
13
14 import org.apache.commons.lang3.StringUtils;
15 import org.opendaylight.controller.config.api.DependencyResolver;
16 import org.opendaylight.controller.config.api.ModuleIdentifier;
17 import org.slf4j.LoggerFactory;
18
19 import ch.qos.logback.classic.Logger;
20 import ch.qos.logback.classic.LoggerContext;
21 import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
22 import ch.qos.logback.classic.spi.ILoggingEvent;
23 import ch.qos.logback.classic.spi.LoggerComparator;
24 import ch.qos.logback.core.Appender;
25 import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
26 import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
27 import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
28
29 import com.google.common.base.Preconditions;
30 import com.google.common.collect.Lists;
31
32 /**
33 *
34 */
35 public class LogbackModuleFactory extends
36         org.opendaylight.controller.config.yang.logback.config.AbstractLogbackModuleFactory {
37
38     private static final String INSTANCE_NAME = "singleton";
39     private Map<String, LoggerTO> loggersDTOs;
40     private Map<String, RollingFileAppenderTO> rollingDTOs;
41     private Map<String, ConsoleAppenderTO> consoleDTOs;
42     private Map<String, FileAppenderTO> fileDTOs;
43
44     @Override
45     public LogbackModule instantiateModule(String instanceName, DependencyResolver dependencyResolver) {
46         Preconditions.checkArgument(instanceName.equals(INSTANCE_NAME),
47                 "There should be just one instance of logback, named " + INSTANCE_NAME);
48         prepareDTOs();
49         LogbackModule module = new LogbackModule(new ModuleIdentifier(getImplementationName(), INSTANCE_NAME),
50                 dependencyResolver);
51         module.setFileAppenderTO(Lists.newArrayList(fileDTOs.values()));
52         module.setConsoleAppenderTO(Lists.newArrayList(consoleDTOs.values()));
53         module.setRollingFileAppenderTO(Lists.newArrayList(rollingDTOs.values()));
54         module.setLoggerTO(Lists.newArrayList(loggersDTOs.values()));
55         return module;
56     }
57
58     @Override
59     public LogbackModule instantiateModule(String instanceName, DependencyResolver dependencyResolver,
60             LogbackModule oldModule, AutoCloseable oldInstance) {
61         Preconditions.checkArgument(instanceName.equals(INSTANCE_NAME),
62                 "There should be just one instance of logback, named " + INSTANCE_NAME);
63         prepareDTOs();
64         LogbackModule module = new LogbackModule(new ModuleIdentifier(getImplementationName(), INSTANCE_NAME),
65                 dependencyResolver, oldModule, oldInstance);
66         module.setConsoleAppenderTO(Lists.newArrayList(consoleDTOs.values()));
67         /*
68          * module.setJCloudsAppender(Lists.newArrayList(jcloudsDTOs.values()));
69          */
70         module.setFileAppenderTO(Lists.newArrayList(fileDTOs.values()));
71         module.setRollingFileAppenderTO(Lists.newArrayList(rollingDTOs.values()));
72         module.setLoggerTO(Lists.newArrayList(loggersDTOs.values()));
73         return module;
74     }
75
76     private void prepareDTOs() {
77         LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
78         this.loggersDTOs = prepareLoggersDTOs(context);
79         prepareAppendersDTOs(context);
80     }
81
82     private void prepareAppendersDTOs(LoggerContext context) {
83         this.rollingDTOs = new HashMap<>();
84         this.consoleDTOs = new HashMap<>();
85         this.fileDTOs = new HashMap<>();
86         ch.qos.logback.core.rolling.RollingFileAppender<ILoggingEvent> rollingApp;
87         ch.qos.logback.core.ConsoleAppender<ILoggingEvent> consoleApp;
88         ch.qos.logback.core.FileAppender<ILoggingEvent> fileApp;
89         Map<Logger, List<Appender<ILoggingEvent>>> appendersAll = new HashMap<>();
90         for (Logger log : context.getLoggerList()) {
91             List<Appender<ILoggingEvent>> appenders = new ArrayList<>();
92             Iterator<Appender<ILoggingEvent>> iter = log.iteratorForAppenders();
93             while (iter.hasNext()) {
94                 Appender<ILoggingEvent> element = iter.next();
95                 appenders.add(element);
96             }
97             appendersAll.put(log, appenders);
98         }
99         for (List<ch.qos.logback.core.Appender<ILoggingEvent>> appEntry : appendersAll.values()) {
100             for (ch.qos.logback.core.Appender<ILoggingEvent> appender : appEntry) {
101                 if (appender instanceof ch.qos.logback.core.rolling.RollingFileAppender<?>) {
102                     RollingFileAppenderTO app = new RollingFileAppenderTO();
103                     rollingApp = (ch.qos.logback.core.rolling.RollingFileAppender<ILoggingEvent>) appender;
104                     app.setAppend(rollingApp.isAppend());
105                     PatternLayoutEncoder encoder = (PatternLayoutEncoder) rollingApp.getEncoder();
106                     app.setEncoderPattern(encoder.getPattern());
107                     app.setFileName(rollingApp.getFile());
108                     if (rollingApp.getRollingPolicy() instanceof FixedWindowRollingPolicy) {
109                         FixedWindowRollingPolicy rollingPolicy = (FixedWindowRollingPolicy) rollingApp
110                                 .getRollingPolicy();
111                         app.setMaxIndex(rollingPolicy.getMaxIndex());
112                         app.setMinIndex(rollingPolicy.getMinIndex());
113                         app.setFileNamePattern(rollingPolicy.getFileNamePattern());
114                         app.setRollingPolicyType("FixedWindowRollingPolicy");
115                     } else if (rollingApp.getRollingPolicy() instanceof TimeBasedRollingPolicy<?>) {
116                         TimeBasedRollingPolicy rollingPolicy = (TimeBasedRollingPolicy) rollingApp.getRollingPolicy();
117                         app.setRollingPolicyType("TimeBasedRollingPolicy");
118                         app.setFileNamePattern(rollingPolicy.getFileNamePattern());
119                         app.setMaxHistory(rollingPolicy.getMaxHistory());
120                         app.setCleanHistoryOnStart(rollingPolicy.isCleanHistoryOnStart());
121                     }
122                     SizeBasedTriggeringPolicy<ILoggingEvent> triggeringPolicy = (SizeBasedTriggeringPolicy<ILoggingEvent>) rollingApp
123                             .getTriggeringPolicy();
124                     app.setMaxFileSize(triggeringPolicy.getMaxFileSize());
125                     app.setName(rollingApp.getName());
126                     this.rollingDTOs.put(rollingApp.getName(), app);
127                 } else if (appender instanceof ch.qos.logback.core.FileAppender<?>) {
128                     FileAppenderTO app = new FileAppenderTO();
129                     fileApp = (ch.qos.logback.core.FileAppender<ILoggingEvent>) appender;
130                     app.setName(fileApp.getName());
131                     app.setAppend(fileApp.isAppend());
132                     app.setFileName(fileApp.getFile());
133                     PatternLayoutEncoder encoder = (PatternLayoutEncoder) fileApp.getEncoder();
134                     app.setEncoderPattern(encoder.getPattern());
135                     this.fileDTOs.put(fileApp.getName(), app);
136                 }
137                 if (appender instanceof ch.qos.logback.core.ConsoleAppender<?>) {
138                     ConsoleAppenderTO app = new ConsoleAppenderTO();
139                     consoleApp = (ch.qos.logback.core.ConsoleAppender<ILoggingEvent>) appender;
140                     consoleApp.getCopyOfAttachedFiltersList();
141                     PatternLayoutEncoder encoder = (PatternLayoutEncoder) consoleApp.getEncoder();
142                     app.setEncoderPattern(encoder.getPattern());
143                     app.setName(consoleApp.getName());
144                     app.setThresholdFilter(context.getLogger(Logger.ROOT_LOGGER_NAME).getEffectiveLevel().levelStr);
145                     this.consoleDTOs.put(consoleApp.getName(), app);
146                 }
147             }
148         }
149     }
150
151     private Map<String, LoggerTO> prepareLoggersDTOs(LoggerContext context) {
152         Map<String, LoggerTO> DTOs = new HashMap<>();
153         List<String> appenders = new ArrayList<>();
154         List<org.slf4j.Logger> loggersToBeAdd = removeUnusableLoggers(context.getLoggerList(),
155                 context.getLogger(Logger.ROOT_LOGGER_NAME));
156         for (org.slf4j.Logger log : loggersToBeAdd) {
157             LoggerTO logger = new LoggerTO();
158             if (((Logger) log).getLevel() != null)
159                 logger.setLevel(((Logger) log).getLevel().levelStr);
160             else
161                 logger.setLevel(((Logger) log).getEffectiveLevel().levelStr);
162             logger.setLoggerName(log.getName());
163             Iterator<Appender<ILoggingEvent>> iter = ((Logger) log).iteratorForAppenders();
164             while (iter.hasNext()) {
165                 Appender<ILoggingEvent> element = iter.next();
166                 appenders.add(element.getName());
167             }
168             logger.setAppenders(appenders);
169             DTOs.put(log.getName(), logger);
170             appenders = new ArrayList<>();
171
172         }
173         return DTOs;
174     }
175
176     private List<org.slf4j.Logger> removeUnusableLoggers(List<Logger> loggerList, Logger rootLogger) {
177         Collections.sort(loggerList, new LoggerComparator());
178         Map<String, org.slf4j.Logger> loggersToReturn = new HashMap<>();
179
180         for (org.slf4j.Logger log : loggerList) {
181             boolean shouldAdd = true;
182             for (Entry<String, org.slf4j.Logger> entry : loggersToReturn.entrySet()) {
183                 if (StringUtils.contains(log.getName(), entry.getKey())) {
184                     if (((Logger) log).getLevel() != null
185                             && ((Logger) log).getLevel().equals(((Logger) entry.getValue()).getLevel())
186                             && !((Logger) log).iteratorForAppenders().hasNext()) {
187                         shouldAdd = false;
188                         break;
189                     }
190                     if (((Logger) log).getLevel() == null
191                             && ((Logger) log).getEffectiveLevel().equals(
192                                     ((Logger) entry.getValue()).getEffectiveLevel())
193                             && !((Logger) log).iteratorForAppenders().hasNext()) {
194                         shouldAdd = false;
195                         break;
196                     }
197                 }
198                 if (((Logger) log).getLevel() != null && ((Logger) log).getLevel().equals(rootLogger.getLevel())
199                         && !((Logger) log).iteratorForAppenders().hasNext()) {
200                     shouldAdd = false;
201                     break;
202                 }
203                 if (((Logger) log).getLevel() == null
204                         && ((Logger) log).getEffectiveLevel().equals(rootLogger.getEffectiveLevel())
205                         && !((Logger) log).iteratorForAppenders().hasNext()) {
206                     shouldAdd = false;
207                     break;
208                 }
209             }
210             if (shouldAdd) {
211                 loggersToReturn.put(log.getName(), log);
212             }
213         }
214         return Lists.newArrayList(loggersToReturn.values());
215     }
216
217 }