/*
 * Copyright (c) 2007 NTT DATA Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package jp.terasoluna.rich.functionsample.exceptionhandler.service;

import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import jp.terasoluna.fw.exception.SystemException;
import jp.terasoluna.fw.service.rich.exception.ServiceException;
import jp.terasoluna.rich.functionsample.common.ExceptionHandlerFilter;
import jp.terasoluna.rich.functionsample.exceptionhandler.bean.ExceptionData;
/**
 * 例外生成サービスの実装クラス<br>
 * 各例外の型によって生成を行う。<br>
 * <li>systemException : 入力されたエラーコードとクラス名を利用してシステム例外
 * を生成する。</li>
 * <li>serviceException : 入力されたエラーコードを利用してサービス例外を
 * 生成する。</li>
 * <li>bindException: 入力されたエラータイプによってバインド例外を生成する。</li>
 * <li>その他(exception等) :入力されたクラス名を利用して例外を生成する。</li><br>
 * <br>
 * ※ ビューの例外は処理しない。
 *
 */
public class ExceptionHandlerServiceImpl implements
    ExceptionHandlerService<ExceptionData> {

    /**
     * 例外を発生させる。<br>
     * ビュー例外の場合は処理を行わない。
     *
     * @param params 例外情報クラス
     * @throws Exception 生成した例外
     */
    public void thorwException(ExceptionData params) throws Exception {

        String className = params.getClassName();
        String errorType = params.getErrorType();
        String errorCode = params.getErrorCode();
        boolean view = params.getView();
        
        //ビューの例外可否をチェック
        if (!view) {
            try {
                if ("systemException".equalsIgnoreCase(errorType)) {
                    //システム例外
                    throw new SystemException(
                            (Exception) Class.forName(className).newInstance(),
                            errorCode);
                } else if ("serviceException".equalsIgnoreCase(errorType)) {
                    //サービス例外
                    throw new ServiceException(errorCode);
                } else if ("bindException".equalsIgnoreCase(errorType)) {
                    //バインド例外
                    BindException errors = new BindException(params, "params");
                    String[] codes = {"typeMismatch.boolean"};
                    String args1 = "XMLFormCheckInputData[0].boolean[0]";
                    String args2 = "boolean";
                    String args3 = "XXX";
                    Object[] arg = {args1, args2, args3};
                    FieldError fe = new FieldError(this.getClass().getName(), 
                            "XMLFormCheckInputData[0].boolean[0]", null, false, 
                            codes, arg, null);
                    errors.addError(fe);
                    throw errors;
                } else {
                    //その他例外
                    throw (Exception) Class.forName(className).newInstance();
                }
            } catch (ClassNotFoundException e) {
                throw new SystemException(e,
                        ExceptionHandlerFilter.ERROR_CODE);
            } catch (IllegalAccessException e) {
                throw new SystemException(e,
                        ExceptionHandlerFilter.ERROR_CODE);
            } catch (InstantiationException e) {
                throw new SystemException(e,
                        ExceptionHandlerFilter.ERROR_CODE);
            } catch (ClassCastException e) {
                throw new SystemException(e,
                        ExceptionHandlerFilter.ERROR_CODE);
            }
        }
    }

}
