OSDN Git Service

スタートアップ処理の改善
[jindolf/Jindolf.git] / src / main / java / jp / sfjp / jindolf / log / LoggingDispatcher.java
1 /*
2  * event dispatcher with logging
3  *
4  * License : The MIT License
5  * Copyright(c) 2011 olyutorskii
6  */
7
8 package jp.sfjp.jindolf.log;
9
10 import java.awt.AWTEvent;
11 import java.awt.EventQueue;
12 import java.awt.Toolkit;
13 import java.util.logging.Level;
14 import java.util.logging.Logger;
15
16 /**
17  * 異常系をロギングするイベントディスパッチャ。
18  */
19 public class LoggingDispatcher extends EventQueue{
20
21     private static final String FATALMSG =
22             "イベントディスパッチ中に異常が起きました。";
23
24     private static final Logger LOGGER = Logger.getAnonymousLogger();
25
26     /**
27      * コンストラクタ。
28      */
29     public LoggingDispatcher(){
30         super();
31         return;
32     }
33
34     /**
35      * 独自ロガーにエラーや例外を吐く、
36      * カスタム化されたイベントキューに差し替える。
37      */
38     public static void replaceEventQueue(){
39         Toolkit kit = Toolkit.getDefaultToolkit();
40         EventQueue oldQueue = kit.getSystemEventQueue();
41         EventQueue newQueue = new LoggingDispatcher();
42         oldQueue.push(newQueue);
43         return;
44     }
45
46     /**
47      * 異常系をログ出力。
48      * @param e 例外
49      */
50     private void errlog(Throwable e){
51         LOGGER.log(Level.SEVERE, FATALMSG, e);
52         return;
53     }
54
55     /**
56      * {@inheritDoc}
57      * 発生した例外をログ出力する。
58      * @param event {@inheritDoc}
59      */
60     @Override
61     protected void dispatchEvent(AWTEvent event){
62         try{
63             super.dispatchEvent(event);
64         }catch(RuntimeException e){
65             errlog(e);
66             throw e;
67         }catch(Exception e){
68             errlog(e);
69         }catch(Error e){
70             errlog(e);
71             throw e;
72         }
73         // TODO Toolkit#beep()もするべきか
74         // TODO モーダルダイアログを出すべきか
75         // TODO 標準エラー出力抑止オプションを用意すべきか
76         // TODO セキュリティバイパス
77         return;
78     }
79
80 }