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 ); // XML なので、このまま。 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}