import java.io.File;
import java.util.Hashtable;

import jp.co.prism.xrf.accessor.MakeJobFileException;
import jp.co.prism.xrf.accessor.XRFApiConfig;
import jp.co.prism.xrf.accessor.XRFApiException;
import jp.co.prism.xrf.launchbroker.RemoteLaunchBroker;
import jp.co.prism.xrf.launchbroker.XRFRemoteLaunchBroker;
import jp.co.prism.xrf.launchbroker.XRFRemoteLaunchBrokerException;


/**
 * このプログラムは、XRFRemoteLaunchBrokerの帳票生成とジョブファイル生成のサンプルプログラムです。
 *
 */
public class XRFRLBSample {


    public static void main(String[] args) {

        // XRFRemoteLaunchBroker#toPrint
        sample1();

        // XRFRemoteLaunchBroker#toView
        sample2();

        // XRFRemoteLaunchBroker#fromMakeToPrint
        sample3();

        // XRFRemoteLaunchBroker#sendJobFile
        sample4();

        // XRFRemoteLaunchBroker#toPrintByJobFile
        sample5();

        System.exit(0);
    }


    /**
     * XRFファイルを、ローカルにあるXRF Readerに対し、印刷要求（toPrint）を行います。
     */
    static void sample1(){

        try{
            // RLBインスタンス
            XRFRemoteLaunchBroker launchBroker = new RemoteLaunchBroker();

            // 印刷するXRFファイル
            String xrfFile = "../output/XRF/Sample_A01_CardType.xrf";

            // XRF Readerが参照するためのファイルパスであり、
            // ここでは、XRF Readerはローカルであるため、絶対パス名を取得します。
            String requestXrfFile = new File( xrfFile ).getAbsolutePath();

            // XRF Readerの動作しているマシンのホスト名またはIPアドレス
            String readerHost = "localhost";

            // XRF Readerが監視するポート番号
            String readerPort = "44444";

            // ソケットタイムアウト[msec]
            String socketTimeout = "60000";

            // リモート印刷要求
            launchBroker.toPrint( requestXrfFile, readerHost, readerPort, socketTimeout );

        }catch (XRFRemoteLaunchBrokerException e){
            e.printStackTrace();
        }
    }


    /**
     * XRFファイルを、ローカルにあるXRF Readerに対し、画面表示（toView）を行います。
     */
    static void sample2(){

        try{
            // RLBインスタンス
            XRFRemoteLaunchBroker launchBroker = new RemoteLaunchBroker();

            // 画面表示するXRFファイル
            String xrfFile = "../output/XRF/Sample_A01_CardType.xrf";

            // XRF Readerが参照するためのファイルパスであり、
            // ここでは、XRF Readerはローカルであるため、絶対パス名を取得します。
            String requestXrfFile = new File( xrfFile ).getAbsolutePath();

            // XRF Readerの動作しているマシンのホスト名またはIPアドレス
            String readerHost = "localhost";

            // XRF Readerが監視するポート番号
            String readerPort = "44444";

            // ソケットタイムアウト[msec]
            String socketTimeout = "60000";

            // リモート画面表示要求
            launchBroker.toView( requestXrfFile, readerHost, readerPort, socketTimeout );

        }catch (XRFRemoteLaunchBrokerException e){
            e.printStackTrace();
        }
    }

    /**
     * XRFファイルの生成から印刷（fromMakeToPrint）までを行います。
     * 印刷は、ローカルにあるXRF Readerに対し、要求します。
     * 印刷後、生成されたXRFは削除されます。
     */
    static void sample3(){

        try{
            // RLBインスタンス
            XRFRemoteLaunchBroker launchBroker = new RemoteLaunchBroker();

            // 帳票オーバレイ、XPFファイル
            String xpfFile = "../data/XPF/Sample_A01_CardType.xpf";

            // ユーザデータ、XMLファイル
            String userData = "../data/XML/Sample_A01_CardType.xml";

            // 帳票生成パラメータ
            Hashtable params = new Hashtable();
            params.put( XRFApiConfig.OUTPUTMODE, XRFApiConfig.OUTPUTMODE_XRF );
            // XRFファイルに印刷ジョブ名をセットします。
            params.put( XRFApiConfig.JOBNAME, "XRFRLBSample3" );

            // XRFファイルの一時出力先
            String xrfFile = "../output/XRF/temp/XRFRLBSample3.xrf";

            // XRF Readerが参照するためのファイルパスであり、
            // ここでは、XRF Readerはローカルであるため、絶対パス名を取得します。
            String requestXrfFile = new File( xrfFile ).getAbsolutePath();

            // XRF Readerの動作しているマシンのホスト名またはIPアドレス
            String readerHost = "localhost";

            // XRF Readerが監視するポート番号
            String readerPort = "44444";

            // ソケットタイムアウト[msec]
            String socketTimeout = "60000";

            // XRFファイルの生成から印刷までを行う
            launchBroker.fromMakeToPrint( "../conf/conf.xml",
                    xpfFile, userData, params, xrfFile,
                    requestXrfFile, readerHost, readerPort, socketTimeout);

        }catch (XRFRemoteLaunchBrokerException e){
            e.printStackTrace();
        } catch ( XRFApiException e ) {
            e.printStackTrace();
        }
    }


