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