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.db;
017
018import java.util.LinkedHashMap;
019import java.util.Map;
020
021import org.opengion.fukurou.db.DBUtil;
022import org.opengion.fukurou.util.ApplicationInfo;
023import org.opengion.hayabusa.common.HybsSystem;
024import org.opengion.hayabusa.resource.ResourceFactory;
025import org.opengion.hayabusa.resource.ResourceManager;
026
027/**
028 * データのコード情報を取り扱うクラスです。
029 *
030 * コードのキーとラベルの情報から、HTMLのメニューやリストを作成するための オプション
031 * タグを作成したり、与えられたキーをもとに、チェック済みのオプションタグを作成したり
032 * します。
033 * QUERYのそれぞれのカラムは、以下の意味を持ちます。
034 *  第1カラム(必須) : ラジオボタンのキー(値)
035 *  第2カラム       : ラベル(指定されない場合は、ラベルリソースの短縮ラベルを使用します)
036 *  第3カラム       : クラス そのオプションに色づけなどを行う為の指定します。
037 *                     NULL(または、ゼロ文字列)の場合は、適用されません。
038 *  第4カラム       : この値は'false'又は'0'である場合にそのラジオボタンを選択不可にします。
039 *                     NULL(または、ゼロ文字列)の場合は、選択可能になります。
040 *
041 * @og.group 選択データ制御
042 *
043 * @version  4.0
044 * @author   Hiroki Nakamura
045 * @since    JDK5.0,
046 */
047// public class Selection_DBRADIO implements Selection {
048public class Selection_DBRADIO extends Selection_NULL {
049        private final long              DB_CACHE_TIME                   = (long)HybsSystem.sysInt( "DB_CACHE_TIME" ) ;
050
051        private final boolean   isClass ;                       // クエリでクラス属性が指定されているかどうか
052        private final boolean   isDisable ;                     // クエリで選択不可属性が指定されているかどうか
053        private final long              createTime ;            // キャッシュの破棄タイミングを計るための作成時間
054
055        private final Map<String,Integer>       map  ;
056
057        private final String[]  label   ;               // ラベル
058        private final String[]  cls     ;               // クラス
059        private final String[]  disabled ;              // ラジオ単位のdisable
060
061        private static final int VAL            = 0;
062        private static final int LBL            = 1;
063        private static final int CLS            = 2;
064        private static final int DISABLED       = 3;
065
066        private static final ApplicationInfo appInfo;
067        static {
068                /** コネクションにアプリケーション情報を追記するかどうか指定 */
069                boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
070
071                // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
072                if( USE_DB_APPLICATION_INFO ) {
073                        String SYSTEM_ID = HybsSystem.sys( "SYSTEM_ID" );
074                        appInfo = new ApplicationInfo();
075                        // ユーザーID,IPアドレス,ホスト名
076                        appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
077                        // 画面ID,操作,プログラムID
078                        appInfo.setModuleInfo( "Selection_DBRADIO",null,null );
079                }
080                else {
081                        appInfo = null;
082                }
083        }
084
085        /**
086         * コンストラクター
087         *
088         * DB検索用のSQL文を与えて、初期化します。
089         * SQL文は、KEY,SNAMEで、SNAMEが設定されてない場合は、LNAMEを使用します。
090         * LNAME は、通常の値を返す場合に、SNAME は、一覧表示の値を返す場合に使用します。
091         * 特別に、KEY のみの場合は、lang に基づく ResourceManager からラベルを取得します。
092         * ただし、その場合は、オーナー(SYSTEM_ID)は選べません。
093         *
094         * @og.rev 5.1.9.0 (2010/08/01) String[] value 廃止
095         *
096         * @param       newQuery        DB検索(SQL)文字列
097         * @param dbid  データベース接続先ID
098         * @param lang  リソースを使用する場合の言語
099         */
100        public Selection_DBRADIO( final String newQuery,final String dbid,final String lang ) {
101
102                String[][] cols = DBUtil.dbExecute( newQuery,null,appInfo,dbid );
103                int count = cols.length;
104
105                label   = new String[count];
106                cls             = new String[count];
107                disabled= new String[count];
108                map             = new LinkedHashMap<String,Integer>(count);
109
110                int len   = ( count > 0 ) ? cols[0].length : 0 ;
111                isClass   = len > CLS ;                 // >= 3 と同意;
112                isDisable = len > DISABLED ;    // >= 4 と同意;
113
114                boolean useLabelData = false ;
115                ResourceManager resource = null;
116                if( len == 1 ) {
117                        useLabelData = true;
118                        resource = ResourceFactory.newInstance( lang );
119                }
120
121                for( int i=0; i<count; i++ ) {
122                        String value = cols[i][VAL];
123                        if( useLabelData ) {
124                                label[i] = resource.getShortLabel( value );
125                        }
126                        else {
127                                label[i] = cols[i][LBL];
128                        }
129
130                        if( isClass ) {
131                                cls[i] = cols[i][CLS];
132                        }
133                        if( isDisable ) {
134                                disabled[i] = cols[i][DISABLED];
135                        }
136
137                        map.put( value, Integer.valueOf( i ) );
138                }
139
140                createTime = System.currentTimeMillis() ;
141        }
142
143        /**
144         * 初期値が選択済みの 選択肢(オプション)を返します。
145         * このオプションは、引数の値を初期値とするオプションタグを返します。
146         * ※ このクラスでは実装されていません。
147         *
148         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
149         *
150         * @param       selectValue     選択されている値
151         * @param       seqFlag         シーケンスアクセス機能の指定
152         *
153         * @return  オプションタグ
154         */
155//      public String getOption( final String selectValue,final boolean seqFlag ) {
156//              String errMsg = "このクラスでは実装されていません。";
157//              throw new UnsupportedOperationException( errMsg );
158//      }
159
160        /**
161         * 初期値が選択済みの 選択肢(オプション)を返します。
162         * このオプションは、引数の値を初期値とするオプションタグを返します。
163         * ※ このクラスでは実装されていません。
164         *
165         * @og.rev 5.1.3.0 (2010/02/01) 追加
166         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
167         *
168         * @param   selectValue  選択されている値
169         * @param       seqFlag         シーケンスアクセス機能の指定
170         * @param       useShortLabel   短ラベルの指定
171         *
172         * @return  オプションタグ
173         */
174        @Override
175        public String getOption( final String selectValue,final boolean seqFlag, final boolean useShortLabel ) {
176                String errMsg = "このクラスでは実装されていません。";
177                throw new UnsupportedOperationException( errMsg );
178        }
179
180        /**
181         * 初期値が選択済みの 選択肢(オプション)を返します。
182         * このオプションは、引数の値を初期値とするオプションタグを返します。
183         *
184         * @param   name         ラジオの name
185         * @param   selectValue  選択されている値
186         * @param   useLabel     ラベル表示の有無 [true:有/false:無]
187         *
188         * @return  オプションタグ
189         */
190        @Override
191        public String getRadio( final String name,final String selectValue,final boolean useLabel ) {
192                String inputTag = "<input type=\"radio\" name=\"" + name + "\" value=\"" ;
193                StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_LARGE );
194                for( Map.Entry<String, Integer> e : map.entrySet() ) {
195                        String val = e.getKey();        // Ver 5.0.0.0 value ⇒ val
196                        int valIdx = e.getValue().intValue();
197                        if( useLabel ) {
198                                buf.append( "<label" );
199                                if( isClass && cls[valIdx] != null && cls[valIdx].length() > 0 ) {
200                                        buf.append( " class=\"" ).append( cls[valIdx] ).append( "\"" );
201                                }
202                                buf.append(  ">" );
203                        }
204                        buf.append( inputTag ).append( val ).append( "\"" );
205                        if( val.equals( selectValue ) ) {
206                                buf.append( " checked=\"checked\"" );
207                        }
208
209                        if( isDisable && disabled[valIdx] != null && disabled[valIdx].length() > 0 ) {
210                                if( "false".equalsIgnoreCase( disabled[valIdx] ) || "0".equals( disabled[valIdx] ) ) {
211                                        buf.append( " disabled=\"disabled\"" );
212                                }
213                        }
214
215                        buf.append( "/>" );
216                        if( useLabel ) { buf.append( label[valIdx] ).append( "</label>" ); }
217                }
218                return buf.toString();
219        }
220
221        /**
222         * 選択肢(value)に対するラベルを返します。
223         * 選択肢(value)が、存在しなかった場合は、選択肢そのものを返します。
224         * getValueLabel( XX ) は、getValueLabel( XX,false ) と同じです。
225         *
226         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
227         *
228         * @param   selectValue 選択肢の値
229         *
230         * @return  選択肢のラベル
231         * @see     #getValueLabel( String,boolean )
232         */
233//      public String getValueLabel( final String selectValue ) {
234//              return getValueLabel( selectValue,false );
235//      }
236
237        /**
238         * 選択肢(value)に対するラベルを返します。
239         * 選択肢(value)が、存在しなかった場合は、選択肢そのものを返します。
240         * このメソッドでは、短縮ラベルを返すかどうかを指定するフラグを指定します。
241         * getValueLabel( XX,false ) は、getValueLabel( XX ) と同じです。
242         *
243         * @param       selectValue     選択肢の値
244         * @param       flag    短縮ラベルを使用する [true:使用する/false:しない]
245         *
246         * @return  選択肢のラベル
247         * @see     #getValueLabel( String )
248         */
249        @Override
250        public String getValueLabel( final String selectValue,final boolean flag ) {
251                // マッチするアドレスを探す。
252                Integer sel = map.get( selectValue );
253
254                if( sel == null ) {
255                        return selectValue;
256                }
257                else {
258                        return label[sel.intValue()] ;
259                }
260        }
261
262        /**
263         * 選択肢(value)に対するラベルを返します。
264         * 選択肢(value)が、存在しなかった場合は、選択肢そのものを返します。
265         * getValueLabel( XX ) は、getValueLabel( XX,false ) と同じです。
266         *
267         * @param   selectValue 選択肢の値
268         *
269         * @return  選択肢のラベル
270         * @see     #getValueLabel( String,boolean )
271         */
272        @Override
273        public String getRadioLabel( final String selectValue ) {
274
275                StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
276                for( Map.Entry<String, Integer> e : map.entrySet() ) {
277                        String val = e.getKey();        // Ver 5.0.0.0 value ⇒ val
278                        if( val.equals( selectValue ) ) {
279                                rtn.append( "○" );
280                        }
281                        else {
282                                rtn.append( " " );
283                        }
284                }
285
286                return rtn.toString();
287        }
288
289        /***
290         * マルチ・キーセレクトを使用するかどうかを返します。
291         * true:使用する。false:使用しない です。
292         * ただし、実際に使用するかどうかは、HTML出力時に決めることが出来ます。
293         * ここでは、USE_MULTI_KEY_SELECT が true で、USE_SIZE(=20)以上の場合に
294         * true を返します。
295         *
296         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
297         *
298         * @return  選択リストで、マルチ・キーセレクトを使用するかどうか(true:使用する)
299         */
300//      public boolean useMultiSelect() {
301//              return false;
302//      }
303
304        /**
305         * オブジェクトのキャッシュが時間切れかどうかを返します。
306         * キャッシュが時間切れ(無効)であれば、true を、有効であれば、
307         * false を返します。
308         *
309         * @return  キャッシュが時間切れなら true
310         */
311        @Override
312        public boolean isTimeOver() {
313                return ( System.currentTimeMillis() - createTime ) > DB_CACHE_TIME ;
314        }
315}