/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom						 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JKKTjgsAreaIfSendFile
*	ソースファイル名	：JKKTjgsAreaIfSendFile.java
*	作成者				：富士通　
*	作成日				：2014年04月30日
*＜機能概要＞
*　他事業者向けエリア情報ファイルを送信します
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v8.00.00	2014/04/30  FJ)江藤		新規作成(【ANK-2060-00-00】ＫＤＤＩシステム切替対応)
*                                       スマートバリューと共用していた部品(JKKSmtvSendFile)から分離して新規作成
*                                       JKKSmtvSendFileと比較しやすくするため過去のソースコメントはあえて残しています
*                                       
*********************************************************************/
package eo.business.common;

import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;


/**
 * 結果ファイルを送信する<p>
 * <br>
 * @author 富士通
 */
public class JKKTjgsAreaIfSendFile extends JKKHttpCommunicator {

	/** PROXYホストを取得するキー */
	private static final String S_KEY_PROXY_HOST = "KK_TAIAR_UL_PROXY_HOST";

	/** PROXYポートを取得するキー */
	private static final String S_KEY_PROXY_PORT = "KK_TAIAR_UL_PROXY_PORT";	

	/** リストを受信URLを取得するキー */
	private static final String S_KEY_URL_STR = "KK_TAIAR_UL_URL";	

	/** 認証ユーザを取得するキー */
	private static final String S_KEY_USER_STR = "KK_TAIAR_UL_USERID";	

	/** 認証パスワードを取得するキー */
	private static final String S_KEY_PASS_STR = "KK_TAIAR_UL_PASSWD";

	/** タイムアウトを取得するキー */
	private static final String S_KEY_TIMEOUT_STR = "KK_TAIAR_UL_TIMEOUT";

	/** リトライ数を取得するキー */
	private static final String S_KEY_RETRY_STR = "KK_TAIAR_UL_RETRYCOUNT";

	/** リトライ後の待機時間を取得するキー */
	private static final String S_KEY_INTERVAL_STR = "KK_TAIAR_UL_RETRYINTERVAL";

	/** HTTPヘッダ　コンテンツサイズ */
	private static final String S_KEY_HTTP_CONTENT_LENGTH = "Content-length";

	/** HTTPヘッダ　コンテンツタイプ*/
	private static final String S_KEY_HTTP_CONTENT_TYPE = "Content-type";

// ANK-1277-00-00対応 2013/01/17 suzuki del start
//	/** MIMEタイプ text/plain */
//	private static final String S_MIME_TEXT_PLANE = "text/plane";
// ANK-1277-00-00対応 2013/01/17 suzuki del end

// ANK-1277-00-00対応 2013/01/17 suzuki add start
	/** MIMEタイプ application/octet-stream */
	private static final String S_MIME_OCTET_STREAM = "application/octet-stream";
// ANK-1277-00-00対応 2013/01/17 suzuki add end

	/** メッセージ定数*/
	private static final String S_MSG_SOSHIN_SAKI = "接続先";
	
	/** メッセージ定数*/
	private static final String S_MSG_SOUSHIN_FILE = "送信ファイル";
	
	
	
	/** 送信ファイル */
	private File sendFile = null;
	
	/**
	 * 送信ファイルを返す
	 * <br>
	 * @return 設定されている送信ファイル
	 */
	protected File getSendFile() 
	{
		return sendFile;
	}
	
	/**
	 * 送信ファイルを設定する
	 * <br>
	 * @param newVal	送信ファイル
	 */
	protected void setSendFile(File newVal)
	{
		sendFile = newVal;
	}
	
