    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.report;
    017
    018import java.io.BufferedWriter;
    019import java.io.File;
    020import java.io.FileNotFoundException;
    021import java.io.FileOutputStream;
    022import java.io.OutputStreamWriter;
    023import java.io.UnsupportedEncodingException;
    024import org.opengion.hayabusa.common.HybsSystemException;
    025import org.opengion.hayabusa.common.HybsSystem;
    026import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE;      // 6.7.4.2 (2017/02/24)
    027import static org.opengion.fukurou.system.HybsConst.FS;                         // 6.7.4.2 (2017/02/24)
    028import static org.opengion.fukurou.system.HybsConst.CR;                         // 6.7.4.2 (2017/02/24)
    029
    030/**
    031 * XML形式でRFIDデータを作成します。
    032 * バッチのコールも内部で行います。
    033 *
    034 * @og.group 帳票システム
    035 *
    036 * @version  5.4.3.0
    037 * @author       Masakazu Takahashi
    038 * @since    JDK6.0,
    039 */
    040public class RFIDPrintPointService_DEFAULT extends AbstractRFIDPrintPointService {
    041
    042        private final StringBuilder strXML      = new StringBuilder( BUFFER_MIDDLE );   // XMLはこれに吐く
    043
    044        private final String    xmlEncode       = HybsSystem.sys("REPORT_RFID_TEXT_ENCODE");
    045
    046        /**
    047         * デフォルトコンストラクター
    048         *
    049         * @og.rev 6.9.7.0 (2018/05/14) PMD Each class should declare at least one constructor
    050         */
    051        public RFIDPrintPointService_DEFAULT() { super(); }             // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    052
    053        /**
    054         * RFID発行処理。
    055         * XMLを作って、ファイル出力
    056         *
    057         * @return 結果 [true:正常/false:異常]
    058         */
    059        @Override
    060        public boolean execute(){
    061                System.out.print( "RRID RequestData Creating ... " );
    062                BufferedWriter bw = null;
    063                final String filename= outdir;
    064                boolean flg = false;
    065
    066                try {
    067                        makeXMLheader();
    068                        makeXMLprintHeader();
    069                        makeXMLprintCards();
    070                        makeXMLfooter();
    071
    072                        bw = getWriter(filename,false,xmlEncode);
    073                        bw.write( strXML.toString() );
    074                        bw.flush();
    075                        bw.close();
    076
    077                        // 常に実行する
    078                        makeShellCommand();
    079                        flg = programRun();
    080                }
    081                catch ( Throwable ex ) {
    082                        errMsg.append( "RFID Print Request Execution Error. " ).append( CR )
    083                                .append( "=============================="       ).append( CR )
    084                                .append( "SYSTEM_ID=["  ).append( systemId      ).append( "] , " )
    085                                .append( "YKNO=["               ).append( ykno          ).append( "] , " )
    086                                .append( ex.toString() )
    087                                .append( CR );
    088                        throw new RuntimeException( errMsg.toString(), ex );
    089                }
    090                return flg;
    091        }
    092
    093        /**
    094         * Dataタグ開始までを出力します。
    095         *
    096         * @og.rev 5.4.3.4 (2012/01/12) listid
    097         * @og.rev 5.4.3.9 (2012/01/25) layoutFile (新帳票のみ)
    098         */
    099        private void makeXMLheader(){
    100                strXML.append( "<?xml version=\"1.0\" encoding=\""      ).append( xmlEncode ).append("\" ?>" ).append( CR )
    101                        .append( "<RfidEvent>"                                                                                                                          ).append( CR )
    102                        .append( "<Type>210</Type>"                                                                                                                     ).append( CR )          // 210固定
    103                        .append( "<SubType>1</SubType>"                                                                                                         ).append( CR )          // 1固定
    104                        .append( "<Id>"                         ).append( listid                ).append( "</Id>"                               ).append( CR )          // 指定なし-> 5.4.3.4 listid
    105                        .append( "<LayoutFilename>"     ).append( layoutFile    ).append( "</LayoutFilename>"   ).append( CR )          // 5.4.3.9 追加
    106                        .append( "<SiteName>"           ).append( hostName              ).append( "</SiteName>"                 ).append( CR )
    107                //      .append( "<DeviceName>"         ).append( prtName               ).append( "</DeviceName>"               ).append( CR )
    108                        .append( "<DeviceName>"         ).append( prtid                 ).append( "</DeviceName>"               ).append( CR )          // 5.4.3.9 nameからidへ
    109                        .append( "<Data>"                       ).append( CR );
    110        }
    111
    112        /**
    113         * printHeaderタグを出力します。
    114         * カラム数分のデータができます
    115         *
    116         * @og.rev 5.4.3.9 (2012/01/25) GE58はなくてもよい
    117         */
    118        private void makeXMLprintHeader(){
    119                strXML.append( "<PrintHeader systemId=\"" ).append( systemId ).append( "\" demandNo=\"" )
    120                                                .append( ykno ).append( "\">" ).append( CR );
    121
    122                for( int clmNo=0; clmNo<table.getColumnCount(); clmNo++ ) {
    123                        final String clmNm = table.getColumnName( clmNo );
    124
    125                        final String[] rfidConf = rfidLayout.get( clmNm );
    126                        if( rfidConf != null ) {
    127//                              strXML.append( "<Col name=\"" ).append( clmNm ).append( "\"" ).append( CR )
    128                                strXML.append( "<Col name=\"" ).append( clmNm ).append( '"' ).append( CR )                      // 6.9.7.0 (2018/05/14) PMD
    129                                        .append( " kbout=\""  ).append( rfidConf[RFIDPrintRequest.GE58_KBOUT]  ).append( '\"' ).append( CR )
    130                                        .append( " data1=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA1]  ).append( '\"' ).append( CR )
    131                                        .append( " data2=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA2]  ).append( '\"' ).append( CR )
    132                                        .append( " data3=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA3]  ).append( '\"' ).append( CR )
    133                                        .append( " data4=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA4]  ).append( '\"' ).append( CR )
    134                                        .append( " data5=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA5]  ).append( '\"' ).append( CR )
    135                                        .append( " data6=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA6]  ).append( '\"' ).append( CR )
    136                                        .append( " data7=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA7]  ).append( '\"' ).append( CR )
    137                                        .append( " data8=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA8]  ).append( '\"' ).append( CR )
    138                                        .append( " data9=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA9]  ).append( '\"' ).append( CR )
    139                                        .append( " data10=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA10] ).append( '\"' ).append( CR )
    140                                        .append( " data11=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA11] ).append( '\"' ).append( CR )
    141                                        .append( " data12=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA12] ).append( '\"' ).append( CR )
    142                                        .append( " data13=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA13] ).append( '\"' ).append( CR )
    143                                        .append( " data14=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA14] ).append( '\"' ).append( CR )
    144                                        .append( " data15=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA15] ).append( '\"' )
    145                                        .append( " />"        ).append( CR );                   // XML なので、このまま。
    146                        }
    147                }
    148
    149                strXML.append( "</PrintHeader>" ).append( CR );
    150        }
    151
    152        /**
    153         * printCardsタグ開始までを出力します。
    154         * 印刷枚数分のデータができます
    155         */
    156        private void makeXMLprintCards(){
    157                strXML.append( "<PrintCards>" ).append( CR );
    158
    159                for( int rowNo=0; rowNo<table.getRowCount(); rowNo++ ) {
    160                        strXML.append( "<PrintCard control=\"" ).append( fgrun ).append( "\" edno=\"" )
    161                                .append( Integer.toString( rowNo+1 ) ).append( "\">" ).append( CR );
    162
    163                        // カラム単位の処理
    164                        for( int clmNo=0; clmNo<table.getColumnCount(); clmNo++ ) {
    165                                strXML.append( "<ColData name=\"" ).append( table.getColumnName( clmNo ) ).append("\">")
    166                                        .append( table.getValue( rowNo, clmNo ) )
    167                                        .append( "</ColData>" ).append( CR );
    168                        }
    169
    170                        strXML.append( "</PrintCard>" ).append( CR );
    171                }
    172
    173                strXML.append( "</PrintCards>" ).append( CR );
    174        }
    175
    176        /**
    177         * Dataタグ終了から最後までを出力します。
    178         */
    179        private void makeXMLfooter(){
    180                strXML.append( "</Data>"                                                        ).append( CR )
    181                        .append( "<Time>systemstamp</Time>"                             ).append( CR )                          // systemstamp固定
    182                        .append( "<SourceName>null</SourceName>"                ).append( CR )
    183                        .append( "<CorrelationId>null</CorrelationId>"  ).append( CR )
    184                        .append( "</RfidEvent>"                                                 ).append( CR );
    185        }
    186
    187        /**
    188         * XMLファイル書き込み用のライターを返します。
    189         *
    190         * @param fileName ファイル名
    191         * @param append アベンドするか
    192         * @param encode エンコード
    193         *
    194         * @return ライター
    195         */
    196        private BufferedWriter getWriter( final String fileName, final boolean append, final String encode) {
    197                final File file = new File ( fileName );
    198                BufferedWriter bw;
    199
    200                try {
    201                        bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( file, append ), encode ) );
    202                }
    203                catch ( final UnsupportedEncodingException ex ) {
    204                        errMsg.append( "[ERROR] Input File is written by Unsupported Encoding" );
    205                        throw new HybsSystemException( ex );
    206                }
    207                catch ( final FileNotFoundException ex ) {
    208                        errMsg.append( "[ERROR] File not Found" );
    209                        throw new HybsSystemException( ex );
    210                }
    211                return bw;
    212        }
    213
    214        /**
    215         * シェルコマンドの文字列を作成します。
    216         *
    217         * @og.rev 5.4.3.9 引数変更
    218         *
    219         * @return 結果 [true:正常/false:異常]
    220         */
    221        private boolean makeShellCommand() {
    222                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
    223                        .append( prgdir ).append( FS ).append( prgfile ).append( ' ' )  // 実行するコマンド
    224                        .append( '\"' ).append( ykno            ).append( "\" " )                       // 引数１：要求NO
    225                        .append( '\"' ).append( prtid           ).append( "\" " )                       // 引数２：プリンタID
    226                        .append( '\"' ).append( prtName         ).append( "\" " )                       // 引数３：プリンタID
    227                        .append( '\"' ).append( hostName        ).append( "\" " )                       // 引数４：ホスト名
    228                        .append( '\"' ).append( portnm          ).append( "\" " );                      // 引数５：プリンタポート 5.4.3.1(2011/12/27)
    229
    230                shellCmd = buf.toString();
    231                System.out.println( CR + shellCmd + CR );
    232
    233                return true;
    234        }
    235}