EMMA Coverage Report (generated Mon Aug 23 17:21:34 CEST 2010)
[all classes][dmg.cells.nucleus]

COVERAGE SUMMARY FOR SOURCE FILE [LogbackShell.java]

nameclass, %method, %block, %line, %
LogbackShell.java100% (1/1)8%   (1/12)2%   (7/418)4%   (3/69)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class LogbackShell100% (1/1)8%   (1/12)2%   (7/418)4%   (3/69)
ac_log_attach_$_2 (Args): String 0%   (0/1)0%   (0/60)0%   (0/10)
ac_log_detach_$_2 (Args): String 0%   (0/1)0%   (0/41)0%   (0/7)
ac_log_logger_ls (Args): String 0%   (0/1)0%   (0/129)0%   (0/15)
ac_log_logger_reset_$_1 (Args): String 0%   (0/1)0%   (0/36)0%   (0/6)
ac_log_logger_set_$_2 (Args): String 0%   (0/1)0%   (0/43)0%   (0/7)
getAppenders (): Map 0%   (0/1)0%   (0/35)0%   (0/9)
getAppenders (Logger): List 0%   (0/1)0%   (0/18)0%   (0/5)
getLogger (String): Logger 0%   (0/1)0%   (0/14)0%   (0/1)
getLoggers (): List 0%   (0/1)0%   (0/4)0%   (0/1)
getNames (List): List 0%   (0/1)0%   (0/24)0%   (0/4)
toString (Level): String 0%   (0/1)0%   (0/7)0%   (0/1)
LogbackShell (): void 100% (1/1)100% (7/7)100% (3/3)

