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( "\" " )                       // 引数1:要求NO
226                        .append( '\"' ).append( prtid           ).append( "\" " )                       // 引数2:プリンタID
227                        .append( '\"' ).append( prtName         ).append( "\" " )                       // 引数3:プリンタID
228                        .append( '\"' ).append( hostName        ).append( "\" " )                       // 引数4:ホスト名
229                        .append( '\"' ).append( portnm          ).append( "\" " );                      // 引数5:プリンタポート 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}