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}