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 */
016 package org.opengion.hayabusa.db;
017
018 import org.opengion.fukurou.util.StringUtil;
019 import org.opengion.fukurou.model.NativeType;
020 import org.opengion.hayabusa.common.HybsSystem;
021 import org.opengion.hayabusa.common.HybsSystemException;
022
023 import java.util.List;
024 import java.util.ArrayList;
025 import java.util.Map;
026 import java.util.HashMap;
027 import java.util.Set;
028 import java.util.HashSet;
029 import java.util.Arrays;
030 import java.util.Locale ;
031
032 /**
033 * DBTableModel インターフェースを継承した TableModel の実?ラスです?
034 * sql? execute( query ) する事により,??タベ?スを検索した結果?
035 * DBTableModel に割り当てます?
036 *
037 * メソ?を宣?て??
038 * DBTableModel インターフェースは?データベ?スの検索結果(Resultset)をラ??する
039 * インターフェースとして使用して下さ??
040 *
041 * @og.group ??ブル管?
042 *
043 * @version 4.0
044 * @author Kazuhiko Hasegawa
045 * @since JDK5.0,
046 */
047 public class DBTableModelImpl implements DBTableModel {
048 /** カラ?ブジェクト??*/
049 protected DBColumn[] dbColumns = null;
050 /** カラ?称配? */
051 protected String[] names = null;
052 /** ??タリス?*/
053 protected List<String[]> data = null;
054 /** 行??ー?? */
055 protected List<DBRowHeader> rowHeader = null;
056 /** カラ?ドレスマップ情報 */
057 protected Map<String,Integer> columnMap = null;
058 /** オーバ?フローフラグ */
059 protected boolean overflow = false;
060
061 /** カラ? */
062 protected int numberOfColumns = 0;
063
064 // 3.5.5.5 (2004/04/23) 整合?キー(オブジェクト?作?時刻)追?
065 /** 整合?キー(オブジェクト?作?時刻) */
066 protected String consistencyKey = String.valueOf( System.currentTimeMillis() );
067 private String[] lastData = null;
068 private int lastRow = -1;
069
070 // 4.1.2.1 (2008/03/13) カラ??にmustタイプ?を割り当てます?
071 private final Map<String,Set<String>> mustMap = new HashMap<String,Set<String>>() ; // 4.3.1.1 (2008/08/23) final?
072
073 /**
074 * こ?オブジェクトを初期化します?
075 * ??引数???配?を作?します?
076 *
077 * @og.rev 3.1.0.0 (2003/03/20) 実?、Vector ?Hashtable から、ArrayList ?HashMapに、変更?
078 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
079 *
080 * @param columnCount カラ?
081 */
082 public void init( final int columnCount ) {
083 data = new ArrayList<String[]>( HybsSystem.BUFFER_MIDDLE );
084 rowHeader = new ArrayList<DBRowHeader>( HybsSystem.BUFFER_MIDDLE );
085 names = new String[columnCount];
086 dbColumns = new DBColumn[ columnCount ];
087 numberOfColumns = columnCount;
088 columnMap = new HashMap<String,Integer>();
089 lastRow = -1; // 3.5.5.7 (2004/05/10)
090 }
091
092 /**
093 * こ?オブジェクトをヘッ??部?コピ?し???タを?期化します?
094 * これは、カラ?どヘッ??系の??は、?と同じオブジェクトを共有し?
095 * ??タ部のみ空にした DBTableModel を作?することを意味します?
096 * こ?際?consistencyKey も??します?で、整合?は崩れな???
097 * ??タ登録を行う?があります?
098 *
099 * @og.rev 4.0.0.0 (2007/06/28) 新規作?
100 *
101 * @return DBTableModelオブジェク?
102 */
103 public DBTableModel newModel() {
104 DBTableModelImpl table = new DBTableModelImpl();
105
106 table.data = new ArrayList<String[]>( HybsSystem.BUFFER_MIDDLE );
107 table.rowHeader = new ArrayList<DBRowHeader>( HybsSystem.BUFFER_MIDDLE );
108 table.names = names;
109 table.dbColumns = dbColumns;
110 table.numberOfColumns = numberOfColumns;
111 table.columnMap = columnMap;
112 table.lastRow = -1;
113 table.consistencyKey = consistencyKey;
114
115 return table ;
116 }
117
118 /**
119 * カラ?配?を返します?
120 *
121 * @og.rev 3.0.0.0 (2002/12/25) カラ?配?を取得するメソ?を追?る?
122 * @og.rev 3.5.6.0 (2004/06/18) 配?をそのまま返さずに、clone して返します?
123 * @og.rev 3.6.0.0 (2004/09/22) names ?null の場合?、?期設定エラーとします?
124 *
125 * @return カラ?配?
126 */
127 public String[] getNames() {
128 if( names != null ) {
129 return names.clone();
130 }
131
132 String errMsg = "カラ?配?が?初期化されて?せん?;
133 throw new HybsSystemException( errMsg );
134 }
135
136 //////////////////////////////////////////////////////////////////////////
137 //
138 // DBTableModelImpl 独自の実??
139 //
140 //////////////////////////////////////////////////////////////////////////
141
142 /**
143 * column に対応し?値を登録します?
144 * column には、番号ではなく、ラベルを指定します?
145 * ??行番号が??の??タ件数より多い場合?、データを追?ます?
146 *
147 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
148 *
149 * @param aRow 値が変更される?
150 * @param columnName 値が変更されるカラ?
151 * @param value 新しい値。null も可
152 */
153 public void setValue( final int aRow, final String columnName, final String value ) {
154 int aColumn = getColumnNo( columnName );
155 int size = getRowCount();
156 if( size > aRow ) {
157 setRowHeader( aRow,UPDATE_TYPE );
158 setValueAt( value , aRow, aColumn );
159 }
160 else {
161 for( int i = 0; i< (aRow-size)+1; i++ ) {
162 String[] columnValues = new String[ numberOfColumns ];
163 for(int j = 0; j < numberOfColumns; j++) { // 3.5.5.7 (2004/05/10)
164 columnValues[j] = "";
165 }
166 addColumnValues( columnValues );
167 }
168 setValueAt( value , aRow, aColumn );
169 }
170 }
171
172 /**
173 * 行を削除します?
174 * 物?除ではなく?論理削除です?
175 * ??タを取り込?とは可能です?
176 *
177 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
178 *
179 * @param aRow 論理削除される?
180 */
181 public void rowDelete( final int aRow ) {
182 setRowHeader( aRow,DELETE_TYPE );
183 }
184
185 /**
186 * row にあるセルのオブジェクト?を置き換えて、行を削除します?
187 * 物?除ではなく?論理削除です?
188 * 値を置き換えた??タを取り込?とが可能です?
189 *
190 * @og.rev 3.5.4.2 (2003/12/15) 新規追?
191 *
192 * @param values 新しい配?値?
193 * @param aRow 論理削除される?
194 *
195 */
196 public void rowDelete( final String[] values, final int aRow ) {
197 if( numberOfColumns == values.length ) { // 3.5.5.7 (2004/05/10)
198 setRowHeader( aRow,DELETE_TYPE );
199 data.set( aRow,values );
200 lastRow = -1; // 3.5.5.7 (2004/05/10)
201 }
202 else {
203 String errMsg = "カラ?の個数が不??です? [" + numberOfColumns + "] : [" + values.length + "]"
204 + " values=" + StringUtil.array2csv( values ) ; // 5.1.8.0 (2010/07/01) errMsg 修正
205 throw new HybsSystemException( errMsg );
206 }
207 }
208
209 /**
210 * 行を物?除します?
211 * メモリ上で編?る?合に使用しますが,?アプリケーションからの
212 * 使用は、物?除の為,お勧めいたしません?
213 *
214 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
215 *
216 * @param aRow 物?除される?
217 *
218 */
219 public void removeValue( final int aRow ) {
220 data.remove( aRow );
221 rowHeader.remove( aRow );
222 lastRow = -1; // 3.5.5.7 (2004/05/10)
223 }
224
225 //////////////////////////////////////////////////////////////////////////
226 //
227 // DBTableModel インターフェースの実??
228 //
229 //////////////////////////////////////////////////////////////////////////
230
231 /**
232 * カラ??ラベル名を返します?
233 * カラ???名に対して,見える形の??を返します?
234 * ?には,リソースバンドルと?せて,?ロケール毎にラベル?
235 * ?えます?
236 *
237 * @param column カラ?号
238 *
239 * @return カラ??ラベル?
240 */
241 public String getColumnLabel( final int column ) {
242 return dbColumns[column].getLabel();
243 }
244
245 /**
246 * row および column にあるセルの属?値をStringに変換して返します?
247 *
248 * @og.rev 3.5.5.7 (2004/05/10) 連続同?row アクセスのキャ?ュ利用対?
249 *
250 * @param aRow 値が参照される?
251 * @param aColumn 値が参照される?
252 *
253 * @return ?されたセルの値 String
254 */
255 public String getValue( final int aRow, final int aColumn ) {
256 if( aRow != lastRow ) {
257 lastData = data.get(aRow);
258 lastRow = aRow ;
259 }
260 return lastData[aColumn] ;
261 }
262
263 /**
264 * row および columnName にあるセルの属?値をStringに変換して返します?
265 *
266 * @param aRow 値が参照される?
267 * @param columnName 値が参照されるカラ?
268 *
269 * @return ?されたセルの値 String
270 * @see #getValue( int , int )
271 */
272 public String getValue( final int aRow, final String columnName ) {
273 return getValue( aRow,getColumnNo( columnName ) );
274 }
275
276 /**
277 * カラ??にカラ?ブジェクトを割り当てます?
278 * カラ?ブジェクト??ラベル?ー?ど?そのカラ?報?
279 * 保持したオブジェクトです?
280 *
281 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
282 *
283 * @param clm ヘッ??を適応するカラ??
284 * @param dbColumn カラ?ブジェク?
285 */
286 public void setDBColumn( final int clm, final DBColumn dbColumn ) {
287 dbColumns[clm] = dbColumn;
288 names[clm] = dbColumn.getName();
289 columnMap.put( names[clm].toUpperCase(Locale.JAPAN),Integer.valueOf( clm ) );
290 }
291
292 /**
293 * カラ??のカラ?ブジェクトを返します?
294 * カラ?ブジェクト??ラベル?ー?ど?そのカラ?報?
295 * 保持したオブジェクトです?
296 *
297 * @param clm ヘッ??を適応するカラ??
298 *
299 * @return カラ?ブジェク?
300 */
301 public DBColumn getDBColumn( final int clm ) {
302 return dbColumns[ clm ];
303 }
304
305 /**
306 * カラ?ブジェクト?列を返します?
307 * カラ?ブジェクト??ラベル?ー?ど?そのカラ?報?
308 * 保持したオブジェクトです?
309 *
310 * @og.rev 4.0.0.0 (2005/12/31) 新規追?
311 *
312 * @return カラ?ブジェクト??
313 */
314 public DBColumn[] getDBColumns() {
315 int size = dbColumns.length;
316 DBColumn[] clms = new DBColumn[size];
317 System.arraycopy( dbColumns,0,clms,0,size );
318 return clms;
319 }
320
321 /**
322 * カラ?をもとに、そのカラ?号を返します?
323 * カラ?が存在しな??合?? HybsSystemException ?throw します?
324 *
325 * @param columnName カラ?
326 *
327 * @return カラ?号
328 * @see #getColumnNo( String ,boolean )
329 */
330 public int getColumnNo( final String columnName ) {
331 return getColumnNo( columnName,true );
332 }
333
334 /**
335 * カラ?をもとに、そのカラ?号を返します?
336 * useThrow が?true の場合?、カラ?が存在しな??合?? HybsSystemException ?
337 * throw します?useThrow が?false の場合?、カラ?が存在しな??合?? -1 を返します?
338 *
339 * @og.rev 4.0.0.0 (2005/12/31) 新規追?
340 *
341 * @param columnName カラ?
342 * @param useThrow カラ?が存在しな??合に、Exception ?throw するかど?
343 *
344 * @return カラ?号
345 * @see #getColumnNo( String )
346 */
347 public int getColumnNo( final String columnName,final boolean useThrow ) {
348 if( columnName != null ) {
349 Integer no = columnMap.get( columnName.toUpperCase(Locale.JAPAN) );
350 if( no != null ) { return no.intValue() ; }
351 }
352
353 if( useThrow ) {
354 String errMsg = "カラ?が存在しません:[" + columnName + "]" ;
355 throw new HybsSystemException( errMsg );
356 }
357 else {
358 return -1;
359 }
360 }
361
362 //////////////////////////////////////////////////////////////////////////
363 //
364 // DBTableModel クラスのオーバ?ライド部?
365 //
366 //////////////////////////////////////////////////////////////////////////
367
368 /**
369 * row の下に属?値配?を追?録します?
370 *
371 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
372 *
373 * @param values 属?値配?
374 * @param aRow 値が参照される?
375 *
376 */
377 public void addValues( final String[] values ,final int aRow ) {
378 // data.add( aRow,values );
379 // lastRow = -1; // 3.5.5.7 (2004/05/10)
380 //
381 // DBRowHeader rowhed = new DBRowHeader();
382 // rowhed.setType( INSERT_TYPE );
383 // rowHeader.add( aRow,rowhed );
384 addValues( values, aRow, true ); // 4.3.1.0 (2008/09/04)
385 }
386
387 /**
388 * row の下に属?値配?を追?録します?
389 * isWritableをfalseにした場合?編?可能な状態で追?れます?
390 *
391 * @og.rev 4.3.1.0 (2008/09/04) interface に新規登録
392 *
393 * @param values 属?値配?
394 * @param aRow 値が参照される?
395 * @param isWritable 編?可能な状態で追?るか
396 *
397 */
398 public void addValues( final String[] values ,final int aRow, final boolean isWritable ) {
399 data.add( aRow,values );
400 lastRow = -1; // 3.5.5.7 (2004/05/10)
401
402 DBRowHeader rowhed = new DBRowHeader();
403 if( isWritable ) {
404 rowhed.setType( INSERT_TYPE );
405 }
406 else {
407 rowhed.setWritable( false );
408 rowhed.setChecked( false );
409 }
410 rowHeader.add( aRow,rowhed );
411 }
412
413 /**
414 * row あるセルの属?値配?を追?録します?
415 * これは,初期登録時?みに使用します?
416 *
417 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
418 *
419 * @param values 属?値配?
420 *
421 */
422 public void addColumnValues( final String[] values ) {
423 data.add( values );
424 lastRow = -1; // 3.5.5.7 (2004/05/10)
425 rowHeader.add( new DBRowHeader() );
426 }
427
428 //////////////////////////////////////////////////////////////////////////
429 //
430 // Implementation of the TableModel Interface
431 //
432 //////////////////////////////////////////////////////////////////////////
433
434 // MetaData
435
436 /**
437 * カラ?を取得します?
438 *
439 * @param column ??のカラ?? 0?番目のカラ?? 1、などとする?
440 *
441 * @return カラ?
442 *
443 */
444 public String getColumnName( final int column ) {
445 return names[column];
446 }
447
448 /**
449 * ??タ??ブル??列?数を返します?
450 *
451 * @return モ?の列数
452 *
453 */
454 public int getColumnCount() {
455 return numberOfColumns ;
456 }
457
458 /**
459 * ??タ??ブル??行?数を返します?
460 *
461 * @return モ?の行数
462 *
463 */
464 public int getRowCount() {
465 return data.size() ;
466 }
467
468 /**
469 * column および row にあるセルのオブジェクト?を設定します?
470 * こ?メソ?は、行番号の?チェ???列番号のチェ?を行いません?
471 * また?登録に際して、更新マ?カー(UPDATE_TYPE?を設定しません?
472 *
473 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
474 * @og.rev 3.5.3.1 (2003/10/31) インターフェースの見直しにより、private 化する?
475 * @og.rev 4.0.0.0 (2007/05/24) インターフェースの見直しにより、public 化する?
476 *
477 * @param value 新しい値。null も可
478 * @param aRow 値が変更される?
479 * @param aColumn 値が変更される?
480 */
481 public void setValueAt( final String value, final int aRow, final int aColumn ) {
482 // setRowHeader( aRow,UPDATE_TYPE );
483 String[] row = data.get(aRow);
484 row[ aColumn ] = value;
485 data.set( aRow,row );
486 lastRow = -1; // 3.5.5.7 (2004/05/10)
487 }
488
489 //////////////////////////////////////////////////////////////////////////
490 //
491 // DBTableModel 独自追??
492 //
493 //////////////////////////////////////////////////////////////////////////
494
495 /**
496 * row にあるセルの属?値を?列で返します?
497 *
498 * @param aRow 値が参照される?
499 *
500 * @return ?されたセルの属?値
501 *
502 */
503 public String[] getValues( final int aRow ) {
504 return data.get(aRow);
505 }
506
507 /**
508 * row にあるセルのオブジェクト?を置き換えます?
509 *
510 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
511 *
512 * @param values 新しい配?値?
513 * @param aRow 値が変更される?
514 *
515 */
516 public void setValues( final String[] values, final int aRow ) {
517 if( numberOfColumns == values.length ) { // 3.5.5.7 (2004/05/10)
518 setRowHeader( aRow,UPDATE_TYPE );
519 data.set( aRow,values );
520 lastRow = -1; // 3.5.5.7 (2004/05/10)
521 }
522 else {
523 String errMsg = "カラ?の個数が不??です? [" + numberOfColumns + "] : [" + values.length + "]"
524 + " values=" + StringUtil.array2csv( values ) ; // 5.1.8.0 (2010/07/01) errMsg 修正
525 throw new HybsSystemException( errMsg );
526 }
527 }
528
529 /**
530 * 変更済みフラグを?に戻します?
531 *
532 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
533 *
534 * ?には,??タベ?スに??ブルモ?を登録するタイミングで?
535 * 変更済みフラグを?に戻します?
536 *
537 */
538 public void resetModify() {
539 int size = rowHeader.size() ;
540 DBRowHeader row ;
541 for( int i=0; i<size; i++ ) {
542 row = rowHeader.get( i );
543 row.clear();
544 }
545 }
546
547 /**
548 * 変更済みフラグを?に戻します?
549 *
550 * ?には,??タベ?スに??ブルモ?を登録するタイミングで?
551 * 変更済みフラグを?に戻します?
552 *
553 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
554 *
555 * @param aRow 値が参照される?
556 */
557 public void resetModify( final int aRow ) {
558 DBRowHeader row = rowHeader.get( aRow );
559 row.clear();
560 }
561
562 /**
563 * row 単位に変更されたタイ?追?変更/削除)を返します?
564 * タイプ?始めに?登録するとそれ以降に変更はかかりません?
565 * つまり?始めに 追?作?した??タは、その後変更があっても追??ままです?
566 * なにも変更されて???合?, ""(ゼロストリング)を返します?
567 *
568 * @param aRow 値が参照される?
569 *
570 * @return 変更されたタイプ?値 String
571 *
572 */
573 public String getModifyType( final int aRow ) {
574 DBRowHeader row = rowHeader.get( aRow );
575 return row.getType();
576 }
577
578 /**
579 * row 単位に変更タイ?追?変更/削除)をセ?します?
580 * こ?メソ?では、データのバックア??は取りません?
581 * タイプ?始めに?登録するとそれ以降に変更はかかりません?
582 * なにも変更されて???合?, ""(ゼロストリング)の状態です?
583 *
584 * @param aRow 値が参照される?
585 * @param modType 変更タイ?追?変更/削除)
586 *
587 */
588 public void setModifyType( final int aRow,final String modType ) {
589 DBRowHeader rowhed = rowHeader.get( aRow );
590 rowhed.setType( modType );
591 }
592
593 /**
594 * row 単位に変更タイ?追?変更/削除)をセ?します?
595 * セ?すると同時に、データのバックア??を取ります?
596 * タイプ?始めに?登録するとそれ以降に変更はかかりません?
597 * つまり?始めに 追?作?した??タは、その後変更があっても追??ままです?
598 * なにも変更されて???合?, ""(ゼロストリング)の状態です?
599 *
600 * @og.rev 3.5.6.0 (2004/06/18) setBackupData 側で 配?をコピ?して?ため、こちらでは不要?
601 * @og.rev 3.5.6.4 (2004/07/16) protected 化します?
602 *
603 * @param aRow 値が参照される?
604 * @param modType 変更タイ?追?変更/削除)
605 */
606 protected void setRowHeader( final int aRow,final String modType ) {
607 DBRowHeader rowhed = rowHeader.get( aRow );
608
609 rowhed.setBackupData( data.get(aRow) );
610 rowhed.setType( modType );
611 }
612
613 /**
614 * 変更??タを?期?(??取り込んだ状?に戻します?
615 *
616 * 変更タイ?追?変更/削除)に応じて、??れます?
617 * 追?は、追?れた行を削除します?
618 * 変更時?、変更された行を?戻します?
619 * 削除時?、削除フラグを解除します?
620 * それ以外?場?変更されて????は、なにもしません?
621 *
622 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
623 * @og.rev 3.5.4.2 (2003/12/15) "DELETE" 時に値を置き換えた場合にUPDATEと同様に戻します?
624 *
625 * @param aRow 処?戻?取り消す)?
626 */
627 public void resetRow( final int aRow ) {
628 String modType = getModifyType(aRow) ;
629
630 if( modType.equals( INSERT_TYPE ) ) {
631 data.remove( aRow );
632 rowHeader.remove( aRow );
633 }
634 else if( modType.equals( UPDATE_TYPE ) ||
635 modType.equals( DELETE_TYPE ) ) {
636 DBRowHeader row = rowHeader.get( aRow );
637 String[] obj = row.getBackupData();
638 if( obj != null ) { data.set( aRow,obj ); }
639 row.clear();
640 }
641 lastRow = -1; // 3.5.5.7 (2004/05/10)
642 }
643
644 /**
645 * 書込み許可を返します?
646 *
647 * @param aRow 値が参照される?
648 *
649 * @return 書込み可能(true)?不可能(false)
650 */
651 public boolean isRowWritable( final int aRow ) {
652 DBRowHeader row = rowHeader.get( aRow );
653 return row.isWritable();
654 }
655
656 /**
657 * 行が書き込み可能かど?をセ?します?
658 * ?ォル?およびなにも設定しな??合?, DEFAULT_WRITABLE ?
659 * 与えられて?す?
660 * これ?true の場合?,書込み許可です?(チェ?ボックスを表示)
661 * false の場合?,書込み不許可(チェ?ボックスは表示されません?
662 *
663 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
664 *
665 * @param aRow 値が参照される?
666 * @param rw 書込み可能(true)?不可能(false)
667 */
668 public void setRowWritable( final int aRow ,final boolean rw ) {
669 DBRowHeader row = rowHeader.get( aRow );
670 row.setWritable( rw );
671 }
672
673 /**
674 * 書き込み可能な?rowWritable == true)のチェ?ボックスに対して
675 * 初期値?選択済みか?非選択済みかを返します?
676 *
677 * @param aRow 値が参照される?
678 *
679 * @return 初期値チェ?ON(true)?チェ?OFF(false)
680 */
681 public boolean isRowChecked( final int aRow ) {
682 DBRowHeader row = rowHeader.get( aRow );
683 return row.isChecked();
684 }
685
686 /**
687 * 書き込み可能な?rowWritable == true)のチェ?ボックスに対して
688 * 初期値?選択済みにするか?非選択済みにするかを?します?
689 *
690 * @og.rev 3.1.0.0 (2003/03/20) 同期メソ?(synchronized付き)を非同期に変更する?
691 *
692 * @param aRow 値が参照される?
693 * @param rw チェ?ON(true)?チェ?OFF(false)
694 */
695 public void setRowChecked( final int aRow ,final boolean rw ) {
696 DBRowHeader row = rowHeader.get( aRow );
697 row.setChecked( rw );
698 }
699
700 /**
701 * 行指定?書込み許可を与えます?
702 * 具体的には,チェ?ボックスの表示/非表示を指定します?
703 * これ?true の場合?,書込み許可です?(チェ?ボックスを表示)
704 * false の場合?,書込み不許可(チェ?ボックスは表示されません?
705 * 行毎に書込み許可/不許可を指定する?合?,?カラ?に writable
706 * カラ?用意して true/false を指定します?
707 * こ? writable カラ?の論理積により?的にチェ?ボックスの
708 * 表示の ON/OFF が決まります?
709 * なにも設定しな??合?, ViewForm.DEFAULT_WRITABLE が設定されます?
710 *
711 * @param rw 書込み可能(true)?不可能(false)
712 */
713 public void setDefaultRowWritable( final boolean rw ) {
714 int size = rowHeader.size() ;
715 DBRowHeader row ;
716 for( int i=0; i<size; i++ ) {
717 row = rowHeader.get( i );
718 row.setWritable( rw );
719 }
720 }
721
722 /**
723 * 書き込み可能な?rowWritable == true)のチェ?ボックスに対して
724 * 初期値?選択済みにするか?非選択済みにするかを?します?
725 *
726 * @param rw 選択状?true)?非選択状?false)
727 */
728 public void setDefaultRowChecked( final boolean rw ) {
729 int size = rowHeader.size() ;
730 DBRowHeader row ;
731 for( int i=0; i<size; i++ ) {
732 row = rowHeader.get( i );
733 row.setChecked( rw );
734 }
735 }
736
737 /**
738 * 検索結果?オーバ?フローしたかど?をチェ?します?
739 * Query で検索した場合に、DB_MAX_ROW_COUNT また?、Query.setMaxRowCount( int maxRowCount )
740 * で?された値よりも検索結果が多い場合に、DBTableModel は、?の設定?までの
741 * ??タを取り込みます?そ?ときに、オーバ?フローフラグを立てておくことで、最大件数?
742 * オーバ?したかど?を判断します?
743 *
744 * @return オーバ?フロー(true)?正常(false)
745 */
746 public boolean isOverflow() {
747 return overflow;
748 }
749
750 /**
751 * 検索結果?オーバ?フローしたかど?を設定します?
752 * Query で検索した場合に、DB_MAX_ROW_COUNT また?、Query.setMaxRowCount( int maxRowCount )
753 * で?された値よりも検索結果が多い場合に、DBTableModel は、?の設定?までの
754 * ??タを取り込みます?そ?ときに、オーバ?フローフラグを立てておくことで、最大件数?
755 * オーバ?したかど?を判断します?
756 *
757 * @param of オーバ?フロー(true)?正常(false)
758 */
759 public void setOverflow( final boolean of ) {
760 overflow = of;
761 }
762
763 /**
764 * 検索されたDBTableModelが登録時に同?ど?を判断する為の 整合?キーを取得します?
765 *
766 * ここでの整合?は、同??ョン(ユーザー)毎にユニ?クかど?で対応します?
767 * ?環??のセ?ョン?での整合?は、確保できません?
768 * 整合?キー は、オブジェクト作?時刻としますが、?変更される可能性があります?
769 *
770 * @og.rev 3.5.5.5 (2004/04/23) 新規追?
771 *
772 * @return 整合?キー(オブジェクト?作?時刻)
773 */
774 public String getConsistencyKey() {
775 return consistencyKey;
776 }
777
778 /**
779 * カラ?定義されたDBTypeよりNativeタイプを返します?
780 * Nativeタイプ?org.opengion.fukurou.model.NativeTypeで定義されて?す?
781 *
782 * @og.rev 4.1.1.2 (2008/02/28) 新規追?
783 *
784 * @param clm 値が参照される?
785 *
786 * @return Nativeタイ?
787 * @see org.opengion.fukurou.model.NativeType
788 */
789 public NativeType getNativeType( final int clm ) {
790 return dbColumns[clm].getNativeType();
791 }
792
793 /**
794 * カラ??にmustタイプ?を割り当てます?
795 * こ?値は、columnCheck 時? nullCheck ?mustAnyCheck の
796 * チェ?対象カラ?して認識されます?
797 *
798 * @og.rev 4.1.2.1 (2008/03/13) interface に新規登録
799 *
800 * @param dbColumn カラ?ブジェク?
801 * @param type mustタイ?must,mustAny)
802 */
803 public void addMustType( final int dbColumn, final String type ) {
804 Set<String> set = mustMap.get( type );
805 if( set == null ) { set = new HashSet<String>(); }
806 set.add( names[dbColumn] );
807 mustMap.put( type,set );
808 }
809
810 /**
811 * mustType="must"時?カラ?を???配?として返します?
812 * こ?値は、columnCheck 時? nullCheck のチェ?対象カラ?して
813 * 認識されます?
814 * カラ?配?は、ソート済みです?
815 *
816 * @og.rev 4.1.2.1 (2008/03/13) interface に新規登録
817 *
818 * @return mustType="must"時?カラ?配?(ソート済み)
819 */
820 public String[] getMustArray() {
821 String[] rtn = null;
822
823 Set<String> set = mustMap.get( "must" );
824 // if( set != null && set.size() > 0 ) {
825 if( set != null && ! set.isEmpty() ) {
826 rtn = set.toArray( new String[set.size()] );
827 Arrays.sort( rtn );
828 }
829 return rtn ;
830 }
831
832 /**
833 * mustType="mustAny" 他?カラ?を???配?として返します?
834 * こ?値は、columnCheck 時? mustAnyCheck のチェ?対象カラ?して
835 * 認識されます?
836 * カラ?配?は、ソート済みです?
837 *
838 * @og.rev 4.1.2.1 (2008/03/13) interface に新規登録
839 *
840 * @return mustType="mustAny"時?カラ?配?(ソート済み)
841 */
842 public String[] getMustAnyArray() {
843
844 List<String> list = new ArrayList<String>();
845
846 String[] keys = mustMap.keySet().toArray( new String[mustMap.size()] );
847 for( int i=0; i<keys.length; i++ ) {
848 String key = keys[i];
849 if( ! "must".equals( key ) ) {
850 Set<String> set = mustMap.get( key );
851 // if( set != null && set.size() > 0 ) {
852 if( set != null && !set.isEmpty() ) {
853 String str = StringUtil.iterator2line( set.iterator(),"|" );
854 list.add( str );
855 }
856 }
857 }
858
859 String[] rtn = null;
860 // if( list.size() > 0 ) {
861 if( ! list.isEmpty() ) {
862 rtn = list.toArray( new String[list.size()] );
863 Arrays.sort( rtn );
864 }
865
866 return rtn ;
867 }
868 }