    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 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 org.opengion.hayabusa.report.AbstractRFIDPrintPointService;
    027import org.opengion.hayabusa.report.RFIDPrintRequest;
    028
    029/**
    030 * XML形式でRFIDデータを作成します。
    031 * バッチのコールも内部で行います。
    032 *
    033 * @og.group 帳票システム
    034 *
    035 * @version  5.4.3.0
    036 * @author       Masakazu Takahashi
    037 * @since    JDK6.0,
    038 */
    039public class RFIDPrintPointService_DEFAULT extends AbstractRFIDPrintPointService {
    040
    041        private static final String CR          = System.getProperty("line.separator");
    042        private final StringBuilder strXML      = new StringBuilder();  // XMLはこれに吐く
    043
    044        private final String    xmlEncode       = HybsSystem.sys("REPORT_RFID_TEXT_ENCODE");
    045
    046        /**
    047         * RFID発行処理
    048         * XMLを作って、ファイル出力
    049         *
    050         * @return 結果 [true:正常/false:異常]
    051         */
    052        @Override
    053        public boolean execute(){
    054                System.out.print( "RRID RequestData Creating ... " );
    055                BufferedWriter bw = null;
    056                String filename= outdir;
    057                boolean flg = false;
    058
    059                try {
    060                        makeXMLheader();
    061                        makeXMLprintHeader();
    062                        makeXMLprintCards();
    063                        makeXMLfooter();
    064
    065                        bw = getWriter(filename,false,xmlEncode);
    066                        bw.write( strXML.toString() );
    067                        bw.flush();
    068                        bw.close();
    069
    070                        // 常に実行する
    071                        makeShellCommand();
    072                        flg = programRun();
    073
    074                }
    075                catch ( Throwable ex ) {
    076                        errMsg.append( "RFID Print Request Execution Error. " ).append( CR );
    077                        errMsg.append( "==============================" ).append( CR );
    078                        errMsg.append( "SYSTEM_ID=[" ).append( systemId ).append( "] , " );
    079                        errMsg.append( "YKNO=["    ).append( ykno    ).append( "] , " );
    080                        errMsg.append( ex.toString() );
    081                        errMsg.append( CR );
    082//                      throw new RuntimeException( errMsg.toString() );
    083                        throw new RuntimeException( errMsg.toString(), ex );
    084                }
    085                return flg;
    086        }
    087
    088        /**
    089         * Dataタグ開始までを出力します
    090         *
    091         * @og.rev 5.4.3.4 (2012/01/12) listid
    092         * @og.rev 5.4.3.9 (2012/01/25) layoutFile (新帳票のみ)
    093         */
    094//      private void makeXML_header(){
    095        private void makeXMLheader(){
    096                strXML.append( "<?xml version=\"1.0\" encoding=\"").append( xmlEncode ).append("\" ?>" ).append( CR );
    097                strXML.append( "<RfidEvent>" ).append( CR );
    098                strXML.append( "<Type>210</Type>" ).append( CR );                   // 210固定
    099                strXML.append( "<SubType>1</SubType>" ).append( CR );               // 1固定
    100                strXML.append( "<Id>").append( listid ).append("</Id>" ).append( CR );      // 指定なし-> 5.4.3.4 listid
    101                strXML.append( "<LayoutFilename>").append( layoutFile ).append("</LayoutFilename>" ).append( CR );  // 5.4.3.9 追加
    102                strXML.append( "<SiteName>" ).append( hostName ).append( "</SiteName>" ).append( CR );
    103                //strXML.append( "<DeviceName>" ).append( prtName ).append( "</DeviceName>" ).append( CR );
    104                strXML.append( "<DeviceName>" ).append( prtid ).append( "</DeviceName>" ).append( CR ); // 5.4.3.9 nameからidへ
    105                strXML.append( "<Data>" ).append( CR );
    106        }
    107
    108        /**
    109         * printHeaderタグを出力します
    110         * カラム数分のデータができます
    111         *
    112         * @og.rev 5.4.3.9 (2012/01/25) GE58はなくてもよい
    113         */
    114//      private void makeXML_printHeader(){
    115        private void makeXMLprintHeader(){
    116                strXML.append( "<PrintHeader systemId=\"" ).append( systemId ).append( "\" demandNo=\"" )
    117                                                .append( ykno ).append( "\">" ).append( CR );
    118
    119                for( int clmNo=0; clmNo<table.getColumnCount(); clmNo++ ) {
    120                        String clmNm = table.getColumnName( clmNo );
    121
    122                        String[] rfidConf = rfidLayout.get( clmNm );
    123//                      if( rfidConf == null ) {
    124//                              // 5.4.3.9 なくてもエラーにしない
    125//                              errMsg.append( "Column does not Exists in GE58. " ).append( CR );
    126//                              errMsg.append( "==============================" ).append( CR );
    127//                              errMsg.append( "SYSTEM_ID=[" ).append( systemId ).append( "] , " );
    128//                              errMsg.append( "YKNO=["    ).append( ykno    ).append( "] , " );
    129//                              errMsg.append( "COLUMN=["    ).append( table.getColumnName( clmNo )    ).append( "]" );
    130//                              errMsg.append( CR );
    131//                              throw new RuntimeException( errMsg.toString() );
    132//                      }
    133//                      else{
    134                        if( rfidConf != null ) {
    135                                strXML.append( "<Col name=\"" ).append( clmNm ).append( "\"" ).append( CR );
    136                                strXML.append( " kbout=\"" ).append( rfidConf[RFIDPrintRequest.GE58_KBOUT] ).append( "\"" ).append( CR );
    137                                strXML.append( " data1=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA1] ).append( "\"" ).append( CR );
    138                                strXML.append( " data2=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA2] ).append( "\"" ).append( CR );
    139                                strXML.append( " data3=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA3] ).append( "\"" ).append( CR );
    140                                strXML.append( " data4=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA4] ).append( "\"" ).append( CR );
    141                                strXML.append( " data5=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA5] ).append( "\"" ).append( CR );
    142                                strXML.append( " data6=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA6] ).append( "\"" ).append( CR );
    143                                strXML.append( " data7=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA7] ).append( "\"" ).append( CR );
    144                                strXML.append( " data8=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA8] ).append( "\"" ).append( CR );
    145                                strXML.append( " data9=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA9] ).append( "\"" ).append( CR );
    146                                strXML.append( " data10=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA10] ).append( "\"" ).append( CR );
    147                                strXML.append( " data11=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA11] ).append( "\"" ).append( CR );
    148                                strXML.append( " data12=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA12] ).append( "\"" ).append( CR );
    149                                strXML.append( " data13=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA13] ).append( "\"" ).append( CR );
    150                                strXML.append( " data14=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA14] ).append( "\"" ).append( CR );
    151                                strXML.append( " data15=\"" ).append( rfidConf[RFIDPrintRequest.GE58_DATA15] ).append( "\"" );
    152                                strXML.append( " />" ).append(       CR );
    153                        }
    154                }
    155
    156                strXML.append( "</PrintHeader>" ).append( CR );
    157        }
    158
    159        /**
    160         * printCardsタグ開始までを出力します
    161         * 印刷枚数分のデータができます
    162         */
    163//      private void makeXML_printCards(){
    164        private void makeXMLprintCards(){
    165                strXML.append( "<PrintCards>" ).append( CR );
    166
    167                for( int rowNo=0; rowNo<table.getRowCount(); rowNo++ ) {
    168                        strXML.append( "<PrintCard control=\"" ).append( fgrun ).append( "\" edno=\"" )
    169                                .append( Integer.toString( rowNo+1 ) ).append( "\">" ).append( CR );
    170
    171                        // カラム単位の処理
    172                        for( int clmNo=0; clmNo<table.getColumnCount(); clmNo++ ) {
    173                                strXML.append( "<ColData name=\"" ).append( table.getColumnName( clmNo ) ).append("\">");
    174                                strXML.append( table.getValue( rowNo, clmNo ) );
    175                                strXML.append( "</ColData>" ).append( CR );
    176                        }
    177
    178                        strXML.append( "</PrintCard>" ).append( CR );
    179                }
    180
    181                strXML.append( "</PrintCards>" ).append( CR );
    182        }
    183
    184        /**
    185         * Dataタグ終了から最後までを出力します
    186         */
    187//      private void makeXML_footer(){
    188        private void makeXMLfooter(){
    189                strXML.append( "</Data>" ).append( CR );
    190                strXML.append( "<Time>systemstamp</Time>" ).append( CR );                           // systemstamp固定
    191                strXML.append( "<SourceName>null</SourceName>" ).append( CR );
    192                strXML.append( "<CorrelationId>null</CorrelationId>" ).append( CR );
    193                strXML.append( "</RfidEvent>" ).append( CR );
    194        }
    195
    196        /**
    197         * XMLファイル書き込み用のライターを返します。
    198         *
    199         * @param fileName ファイル名
    200         * @param append アベンドするか
    201         * @param encode エンコード
    202         *
    203         * @return ライター
    204         */
    205        private BufferedWriter getWriter( final String fileName, final boolean append, final String encode) {
    206                File file = new File ( fileName );
    207                BufferedWriter bw;
    208
    209                try {
    210                        bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( file, append ), encode ) );
    211                }
    212                catch ( UnsupportedEncodingException ex ) {
    213                        errMsg.append( "[ERROR] Input File is written by Unsupported Encoding" );
    214                        throw new HybsSystemException( ex );
    215                }
    216                catch ( FileNotFoundException ex ) {
    217                        errMsg.append( "[ERROR] File not Found" );
    218                        throw new HybsSystemException( ex );
    219                }
    220                return bw;
    221        }
    222
    223        /**
    224         * シェルコマンドの文字列を作成します。
    225         *
    226         * @og.rev 5.4.3.9 引数変更
    227         *
    228         * @return 結果 [true:正常/false:異常]
    229         */
    230        private boolean makeShellCommand() {
    231                StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL );
    232
    233                buf.append( prgdir + HybsSystem.FS + prgfile ).append( " " );           // 実行するコマンド
    234                buf.append( "\"" ).append( ykno ).append( "\" " );                      // 引数１：要求NO
    235                buf.append( "\"" ).append( prtid ).append( "\" " );                     // 引数２：プリンタID
    236                buf.append( "\"" ).append( prtName ).append( "\" " );           // 引数３：プリンタID
    237                buf.append( "\"" ).append( hostName ).append( "\" " );          // 引数４：ホスト名
    238                buf.append( "\"" ).append( portnm ).append( "\" " );                    // 引数５：プリンタポート 5.4.3.1(2011/12/27)
    239
    240                shellCmd = buf.toString();
    241                System.out.println( CR + shellCmd + CR );
    242
    243                return true;
    244        }
    245}