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