/*
 * Copyright (c) 2007, Going Dot Com Inc. All rights reserved.
 */

package jp.co.going.xbrl.common;

import java.io.PrintStream;
import java.io.PrintWriter;

/**
 * 全てのクラスはこのExceptionを使用すること。
 * 
 * <ul>
 * <li>Exceptionをハンドリングするさいの注意点。
 * <PRE> 
 * <B></B>
 * XbrlExceptionをキャッチして、さらにそれをXbrlExceptionに設定することは禁止。
 * 
 * try {
 * 
 * } catch (XbrlException xbrle) {
 *  // ここでは、さらにXbrlExeptionに例外を設定する必要はない。
 * } catch (Exception e) {
 *  // ここでは新たに、XbrlExceptionを生成し、受け取った例外を設定。
 *  new XbrlException(e, "XXX");
 *   ・
 *   ・
 *   ・
 * }
 * 
 * </PRE>
 * 
 * @author Going Dot Com Inc.
 */
public class XbException extends Exception {

    /******************************************/
    /***   Instance Variable Declarations   ***/
    /******************************************/

    /** 詳細例外 */
    private Throwable detail;

    /************************************/
    /***   Constructor Declarations   ***/
    /************************************/

    /**
     * 例外を生成する。
     */
    public XbException() {
        super();
    }

    /**
     * 例外を生成する。
     *
     * @param ex 詳細例外
     */
    public XbException(Throwable ex) {
        super();
        detail = ex;
    }

    /**
     * 例外を生成する。
     *
     * @param message 例外メッセージ
     */
    public XbException(String message) {
        super(message);
    }

    /**
     * 例外を生成する。
     *
     * @param ex 詳細例外
     * @param message 例外メッセージ
     */
    public XbException(Throwable ex, String message) {
        super(message);
        detail = ex;
    }

    /*******************************/
    /***   Method Declarations   ***/
    /*******************************/

    /**
     * 詳細例外を設定する。
     *
     * @param ex 詳細例外
     */
    public void setDetailException(Throwable ex) {
        detail = ex;
    }

    /**
     * 詳細例外を取得する。
     *
     * @return 詳細例外
     */
    public Throwable getDetailException() {
        return detail;
    }

    /**
     * 例外のトレースを出力する。
     */
    public void printStackTrace() {
        super.printStackTrace();
        if (detail != null) {
            detail.printStackTrace();
        }
    }

    /**
     * 例外のトレースを出力する。
     *
     * @param s 出力に使用するPrintStream
     */
    public void printStackTrace(PrintStream s) {
        super.printStackTrace(s);
        if (detail != null) {
            detail.printStackTrace(s);
        }
    }

    /**
     * 例外のトレースを出力する。
     *
     * @param s 出力に使用するPrintWriter
     */
    public void printStackTrace(PrintWriter s) {
        super.printStackTrace(s);
        if (detail != null) {
            detail.printStackTrace(s);
        }
    }
}