/*
 * Copyright (c) 2009 The openGion Project.
 *
 * 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 org.opengion.hayabusa.remote;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.opengion.fukurou.db.Transaction;
import org.opengion.fukurou.db.TransactionReal;
import org.opengion.fukurou.transfer.TransferConfig;
import org.opengion.fukurou.transfer.TransferExec;
import org.opengion.fukurou.util.ApplicationInfo;
import org.opengion.fukurou.util.StringUtil;
import org.opengion.hayabusa.common.HybsSystem;
import org.opengion.hayabusa.common.HybsSystemException;

/**
 * RemoteControllableインタフェイスを実装した
 * サーブレット経由で遠隔伝送実行処理を行うためのクラスです。
 *
 * このクラスは、伝送実行処理のラッパークラスです。
 * 引数のKBEXECのパラメーターに基づき、伝送実行オブジェクトを生成し、伝送処理を実行します。
 * 詳細については、{@link org.opengion.fukurou.transfer.TransferExec_HTTP}を参照して下さい。
 *
 * @og.rev 5.4.2.0 (2011/12/01) 新規作成
 *
 * @version  4.1
 * @author   Hiroki Nakamura
 * @since    JDK6.0,
 *
 */
public class TransferExecWrapper implements RemoteControllable {

	// 伝送実行クラスのベースクラス名
	private static final String EXEC_CLASS_BASE = "org.opengion.fukurou.transfer.TransferExec_" ;

	// コネクションにアプリケーション情報を追記するかどうか指定
	private static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;

	private static final ApplicationInfo appInfo;

	static {
		if( USE_DB_APPLICATION_INFO ) {
			appInfo = new ApplicationInfo();
			// ユーザーID,IPアドレス,ホスト名
			appInfo.setClientInfo( "TransferExecWrapper",HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
			// 画面ID,操作,プログラムID
			appInfo.setModuleInfo( "TransferExecWrapper","TransferExecWrapper","TransferExecWrapper" );
		}
		else {
			appInfo = null;
		}
	}
	/**
	 * RemoteControllableインタフェイスの実装メソッドです。
	 *
	 * @og.rev 5.7.1.2 (2013/12/20) msg ⇒ errMsg 変更
	 *
	 * @param	valMap	 サーブレットが受け取ったキーと値のマップ
	 *
	 * @return	XML形式の実行結果
	 */
	public String remoteControl( final Map<String,String> valMap ) {
		// パラメーターより伝送設定オブジェクトを生成します。
		TransferConfig conf = new TransferConfig(
								valMap.get( "KBREAD" )
								, valMap.get( "READOBJ" )
								, valMap.get( "READPRM" )
								, valMap.get( "KBEXEC" )
								, valMap.get( "EXECDBID" )
								, valMap.get( "EXECOBJ" )
								, valMap.get( "EXECPRM" )
								, valMap.get( "ERROR_SENDTO" )
								, valMap.get( "HFROM" )
								, null, -1 );

		// パラメーターより伝送実行オブジェクトに渡す値一覧(配列)を生成します。
		String[] vals = getVals( valMap );

		Transaction tran = null;
		try {
			tran = new TransactionReal( appInfo );
			// 実行方法のオブジェクトを生成します。
			TransferExec exec = (TransferExec)StringUtil.newInstance( EXEC_CLASS_BASE + valMap.get( "KBEXEC" ) );
			// 処理を実行します。
			exec.execute( vals, conf, tran );
		}
		catch ( Throwable ex ) {
//			String msg = "伝送処理実行(HTTP経由)でエラーが発生しました。";
//			throw new HybsSystemException( msg, ex );
			String errMsg = "伝送処理実行(HTTP経由)でエラーが発生しました。";
			throw new HybsSystemException( errMsg, ex );	// 5.7.1.2 (2013/12/20) msg ⇒ errMsg 変更
		}
		finally {
			if( tran != null ) { tran.close(); }
		}

		return "";
	}

	/**
	 * パラメーターより伝送実行オブジェクトに渡す値一覧(配列)を生成します。
	 * 対象パラメーターは①n(データ件数) と ②v1～vn(データ) です。
	 *
	 * @param valMap パラメーターMap
	 *
	 * @return 値一覧(配列)
	 */
	private String[] getVals( final Map<String,String> valMap ) {
		int rows = 0;
		String rno = valMap.get( "n" );
		if( rno != null && rno.length() > 0 ) {
			rows = Integer.valueOf( rno );
		}
		List<String> list = new ArrayList<String>();
		for( int i=0; i<rows; i++ ) {
//			String val = valMap.get( "v" + String.valueOf( i ) );
			String val = valMap.get( "v" + i );
			list.add( val );
		}
//		return list.toArray( new String[0] );
		return list.toArray( new String[list.size()] );
	}
}