1package dmg.cells.nucleus;
2 
3import java.util.Iterator;
4import java.util.List;
5import java.util.ArrayList;
6import java.util.Formatter;
7import java.util.Collection;
8import java.util.Collections;
9import java.util.Comparator;
10import java.util.Map;
11import java.util.HashMap;
12 
13import ch.qos.logback.classic.Level;
14import ch.qos.logback.classic.Logger;
15import ch.qos.logback.classic.LoggerContext;
16import ch.qos.logback.core.Appender;
17import ch.qos.logback.classic.spi.ILoggingEvent;
18 
19import org.slf4j.LoggerFactory;
20 
21import dmg.util.Args;
22 
23public class LogbackShell
24{
25    private LoggerContext _context;
26 
27    public LogbackShell()
28    {
29        _context = (LoggerContext) LoggerFactory.getILoggerFactory();
30    }
31 
32    private Logger getLogger(String name)
33    {
34        return name.equals("root")
35            ? _context.getLogger(Logger.ROOT_LOGGER_NAME)
36            : _context.getLogger(name);
37    }
38 
39    private List<Logger> getLoggers()
40    {
41        return _context.getLoggerList();
42    }
43 
44    private Map<String,Appender<ILoggingEvent>> getAppenders()
45    {
46        Map<String,Appender<ILoggingEvent>> appenders =
47            new HashMap<String,Appender<ILoggingEvent>>();
48        for (Logger logger: getLoggers()) {
49            Iterator<Appender<ILoggingEvent>> i = logger.iteratorForAppenders();
50            while (i.hasNext()) {
51                Appender<ILoggingEvent> appender = i.next();
52                appenders.put(appender.getName(), appender);
53            }
54        }
55        return appenders;
56    }
57 
58    private List<Appender<ILoggingEvent>> getAppenders(Logger logger)
59    {
60        Iterator<Appender<ILoggingEvent>> appenders =
61            logger.iteratorForAppenders();
62        List<Appender<ILoggingEvent>> result =
63            new ArrayList<Appender<ILoggingEvent>>();
64        while (appenders.hasNext()) {
65            result.add(appenders.next());
66        }
67        return result;
68    }
69 
70    private List<String> getNames(List<Appender<ILoggingEvent>> appenders)
71    {
72        List<String> result = new ArrayList<String>(appenders.size());
73        for (Appender<ILoggingEvent> appender: appenders) {
74            result.add(appender.getName());
75        }
76        return result;
77    }
78 
79    private String toString(Level level)
80    {
81        return (level == null) ? "" : level.toString();
82    }
83 
84    public final static String hh_log_logger_ls = "[-a]";
85    public final static String fh_log_logger_ls =
86        "Lists logger instances. Loggers that inherit all properties are\n" +
87        "not listed unless the -a option is specified.";
88    public String ac_log_logger_ls(Args args)
89    {
90        final String format = "%-5s %-30s %s\n";
91 
92        boolean all = (args.getOpt("a") != null);
93        Formatter f = new Formatter();
94        f.format(format, "Level", "Appenders", "Logger");
95        f.format(format, "-----", "---------", "------");
96        for (Logger logger: getLoggers()) {
97            List<Appender<ILoggingEvent>> appenders = getAppenders(logger);
98            boolean hasAppenders = !appenders.isEmpty();
99            boolean isEndOfRoad = !logger.isAdditive();
100            boolean hasLevel = (logger.getLevel() != null);
101            boolean isRoot = (logger.getName().equals(Logger.ROOT_LOGGER_NAME));
102            if (all || hasAppenders || isEndOfRoad || hasLevel || isRoot) {
103                f.format(format,
104                         toString(logger.getLevel()),
105                         getNames(appenders),
106                         logger.getName());
107            }
108        }
109        return f.toString();
110    }
111 
112    public final static String hh_log_logger_set =
113        "<logger> OFF|ERROR|WARN|INFO|DEBUG|TRACE|ALL";
114    public final static String fh_log_logger_set =
115        "Sets log level of <logger>. Notice that the preferred method to\n" +
116        "adjust log levels in dCache is to manipulate the appender log\n" +
117        "levels through the 'log set' and 'log reset' commands.";
118    public String ac_log_logger_set_$_2(Args args)
119    {
120        String name = args.argv(0);
121        Level level = Level.valueOf(args.argv(1));
122        Logger logger = getLogger(name);
123        if (logger == null) {
124            throw new IllegalArgumentException("Logger not found: " + name);
125        }
126 
127        logger.setLevel(level);
128        return "Log level of " + name + " set to " + level;
129    }
130 
131    public final static String hh_log_logger_reset =
132        "<logger>";
133    public final static String fh_log_logger_reset =
134        "Resets the log level of <logger>. The effective log level will be\n" +
135        "inherited from the parent logger. Notice that the preferred method\n" +
136        "to adjust log levels in dCache is to manipulate the appender log\n" +
137        "levels through the 'log set' and 'log reset' commands.";
138    public String ac_log_logger_reset_$_1(Args args)
139    {
140        String name = args.argv(0);
141        Logger logger = getLogger(name);
142        if (logger == null) {
143            throw new IllegalArgumentException("Logger not found: " + name);
144        }
145 
146        logger.setLevel(null);
147        return "Log level of " + name + " was reset";
148    }
149 
150    public final static String hh_log_attach =
151        "<logger> <appender>";
152    public final static String fh_log_attach =
153        "Attach <logger> to output module <appender>.";
154    public String ac_log_attach_$_2(Args args)
155    {
156        String name = args.argv(0);
157        String appender = args.argv(1);
158        Logger logger = getLogger(name);
159        if (logger == null) {
160            throw new IllegalArgumentException("Logger not found: " + name);
161        }
162 
163        Appender<ILoggingEvent> app = getAppenders().get(appender);
164        if (app == null) {
165            throw new IllegalArgumentException("Appender not found: " + appender);
166        }
167 
168        logger.addAppender(app);
169 
170        return name + " attached to " + appender;
171    }
172 
173    public final static String hh_log_detach =
174        "<logger> <appender>";
175    public final static String fh_log_detach =
176        "Detach <logger> from output module <appender>.";
177    public String ac_log_detach_$_2(Args args)
178    {
179        String name = args.argv(0);
180        String appender = args.argv(1);
181        Logger logger = getLogger(name);
182        if (logger == null) {
183            throw new IllegalArgumentException("Logger not found: " + name);
184        }
185 
186        logger.detachAppender(appender);
187 
188        return name + " detached from " + appender;
189    }
190}

[all classes][dmg.cells.nucleus]
EMMA 2.0.5312 (C) Vladimir Roubtsov