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    }