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