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