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