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 java.util.HashMap;
019 import java.util.Locale;
020 import java.util.Map;
021 import java.util.LinkedHashMap ;
022 import java.util.Map.Entry;
023
024 import org.opengion.fukurou.util.ErrorMessage;
025 import org.opengion.fukurou.db.Transaction;
026 import org.opengion.hayabusa.resource.ResourceManager;
027 import org.opengion.hayabusa.common.HybsSystemException;
028
029 /**
030 * AbstractTableFilter は、TableUpda インターフェースを継承した、DBTableModel 処?の
031 * Abstract実?ラスです?
032 *
033 * @og.rev 5.5.2.6 (2012/05/25) protected変数をprivateに変更。インターフェースにメソ?追?
034 *
035 * @version 0.9.0 2000/10/17
036 * @author Kazuhiko Hasegawa
037 * @since JDK1.1,
038 */
039 abstract public class AbstractTableFilter implements TableFilter {
040
041 /** CR 定義 */
042 // 5.5.2.6 (2012/05/25) I/F 側に移?
043 // protected static final String CR = HybsSystem.CR ; // 5.1.1.0 (2009/12/01) CR 定義をここで行う?
044
045 // protected DBTableModel table = null;
046 // protected String modifyType = null;
047 // protected int[] rowNo = null;
048 // protected boolean isDebug = false;
049 // protected ApplicationInfo appInfo = null; // 5.1.9.0 (2010/08/01) ?
050 // protected Transaction tran = null; // 5.1.9.0 (2010/08/01) 追?
051 // protected String sql = null; // 4.2.4.0 (2008/06/23)
052 // protected String dbid = null; // 4.2.4.0 (2008/06/23)
053 // protected ResourceManager resource = null; // 4.3.7.4 (2009/07/01)
054
055 // 5.5.2.6 (2012/05/25) protected変数をprivateに変更。インターフェースにメソ?追?
056 private DBTableModel table = null;
057 private String modifyType = null;
058 private int[] rowNo = null;
059 private boolean isDebug = false;
060 private Transaction tran = null; // 5.1.9.0 (2010/08/01) 追?
061 private String sql = null; // 4.2.4.0 (2008/06/23)
062 private String dbid = null; // 4.2.4.0 (2008/06/23)
063 private ResourceManager resource = null; // 4.3.7.4 (2009/07/01)
064
065 private int errCode = ErrorMessage.OK;
066 private ErrorMessage errMessage = null;
067
068 private final Map<String,String> keysVals = new HashMap<String,String>();
069
070 // 5.6.6.0 (2013/07/05) keys の整合?チェ?を行います?
071 protected final Map<String,String> keysMap = new LinkedHashMap<String,String>();
072
073 /**
074 * ?ォルトコンストラクター
075 * ここでは、keys の整合?チェ?を行うための初期設定を行う、init( Map<String,String> )
076 * メソ?を呼び出します?
077 * init( Map<String,String> ) メソ?は、各サブクラスで実??です?
078 *
079 * @og.rev 5.6.6.1 (2013/07/12) keys の整合?チェ?対?
080 */
081 public AbstractTableFilter() {
082 init( keysMap );
083 }
084
085 /**
086 * keys の整合?チェ?を行うための初期設定を行います?
087 * ここでは何もしません。?であれば、各サブクラスに実?ておきます?
088 *
089 * @og.rev 5.6.6.1 (2013/07/12) keys の整合?チェ?対?
090 *
091 * @param keysMap keys の整合?チェ?を行うための Map
092 */
093 protected void init( final Map<String,String> keysMap ) {}
094
095 /**
096 * DBTableModel をセ?します?
097 *
098 * @param table DBTableModelオブジェク?
099 */
100 public void setDBTableModel( final DBTableModel table ) {
101 this.table = table;
102 }
103
104 /**
105 * DBTableModel を取得します?
106 *
107 * @og.rev 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追?
108 *
109 * @return ?のDBTableModel
110 */
111 public DBTableModel getDBTableModel() {
112 return table;
113 }
114
115 /**
116 * ??タ処??方?A:追?C:更新 D:削除)を指定します?
117 *
118 * 通常は、DBTableModel に自動設定されて? modifyType を?に、データ処?法を
119 * 選別します?(A:追?C:更新 D:削除)
120 * こ?場合?行単位で modifyType の値を取得して判別する?がありますが、?には
121 * 処?象は、?件おな?modifyType である可能性が高いです?
122 * また?selectedAll などで強制?全件処?象とする場合?、modifyType に値?
123 * 設定さて?せん。その様な場合に外部より modifyType を指定します?
124 * 初期値は、?動判?です?
125 *
126 * @og.rev 5.5.2.6 (2012/05/25) ?
127 *
128 * @param type ??タ処??方?A:追?C:更新 D:削除)
129 */
130 public void setModifyType( final String type ) {
131 modifyType = type;
132 }
133
134 /**
135 * ??タ処??方?A:追?C:更新 D:削除)を取得します?
136 *
137 * 初期値は、?動判?です?
138 *
139 * @og.rev 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追?
140 *
141 * @return ??タ処??方?A:追?C:更新 D:削除)
142 */
143 public String getModifyType() {
144 return modifyType ;
145 }
146
147 /**
148 * キーと値のペアの変数配?を受け取ります?
149 *
150 * ここでは、この方式以外に、パラメーターMapを受け取る方法もあります?
151 * こ?受け取る時に、キーを大?化します?TableFilter の keys は?
152 * 大??みで定義しておくことで、HTMLやWindows世代の曖昧な表記方法に
153 * 対応して?す?(unixやxmlのような厳格な方が好きですけど)
154 *
155 * keys,vals とパラメーターMapを同時に?した?合?、両方とも有効です?
156 * ただし?キーが重?た?合?、不定と?てください?
157 *
158 * @og.rev 5.6.6.0 (2013/07/05) keys の整合?チェ?を行います?
159 *
160 * @param keys キー配?
161 * @param vals 値配?
162 * @see #setParamMap( Map )
163 */
164 public void setKeysVals( final String[] keys,final String[] vals ) {
165 if( keys != null && vals != null ) {
166 for( int i=0; i<keys.length; i++ ) {
167 // 5.6.6.0 (2013/07/05) 共通?セ?ーメソ?経由で登録します?
168 // keysVals.put( keys[i].toUpperCase(Locale.JAPAN),vals[i] );
169 setKeyVal( keys[i],vals[i] );
170 }
171 }
172 }
173
174 /**
175 * キーと値のペアを受け取り??の keysVals マップに追?ます?
176 *
177 * キーか?のどちらか?null の場合?、何もしません。つまり?val に
178 * null をセ?することはできません?
179 *
180 * こ?メソ?は、setKeysVals( String[] ,String[] ) メソ?と?
181 * setParamMap( Map<String,String> ) メソ?の両方から、使用します?
182 * 処?行うに当たり?下記?処?行います?
183 * ?.キーを大?化します?
184 * ?.各クラスの keys と整合?チェ?を行います?
185 *
186 * ただし?setKeysVals と setParamMap の登録??、不定と?てください?
187 * 両方に同じキーを指定すると、どちら?値がセ?されたかは、不定です?
188 *
189 * @og.rev 5.6.6.0 (2013/07/05) keys の整合?チェ?を行います?
190 *
191 * @param key キー??(null の場合?、??な?
192 * @param val 値??(null の場合?、??な?
193 * @see #setKeysVals( String[] ,String[] )
194 * @see #setParamMap( Map )
195 */
196 private void setKeyVal( final String key,final String val ) {
197 // key ?val かどちらか?null の場合?、??行わな??
198 if( key == null || val == null ) { return; }
199
200 String upKey = key.toUpperCase(Locale.JAPAN);
201
202 if( keysMap.containsKey( upKey ) ) { // keysMap は、各サブクラスで定義
203 keysVals.put( upKey,val );
204 }
205 else {
206 String BR = "<br />" + CR ;
207 StringBuilder errMsg = new StringBuilder();
208 errMsg.append( BR )
209 .append( "??キーは、この tableFilter では、使用できません? ).append( BR )
210 .append( " class=[" ).append( getClass().getName() ).append( "]" ).append( BR )
211 .append( " key =[" ).append( key ).append( "]" ).append( BR )
212 .append( " ======== usage keys ======== " ).append( BR ) ;
213 for( Map.Entry<String, String> entry : keysMap.entrySet() ) {
214 errMsg.append( " " ).append( entry.getKey() ).append( " : " )
215 .append( entry.getValue() ).append( BR ) ;
216 }
217 errMsg.append( " ============================ " ).append( BR );
218
219 throw new HybsSystemException( errMsg.toString() );
220 }
221 }
222
223 /**
224 * 選択された行番号の配?をセ?します?
225 *
226 * 表示??タの HybsSystem.ROW_SELECTED_KEY を?に?ばれた 行を
227 * 処??対象とします?
228 *
229 * @param rowNoTmp 行番号配?
230 */
231 public void setParameterRows( final int[] rowNoTmp ) {
232 if( rowNoTmp != null ) {
233 int size = rowNoTmp.length ;
234 rowNo = new int[size];
235 System.arraycopy( rowNoTmp,0,rowNo,0,size );
236 }
237 }
238
239 /**
240 * 選択された行番号の配?を取得します?
241 *
242 * 表示??タの HybsSystem.ROW_SEL_KEY を?に?ばれた 行を
243 * 処??対象とします?
244 *
245 * @og.rev 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追?
246 *
247 * @return 行番号の配?
248 */
249 public int[] getParameterRows() {
250 return (rowNo != null ) ? rowNo.clone() : null ;
251 }
252
253 /**
254 * アクセスログ取得?為,ApplicationInfoオブジェクトを設定します?
255 *
256 * @og.rev 3.8.7.0 (2006/12/15) 新規追?
257 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対?のため、?
258 *
259 * @param appInfo ApplicationInfo
260 */
261 // public void setApplicationInfo( final ApplicationInfo appInfo ) {
262 // this.appInfo = appInfo;
263 // }
264
265 /**
266 * アクセスログ取得?為,Transactionオブジェクトを設定します?
267 *
268 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対?新規追?
269 *
270 * @param tran Transactionオブジェク?
271 */
272 public void setTransaction( final Transaction tran ) {
273 this.tran = tran;
274 }
275
276 /**
277 * アクセスログ取得?為,Transactionオブジェクトを取得します?
278 *
279 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対?新規追?
280 * @og.rev 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追?
281 *
282 * @return Transactionオブジェク?
283 */
284 public Transaction getTransaction() {
285 return tran;
286 }
287
288 /**
289 * DBIDを指定します?
290 *
291 * @og.rev 4.2.4.0 (2008/06/23) 新規追?
292 *
293 * @param dbid 接続?ID
294 */
295 public void setDbid( final String dbid ) {
296 this.dbid = dbid;
297 }
298
299 /**
300 * DBIDを取得します?
301 *
302 * @og.rev 4.2.4.0 (2008/06/23) 新規追?
303 * @og.rev 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追?
304 *
305 * @return DBID(接続???)
306 */
307 public String getDbid() {
308 return dbid;
309 }
310
311 /**
312 * ボディー部??SQLを指定します?
313 *
314 * @og.rev 4.2.4.0 (2008/06/23) 新規追?
315 *
316 * @param sql ボディー部??SQL
317 */
318 public void setSql( final String sql ) {
319 this.sql = sql;
320 }
321
322 /**
323 * ボディー部??SQLを取得します?
324 *
325 * @og.rev 4.2.4.0 (2008/06/23) 新規追?
326 * @og.rev 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追?
327 *
328 * @return ボディー部??SQL
329 */
330 public String getSql() {
331 return sql;
332 }
333
334 /**
335 * パラメーターMapを指定します?
336 *
337 * keys,vals と パラメーターMapを同時に?した?合?、両方とも有効です?
338 * ただし?キーが重?た?合?、不定と?てください?
339 *
340 * こ?受け取る時に、キーを大?化します?TableFilter の keys は?
341 * 大??みで定義しておくことで、HTMLやWindows世代の曖昧な表記方法に
342 * 対応して?す?(unixやxmlのような厳格な方が好きですけど)
343 *
344 * @og.rev 5.6.5.2 (2013/06/21) 新規追?
345 * @og.rev 5.6.6.0 (2013/07/05) keys の整合?チェ?を行います?
346 *
347 * @param paramMap パラメーターMap
348 * @see #setKeysVals( String[] ,String[] )
349 */
350 public void setParamMap( final Map<String,String> paramMap ) {
351 if( paramMap != null ) {
352 // keysVals.putAll( paramMap );
353 // 5.6.6.0 (2013/07/05) Map を?づつ回して登録します?
354 for( Map.Entry<String, String> entry : paramMap.entrySet() ) {
355 setKeyVal( entry.getKey(),entry.getValue() );
356 }
357 }
358 }
359
360 /**
361 * リソースオブジェクトを?します?
362 *
363 * @og.rev 4.3.7.4 (2009/07/01) 新規追?
364 *
365 * @param resource リソースオブジェク?
366 */
367 public void setResource( final ResourceManager resource ) {
368 this.resource = resource;
369 }
370
371 /**
372 * リソースオブジェクトを取得します?
373 *
374 * @og.rev 4.3.7.4 (2009/07/01) 新規追?
375 * @og.rev 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追?
376 *
377 * @return リソースオブジェク?
378 */
379 public ResourceManager getResource() {
380 return resource;
381 }
382
383 /**
384 * ????を表示するかど?[true/false]を指定します?
385 * true で????を表示します?
386 *
387 * @param flag [true:出力す?それ以?しない]
388 */
389 public void setDebug( final boolean flag ) {
390 isDebug = flag;
391 }
392
393 /**
394 * ????を表示するかど?を取得します?
395 * true で????を表示します?
396 *
397 * @og.rev 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追?
398 *
399 * @return ????(true:????を?力す?
400 */
401 public boolean isDebug() {
402 return isDebug ;
403 }
404
405 /**
406 * エラーコー?を取得します?
407 * エラーコー?は、ErrorMessage クラスで規定されて?コードです?
408 *
409 * @return エラーコー?
410 */
411 public int getErrorCode() {
412 return errCode;
413 }
414
415 /**
416 * エラーメ?ージオブジェク?を取得します?
417 *
418 * @return エラーメ?ージオブジェク?
419 */
420 public ErrorMessage getErrorMessage() {
421 return errMessage;
422 }
423
424 /**
425 * タイトルとエラーコードを?して、エラーメ?ージオブジェク?を作?します?
426 * すでに、作?済みの場合?、作?済みのオブジェクトを、ま??未作?の場合??
427 * 新規に作?します?
428 *
429 * @param title タイトル
430 * @param code エラーコー?
431 *
432 * @return エラーメ?ージオブジェク?
433 */
434 protected ErrorMessage makeErrorMessage( final String title,final int code ) {
435 if( errMessage == null ) {
436 errMessage = new ErrorMessage( title );
437 }
438 if( errCode < code ) { errCode = code; }
439 return errMessage;
440 }
441
442 /**
443 * カラ?配?(String[])より、対応するカラ?o配?(int[])を作?します?
444 *
445 * @param nameArray カラ?配?
446 *
447 * @return カラ?o配?
448 */
449 protected int[] getTableColumnNo( final String[] nameArray ) {
450 int[] clmNo = new int[ nameArray.length ];
451 for( int i=0; i<clmNo.length; i++ ) {
452 clmNo[i] = table.getColumnNo( nameArray[i] );
453 }
454 return clmNo;
455 }
456
457 /**
458 * 設定されたパラメータキーに対する値を取得します?
459 * 引数、およ?、パラメータ?null の場合??null を返します?
460 *
461 * @param key パラメータキー
462 *
463 * @return パラメータ値
464 */
465 protected String getValue( final String key ) {
466 return keysVals.get( key );
467 }
468 }