    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.plugin.report;
    017
    018import org.opengion.fukurou.system.OgRuntimeException ;         // 6.4.2.0 (2016/01/29)
    019import java.io.PrintWriter;                                                                                     // 6.3.8.0 (2015/09/11)
    020import java.io.File;
    021import org.opengion.hayabusa.common.HybsSystem;
    022import org.opengion.hayabusa.report.AbstractRFIDPrintPointService;
    023import org.opengion.hayabusa.report.RFIDPrintRequest;
    024import org.opengion.fukurou.system.Closer ;                                                     // 6.3.8.0 (2015/09/11)
    025import org.opengion.fukurou.util.FileUtil;                                                      // 6.3.8.0 (2015/09/11)
    026
    027import static org.opengion.fukurou.system.HybsConst.CR ;                                // 5.9.0.0 (2015/09/04)
    028import static org.opengion.fukurou.system.HybsConst.FS ;                                // 5.9.0.0 (2015/09/04)
    029import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE ;     // 5.9.0.0 (2015/09/04)
    030
    031/**
    032 * XML形式でRFIDデータを作成します。
    033 * バッチのコールも内部で行います。
    034 *
    035 * @og.group 帳票システム
    036 *
    037 * @version  5.4.3.0
    038 * @author       Masakazu Takahashi
    039 * @since    JDK6.0,
    040 */
    041public class RFIDPrintPointService_DEFAULT extends AbstractRFIDPrintPointService {
    042
    043        private final StringBuilder strXML      = new StringBuilder( BUFFER_MIDDLE );   // XMLはこれに吐く
    044        private final String    xmlEncode       = HybsSystem.sys("REPORT_RFID_TEXT_ENCODE");
    045
    046        /**
    047         * デフォルトコンストラクター
    048         *
    049         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    050         */
    051        public RFIDPrintPointService_DEFAULT() { super(); }             // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    052
    053        /**
    054         * RFID発行処理。
    055         *
    056         * XMLを作って、ファイル出力
    057         *
    058         * @og.rev 6.3.8.0 (2015/09/11) FileUtil#getPrintWriter( File,String ) を使用。
    059         *
    060         * @return 結果 [true:正常/false:異常]
    061         */
    062        @Override
    063        public boolean execute(){
    064                System.out.print( "RRID RequestData Creating ... " );
    065                PrintWriter    bw = null;                               // 6.3.8.0 (2015/09/11)
    066                // 6.3.9.1 (2015/11/27) Found 'DD'-anomaly for variable(PMD)
    067                final boolean flg;
    068                try {
    069                        makeXMLheader();
    070                        makeXMLprintHeader();
    071                        makeXMLprintCards();
    072                        makeXMLfooter();
    073
    074                        // 6.3.8.0 (2015/09/11) FileUtil#getPrintWriter( File,String ) を使用。
    075                        bw = FileUtil.getPrintWriter( new File( outdir ),xmlEncode ) ;          // 6.3.8.0 (2015/09/11)
    076                        bw.write( strXML.toString() );
    077                        bw.flush();
    078
    079                        // 常に実行する
    080                        makeShellCommand();
    081                        flg = programRun();
    082                }
    083                catch( final Throwable ex ) {
    084                        errMsg.append( "RFID Print Request Execution Error. " ).append( CR )
    085                                .append( "==============================" ).append( CR )
    086                                .append( "SYSTEM_ID=[" ).append( systemId ).append( "] , " )
    087                                .append( "YKNO=["    ).append( ykno    ).append( "] , " )
    088                                .append( ex.toString() )
    089                                .append( CR );
    090                        throw new OgRuntimeException( errMsg.toString(), ex );
    091                }
    092                finally {
    093                        Closer.ioClose( bw );           // 6.3.8.0 (2015/09/11)
    094                }
    095                return flg;
    096        }
    097
    098        /**
    099         * Dataタグ開始までを出力します。
    100         *
    101         * @og.rev 5.4.3.4 (2012/01/12) listid
    102         * @og.rev 5.4.3.9 (2012/01/25) layoutFile (新帳票のみ)
    103         */
    104        private void makeXMLheader(){
    105                strXML.append( "<?xml version=\"1.0\" encoding=\"").append( xmlEncode ).append("\" ?>" ).append( CR )
    106                        .append( "<RfidEvent>" ).append( CR )
    107                        .append( "<Type>210</Type>" ).append( CR )                      // 210固定
    108                        .append( "<SubType>1</SubType>" ).append( CR )          // 1固定
    109                        .append( "<Id>").append( listid ).append("</Id>" ).append( CR ) // 指定なし-> 5.4.3.4 listid
    110                        .append( "<LayoutFilename>").append( layoutFile ).append("</LayoutFilename>" ).append( CR )     // 5.4.3.9 追加
    111                        .append( "<SiteName>" ).append( hostName ).append( "</SiteName>" ).append( CR )
    112                //strXML.append( "<DeviceName>" ).append( prtName ).append( "</DeviceName>" ).append( CR )
    113                        .append( "<DeviceName>" ).append( prtid ).append( "</DeviceName>" ).append( CR ) // 5.4.3.9 nameからidへ
    114                        .append( "<Data>" ).append( CR );
    115        }
    116
    117        /**
    118         * printHeaderタグを出力します。
    119         * カラム数分のデータができます
    120         *
    121         * @og.rev 5.4.3.9 (2012/01/25) GE58はなくてもよい
    122         */
    123        private void makeXMLprintHeader(){
    124                strXML.append( "<PrintHeader systemId=\"" ).append( systemId ).append( "\" demandNo=\"" )
    125                                                .append( ykno ).append( "\">" ).append( CR );
    126
    127                for( int clmNo=0; clmNo<table.getColumnCount(); clmNo++ ) {
    128                        final String clmNm = table.getColumnName( clmNo );
    129
    130                        final String[] rfidConf = rfidLayout.get( clmNm );
    131                        if( rfidConf != null ) {
    132                                strXML.append( "<Col name=\"" ).append( clmNm ).append( '"' ).append( CR )
    133                                        .append( " kbout=\""  ).append( rfidConf[RFIDPrintRequest.GE58_KBOUT]  ).append( '"' ).append( CR )
    134                                        .append( " data1=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA1]  ).append( '"' ).append( CR )
    135                                        .append( " data2=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA2]  ).append( '"' ).append( CR )
    136                                        .append( " data3=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA3]  ).append( '"' ).append( CR )
    137                                        .append( " data4=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA4]  ).append( '"' ).append( CR )
    138                                        .append( " data5=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA5]  ).append( '"' ).append( CR )
    139                                        .append( " data6=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA6]  ).append( '"' ).append( CR )
    140                                        .append( " data7=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA7]  ).append( '"' ).append( CR )
    141                                        .append( " data8=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA8]  ).append( '"' ).append( CR )
    142                                        .append( " data9=\""  ).append( rfidConf[RFIDPrintRequest.GE58_DATA9]  ).append( '"' ).append( CR )
    143                                        .append( " data10=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA10] ).append( '"' ).append( CR )
    144                                        .append( " data11=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA11] ).append( '"' ).append( CR )
    145                                        .append( " data12=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA12] ).append( '"' ).append( CR )
    146                                        .append( " data13=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA13] ).append( '"' ).append( CR )
    147                                        .append( " data14=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA14] ).append( '"' ).append( CR )
    148                                        .append( " data15=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA15] ).append( '"' )
    149                                        .append( " />" ).append(        CR );           // XML なので、このまま。
    150                        }
    151                }
    152
    153                strXML.append( "</PrintHeader>" ).append( CR );
    154        }
    155
    156        /**
    157         * printCardsタグ開始までを出力します。
    158         * 印刷枚数分のデータができます
    159         */
    160        private void makeXMLprintCards(){
    161                strXML.append( "<PrintCards>" ).append( CR );
    162
    163                for( int rowNo=0; rowNo<table.getRowCount(); rowNo++ ) {
    164                        strXML.append( "<PrintCard control=\"" ).append( fgrun ).append( "\" edno=\"" )
    165                                .append( Integer.toString( rowNo+1 ) ).append( "\">" ).append( CR );
    166
    167                        // カラム単位の処理
    168                        for( int clmNo=0; clmNo<table.getColumnCount(); clmNo++ ) {
    169                                strXML.append( "<ColData name=\"" ).append( table.getColumnName( clmNo ) ).append("\">")
    170                                        .append( table.getValue( rowNo, clmNo ) )
    171                                        .append( "</ColData>" ).append( CR );
    172                        }
    173
    174                        strXML.append( "</PrintCard>" ).append( CR );
    175                }
    176
    177                strXML.append( "</PrintCards>" ).append( CR );
    178        }
    179
    180        /**
    181         * Dataタグ終了から最後までを出力します。
    182         */
    183        private void makeXMLfooter(){
    184                strXML.append( "</Data>" ).append( CR )
    185                        .append( "<Time>systemstamp</Time>" ).append( CR )                              // systemstamp固定
    186                        .append( "<SourceName>null</SourceName>" ).append( CR )
    187                        .append( "<CorrelationId>null</CorrelationId>" ).append( CR )
    188                        .append( "</RfidEvent>" ).append( CR );
    189        }
    190
    191        /**
    192         * シェルコマンドの文字列を作成します。
    193         *
    194         * @og.rev 5.4.3.9 引数変更
    195         *
    196         * @return 結果 [true:正常/false:異常]
    197         */
    198        private boolean makeShellCommand() {
    199                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
    200                        .append( prgdir ).append( FS ).append( prgfile ).append( ' ' )  // 実行するコマンド
    201                        .append( '"' ).append( ykno             ).append( "\" " )                       // 引数１：要求NO
    202                        .append( '"' ).append( prtid    ).append( "\" " )                       // 引数２：プリンタID
    203                        .append( '"' ).append( prtName  ).append( "\" " )                       // 引数３：プリンタID
    204                        .append( '"' ).append( hostName ).append( "\" " )                       // 引数４：ホスト名
    205                        .append( '"' ).append( portnm   ).append( "\" " );                      // 引数５：プリンタポート 5.4.3.1(2011/12/27)
    206
    207                shellCmd = buf.toString();
    208                System.out.println( CR + shellCmd + CR );
    209
    210                return true;
    211        }
    212}