    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 *  第１カラム(必須) : ラジオボタンのキー(値)
    035 *  第２カラム       : ラベル(指定されない場合は、ラベルリソースの短縮ラベルを使用します)
    036 *  第３カラム       : クラス そのオプションに色づけなどを行う為の指定します。
    037 *                     NULL(または、ゼロ文字列)の場合は、適用されません。
    038 *  第４カラム       : この値は'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         * ＤＢ検索用のＳＱＬ文を与えて、初期化します。
    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}