OSDN Git Service

use multi-catch
[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      */
30     public LoggingDispatcher(){
31         super();
32         return;
33     }
34
35
36     /**
37      * 匿名ロガーにエラーや例外を吐く、
38      * カスタム化されたイベントキューに差し替える。
39      */
40     public static void replaceEventQueue(){
41         Toolkit kit = Toolkit.getDefaultToolkit();
42         EventQueue oldQueue = kit.getSystemEventQueue();
43         EventQueue newQueue = new LoggingDispatcher();
44         oldQueue.push(newQueue);
45         return;
46     }
47
48     /**
49      * 異常系を匿名ロガーに出力する。
50      * @param e 例外
51      */
52     private static void logThrowable(Throwable e){
53         LOGGER.log(Level.SEVERE, FATALMSG, e);
54         return;
55     }
56
57
58     /**
59      * {@inheritDoc}
60      * イベントディスパッチにより発生した例外を匿名ログ出力する。
61      * @param event {@inheritDoc}
62      */
63     @Override
64     protected void dispatchEvent(AWTEvent event){
65         try{
66             super.dispatchEvent(event);
67         }catch(RuntimeException | Error e){
68             logThrowable(e);
69             throw e;
70         }catch(Exception e){
71             logThrowable(e);
72         }
73         // TODO Toolkit#beep()もするべきか
74         // TODO モーダルダイアログを出すべきか
75         // TODO 標準エラー出力抑止オプションを用意すべきか
76         // TODO セキュリティバイパス
77         return;
78     }
79
80 }