/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.classic.control; import java.util.HashMap; import java.util.Map; import ch.qos.logback.classic.Level; import ch.qos.logback.core.CoreConstants; /** * This logger context quite optimized for logger retrieval. * * <p>It uses a single loggerMap where the key is the logger name and the value * is the logger. * * <p>This approach acts a lower limit for what is achievable for low memory * usage as well as low creation/retrieval times. However, this simplicity also * results in slow effective level evaluation, the most frequently exercised * part of the API. * * <p>This class is expected to contain correct results, and serve to verify * the correctness of a more sophisticated implementation. * * @author ceki */ public class ControlLoggerContext { private ControlLogger root; // // Hashtable loggerMap = new Hashtable(); Map<String, ControlLogger> loggerMap = new HashMap<String, ControlLogger>(); public ControlLoggerContext() { this.root = new ControlLogger("root", null); this.root.setLevel(Level.DEBUG); } /** * Return this contexts root logger * * @return */ public ControlLogger getRootLogger() { return root; } public ControlLogger exists(String name) { if (name == null) { throw new IllegalArgumentException("name parameter cannot be null"); } synchronized (loggerMap) { return (ControlLogger) loggerMap.get(name); } } public final ControlLogger getLogger(String name) { if (name == null) { throw new IllegalArgumentException("name parameter cannot be null"); } synchronized (loggerMap) { ControlLogger cl = (ControlLogger) loggerMap.get(name); if (cl != null) { return cl; } ControlLogger parent = this.root; int i = 0; while (true) { i = name.indexOf(CoreConstants.DOT, i); if (i == -1) { // System.out.println("FINAL-Creating logger named [" + name + "] with // parent " + parent.getName()); cl = new ControlLogger(name, parent); loggerMap.put(name, cl); return cl; } else { String parentName = name.substring(0, i); ControlLogger p = (ControlLogger) loggerMap.get(parentName); if (p == null) { // System.out.println("INTERMEDIARY-Creating logger [" + parentName // + "] with parent " + parent.getName()); p = new ControlLogger(parentName, parent); loggerMap.put(parentName, p); } parent = p; } // make i move past the last found dot. i++; } } } public Map<String, ControlLogger> getLoggerMap() { return loggerMap; } }