	/**
	 * 実行する
	 * <br>
	 * @param sendFileName 送信ファイル
	 */
	public void invoke(String sendFileName) throws Exception
	{
		
		// PROXYを取得する
		String proxyHost = getApplicationConst(S_KEY_PROXY_HOST, false);
		String proxyPort = getApplicationConst(S_KEY_PROXY_PORT, false);

		// PROXYの設定
		setProxy(proxyHost, proxyPort);
		
		// 接続先を指定する（必須）
		String urlStr = getApplicationConst(S_KEY_URL_STR, false);
		if ( null == urlStr || urlStr.length() == 0)
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0130CE, new String[] {S_MSG_SOSHIN_SAKI});
		}

		// 送信ファイルのチェック
		setSendFile(new File(sendFileName));
		if (!getSendFile().exists())
		{
			//↓↓↓2013-01-29変更　ロット２KT1-2013-0000110（メッセージが実態と異なる）↓↓↓
		//	throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0130CE, new String[] {S_MSG_SOUSHIN_FILE + ":" + sendFileName});
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0020CE, new String[] {sendFileName});
			//↑↑↑2013-01-29変更　ロット２KT1-2013-0000110（メッセージが実態と異なる）↑↑↑
		}
		
		// URLに変換
		URL url = new URL(urlStr);
		
		// SSLの場合は証明書関係の初期化を行う
		if (url.getProtocol().equalsIgnoreCase(JKKHttpCommunicator.S_HTTPS))
		{
			JKKHttpCommunicator.initializeSSL();
		}
		
		// 認証情報の取得
		String user   = getApplicationConst(S_KEY_USER_STR, false);
		String passwd = getApplicationConst(S_KEY_PASS_STR, true);	// 復号化

		if (user != null && user.length() > 0)
		{
			initializeAuthentication(user, passwd);
		}
		
		// その他の属性を設定
		setTimeout(Integer.parseInt(getApplicationConst(S_KEY_TIMEOUT_STR, false)));
		setRetryCount(Integer.parseInt(getApplicationConst(S_KEY_RETRY_STR, false)));
		setRetryInterval(Integer.parseInt(getApplicationConst(S_KEY_INTERVAL_STR, false)));
		
		// URLを指定する
		setTargetURL(url);
					
		// 実行する。
		if (!execute()) 
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0120CE, new String[] {getSendFile().getName()});
		}
		
	}

	/**
	 * ファイルデータを送信する
	 */
	@Override
	protected void sendMessage(HttpURLConnection conn) throws IOException 
	{
		// 各種プロパティの指定
		conn.setRequestMethod(S_POST);
		conn.setDoOutput(true);			// 出力データを指定
		conn.setInstanceFollowRedirects(true);

		// ヘッダ情報を書き込む
		conn.setRequestProperty(S_KEY_HTTP_CONTENT_LENGTH, Long.toString(getSendFile().length()));
// ANK-1277-00-00対応 2013/01/17 suzuki mod start
//		conn.setRequestProperty(S_KEY_HTTP_CONTENT_TYPE, S_MIME_TEXT_PLANE);
		conn.setRequestProperty(S_KEY_HTTP_CONTENT_TYPE, S_MIME_OCTET_STREAM);
// ANK-1277-00-00対応 2013/01/17 suzuki mod end
		
		// 20130416 ST1-2013-0000522 ADD START
		if(!isNull(authUser))
		{
			// 認証が必要な場合
			conn.setRequestProperty("Authorization", getAutorizationValue());
		}
		// 20130416 ST1-2013-0000522 ADD END

		// 入出力ストリームの定義
		DataOutputStream output = null;
		BufferedInputStream input = null;
		try 
		{
			OutputStream out = conn.getOutputStream();
			output = new DataOutputStream(out);
			input = new BufferedInputStream(new FileInputStream(getSendFile()));
			
			byte[] val = new byte[256];
			// データの書き込み
			while(true)
			{
				int size = input.read(val);
				if (size < 0) break;
				// ストリームに書き込み
				output.write(val, 0, size);
			}
		}
		finally 
		{
			if (output != null)
			{
				output.close();
			}
			if (input != null)
			{
				input.close();
			}
		}
	}

}
