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

COVERAGE SUMMARY FOR SOURCE FILE [FilterShell.java]

nameclass, %method, %block, %line, %
FilterShell.java100% (1/1)10%  (1/10)4%   (12/298)9%   (5/58)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class FilterShell100% (1/1)10%  (1/10)4%   (12/298)9%   (5/58)
ac_log_ls_$_0_2 (Args): String 0%   (0/1)0%   (0/45)0%   (0/10)
ac_log_reset_$_1_2 (Args): String 0%   (0/1)0%   (0/47)0%   (0/8)
ac_log_set_$_2_3 (Args): String 0%   (0/1)0%   (0/52)0%   (0/12)
getFilters (): Collection 0%   (0/1)0%   (0/4)0%   (0/1)
getLoggers (): Collection 0%   (0/1)0%   (0/4)0%   (0/1)
isExistingLogger (LoggerName): boolean 0%   (0/1)0%   (0/20)0%   (0/4)
ls (Formatter, boolean): void 0%   (0/1)0%   (0/18)0%   (0/3)
lsFilter (Formatter, boolean, String): void 0%   (0/1)0%   (0/30)0%   (0/4)
lsLogger (Formatter, boolean, LoggerName, String): void 0%   (0/1)0%   (0/61)0%   (0/9)
FilterShell (FilterThresholds): void 100% (1/1)71%  (12/17)83%  (5/6)

1package dmg.util.logback;
2 
3import java.util.Map;
4import java.util.HashMap;
5import java.util.List;
6import java.util.Collection;
7import java.util.Set;
8import java.util.HashSet;
9import java.util.Formatter;
10import java.util.concurrent.ConcurrentHashMap;
11 
12import ch.qos.logback.classic.Logger;
13import ch.qos.logback.classic.Level;
14import ch.qos.logback.classic.LoggerContext;
15 
16import org.slf4j.LoggerFactory;
17 
18import dmg.util.Args;
19 
20/**
21 * Provides basic cell shell commands to inspect and manipulate log
22 * filter thresholds.
23 *
24 * Notice that there is a one-to-one correspondence between appenders
25 * and filters. Hence we refer to appenders in the user interface, but
26 * the code actually manipulates the filters attached to the
27 * appenders.
28 */
29public class FilterShell
30{
31    private final FilterThresholds _thresholds;
32    private final LoggerContext _context =
33        (LoggerContext) LoggerFactory.getILoggerFactory();
34 
35    public FilterShell(FilterThresholds thresholds)
36    {
37        if (thresholds == null) {
38            throw new IllegalArgumentException("Null argument is not valid");
39        }
40        _thresholds = thresholds;
41    }
42 
43    private boolean isExistingLogger(LoggerName name)
44    {
45        for (Logger logger: getLoggers()) {
46            if (name.isNameOfLogger(logger)) {
47                return true;
48            }
49        }
50        return false;
51    }
52 
53    private Collection<Logger> getLoggers()
54    {
55        return _context.getLoggerList();
56    }
57 
58    private Collection<String> getFilters()
59    {
60        return _thresholds.getFilters();
61    }
62 
63    public final static String hh_log_ls =
64        "[-a] [<appender>] [<logger>]";
65    public final static String fh_log_ls =
66        "Lists current log thresholds. Inherited thresholds are marked\n" +
67        "with an asterix.";
68    public String ac_log_ls_$_0_2(Args args)
69    {
70        boolean all = (args.getOpt("a") != null);
71        String appender = args.argv(0);
72        String logger = args.argv(1);
73        Formatter out = new Formatter();
74        if (logger != null) {
75            lsLogger(out, all, LoggerName.getInstance(logger), appender);
76        } else if (appender != null) {
77            lsFilter(out, all, appender);
78        } else {
79            ls(out, all);
80        }
81        return out.toString();
82    }
83 
84    private void ls(Formatter out, boolean all)
85    {
86        for (String filter: getFilters()) {
87            lsFilter(out, all, filter);
88        }
89    }
90 
91    private void lsFilter(Formatter out, boolean all, String filter)
92    {
93        out.format("%s:\n", filter);
94        for (Logger logger: getLoggers()) {
95            lsLogger(out, all, LoggerName.getInstance(logger), filter);
96        }
97    }
98 
99    private void lsLogger(Formatter out, boolean all,
100                          LoggerName logger, String filter)
101    {
102        Level level = _thresholds.get(logger, filter);
103        if (level != null) {
104            out.format("  %s=%s\n", logger, level);
105        } else {
106            level = _thresholds.getInheritedMap(logger).get(filter);
107            if (level != null) {
108                out.format("  %s=%s*\n", logger, level);
109            } else if (all) {
110                out.format("  %s\n", logger);
111            }
112        }
113    }
114 
115    public final static String hh_log_set =
116        "<appender> [<logger>] OFF|ERROR|WARN|INFO|DEBUG|TRACE|ALL";
117    public final static String fh_log_set =
118        "Sets the log level of <appender>.";
119    public String ac_log_set_$_2_3(Args args)
120    {
121        String appender = args.argv(0);
122        LoggerName logger;
123        String threshold;
124 
125        if (args.argc() == 3) {
126            logger = LoggerName.getInstance(args.argv(1));
127            threshold = args.argv(2);
128        } else {
129            logger = LoggerName.ROOT;
130            threshold = args.argv(1);
131        }
132 
133        if (!getFilters().contains(appender)) {
134            throw new IllegalArgumentException("Appender not found");
135        }
136 
137        if (!isExistingLogger(logger)) {
138            throw new IllegalArgumentException("Logger not found");
139        }
140 
141        _thresholds.setThreshold(logger, appender, Level.valueOf(threshold));
142        return "";
143    }
144 
145    public final static String hh_log_reset =
146        "[-a] <appender> [<logger>]";
147    public final static String fh_log_reset =
148        "Resets the log level of <appender>. The log level for <appender>\n" +
149        "will be inherited from the parent cell.";
150    public String ac_log_reset_$_1_2(Args args)
151    {
152        String appender = args.argv(0);
153        if (args.argc() == 2) {
154            _thresholds.remove(LoggerName.getInstance(args.argv(1)), appender);
155        } else if (args.getOpt("a") == null) {
156            _thresholds.remove(LoggerName.ROOT, appender);
157        } else {
158            for (Logger logger: getLoggers()) {
159                _thresholds.remove(LoggerName.getInstance(logger), appender);
160            }
161        }
162        return "";
163    }
164}

[all classes][dmg.util.logback]
EMMA 2.0.5312 (C) Vladimir Roubtsov