    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                }
    082                catch ( Throwable ex ) {
    083                        errMsg.append( "RFID Print Request Execution Error. " ).append( CR )
    084                                .append( "=============================="       ).append( CR )
    085                                .append( "SYSTEM_ID=["  ).append( systemId      ).append( "] , " )
    086                                .append( "YKNO=["               ).append( ykno          ).append( "] , " )
    087                                .append( ex.toString() )
    088                                .append( CR );
    089                        throw new RuntimeException( errMsg.toString(), ex );
    090                }
    091                return flg;
    092        }
    093
    094        /**
    095         * Dataタグ開始までを出力します。
    096         *
    097         * @og.rev 5.4.3.4 (2012/01/12) listid
    098         * @og.rev 5.4.3.9 (2012/01/25) layoutFile (新帳票のみ)
    099         */
    100        private void makeXMLheader(){
    101                strXML.append( "<?xml version=\"1.0\" encoding=\""      ).append( xmlEncode ).append("\" ?>" ).append( CR )
    102                        .append( "<RfidEvent>"                                                                                                                          ).append( CR )
    103                        .append( "<Type>210</Type>"                                                                                                                     ).append( CR )          // 210固定
    104                        .append( "<SubType>1</SubType>"                                                                                                         ).append( CR )          // 1固定
    105                        .append( "<Id>"                         ).append( listid                ).append( "</Id>"                               ).append( CR )          // 指定なし-> 5.4.3.4 listid
    106                        .append( "<LayoutFilename>"     ).append( layoutFile    ).append( "</LayoutFilename>"   ).append( CR )          // 5.4.3.9 追加
    107                        .append( "<SiteName>"           ).append( hostName              ).append( "</SiteName>"                 ).append( CR )
    108                //      .append( "<DeviceName>"         ).append( prtName               ).append( "</DeviceName>"               ).append( CR )
    109                        .append( "<DeviceName>"         ).append( prtid                 ).append( "</DeviceName>"               ).append( CR )          // 5.4.3.9 nameからidへ
    110                        .append( "<Data>"                       ).append( CR );
    111        }
    112
    113        /**
    114         * printHeaderタグを出力します。
    115         * カラム数分のデータができます
    116         *
    117         * @og.rev 5.4.3.9 (2012/01/25) GE58はなくてもよい
    118         */
    119        private void makeXMLprintHeader(){
    120                strXML.append( "<PrintHeader systemId=\"" ).append( systemId ).append( "\" demandNo=\"" )
    121                                                .append( ykno ).append( "\">" ).append( CR );
    122
    123                for( int clmNo=0; clmNo<table.getColumnCount(); clmNo++ ) {
    124                        final String clmNm = table.getColumnName( clmNo );
    125
    126                        final String[] rfidConf = rfidLayout.get( clmNm );
    127                        if( rfidConf != null ) {
    128//                              strXML.append( "<Col name=\"" ).append( clmNm ).append( "\"" ).append( CR )
    129                                strXML.append( "<Col name=\"" ).append( clmNm ).append( '"' ).append( CR )                      // 6.9.7.0 (2018/05/14) PMD
    130                                        .append( " kbout=\""  ).append( rfidConf[RFIDPrintRequest.GE58_KBOUT]  ).append( '\"' ).append( CR )
    131                                        .append( " data1=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA1]  ).append( '\"' ).append( CR )
    132                                        .append( " data2=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA2]  ).append( '\"' ).append( CR )
    133                                        .append( " data3=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA3]  ).append( '\"' ).append( CR )
    134                                        .append( " data4=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA4]  ).append( '\"' ).append( CR )
    135                                        .append( " data5=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA5]  ).append( '\"' ).append( CR )
    136                                        .append( " data6=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA6]  ).append( '\"' ).append( CR )
    137                                        .append( " data7=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA7]  ).append( '\"' ).append( CR )
    138                                        .append( " data8=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA8]  ).append( '\"' ).append( CR )
    139                                        .append( " data9=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA9]  ).append( '\"' ).append( CR )
    140                                        .append( " data10=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA10] ).append( '\"' ).append( CR )
    141                                        .append( " data11=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA11] ).append( '\"' ).append( CR )
    142                                        .append( " data12=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA12] ).append( '\"' ).append( CR )
    143                                        .append( " data13=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA13] ).append( '\"' ).append( CR )
    144                                        .append( " data14=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA14] ).append( '\"' ).append( CR )
    145                                        .append( " data15=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA15] ).append( '\"' )
    146                                        .append( " />"        ).append( CR );
    147                        }
    148                }
    149
    150                strXML.append( "</PrintHeader>" ).append( CR );
    151        }
    152
    153        /**
    154         * printCardsタグ開始までを出力します。
    155         * 印刷枚数分のデータができます
    156         */
    157        private void makeXMLprintCards(){
    158                strXML.append( "<PrintCards>" ).append( CR );
    159
    160                for( int rowNo=0; rowNo<table.getRowCount(); rowNo++ ) {
    161                        strXML.append( "<PrintCard control=\"" ).append( fgrun ).append( "\" edno=\"" )
    162                                .append( Integer.toString( rowNo+1 ) ).append( "\">" ).append( CR );
    163
    164                        // カラム単位の処理
    165                        for( int clmNo=0; clmNo<table.getColumnCount(); clmNo++ ) {
    166                                strXML.append( "<ColData name=\"" ).append( table.getColumnName( clmNo ) ).append("\">")
    167                                        .append( table.getValue( rowNo, clmNo ) )
    168                                        .append( "</ColData>" ).append( CR );
    169                        }
    170
    171                        strXML.append( "</PrintCard>" ).append( CR );
    172                }
    173
    174                strXML.append( "</PrintCards>" ).append( CR );
    175        }
    176
    177        /**
    178         * Dataタグ終了から最後までを出力します。
    179         */
    180        private void makeXMLfooter(){
    181                strXML.append( "</Data>"                                                        ).append( CR )
    182                        .append( "<Time>systemstamp</Time>"                             ).append( CR )                          // systemstamp固定
    183                        .append( "<SourceName>null</SourceName>"                ).append( CR )
    184                        .append( "<CorrelationId>null</CorrelationId>"  ).append( CR )
    185                        .append( "</RfidEvent>"                                                 ).append( CR );
    186        }
    187
    188        /**
    189         * XMLファイル書き込み用のライターを返します。
    190         *
    191         * @param fileName ファイル名
    192         * @param append アベンドするか
    193         * @param encode エンコード
    194         *
    195         * @return ライター
    196         */
    197        private BufferedWriter getWriter( final String fileName, final boolean append, final String encode) {
    198                final File file = new File ( fileName );
    199                BufferedWriter bw;
    200
    201                try {
    202                        bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( file, append ), encode ) );
    203                }
    204                catch ( final UnsupportedEncodingException ex ) {
    205                        errMsg.append( "[ERROR] Input File is written by Unsupported Encoding" );
    206                        throw new HybsSystemException( ex );
    207                }
    208                catch ( final FileNotFoundException ex ) {
    209                        errMsg.append( "[ERROR] File not Found" );
    210                        throw new HybsSystemException( ex );
    211                }
    212                return bw;
    213        }
    214
    215        /**
    216         * シェルコマンドの文字列を作成します。
    217         *
    218         * @og.rev 5.4.3.9 引数変更
    219         *
    220         * @return 結果 [true:正常/false:異常]
    221         */
    222        private boolean makeShellCommand() {
    223                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
    224                        .append( prgdir ).append( FS ).append( prgfile ).append( ' ' )  // 実行するコマンド
    225                        .append( '\"' ).append( ykno            ).append( "\" " )                       // 引数１：要求NO
    226                        .append( '\"' ).append( prtid           ).append( "\" " )                       // 引数２：プリンタID
    227                        .append( '\"' ).append( prtName         ).append( "\" " )                       // 引数３：プリンタID
    228                        .append( '\"' ).append( hostName        ).append( "\" " )                       // 引数４：ホスト名
    229                        .append( '\"' ).append( portnm          ).append( "\" " );                      // 引数５：プリンタポート 5.4.3.1(2011/12/27)
    230
    231                shellCmd = buf.toString();
    232                System.out.println( CR + shellCmd + CR );
    233
    234                return true;
    235        }
    236}