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