    /**
     * ジョブファイルを、ローカルにあるXRF Readerに対し、実行要求（sendJobFile）を行います。
     */
    static void sample4(){

        try{
            // RLBインスタンス
            XRFRemoteLaunchBroker launchBroker = new RemoteLaunchBroker();

            // ジョブファイル
            String jobFile = "../output/XJF/PrintJob1.xjf";

            // XRF Readerが参照するためのファイルパスであり、
            // ここでは、XRF Readerはローカルであるため、絶対パス名を取得します。
            String requestJobFile = new File( jobFile ).getAbsolutePath();

            // XRF Readerの動作しているマシンのホスト名またはIPアドレス
            String readerHost = "localhost";

            // XRF Readerが監視するポート番号
            String readerPort = "44444";

            // ソケットタイムアウト[msec]
            String socketTimeout = "60000";

            // リモート印刷要求
            launchBroker.sendJobFile( requestJobFile, readerHost, readerPort, socketTimeout );

        }catch (XRFRemoteLaunchBrokerException e){
            e.printStackTrace();
        }
    }

    /**
     * ジョブファイルの生成から印刷（toPrintByJobFile）までを行います。
     * 印刷は、ローカルにあるXRF Readerに対し、要求します。
     * 印刷後、生成されたジョブファイルは削除されます。
     */
    static void sample5(){
        try{
            // RLBインスタンス
            XRFRemoteLaunchBroker launchBroker = new RemoteLaunchBroker();

            // XRFファイル
            String[] xrfFiles = {
                    "../output/XRF/Sample_A01_CardType.xrf",
                    "../output/XRF/Sample_A02_DenpyoType_1.xrf",
                    "../output/XRF/Sample_A03_DenpyoType_2.xrf",
                    "../output/XRF/Sample_A04_DenpyoType_3.xrf"};

            // ジョブファイル生成パラメータ
            Hashtable jobfileParam = new Hashtable();

            //ジョブファイルに名前をつける（File名ではない）
            jobfileParam.put(XRFApiConfig.JOBFILE_NAME_KEY, "XRFRLBSample5");

            //ジョブファイルのログレポートのレベルをデバッグに設定
            jobfileParam.put(XRFApiConfig.JOBFILE_CLIENT_LOGREPORT_LEVEL_KEY,
                    XRFApiConfig.JOBFILE_CLIENT_LOGREPORT_LEVEL_DEBUG);

            //ジョブファイルの拡張情報をセット（ログレポートで出力される）
            jobfileParam.put(XRFApiConfig.JOBFILE_EXTINFO_KEY_PREFIX
                    +"COMMENT", "comment.");

            // ジョブファイル
            String jobFile = "../output/XJF/temp/XRFRLBSample5.xjf";

            // XRF Readerが参照するためのファイルパスであり、
            // ここでは、XRF Readerはローカルであるため、絶対パス名を取得します。
            String requestJobFile = new File( jobFile ).getAbsolutePath();

            // XRF Readerの動作しているマシンのホスト名またはIPアドレス
            String readerHost = "localhost";

            // XRF Readerが監視するポート番号
            String readerPort = "44444";

            // ソケットタイムアウト[msec]
            String socketTimeout = "60000";

            // リモート印刷要求
            launchBroker.toPrintByJobFile( "../conf/conf.xml",
                    xrfFiles, jobfileParam, jobFile,
                    requestJobFile, readerHost, readerPort, socketTimeout);

        }catch (MakeJobFileException e){
            e.printStackTrace();
        }catch (XRFRemoteLaunchBrokerException e){
            e.printStackTrace();
        }
    }
}
