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.taglib; 017 018import org.opengion.hayabusa.common.HybsSystem; 019import org.opengion.hayabusa.common.HybsSystemException; 020import org.opengion.hayabusa.db.DBTableModel; 021import org.opengion.hayabusa.db.DBColumn; 022import org.opengion.hayabusa.io.TableReader; 023import org.opengion.fukurou.util.ErrorMessage; 024import org.opengion.fukurou.util.FileUtil; 025import org.opengion.fukurou.util.Closer ; 026import org.opengion.fukurou.util.StringUtil ; 027import static org.opengion.fukurou.util.StringUtil.nval ; 028 029import java.io.File; 030import java.io.BufferedReader; 031import java.util.Locale ; 032import java.io.ObjectOutputStream; 033import java.io.ObjectInputStream; 034import java.io.IOException; 035 036/** 037 * 指定のファイルを DBTableModelオブジェクトに読み取るファイル入力タグです。 038 * 039 * データ(DBTableModel)と、コントローラ(ReadTableタグ)を与えて、外部からコントロールすることで、 040 * 各種形式で データ(DBTableModel)を表示させることが できます。 041 * ReadTableタグ に対して、コマンドを与えることにより、内部のコントローラの実装に対応した 042 * 形式でデータを作成します。 043 * すべての読取の初期クラス名を リソースファイルの TABLE_READER_DEFAULT_CLASS で指定可能です。 044 * その場合、AutoReader を指定すると、Excel と Default(テキスト) を順番に試します。 045 * 046 * 入力件数を"DB.COUNT" キーでリクエストにセットしています。 047 * 048 * @og.formSample 049 * ●形式: 050 * <og:readTable 051 * command = "NEW" 052 * fileURL = "{@USER.ID}" 読み取り元ディレクトリ名 053 * filename = "{@filename}" 読み取り元ファイル名 054 * encode = "UnicodeLittle" 読み取り元ファイルエンコード名 055 * maxRowCount = "10000" 読取最大件数(0:[無制限]) 056 * /> 057 * ●body:なし 058 * 059 * ●Tag定義: 060 * <og:readTable 061 * readerClass 【TAG】実際に読み出すクラス名の略称(TableReader_**** の ****)をセットします({@og.doc03Link readerClass 初期値:Default}) 062 * fileURL 【TAG】読み取り元ディレクトリ名を指定します(初期値:FILE_URL) 063 * filename 【TAG】ファイルを作成するときのファイル名をセットします (初期値:FILE_FILENAME[=file.xls]) 064 * encode 【TAG】ファイルを作成するときのファイルエンコーディング名をセットします(初期値:FILE_ENCODE) 065 * maxRowCount 【TAG】読取時の最大取り込み件数をセットします (初期値:DB_MAX_ROW_COUNT[=1000])(0:[無制限]) 066 * separator 【TAG】可変長ファイルを作成するときの項目区切り文字をセットします 067 * tableId 【TAG】(通常使いません)sessionから所得する DBTableModelオブジェクトの ID 068 * command 【TAG】コマンド(NEW,RENEW)をセットします(初期値:NEW) 069 * modifyType 【TAG】ファイル取り込み時の モディファイタイプ(A(追加),C(更新),D(削除))を指定します 070 * displayMsg 【TAG】query の結果を画面上に表示するメッセージIDを指定します(初期値:MSG0033[ 件検索しました]) 071 * notfoundMsg 【TAG】検索結果がゼロ件の場合に表示するメッセージリソースIDを指定します(初期値:MSG0077[対象データはありませんでした]) 072 * sheetName 【TAG】EXCELファイルを読み込むときのシート名を設定します(初期値:指定なし) 073 * sheetNos 【TAG】EXCELファイルを読み込むときのシート番号を複数設定できます(初期値:0) 074 * sheetConstKeys 【TAG】EXCELファイルを読み込むときの固定値となるカラム名(CSV形式) 075 * sheetConstAdrs 【TAG】EXCELファイルを読み込むときの固定値となるアドレス(行-列,行-列,・・・) 076 * nullBreakClm 【TAG】カラム列に NULL が現れた時点で読み取りを中止します(複数Sheetの場合は、次のSheetを読みます)。 077 * columns 【TAG】読み取り元ファイルのカラム列を、外部(タグ)より指定します 078 * useNumber 【TAG】行番号情報を、使用している/していない[true/false]を指定します(初期値:true) 079 * adjustColumns 【TAG】読み取り元ファイルのデータ変換を行うカラム列をカンマ指定します 080 * checkColumns 【TAG】読み取り元ファイルの整合性チェックを行うカラム列をカンマ指定します 081 * nullCheck 【TAG】NULL チェックすべきカラム列をカンマ区切り(CVS形式)で指定します 082 * language 【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します 083 * stopZero 【TAG】読込件数が0件のとき処理を続行するかどうか[true/false]を指定します(初期値:false[続行する]) 084 * scope 【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session) 085 * mainTrans 【TAG】(通常使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:false) 086 * skipRowCount 【TAG】(通常は使いません)データの読み飛ばし件数を設定します 087 * useRenderer 【TAG】読取処理でラベルをコードリソースに逆変換を行うかどうかを指定します (初期値:USE_TABLE_READER_RENDERER[=false]) 088 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 5.7.7.2 (2014/06/20) 089 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 5.7.7.2 (2014/06/20) 090 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:true) 5.7.7.2 (2014/06/20) 091 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:true) 5.7.7.2 (2014/06/20) 092 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 093 * /> 094 * 095 * ●使用例 096 * 097 * <og:readTable 098 * command = "NEW" 099 * readerClass = "Fixed" 固定長データの読み取り 100 * modifyType = "{@modifyType}" 読取時のモディファイタイプ(A,C等) 101 * fileURL = "{@USER.ID}" 読み取り元ディレクトリ名 102 * filename = "{@filename}" 読み取り元ファイル名 103 * encode = "Shift_JIS" 読み取り元ファイルエンコード名 104 * maxRowCount = "10000" 読取最大件数(0:[無制限]) 105 * columns = "OYA,KO,HJO,SU,DYSTR,DYEND" #NAME に対応するカラム列 106 * useNumber = "false" 行番号の存在しないデータを読み取ります。 107 * adjustColumns = "OYA,KO,HJO,SU" データ変換するカラム列("*" で全カラム) 108 * checkColumns = "OYA,KO,HJO,SU" 整合性チェックするカラム列("*" で全カラム) 109 * nullCheck = "OYA,KO,SU" NULLチェックを実行します("*" で全カラム) 110 * stopZero = "true" 取得0件の場合に以降の処理を停止します 111 * skipRowCount = "4" データの読み飛ばし件数(読み込み開始は、この数字+1行目から) 112 * /> 113 * 114 * @og.group ファイル入力 115 * 116 * @version 4.0 117 * @author Kazuhiko Hasegawa 118 * @since JDK5.0, 119 */ 120public class ReadTableTag extends CommonTagSupport { 121 //* このプログラムのVERSION文字列を設定します。 {@value} */ 122 private static final String VERSION = "5.7.7.2 (2014/06/20)" ; 123 124 private static final long serialVersionUID = 577220140620L ; 125 126 private static final int ERROR_ROW_COUNT = 200 ; // 4.0.0 (2007/05/25) 127 128 /** command 引数に渡す事の出来る コマンド 新規作成 {@value} */ 129 public static final String CMD_NEW = "NEW" ; 130 /** command 引数に渡す事の出来る コマンド 再検索 {@value} */ 131 public static final String CMD_RENEW = "RENEW" ; 132 133 private static final String[] COMMAND_LIST = new String[] { CMD_NEW , CMD_RENEW }; 134 135 private String separator = TableReader.TAB_SEPARATOR; // 項目区切り文字 136 private String fileURL = HybsSystem.sys( "FILE_URL" ); 137 private String filename = HybsSystem.sys( "FILE_FILENAME" ); // ファイル名 138 private String encode = HybsSystem.sys( "FILE_ENCODE" ); // ファイルエンコーディング "JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS" 139 private String readerClass = HybsSystem.sys( "TABLE_READER_DEFAULT_CLASS" ); // 3.8.5.3 (2006/08/07) 140 private int maxRowCount = -1; 141 private String displayMsg = HybsSystem.sys( "VIEW_DISPLAY_MSG" ); 142 private String notfoundMsg = "MSG0077"; // 対象データはありませんでした。 143 private int executeCount = -1; // 検索/実行件数 144 private String modifyType = null; 145 private String adjustColumns = null; // 3.6.0.2 (2004/10/04) 取り込み時チェック 146 private String checkColumns = null; // 3.6.0.2 (2004/10/04) 取り込み時チェック 147 private String nullCheck = null; // 3.8.0.2 (2005/06/30) nullチェック確認 148 149 private transient DBTableModel table = null; 150 private String command = CMD_NEW; 151 private String tableId = HybsSystem.TBL_MDL_KEY ; 152 private String sheetName = null ; // 3.5.4.2 (2003/12/15) 153 private String sheetNos = null ; // 5.5.7.2 (2012/10/09) 複数シートを指定できるようにシート番号を指定できるようにする。 154 private String sheetConstKeys = null ; // 5.5.8.2 (2012/11/09) 固定値となるカラム名(CSV形式) 155 private String sheetConstAdrs = null ; // 5.5.8.2 (2012/11/09) 固定値となるアドレス(行-列,行-列,・・・) 156 private String nullBreakClm = null; // 5.5.8.2 (2012/11/09) 取込み条件/Sheet BREAK条件 157 158 // 3.5.4.5 (2004/01/23) 外部よりカラム列(カンマ区切り)を指定できるようにする。 159 private String columns = null; 160 private boolean useNumber = true; // 3.7.0.5 (2005/04/11) 161 162 private boolean stopZero = false; // 4.3.7.0 (2009/06/01) stopZero属性追加 163 164 // 5.1.8.0 (2010/07/01) AutoReaderのCalc対応 165 private static final String[] AUTO_READER_CLASS = new String[] { "Excel","Calc","Default" ,"Default" }; 166 private static final String[] AUTO_READER_ENCODE = new String[] { null ,null ,"UnicodeLittle","Windows-31J" }; 167 168 private boolean isMainTrans = true; // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し 169 private int skipRowCount = 0; // 5.1.6.0 (2010/05/01) データの読み飛ばし設定 170 171 // 5.9.8.1 (2016/05/13) 追加 172 private String[] matchKeys = null; 173 private String[] matchVals = null; 174 175 // 5.2.1.0 (2010/10/01) 読取処理でコードリソースのラベル変換を行うかどうか 176 private boolean useRenderer = HybsSystem.sysBool( "USE_TABLE_READER_RENDERER" ); // 5.2.1.0 (2010/10/01) 177 178 /** 179 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 180 * 181 * @og.rev 3.0.1.4 (2003/03/17) displayMsg が 0Byteの場合は、件数も表示しないように変更。 182 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 183 * @og.rev 3.5.4.1 (2003/12/01) 引数の BufferedReader を、InputStream に変更。 184 * @og.rev 3.5.4.3 (2004/01/05) 引数の InputStream を、 BufferedReader に戻す。 185 * @og.rev 3.5.6.5 (2004/08/09) 暫定的に、DBTableModelを先行削除します。 186 * @og.rev 3.6.0.0 (2004/09/24) DBTableModel の先行削除は、scope="session" の場合のみ。 187 * @og.rev 3.6.0.2 (2004/10/04) 取り込み時チェック用に、checkColumns,adjustColumns 属性追加 188 * @og.rev 3.6.0.8 (2004/11/19) DBTableModel をセーブする時に、トランザクションチェックを行います。 189 * @og.rev 3.8.5.3 (2006/08/07) readerClassが "Excel"でエラーが発生したとき、もう一度Defaultで再読取を行います。 190 * @og.rev 4.0.0.0 (2007/10/12) checkTableColumn 前に、modifyType 設定を行います。 191 * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel ) 192 * @og.rev 4.3.1.1 (2008/10/08) columnsが指定されている場合は、AutoReader禁止 193 * @og.rev 4.3.7.0 (2009/06/01) stopZero機能,DB.COUNTリクエストキーへ読込件数セットを追加 194 * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。 195 * @og.rev 5.1.8.0 (2010/07/01) AutoReaderのCalc対応 196 * @og.rev 5.1.9.0 (2010/08/01) AutoReaderでのExceptionの判定をThrowableに変更 197 * @og.rev 5.7.1.2 (2013/12/20) tempMsg.toString() ⇒ errMsg 変更 198 * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加 199 * 200 * @return 後続処理の指示 201 */ 202 @Override 203 public int doEndTag() { 204 debugPrint(); // 4.0.0 (2005/02/28) 205 // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加 206 if( !useTag() ) { return EVAL_PAGE ; } 207 208 if( check( command, COMMAND_LIST ) ) { 209 useMainTrans( isMainTrans ); // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し 210 startQueryTransaction( tableId ); // 3.6.0.8 (2004/11/19) 211 212 // 3.5.6.5 (2004/08/09) 削除するのは、セッションのオブジェクトでよい。 213 // 3.6.0.0 (2004/09/24) 削除するのは、scope="session" の場合のみ。 214 if( "session".equals( getScope() ) ) { 215 removeSessionAttribute( tableId ); 216 removeSessionAttribute( HybsSystem.VIEWFORM_KEY ); 217 } 218 219 if( maxRowCount < 0 ) { 220 maxRowCount = sysInt( "DB_MAX_ROW_COUNT" ); 221 } 222 223 // ファイル の読み込み:AutoReader 処理 224 BufferedReader pw = null; 225 final String[] READER_CLASS ; 226 final String[] READER_ENCODE ; 227 if( "AutoReader".equalsIgnoreCase( readerClass ) ) { 228 // 4.3.1.1 (2008/10/08) 229 if( columns != null && columns.length() > 0 ) { 230 String errMsg = "columnsが指定されている場合は、readerClass=\"AutoReader\"は使えません"; 231 throw new HybsSystemException( errMsg ); // 4.3.4.4 (2009/01/01) 232 } 233 READER_CLASS = AUTO_READER_CLASS ; 234 READER_ENCODE = AUTO_READER_ENCODE; 235 } 236 else { 237 READER_CLASS = new String[] { readerClass }; 238 READER_ENCODE = new String[] { encode }; 239 } 240 241 StringBuilder tempMsg = new StringBuilder(); 242 for( int i=0; i<READER_CLASS.length; i++ ) { 243 readerClass = READER_CLASS[i]; 244 encode = READER_ENCODE[i]; 245 246 try { 247 // 5.1.8.0 (2010/07/01) AutoReaderのCalc対応 248 if( "Excel".equalsIgnoreCase( readerClass ) || "Calc".equalsIgnoreCase( readerClass ) ) { 249 create( null ); 250 } 251 else { 252 pw = getBufferedReader(); 253 create( pw ); 254 } 255 // 成功すれば、エラーメッセージをクリアして、その場で抜ける。 256 tempMsg = null; 257 break; 258 } 259 // 3.8.5.3 (2006/08/07) readerClassが "Excel"でエラーが発生したとき、もう一度Defaultで再読取を行います。 260 // 5.1.9.0 (2010/08/01) RuntimeException系のExceptionがキャッチできないため、Throwableで受ける 261 catch( Throwable th ) { 262 tempMsg.append( "readerClass=[" ).append( readerClass ) 263 .append( "],encode=[" ).append( encode ) 264 .append( "] Error!" ).append( HybsSystem.CR ) 265 .append( th.getMessage() ).append( HybsSystem.CR ) ; 266 } 267 finally { 268 Closer.ioClose( pw ); // 4.0.0 (2006/01/31) close 処理時の IOException を無視 269 } 270 } 271 272 if( tempMsg != null ) { // 最後までエラーがあれば、例外処理を発行します。 273 String errMsg = tempMsg.toString(); 274 System.err.print( errMsg ); 275 throw new HybsSystemException( errMsg ); // 5.7.1.2 (2013/12/20) msg ⇒ errMsg 変更 276 } 277 278 if( table != null ) { 279 // 3.6.0.2 (2004/10/04) 280 // 4.0.0.0 (2007/10/12) checkTableColumn 前に、modifyType 設定を行います。 281 executeCount = table.getRowCount(); 282 if( modifyType != null ) { 283 for( int row=0; row<executeCount; row++ ) { 284 table.setModifyType( row,modifyType ); 285 } 286 } 287 288 ErrorMessage errMsg = checkTableColumn( table ); 289 if( errMsg != null && ! errMsg.isOK()) { 290 jspPrint( TaglibUtil.makeHTMLErrorTable( errMsg,getResource() ) ); 291 return SKIP_PAGE ; 292 } 293 294 } 295 // 3.6.0.8 (2004/11/19) トランザクションチェックを行います。 296 if( ! commitTableObject( tableId, table ) ) { 297 jspPrint( "ReadTableTag Query処理が割り込まれました。DBTableModel は登録しません。" ); 298 return SKIP_PAGE ; 299 } 300 301 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL ); 302 303 // 実行件数の表示 command="NEW" のときのみ、displayMsg を表示させます。 304 // 4.0.0 (2005/11/30) 出力順の変更。一番最初に出力します。 305 if( CMD_NEW.equals( command ) ) { 306 if( executeCount > 0 && displayMsg != null && displayMsg.length() > 0 ) { 307 buf.append( executeCount ); 308 buf.append( getResource().getLabel( displayMsg ) ); 309 buf.append( HybsSystem.BR ); 310 } 311 else if( executeCount == 0 && notfoundMsg != null && notfoundMsg.length() > 0 ) { 312 buf.append( getResource().getLabel( notfoundMsg ) ); 313 buf.append( HybsSystem.BR ); 314 } 315 } 316 317 // 4.3.7.0 (2009/06/01) 読込件数を、"DB.COUNT" キーでリクエストにセットする。 318 setRequestAttribute( "DB.COUNT" , String.valueOf( executeCount ) ); 319 320 jspPrint( buf.toString() ); 321 } 322 323 // 4.3.7.0 (2009/06/01) stopZero機能を追加 324 final int rtnCode ; 325 if( executeCount == 0 && stopZero ) { 326 rtnCode = SKIP_PAGE; 327 } 328 else { 329 rtnCode = EVAL_PAGE; 330 } 331 332 return rtnCode ; 333 } 334 335 /** 336 * タグリブオブジェクトをリリースします。 337 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 338 * 339 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加 340 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 341 * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。 342 * @og.rev 3.1.4.0 (2003/04/18) command 属性に、初期値(NEW)を設定する。 343 * @og.rev 3.5.4.2 (2003/12/15) EXCELのシート名を指定できるように変更。 344 * @og.rev 3.5.4.5 (2004/01/23) 外部よりカラム列(カンマ区切り)を指定できるようにする。 345 * @og.rev 3.6.0.2 (2004/10/04) checkColumns,adjustColumns,allColumnCheck 属性追加 346 * @og.rev 3.7.0.5 (2005/04/11) useNumber 属性を追加します。 347 * @og.rev 3.8.0.2 (2005/06/30) nullCheck 属性追加 348 * @og.rev 3.8.5.3 (2006/08/07) readerClass 属性の初期値をシステムリソースより取得します。 349 * @og.rev 4.3.7.0 (2009/06/01) stopZero属性追加 350 * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。 351 * @og.rev 5.1.6.0 (2010/05/01) データの読み飛ばし設定 skipRowCount 属性追加 352 * @og.rev 5.2.1.0 (2010/10/01) 読取処理でコードリソースのラベル変換を行うかどうか useRenderer 属性追加 353 * @og.rev 5.5.7.2 (2012/10/09) 複数シートを指定できるようにシート番号を指定できるように、sheetNos属性追加 354 * @og.rev 5.5.8.2 (2012/11/09) 固定値となるカラム名、アドレスの指定のための、sheetConstKeys、sheetConstAdrs属性追加 355 * @og.rev 5.5.8.2 (2012/11/09) カラム列に NULL が現れた時点で読み取りを中止する、nullBreakClm属性追加 356 * @og.rev 5.9.8.1 (2016/05/13) 読込条件の追加 357 */ 358 @Override 359 protected void release2() { 360 super.release2(); 361 separator = TableReader.TAB_SEPARATOR; // 項目区切り文字 362 fileURL = HybsSystem.sys( "FILE_URL" ); 363 filename = HybsSystem.sys( "FILE_FILENAME" ); // ファイル名 364 encode = HybsSystem.sys( "FILE_ENCODE" ); // ファイルエンコーディング "JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS" 365 readerClass = HybsSystem.sys( "TABLE_READER_DEFAULT_CLASS" ); // 3.8.5.3 (2006/08/07) 366 maxRowCount = -1; 367 displayMsg = HybsSystem.sys( "VIEW_DISPLAY_MSG" ); 368 notfoundMsg = "MSG0077"; // 対象データはありませんでした。 369 executeCount = -1; // 検索/実行件数 370 modifyType = null; 371 command = CMD_NEW; 372 table = null; 373 tableId = HybsSystem.TBL_MDL_KEY ; 374 sheetName = null; // 3.5.4.2 (2003/12/15) 375 sheetNos = null ; // 5.5.7.2 (2012/10/09) 複数シートを指定できるようにシート番号を指定できるようにする。 376 sheetConstKeys = null ; // 5.5.8.2 (2012/11/09) 固定値となるカラム名(CSV形式) 377 sheetConstAdrs = null ; // 5.5.8.2 (2012/11/09) 固定値となるアドレス(行-列,行-列,・・・) 378 nullBreakClm = null; // 5.5.8.2 (2012/11/09) 取込み条件/Sheet BREAK条件 379 columns = null; // 3.5.4.5 (2004/01/23) 380 useNumber = true; // 3.7.0.5 (2005/04/11) 381 adjustColumns = null; // 3.6.0.2 (2004/10/04) 取り込み時チェック 382 checkColumns = null; // 3.6.0.2 (2004/10/04) 取り込み時チェック 383 nullCheck = null; // 3.8.0.2 (2005/06/30) 384 stopZero = false; // 4.3.7.0 (2009/06/01) soptZero追加 385 isMainTrans = true; // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し 386 skipRowCount = 0; // 5.1.6.0 (2010/05/01) データの読み飛ばし設定 387 matchKeys = null; // 5.9.8.1 (2016/05/13) 読込条件設定 388 matchVals = null; // 5.9.8.1 (2016/05/13) 読込条件設定 389 useRenderer = HybsSystem.sysBool( "USE_TABLE_READER_RENDERER" ); // 5.2.1.0 (2010/10/01) 390 } 391 392 /** 393 * TableReader の実オブジェクトを生成して,BufferedReader に書き込みます。 394 * 395 * @og.rev 3.5.4.1 (2003/12/01) 引数の BufferedReader を、InputStream に変更。 396 * @og.rev 3.5.4.2 (2003/12/15) TableReader のサブクラス名変更。 397 * @og.rev 3.5.4.2 (2003/12/15) EXCELのシート名を指定できるように変更。 398 * @og.rev 3.5.4.3 (2004/01/05) 引数の InputStream を、 BufferedReader に戻す。 399 * @og.rev 3.5.4.5 (2004/01/23) TableReader に、encode を渡すように変更。 400 * @og.rev 3.5.6.0 (2004/06/18) 各種プラグイン関連付け設定を、システムパラメータ に記述します。 401 * @og.rev 3.7.0.5 (2005/04/11) useNumber 属性を追加します。 402 * @og.rev 4.0.0.0 (2005/01/31) キーの指定を、TableReader. から、TableReader_ に変更します。 403 * @og.rev 4.0.0.0 (2005/01/31) lang ⇒ ResourceManager へ変更 404 * @og.rev 5.1.6.0 (2010/05/01) データの読み飛ばし設定 skipRowCount 属性追加 405 * @og.rev 5.2.1.0 (2010/10/01) 読取処理でコードリソースのラベル変換を行うかどうか設定 useRenderer 属性追加 406 * @og.rev 5.5.7.2 (2012/10/09) 複数シートを指定できるようにシート番号を指定できるように、sheetNos属性追加 407 * @og.rev 5.5.8.2 (2012/11/09) 固定値となるカラム名、アドレスの指定のための、sheetConstKeys、sheetConstAdrs属性追加 408 * @og.rev 5.5.8.2 (2012/11/09) カラム列に NULL が現れた時点で読み取りを中止する、nullBreakClm属性追加 409 * @og.rev 5.9.8.1 (2016/05/13) match対応 410 * 411 * @param out 出力するBufferedReaderオブジェクト 412 */ 413 protected void create( final BufferedReader out ) { 414 String className = HybsSystem.sys( "TableReader_" + readerClass ) ; // 4.0.0 (2005/01/31) 415 TableReader reader = (TableReader)HybsSystem.newInstance( className ); // 3.5.5.3 (2004/04/09) 416 reader.setResourceManager( getResource() ); // 4.0.0 (2005/01/31) 417 reader.setSeparator( separator ); 418 reader.setEncode( encode ); // 3.5.4.5 (2004/01/23) 419 reader.setColumns( columns ); // 3.5.4.5 (2004/01/23) 420 reader.setUseNumber( useNumber ); // 3.7.0.5 (2005/04/11) 421 reader.setMaxRowCount( maxRowCount ); 422 reader.setSkipRowCount( skipRowCount ); // 5.1.6.0 (2010/05/01) 423 reader.setUseRenderer( useRenderer ); // 5.2.1.0 (2010/10/01) 424 reader.setMatchKeys( matchKeys ); // 5.9.8.1 (2016/05/13) 425 reader.setMatchVals( matchVals ); // 5.9.8.1 (2016/05/13) 426 reader.setDebug( isDebug() ); // 5.5.7.2 (2012/10/09) デバッグ情報を出力するかどうかを指定 427 if( reader.isExcel() ) { // 3.5.4.3 (2004/01/05) 428 reader.setFilename( HybsSystem.url2dir( StringUtil.urlAppend( fileURL,filename ))); 429 reader.setSheetName( sheetName ); // 3.5.4.2 (2003/12/15) 430 reader.setSheetNos( sheetNos ); // 5.5.7.2 (2012/10/09) 複数シートを指定できるようにシート番号を指定できるようにする。 431 reader.setSheetConstData( sheetConstKeys,sheetConstAdrs ) ; // 5.5.8.2 (2012/11/09) 固定値となるカラム名、アドレスの指定 432 reader.setNullBreakClm( nullBreakClm ) ; // 5.5.8.2 (2012/11/09) 取込み条件/Sheet BREAK条件 433 reader.readDBTable(); 434 } 435 else { 436 reader.readDBTable( out ); 437 } 438 table = reader.getDBTableModel(); 439 } 440 441 /** 442 * BufferedReader を取得します。 443 * 444 * ここでは、一般的なファイル出力を考慮した BufferedReader を作成します。 445 * 446 * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更 447 * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。 448 * @og.rev 3.5.4.1 (2003/12/01) 引数の BufferedReader を、InputStream に変更。 449 * @og.rev 3.5.4.3 (2004/01/05) 引数の InputStream を、 BufferedReader に戻す。 450 * @og.rev 3.5.5.9 (2004/06/07) FileUtil.getBufferedReader を使用 451 * 452 * @return ファイル読取BufferedReaderオブジェクト 453 */ 454 private BufferedReader getBufferedReader() { 455 if( filename == null ) { 456 String errMsg = "ファイル名がセットされていません。"; 457 throw new HybsSystemException( errMsg ); 458 } 459 String directory = HybsSystem.url2dir( fileURL ); 460 File file = new File( StringUtil.urlAppend( directory,filename ) ); 461 462 BufferedReader out = FileUtil.getBufferedReader( file,encode ); 463 464 return out ; 465 } 466 467 /** 468 * カラム文字列(CSV形式)から、カラム番号配列を作成します。 469 * 簡易メソッドです。 470 * 引数が、"*" の場合は、全カラムを指定したことになります。 471 * null の場合は、サイズが 0 の配列を返します。 472 * 473 * @og.rev 4.0.0.0 (2007/05/25) 新規作成 474 * 475 * @param clms カラム文字列(CSV形式) 476 * @param table DBTableModelオブジェクト 477 * 478 * @return カラム番号配列(無い場合は、長さ0の配列) 479 */ 480 private int[] makeClmNos( final String clms,final DBTableModel table ) { 481 final int[] clmNo; 482 483 if( clms == null ) { 484 clmNo = new int[0]; 485 } 486 else if( "*".equals( clms ) ) { 487 int size = table.getColumnCount(); 488 clmNo = new int[size]; 489 for( int i=0; i<size; i++ ) { 490 clmNo[i] = i; 491 } 492 } 493 else { 494 String[] clmStr = StringUtil.csv2Array( clms ); 495 int size = clmStr.length; 496 clmNo = new int[size]; 497 for( int i=0; i<size; i++ ) { 498 clmNo[i] = table.getColumnNo( clmStr[i] ); 499 } 500 } 501 502 return clmNo; 503 } 504 505 /** 506 * checkColumns に指定されたカラムをチェックします。 507 * カラムオブジェクトのDBType属性に対応したチェックを行います。 508 * チェック結果で、エラーが発生した場合は、ErrorMessage オブジェクトを 509 * 返します。 510 * DBColumn#valueCheck( String ) の結果のErrorMessageをすべて append 511 * していきます。 512 * useAdjust==true で、かつ、エラーがない場合は、adjustColumns 処理結果を 513 * DBTableModel に反映させます。 514 * debug=true で、エラー時の詳細なデータを出力します。 515 * 516 * @og.rev 3.6.0.2 (2004/10/04) 新規作成 517 * @og.rev 3.8.0.2 (2005/06/30) nullチェック確認 518 * @og.rev 4.0.0.0 (2007/05/25) 処理順序書き換え 519 * 520 * @param table DBTableModelオブジェクト 521 * 522 * @return カラムキー + 値 のエラーメッセージオブジェクト 523 */ 524 private ErrorMessage checkTableColumn( final DBTableModel table ) { 525 ErrorMessage errMsg = new ErrorMessage( "Check Columns Error!" ); 526 527 int rowCnt = table.getRowCount(); 528 int[] adjClmNo = makeClmNos( adjustColumns,table ); 529 int[] chkClmNo = makeClmNos( checkColumns,table ); 530 int[] nllclmNo = makeClmNos( nullCheck,table ); 531 532 boolean useAdjust = adjClmNo.length > 0 ; 533 534 for( int row=0; row<rowCnt; row++ ) { 535 String[] vals = table.getValues( row ); 536 DBColumn[] dbClms = table.getDBColumns(); 537 boolean isError = false; // 5.5.7.2 (2012/10/09) エラー時のフラグ。ループでクリアする。 538 539 // adjustColumns 処理 540 for( int i=0; i<adjClmNo.length; i++ ) { 541 int no = adjClmNo[i]; 542 vals[no] = dbClms[no].valueSet( vals[no] ); 543 } 544 545 // checkColumns 処理 546 for( int i=0; i<chkClmNo.length; i++ ) { 547 int no = chkClmNo[i]; 548 ErrorMessage msg = dbClms[no].valueCheck( vals[no] ); 549 if( msg.getKekka() > ErrorMessage.OK ) { 550 isError = true; 551 errMsg.append( row+1,dbClms[no].valueCheck( vals[no] ) ); 552 } 553 } 554 555 // nullCheck 処理 556 for( int i=0; i<nllclmNo.length; i++ ) { 557 int no = nllclmNo[i]; 558 if( vals[no] == null || vals[no].length() == 0 ) { 559 isError = true; 560 String label = dbClms[no].getLabel(); 561 // ERR0012 : 指定のデータがセットされていません。(NULLエラー)。key={0} 562 errMsg.addMessage( row+1,ErrorMessage.NG,"ERR0012",label ); 563 } 564 } 565 566 // 5.5.7.2 (2012/10/09) エラー時のデバッグ出力 567 if( isDebug() && isError ) { 568 errMsg.addMessage( row+1,ErrorMessage.OK,"Debug Info",java.util.Arrays.toString(table.getValues(row) ) ); 569 } 570 571 // adjustColumns 処理結果を反映させます。 572 if( useAdjust && !isError ) { table.setValues( vals,row ); } 573 if( errMsg.size() > ERROR_ROW_COUNT ) { break; } 574 } 575 576 return errMsg; 577 } 578 579 /** 580 * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します 581 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。 582 * 583 * @og.tag 584 * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に 585 * 渡す場合に、通常は、session を利用します。その場合の登録キーです。 586 * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、 587 * この tableId 属性を利用して、メモリ空間を分けます。 588 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。 589 * 590 * @param id sessionに登録する時の ID 591 */ 592 public void setTableId( final String id ) { 593 tableId = nval( getRequestParameter( id ), tableId ); 594 } 595 596 /** 597 * 【TAG】可変長ファイルを作成するときの項目区切り文字をセットします。 598 * 599 * @og.tag 可変長ファイルを作成するときの項目区切り文字をセットします。 600 * 601 * @param separator 項目区切り文字 602 */ 603 public void setSeparator( final String separator ) { 604 this.separator = nval( getRequestParameter( separator ),this.separator ); 605 } 606 607 /** 608 * 【TAG】読み取り元ディレクトリ名を指定します 609 * (初期値:FILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])。 610 * 611 * @og.tag 612 * この属性で指定されるディレクトリより、ファイルを読み取ります。 613 * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、 614 * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、 615 * fileURL = "{@USER.ID}" と指定すると、FILE_URL 属性で指定のフォルダの下に、 616 * さらに、各個人ID別のフォルダを作成して、そこを操作します。 617 * (初期値:システム定数のFILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])。 618 * 619 * @og.rev 4.0.0.0 (2005/01/31) StringUtil.urlAppend メソッドの利用 620 * @og.rev 4.0.0.0 (2007/11/20) 指定されたディレクトリ名の最後が"\"or"/"で終わっていない場合に、"/"を付加する。 621 * 622 * @param url 読み取り元ディレクトリ名 623 * @see org.opengion.hayabusa.common.SystemData#FILE_URL 624 */ 625 public void setFileURL( final String url ) { 626 String furl = nval( getRequestParameter( url ),null ); 627 if( furl != null ) { 628 char ch = furl.charAt( furl.length()-1 ); 629 if( ch != '/' && ch != '\\' ) { furl = furl + "/"; } 630 fileURL = StringUtil.urlAppend( fileURL,furl ); 631 } 632 } 633 634 /** 635 * 【TAG】ファイルを作成するときのファイル名をセットします 636 * (初期値:FILE_FILENAME[={@og.value org.opengion.hayabusa.common.SystemData#FILE_FILENAME}])。 637 * 638 * @og.tag ファイルを作成するときのファイル名をセットします。 639 * (初期値:システム定数のFILE_FILENAME[={@og.value org.opengion.hayabusa.common.SystemData#FILE_FILENAME}])。 640 * 641 * @param filename ファイル名 642 * @see org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK 643 */ 644 public void setFilename( final String filename ) { 645 this.filename = nval( getRequestParameter( filename ),this.filename ); 646 } 647 648 /** 649 * 【TAG】ファイルを作成するときのファイルエンコーディング名をセットします 650 * (初期値:FILE_ENCODE[={@og.value org.opengion.hayabusa.common.SystemData#FILE_ENCODE}])。 651 * 652 * @og.tag 653 * Shift_JIS,MS932,Windows-31J,UTF-8,ISO-8859-1,UnicodeLittle 654 * (初期値:システム定数のFILE_ENCODE[={@og.value org.opengion.hayabusa.common.SystemData#FILE_ENCODE}])。 655 * 656 * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更 657 * @og.rev 3.1.3.0 (2003/04/10) FILE_ENCODE から、エンコード情報を取得する。 658 * 659 * @param enc ファイルエンコーディング名 660 * @see <a href="http://www.iana.org/assignments/character-sets">IANA Charset Registry</a> 661 * @see org.opengion.hayabusa.common.SystemData#FILE_ENCODE 662 */ 663 public void setEncode( final String enc ) { 664 encode = nval( getRequestParameter( enc ),encode ); 665 } 666 667 /** 668 * 【TAG】実際に読み出すクラス名の略称(TableReader_**** の ****)をセットします({@og.doc03Link readerClass 初期値:Default})。 669 * 670 * @og.tag 671 * 実際に読み出すクラス名(の略称)をセットします。 672 * これは、org.opengion.hayabusa.io 以下の TableReader_**** クラスの **** を 673 * 与えます。これらは、TableReader インターフェースを継承したサブクラスです。 674 * 属性クラス定義の {@link org.opengion.hayabusa.io.TableReader TableReader} を参照願います。 675 * {@og.doc03Link readerClass TableReader_**** クラス} 676 * 677 * @param readerClass クラス名(の略称) 678 * @see org.opengion.hayabusa.io.TableReader TableReaderのサブクラス 679 */ 680 public void setReaderClass( final String readerClass ) { 681 this.readerClass = nval( getRequestParameter( readerClass ),this.readerClass ); 682 } 683 684 /** 685 * 【TAG】読取時の最大取り込み件数をセットします 686 * (初期値:DB_MAX_ROW_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT}])。 687 * 688 * @og.tag 689 * DBTableModelのデータとして登録する最大件数をこの値に設定します。 690 * サーバーのメモリ資源と応答時間の確保の為です。 691 * 0 をセットすると、無制限(Integer.MAX_VALUE)になります。 692 * (初期値:ユーザー定数のDB_MAX_ROW_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT}])。 693 * 694 * @og.rev 5.5.8.5 (2012/11/27) 0を無制限として処理します。 695 * 696 * @param count 読取時の最大取り込み件数 697 * @see org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT 698 */ 699 public void setMaxRowCount( final String count ) { 700 maxRowCount = nval( getRequestParameter( count ),maxRowCount ); 701 if( maxRowCount == 0 ) { maxRowCount = Integer.MAX_VALUE ; } // 5.5.8.5 (2012/11/27) 702 } 703 704 /** 705 * 【TAG】コマンド(NEW,RENEW)をセットします(初期値:NEW)。 706 * 707 * @og.tag 708 * コマンドは,HTMLから(get/post)指定されますので,CMD_xxx で設定される 709 * フィールド定数値のいづれかを、指定できます。 710 * 何も設定されない、または、null の場合は、"NEW" が初期値にセットされます。 711 * 712 * @param cmd コマンド(public static final 宣言されている文字列) 713 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ReadTableTag.CMD_NEW">コマンド定数</a> 714 */ 715 public void setCommand( final String cmd ) { 716 String cmd2 = getRequestParameter( cmd ); 717 if( cmd2 != null && cmd2.length() > 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); } 718 } 719 720 /** 721 * 【TAG】query の結果を画面上に表示するメッセージIDを指定します(初期値:MSG0033[ 件検索しました])。 722 * 723 * @og.tag 724 * ここでは、検索結果の件数や登録された件数をまず出力し、 725 * その次に、ここで指定したメッセージをリソースから取得して 726 * 表示します。 727 * 表示させたくない場合は, displayMsg = "" をセットしてください。 728 * 初期値は、検索件数を表示します。 729 * 730 * @param id ディスプレイに表示させるメッセージ ID 731 */ 732 public void setDisplayMsg( final String id ) { 733 if( id != null ) { displayMsg = id; } 734 } 735 736 /** 737 * 【TAG】検索結果がゼロ件の場合に表示するメッセージリソースIDを指定します(初期値:MSG0077[対象データはありませんでした])。 738 * 739 * @og.tag 740 * ここでは、検索結果がゼロ件の場合のみ、特別なメッセージを表示させます。 741 * 従来は、displayMsg と兼用で、『0 件検索しました』という表示でしたが、 742 * displayMsg の初期表示は、OFF になりましたので、ゼロ件の場合のみ別に表示させます。 743 * 表示させたくない場合は, notfoundMsg = "" をセットしてください。 744 * 初期値は、MSG0077[対象データはありませんでした]です。 745 * 746 * @param id ディスプレイに表示させるメッセージ ID 747 */ 748 public void setNotfoundMsg( final String id ) { 749 String ids = getRequestParameter( id ); 750 if( ids != null ) { notfoundMsg = ids; } 751 } 752 753 /** 754 * 【TAG】ファイル取り込み時の モディファイタイプ(A(追加),C(更新),D(削除))を指定します。 755 * 756 * @og.tag 757 * ファイル読み込み時に、そのデータをA(追加)、C(更新)、D(削除)の 758 * モディファイタイプをつけた状態にします。 759 * その状態で、そのまま、update する事が可能になります。 760 * 761 * @param type ファイル取り込み時の モディファイタイプ(A,C,D属性) 762 */ 763 public void setModifyType( final String type ) { 764 modifyType = getRequestParameter( type ); 765 } 766 767 /** 768 * 【TAG】EXCELファイルを読み込むときのシート名を設定します(初期値:指定なし)。 769 * 770 * @og.tag 771 * EXCELファイルを読み込む時に、シート名を指定します。これにより、複数の形式の 772 * 異なるデータを順次読み込むことや、シートを指定して読み取ることが可能になります。 773 * sheetNos と sheetName が同時に指定された場合は、sheetNos が優先されます。エラーにはならないのでご注意ください。 774 * 初期値は、指定なしです。 775 * 776 * @og.rev 3.5.4.2 (2003/12/15) 新規追加 777 * 778 * @param sheet EXCELファイルのシート名 779 * @see #setSheetNos( String ) 780 */ 781 public void setSheetName( final String sheet ) { 782 sheetName = nval( getRequestParameter( sheet ),sheetName ); 783 } 784 785 /** 786 * 【TAG】EXCELファイルを読み込むときのシート番号を指定します(初期値:0)。 787 * 788 * @og.tag 789 * EXCEL読み込み時に複数シートをマージして取り込みます。 790 * シート番号は、0 から始まる数字で表します。 791 * ヘッダーは、最初のシートのカラム位置に合わせます。(ヘッダータイトルの自動認識はありません。) 792 * よって、指定するシートは、すべて同一レイアウトでないと取り込み時にカラムのずれが発生します。 793 * 794 * シート番号の指定は、カンマ区切りで、複数指定できます。また、N-M の様にハイフンで繋げることで、 795 * N 番から、M 番のシート範囲を一括指定可能です。また、"*" による、全シート指定が可能です。 796 * これらの組み合わせも可能です。( 0,1,3,5-8,10-* ) 797 * ただし、"*" に関しては例外的に、一文字だけで、すべてのシートを表すか、N-* を最後に指定するかの 798 * どちらかです。途中には、"*" は、現れません。 799 * シート番号は、重複(1,1,2,2)、逆転(3,2,1) での指定が可能です。これは、その指定順で、読み込まれます。 800 * sheetNos と sheetName が同時に指定された場合は、sheetNos が優先されます。エラーにはならないのでご注意ください。 801 * 802 * 初期値は、0(第一シート) です。 803 * 804 * @og.rev 5.5.7.2 (2012/10/09) 新規追加 805 * 806 * @param sheet EXCELファイルのシート番号(0から始まる) 807 * @see #setSheetName( String ) 808 */ 809 public void setSheetNos( final String sheet ) { 810 sheetNos = nval( getRequestParameter( sheet ),sheetNos ); 811 if( sheetNos != null && sheetNos.length() > 0 ) { 812 boolean errFlag = false; 813 for( int i=0; i<sheetNos.length(); i++ ) { 814 char ch = sheetNos.charAt(i); 815 if( ch == '-' || ch == ',' ) { continue; } 816 if( ch == '*' && ( i==0 || i==sheetNos.length()-1 ) ) { continue; } 817 if( ch < '0' || ch > '9' ) { errFlag = true; break; } 818 } 819 if( errFlag ) { 820 String errMsg = "sheetNos の指定を見直してください。sheetNos=[" + sheetNos + "]"; 821 throw new HybsSystemException( errMsg ); 822 } 823 } 824 } 825 826 /** 827 * 【TAG】EXCELファイルを読み込むときのシート単位の固定値を設定するためのカラム名を指定します。 828 * 829 * @og.tag 830 * カラム名は、カンマ区切りで指定します。 831 * これにより、シートの一か所に書かれている情報を、DBTableModel のカラムに固定値として 832 * 設定することができます。 833 * 例として、DB定義書で、テーブル名をシートの全レコードに設定したい場合などに使います。 834 * このメソッドは、isExcel() == true の場合のみ利用されます。 835 * 836 * @og.rev 5.5.8.2 (2012/11/09) 新規追加 837 * 838 * @param constKeys 固定値となるカラム名(CSV形式) 839 * @see #setSheetConstAdrs( String ) 840 */ 841 public void setSheetConstKeys( final String constKeys ) { 842 sheetConstKeys = nval( getRequestParameter( constKeys ),null ); 843 } 844 845 /** 846 * 【TAG】EXCELファイルを読み込むときのシート単位の固定値を設定するためのカラム名に対応するアドレスを指定します。 847 * 848 * @og.tag 849 * アドレスは、EXCEL上の行-列をカンマ区切りで指定します。 850 * 行列は、EXCELオブジェクトに準拠するため、0から始まる整数です。 851 * 0-0 ⇒ A1 , 1-0 ⇒ A2 , 0-1 ⇒ B1 になります。 852 * これにより、シートの一か所に書かれている情報を、DBTableModel のカラムに固定値として 853 * 設定することができます。 854 * 例として、DB定義書で、テーブル名をシートの全レコードに設定したい場合などに使います。 855 * このメソッドは、isExcel() == true の場合のみ利用されます。 856 * 857 * 5.7.6.3 (2014/05/23) より、 858 * @EXCEL表記に準拠した、A1,A2,B1 の記述も処理できるように対応します。 859 * なお、A1,A2,B1 の記述は、必ず、英字1文字+数字 にしてください。(A〜Zまで) 860 * A処理中のEXCELシート名をカラムに割り当てるために、"SHEET" という記号に対応します。 861 * 例えば、sheetConstKeys="CLM,LANG,NAME" とし、sheetConstAdrs="0-0,A2,SHEET" とすると、 862 * NAMEカラムには、シート名を読み込むことができます。 863 * これは、内部処理の簡素化のためです。 864 * 865 * ちなみに、EXCELのセルに、シート名を表示させる場合の関数は、下記の様になります。 866 * =RIGHT(CELL("filename",$A$1),LEN(CELL("filename",$A$1))-FIND("]",CELL("filename",$A$1))) 867 * 868 * @og.rev 5.5.8.2 (2012/11/09) 新規追加 869 * 870 * @param constAdrs 固定値となるアドレス(行-列,行-列,・・・) 871 * @see #setSheetConstKeys( String ) 872 */ 873 public void setSheetConstAdrs( final String constAdrs ) { 874 sheetConstAdrs = nval( getRequestParameter( constAdrs ),null ); 875 } 876 877 /** 878 * 【TAG】ここに指定されたカラム列に NULL が現れた時点で読み取りを中止します。 879 * 880 * @og.tag 881 * これは、指定のカラムは必須という事を条件に、そのレコードだけを読み取る処理を行います。 882 * 複数Sheetの場合は、次のSheetを読みます。 883 * 現時点では、Excel の場合のみ有効です。 884 * 885 * @og.rev 5.5.8.2 (2012/11/09) 新規追加 886 * 887 * @param clm カラム列 888 */ 889 public void setNullBreakClm( final String clm ) { 890 nullBreakClm = nval( getRequestParameter( clm ),null ); 891 } 892 893 /** 894 * 【TAG】読み取り元ファイルのカラム列を、外部(タグ)より指定します。 895 * 896 * @og.tag 897 * 読み取り元ファイルのカラム列を、外部(タグ)より指定します。 898 * ファイルに記述された #NAME より優先して使用されます。 899 * これは、元ファイルのカラムを順番に指定のカラム名に割り当てる機能で 900 * ファイルの特定のカラム列を抜き出して取り込む機能ではありません。 901 * 902 * @og.rev 3.5.4.5 (2004/01/23) 新規作成 903 * 904 * @param clms 読み取り元ファイルのカラム列(カンマ区切り文字) 905 */ 906 public void setColumns( final String clms ) { 907 columns = nval( getRequestParameter( clms ),columns ); 908 } 909 910 /** 911 * 【TAG】読み取り元ファイルの整合性チェックを行うカラム列をカンマ指定します。 912 * 913 * @og.tag 914 * カラムオブジェクトのDBType属性に対応したチェックを行います。 915 * 指定のカラム名をカンマ区切り(CSV)で複数指定できます。 916 * 全てのカラムのチェックを行う場合は、allColumnCheck = "true" を 917 * 指定して下さい。 918 * 分解方法は、通常のパラメータ取得後に、CSV分解します。 919 * 920 * @og.rev 3.6.0.2 (2004/10/04) 新規追加 取り込み時チェック用 921 * @og.rev 3.8.8.5 (2007/03/09) 通常のパラメータ取得後に、CSV分解に戻します。 922 * 923 * @param clms 整合性チェックを行うカラム列(カンマ区切り文字) 924 */ 925 public void setCheckColumns( final String clms ) { 926 checkColumns = nval( getRequestParameter( clms ),checkColumns ); 927 } 928 929 /** 930 * 【TAG】読み取り元ファイルのデータ変換を行うカラム列をカンマ指定します。 931 * 932 * @og.tag 933 * カラムオブジェクトのDBType属性に対応したデータ変換を行います。 934 * 指定のカラム名をカンマ区切り(CSV)で複数指定できます。 935 * 分解方法は、通常のパラメータ取得後に、CSV分解します。 936 * 937 * @og.rev 3.6.0.2 (2004/10/04) 新規追加 取り込み時データ変換 938 * @og.rev 3.8.8.5 (2007/03/09) 通常のパラメータ取得後に、CSV分解に戻します。 939 * 940 * @param clms データ変換を行うカラム列(カンマ区切り文字) 941 */ 942 public void setAdjustColumns( final String clms ) { 943 adjustColumns = nval( getRequestParameter( clms ),adjustColumns ); 944 } 945 946 /** 947 * 【TAG】NULL チェックすべきカラム列をカンマ区切り(CVS形式)で指定します。 948 * 949 * @og.tag nullCheck="AAA,BBB,CCC,DDD" 950 * 分解方法は、通常のパラメータ取得後に、CSV分解します。 951 * 952 * @og.rev 3.8.0.2 (2005/06/30) 新規追加 953 * @og.rev 3.8.8.5 (2007/03/09) 通常のパラメータ取得後に、CSV分解に戻します。 954 * 955 * @param clms カラム列(CVS形式) 956 */ 957 public void setNullCheck( final String clms ) { 958 nullCheck = nval( getRequestParameter( clms ),nullCheck ); 959 } 960 961 /** 962 * 【TAG】行番号情報を、使用している/していない[true/false]を指定します(初期値:true)。 963 * 964 * @og.tag 965 * 通常のフォーマットでは、各行の先頭に行番号が出力されています。 966 * 読み取り時に、#NAME 属性を使用する場合は、この行番号を無視しています。 967 * #NAME 属性を使用せず、columns 属性でカラム名を指定する場合(他システムの 968 * 出力ファイルを読み取るケース等)では、行番号も存在しないケースがあり、 969 * その様な場合に、useNumber="false" を指定すれば、データの最初から読み取り始めます。 970 * この場合、出力データのカラムの並び順が変更された場合、columns 属性も 971 * 指定しなおす必要がありますので、できるだけ、#NAME 属性を使用するように 972 * してください。 973 * なお、EXCEL 入力には、この設定は適用されません。(暫定対応) 974 * 初期値は、true(使用する) です。 975 * 976 * @og.rev 3.7.0.5 (2005/04/11) 新規追加 977 * 978 * @param useNo 行番号情報 [true:使用する/false:使用しない] 979 */ 980 public void setUseNumber( final String useNo ) { 981 useNumber = nval( getRequestParameter( useNo ),useNumber ); 982 } 983 984 /** 985 * 【TAG】読込件数が0件のとき処理を続行するかどうか[true/false]を指定します(初期値:false[続行する])。 986 * 987 * @og.tag 988 * 初期値は、false(続行する)です。 989 * 990 * @og.rev 4.3.7.0 (2009/06/01) 新規追加 991 * 992 * @param cmd 読込件数が0件のとき、処理を [true:中止する/false:続行する] 993 */ 994 public void setStopZero( final String cmd ) { 995 stopZero = nval( getRequestParameter( cmd ), stopZero ); 996 } 997 998 /** 999 * 【TAG】(通常使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:false)。 1000 * 1001 * @og.tag 1002 * この値は、ファイルダウンロード処理に影響します。この値がtrueに指定された時にcommitされたDBTableModelが 1003 * ファイルダウンロードの対象の表になります。 1004 * 1005 * このパラメーターは、通常、各タグにより実装され、ユーザーが指定する必要はありません。 1006 * 但し、1つのJSP内でDBTableModelが複数生成される場合に、前に処理したDBTableModelについてファイルダウンロードをさせたい 1007 * 場合は、後ろでDBTableModelを生成するタグで、明示的にこの値をfalseに指定することで、ファイルダウンロード処理の対象から 1008 * 除外することができます。 1009 * 1010 * @og.rev 5.1.6.0 (2010/05/01) 新規作成 1011 * 1012 * @param flag メイントランザクションかどうか 1013 */ 1014 public void setMainTrans( final String flag ) { 1015 isMainTrans = nval( getRequestParameter( flag ),isMainTrans ); 1016 } 1017 1018 /** 1019 * 【TAG】(通常は使いません)データの読み飛ばし件数を設定します。 1020 * 1021 * @og.tag 1022 * TAB区切りテキストやEXCEL等のデータの読み始めの初期値を指定します。 1023 * ファイルの先頭行が、0行としてカウントしますので、設定値は、読み飛ばす 1024 * 件数になります。(1と指定すると、1件読み飛ばし、2行目から読み込みます。) 1025 * 読み飛ばしは、コメント行などは、無視しますので、実際の行数分読み飛ばします。 1026 * #NAME属性や、columns 属性は、有効です。 1027 * 1028 * @og.rev 5.1.6.0 (2010/05/01) 新規作成 1029 * 1030 * @param count 読み始めの初期値 1031 */ 1032 public void setSkipRowCount( final String count ) { 1033 skipRowCount = nval( getRequestParameter( count ),skipRowCount ); 1034 } 1035 1036 /** 1037 * 【TAG】読取処理でラベルをコードリソースに逆変換を行うかどうかを指定します 1038 * (初期値:USE_TABLE_READER_RENDERER[={@og.value org.opengion.hayabusa.common.SystemData#USE_TABLE_READER_RENDERER}])。 1039 * 1040 * @og.tag 1041 * TableWriter_Renderer 系のクラスで出力した場合は、コードリソースがラベルで出力されます。 1042 * そのファイルを読み取ると、当然、エラーになります。 1043 * ここでは、コードリソースのカラムに対して、ラベルからコードを求める逆変換を行うことで、 1044 * Renderer 系で出力したファイルを取り込むことができるようにします。 1045 * 1046 * ここでは、TableWriter 系と同様に、TableReader_Renderer 系のクラスを作るのではなく、 1047 * 属性値のフラグで、制御します。 1048 * 将来的には、TableWriter 系も廃止して、同様のフラグで制御するように変更する予定です。 1049 * (初期値:システム定数のUSE_TABLE_READER_RENDERER[={@og.value org.opengion.hayabusa.common.SystemData#USE_TABLE_READER_RENDERER}])。 1050 * 1051 * @og.rev 5.2.1.0 (2010/10/01) 新規作成 1052 * 1053 * @param flag コードリソースのラベル逆変換を行うかどうか 1054 * @see org.opengion.hayabusa.common.SystemData#USE_TABLE_READER_RENDERER 1055 */ 1056 public void setUseRenderer( final String flag ) { 1057 useRenderer = nval( getRequestParameter( flag ),useRenderer ); 1058 } 1059 1060 /** 1061 * 【TAG】matchKeysをカンマ区切りで指定します。 1062 * 1063 * @og.tag 1064 * ファイルから特定の行のみを読み取るためのmatchKeysを指定します。 1065 * matchKeysで指定したカラムに対して、matchValsの正規表現でチェックします。 1066 * この機能はTableReader_Defaultのみ有効です。 1067 * 通常は指定する必要はありません。 1068 * 1069 * 1070 * @og.rev 5.9.8.1 (2016/05/13) 新規作成 1071 * 1072 * @param keys カラム列(カンマ区切り文字) 1073 */ 1074 public void setMatchKeys( final String keys ) { 1075 matchKeys = getCSVParameter( keys ); 1076 1077 if( matchVals != null && matchKeys.length != matchVals.length ) { 1078 String errMsg = "matchKeys属性とmatchVals属性の個数が合いません。" 1079 + HybsSystem.CR 1080 + " matchKeys=[" + matchKeys.length + "]:KEYS=" 1081 + StringUtil.array2csv( matchKeys ) + HybsSystem.CR 1082 + " matchVals=[" + matchVals.length + "]:VLAS=" 1083 + StringUtil.array2csv( matchVals ) + HybsSystem.CR ; 1084 throw new HybsSystemException( errMsg ); 1085 } 1086 } 1087 1088 /** 1089 * 【TAG】matchKeysをカンマ区切りで指定します。 1090 * 1091 * @og.tag 1092 * ファイルから特定の行のみを読み取るためのmatchKeysを指定します。 1093 * matchKeysで指定したカラムに対して、matchValsの正規表現でチェックします。 1094 * この機能はTableReader_Defaultのみ有効です。 1095 * 通常は指定する必要はありません。 1096 * 1097 * 1098 * @og.rev 5.9.8.1 (2016/05/13) 新規作成 1099 * 1100 * @param keys カラム列(カンマ区切り文字) 1101 */ 1102 public void setMatchVals( final String keys ) { 1103 matchVals = getCSVParameter( keys ); 1104 1105 if( matchKeys != null && matchKeys.length != matchVals.length ) { 1106 String errMsg = "matchKeys属性とmatchVals属性の個数が合いません。" 1107 + HybsSystem.CR 1108 + " matchKeys=[" + matchKeys.length + "]:KEYS=" 1109 + StringUtil.array2csv( matchKeys ) + HybsSystem.CR 1110 + " matchVals=[" + matchVals.length + "]:VLAS=" 1111 + StringUtil.array2csv( matchVals ) + HybsSystem.CR ; 1112 throw new HybsSystemException( errMsg ); 1113 } 1114 } 1115 1116 /** 1117 * シリアライズ用のカスタムシリアライズ書き込みメソッド 1118 * 1119 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 1120 * @serialData 一部のオブジェクトは、シリアライズされません。 1121 * 1122 * @param strm ObjectOutputStreamオブジェクト 1123 * @throws IOException 入出力エラーが発生した場合 1124 */ 1125 private void writeObject( final ObjectOutputStream strm ) throws IOException { 1126 strm.defaultWriteObject(); 1127 } 1128 1129 /** 1130 * シリアライズ用のカスタムシリアライズ読み込みメソッド 1131 * 1132 * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。 1133 * 1134 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 1135 * @serialData 一部のオブジェクトは、シリアライズされません。 1136 * 1137 * @param strm ObjectInputStreamオブジェクト 1138 * @see #release2() 1139 * @throws IOException シリアライズに関する入出力エラーが発生した場合 1140 * @throws ClassNotFoundException クラスを見つけることができなかった場合 1141 */ 1142 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException { 1143 strm.defaultReadObject(); 1144 } 1145 1146 /** 1147 * このオブジェクトの文字列表現を返します。 1148 * 基本的にデバッグ目的に使用します。 1149 * 1150 * @return このクラスの文字列表現 1151 */ 1152 @Override 1153 public String toString() { 1154 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 1155 .println( "VERSION" ,VERSION ) 1156 .println( "separator" ,separator ) 1157 .println( "fileURL" ,fileURL ) 1158 .println( "filename" ,filename ) 1159 .println( "encode" ,encode ) 1160 .println( "readerClass" ,readerClass ) 1161 .println( "maxRowCount" ,maxRowCount ) 1162 .println( "displayMsg" ,displayMsg ) 1163 .println( "executeCount" ,executeCount ) 1164 .println( "modifyType" ,modifyType ) 1165 .println( "checkColumns" ,checkColumns ) 1166 .println( "adjustColumns" ,adjustColumns ) 1167 .println( "nullCheck" ,nullCheck ) 1168 .println( "command" ,command ) 1169 .println( "tableId" ,tableId ) 1170 .println( "sheetName" ,sheetName ) 1171 .println( "sheetNos" ,sheetNos ) // 5.5.7.2 (2012/10/09) 1172 .println( "columns" ,columns ) 1173 .println( "useNumber" ,useNumber ) 1174 .println( "Other..." ,getAttributes().getAttribute() ) 1175 .fixForm().toString() ; 1176 } 1177}