OSDN Git Service

mainエントリのパッケージを変更。
[jindolf/Jindolf.git] / src / main / java / jp / sfjp / jindolf / log / PileHandler.java
1 /*
2  * Dummy logging handler
3  *
4  * License : The MIT License
5  * Copyright(c) 2008 olyutorskii
6  */
7
8 package jp.sfjp.jindolf.log;
9
10 import java.util.Collections;
11 import java.util.LinkedList;
12 import java.util.List;
13 import java.util.logging.Handler;
14 import java.util.logging.Level;
15 import java.util.logging.LogRecord;
16 import java.util.logging.Logger;
17
18 /**
19  * なにもしないロギングハンドラ。
20  * あとからなにがロギングされたのか一括して出力することができる。
21  */
22 public class PileHandler extends Handler{
23
24     private final List<LogRecord> logList = new LinkedList<LogRecord>();
25     private final List<LogRecord> unmodList =
26             Collections.unmodifiableList(this.logList);
27
28     /**
29      * ロギングハンドラを生成する。
30      */
31     public PileHandler(){
32         super();
33         return;
34     }
35
36     /**
37      * ロガーに含まれる{@link PileHandler}型ハンドラのリストを返す。
38      * @param logger ロガー
39      * @return {@link PileHandler}型ハンドラのリスト
40      */
41     public static List<PileHandler> getPileHandlers(Logger logger){
42         List<PileHandler> result = new LinkedList<PileHandler>();
43
44         for(Handler handler : logger.getHandlers()){
45             if( ! (handler instanceof PileHandler) ) continue;
46             PileHandler pileHandler = (PileHandler) handler;
47             result.add(pileHandler);
48         }
49
50         return result;
51     }
52
53     /**
54      * ロガーに含まれる{@link PileHandler}型ハンドラを全て削除する。
55      * @param logger ロガー
56      */
57     public static void removePileHandlers(Logger logger){
58         for(PileHandler pileHandler : getPileHandlers(logger)){
59             logger.removeHandler(pileHandler);
60         }
61         return;
62     }
63
64     /**
65      * 蓄積されたログレコードのリストを返す。
66      * 古いログが先頭に来る。
67      * @return ログレコードのリスト。変更不可。
68      */
69     public List<LogRecord> getRecordList(){
70         return this.unmodList;
71     }
72
73     /**
74      * {@inheritDoc}
75      * ログを内部に溜め込む。
76      * @param record {@inheritDoc}
77      */
78     @Override
79     public void publish(LogRecord record){
80         if(record == null) return;
81
82         if( ! isLoggable(record) ){
83             return;
84         }
85
86         this.logList.add(record);
87
88         return;
89     }
90
91     /**
92      * {@inheritDoc}
93      * (何もしない)。
94      */
95     @Override
96     public void flush(){
97         return;
98     }
99
100     /**
101      * {@inheritDoc}
102      */
103     @Override
104     public void close(){
105         setLevel(Level.OFF);
106         flush();
107         return;
108     }
109
110     /**
111      * 他のハンドラへ蓄積したログをまとめて出力する。
112      * 最後に自分自身をクローズし、蓄積されたログを解放する。
113      * @param handler 他のハンドラ
114      */
115     public void delegate(Handler handler){
116         if(handler == this) return;
117
118         close();
119
120         for(LogRecord record : this.logList){
121             handler.publish(record);
122         }
123
124         handler.flush();
125         this.logList.clear();
126
127         return;
128     }
129
130 }