package org.itscool.commons.logging;

/**
 * クラス及びメソッドの呼出元を特定し、呼出元クラス名とメソッド名を保持する
 * クラスです。
 *
 * このクラスはThrowable().getStackTrace()メソッドによりStackTraceElementを
 * 作成し、この配列から呼び出されたクラス名とメソッド名を取得します。
 *
 * このメソッドはjavaのバージョンが1.4以上でサポートされています。
 *
 *【使用例】
 *      StackTraceElement[] traces = new Throwable().getStackTrace();
 *      for( int i=0; i<traces.length; i++ ){
 *          StackTraceElement trace = traces[i];
 *          String className = trace.getClassName();
 *          String methodName = trace.getMethodName();
 *       }
 *
 */
public class CallClass{
    /** 呼出もとのクラス名 */
    private String className = SimpleLog.class.getName();
    /** 呼出もとのメソッド名 */
    private String methodName = "out";
    /** 行番号 */
    private int lineNumber;
    
    /**
     * 呼出もとのクラス名及びメソッド名を取得します。
     *
     * @param record 呼出もとのメソッドを特定するために指定します。
     *         メソッド呼出の履歴順位を指定してください。
     */
    public CallClass(int record){
        StackTraceElement[] traces = new Throwable().getStackTrace();
        if( traces.length >= record ){
            StackTraceElement trace = traces[record];
            String clazzName = trace.getClassName();
            String methodName = trace.getMethodName();
            int lineNumber = trace.getLineNumber();
            setClassName(clazzName);
            setMethodName(methodName);
            setLineNumber(lineNumber);
        }
    }
    
    /**
     * 呼出もとのクラス名を取得します
     */
    public String getClassName(){
        return className;
    }
    
    /**
     * 呼出もとのクラス名を設定します
     */
    public void setClassName(String className){
        this.className = className;
    }
    
    /**
     * 呼出もとのメソッド名を取得します
     */
    public String getMethodName(){
        return methodName;
    }
    
    /**
     * 呼出もとのメソッド名を設定します
     */
    public void setMethodName(String methodName ){
        this.methodName = methodName;
    }
    
    public int getLineNumber() {
        return lineNumber;
    }
    
    public void setLineNumber(int lineNumber) {
        this.lineNumber = lineNumber;
    }
}


