package org.itscool.weber.mapping;

import java.util.LinkedList;

/**
 * &lt;exception&gt;要素の情報を保持する配列クラスです<BR>
 * <BR>
 * このクラスは次のキーと値の配列で管理されます<BR>
 * 　キー：ユーザ情報ファイルの論理名(name)<BR>
 * 　値  ：ユーザ情報ファイルが保存されているパス(path)<BR>
 *
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2004/11/1
*/
public class ExceptionMappings extends LinkedList{
    /** 唯一のExceptionMappingsインスタンス */
    private static ExceptionMappings instance;
    
    /**
     * 唯一のExceptionMappingsインスタンスを取得します
     * @return ExceptionMappingsインスタンス
    */
    public static synchronized ExceptionMappings getInstance(){
        if( instance == null ){
            instance = new ExceptionMappings();
        }
        return instance;
    }
    
    /**
     * 例外マッピング情報を取得します
     * @param e 例外インスタンス
     * @return 例外マッピング情報
     */
    public ExceptionMapping get(Exception e){
        ExceptionMapping exception = null;
        
        for(int i=0; i<this.size(); i++ ){
            exception = (ExceptionMapping)this.get(i);
            String clazzName = exception.getName();
            if( e.getClass().getName().equals(clazzName) ){
                return exception;
            }
            Class clazz = null;
            try{
                clazz = Class.forName(clazzName);
            }catch(ClassNotFoundException cnfe){}
            if( clazz != null && clazz.isInstance(e) ){
//            if( clazz != null && clazz.isAssignableFrom(e.getClass()) ){
                return exception;
            }
        }
        return null;
    }
    
    /**
     * 例外マッピング情報を取得します
     * @param e 例外インスタンス
     * @return 例外マッピング情報
     */
    public ExceptionMapping get(Error e){
        ExceptionMapping exception = null;
        
        for(int i=0; i<this.size(); i++ ){
            exception = (ExceptionMapping)this.get(i);
            String clazzName = exception.getName();
            if( e.getClass().getName().equals(clazzName) ){
                return exception;
            }
            Class clazz = null;
            try{
                clazz = Class.forName(clazzName);
            }catch(ClassNotFoundException cnfe){}
            if( clazz != null && clazz.isInstance(e) ){
//            if( clazz != null && clazz.isAssignableFrom(e.getClass()) ){
                return exception;
            }
        }
        return null;
    }
}
