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