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&lt;String,String&gt; )
076             * メソãƒ?ƒ‰を呼び出しますã?
077             * init( Map&lt;String,String&gt; ) メソãƒ?ƒ‰は、各サブクラスで実è£?�Œå¿?¦�ですã?
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    }