例外について(3)

http://d.hatena.ne.jp/n-kizashi/20080801 に書いたインターセプタを改良した。
Actionで意図的に発生させたActionMessagesExceptionもこのインターセプタを通ってしまうことがわかったので。

public class ExceptionLogInterceptor extends ThrowsInterceptor {

    private static final long serialVersionUID = 1L;
    
    private static  Priority LOG_PRIORITY = Level.ERROR;

    private static Logger logger = Logger.getLogger(ExceptionLogInterceptor.class);
    
    public void handleThrowable(Exception exception,
            MethodInvocation invocation) throws Throwable {
        
        if (!(exception instanceof ActionMessagesException)) {
            logger.log(LOG_PRIORITY, 
                exception.getClass().getName() 
                + ": " 
                + exception.getMessage(), exception);
        }
        throw exception;
    }
}

2008-08-05 22:26:20,030 [ERROR] java.lang.NullPointerException: aaaaa

みたいな感じで出力されるようにした。これでスクリプトで "[ERROR]" でgrepして、メールを飛ばすなんてことができると。

カスタムタグを作る

テキストにURLが含まれていたら、リンクにして表示するカスタムタグを作った。
SAStrutsに含まれるS2Functionsクラスのescapeメソッドを使いたかったのだが、privateメソッドなので継承しても意味ないので断念。まるっとコピーするのもアレな感じがしたので、commons.langのStringEscapeUtils#escapeHtml(String)を使うことにした。S2Functionsクラスのescapeと処理を比較したわけではないが、とりあえずは動いてそうなのでよしとする。

    public static String url2link(String input) {
        return StringEscapeUtils.escapeHtml(input)
                                .replaceAll(
                                    "(http://|https://){1}[\\w\\.\\-/:]+"
                                   ,"<a href='$0' target='_blank'>$0</a>");
    }

参考:
http://www.atmarkit.co.jp/fjava/javatips/059jspservlet028.html

追記

まてよ。
自作クラスでescapeしなくても、

${f2:url2link(f:h(stringWithUrl))}

みたいな感じにすればよいのか。

さらに追記

思ったとおりだった。

    public static String url2link(String input) {
        return input.replaceAll(
                               "(http://|https://){1}[\\w\\.\\-/:]+"
                              ,"<a href='$0' target='_blank'>$0</a>");
    }

でおけ。