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