    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 org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.fukurou.util.LogWriter;
    020import org.opengion.hayabusa.resource.CodeData;
    021
    022/**
    023 * データのコード情報を取り扱うクラスです。
    024 *
    025 * コードのキーとラベルの情報から、HTMLのメニューやリストを作成するための オプション
    026 * タグを作成したり、与えられたキーをもとに、チェック済みのオプションタグを作成したり
    027 * します。
    028 *
    029 * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 基本実装とします。
    030 * @og.group 選択データ制御
    031 *
    032 * @version  4.0
    033 * @author   Kazuhiko Hasegawa
    034 * @since    JDK5.0,
    035 */
    036// public class Selection_CODE implements Selection {
    037public class Selection_CODE extends Selection_NULL {
    038        private final CodeData codeData ;
    039
    040        private final int[]    ADRS  ;
    041        private final String   CACHE ;
    042        private final int      LEN   ;
    043
    044        private final int[]    LADRS  ; // 5.1.3.0 (2010/02/01)
    045        private final String   LCACHE ; // 5.1.3.0 (2010/02/01)
    046        private final int      LLEN   ; // 5.1.3.0 (2010/02/01)
    047
    048        /**
    049         * コンストラクター
    050         *
    051         * @og.rev 4.0.0.0 (2007/11/07) コードリソースの有無はDBColumnでチェックする。
    052         * @og.rev 4.3.8.0 (2009/08/01) ツールチップ表示機能追加
    053         * @og.rev 5.1.3.0 (2010/02/01) 一覧表示以外は、ツールチップ表示しない
    054         * @og.rev 5.1.9.0 (2010/08/01) グループ機能とパラメータ機能の追加
    055         * @og.rev 5.6.8.2 (2013/09/20) ツールチップは未加工のlongLabelを利用に修正
    056         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、super( null ); を追加します。
    057         *
    058         * @param       cdData  コードデータオブジェクト
    059         */
    060        public Selection_CODE( final CodeData cdData ) {
    061                codeData = cdData ;
    062                int size = codeData.getSize();
    063
    064                // 5.1.9.0 (2010/08/01) グループ機能とパラメータの判定
    065                boolean isLbl = codeData.useLebel();
    066                boolean isCls = codeData.useParam();
    067                boolean isLblSet = false;
    068
    069                ADRS  = new int[size];
    070                StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
    071                boolean useTitle = false; // 4.3.8.0 (2009/08/01) title属性付加フラグ
    072                for( int i=0; i<size; i++ ) {
    073                        if( ! codeData.isUse(i) ) { continue; }
    074
    075                        String rslbl = codeData.getRawShortLabel(i);
    076                        // String lblb  = codeData.getLongLabel(i);
    077                        String lblb  = codeData.getRawLongLabel(i); // 5.6.8.2 (2013/09/20) ここでは生の名称長を取る
    078
    079                        // 5.1.9.0 (2010/08/01) コードレベルの判定
    080                        if( isLbl && "0".equals( codeData.getCodeLebel(i) ) ) {
    081                                if( isLblSet ) { buf.append( "</optgroup>" ); }
    082
    083                                buf.append( "<optgroup label=\"" + rslbl + "\">" );
    084                                isLblSet = true;
    085                                continue;
    086                        }
    087
    088                        buf.append( "<option value=\"" ).append( codeData.getCodeKey(i) ).append( "\"" );
    089                        ADRS[i] = buf.length() ;
    090
    091                        // 5.1.9.0 (2010/08/01) パラメータの利用
    092                        if( isCls ) {
    093                                String classKey = codeData.getCodeParam(i);
    094                                if( ! "".equals( classKey ) ) {
    095                                        buf.append( " class=\"" ).append( classKey ).append( "\"" );
    096                                }
    097                        }
    098
    099                        // 4.3.8.0 (2009/08/01) LongLabelはRawShortLabelと異なるときにツールチップとして表示させる
    100                        if( ! rslbl.equals( lblb ) ){
    101                                buf.append(" title=\"").append( lblb ).append("\"");
    102                                useTitle = true;
    103                        }
    104                        // ShortLabelをBODYにする。
    105                        buf.append( ">" ).append( rslbl ).append( "</option>" );
    106                }
    107                if( isLbl ) {
    108                        buf.append( "</optgroup>" );
    109                }
    110
    111                CACHE = buf.toString();
    112                LEN   = CACHE.length() + 30;
    113
    114                // 5.1.3.0 (2010/02/01) ツールチップ表示が適用されている場合のみ、ツールチップなしの状態のoptionをキャッシュする。
    115                if( useTitle ) {
    116                        isLblSet = false;
    117
    118                        LADRS  = new int[size];
    119                        StringBuilder lbuf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
    120                        for( int i=0; i<size; i++ ) {
    121                                String lblb  = codeData.getLongLabel(i);
    122                                // 5.1.9.0 (2010/08/01) グループ機能の判定
    123                                if( isLbl && "0".equals( codeData.getCodeLebel(i) ) ) {
    124                                        if( isLblSet ) { lbuf.append( "</optgroup>" ); }
    125
    126                                        lbuf.append( "<optgroup label=\"" + lblb + "\">" );
    127                                        isLblSet = true;
    128                                        continue;
    129                                }
    130
    131                                lbuf.append( "<option value=\"" ).append( codeData.getCodeKey(i) ).append( "\"" );
    132                                LADRS[i] = lbuf.length() ;
    133
    134                                // 5.1.9.0 (2010/08/01) パラメータの利用
    135                                if( isCls ) {
    136                                        String classKey = codeData.getCodeParam(i);
    137                                        if( ! "".equals( classKey ) ) {
    138                                                lbuf.append( " class=\"" ).append( classKey ).append( "\"" );
    139                                        }
    140                                }
    141
    142                                lbuf.append( ">" ).append( lblb ).append( "</option>" );
    143                        }
    144                        if( isLbl ) {
    145                                buf.append( "</optgroup>" );
    146                        }
    147
    148                        LCACHE = lbuf.toString();
    149                        LLEN   = LCACHE.length() + 30;
    150                }
    151                else {
    152                        LADRS  = ADRS;
    153                        LCACHE = CACHE;
    154                        LLEN   = LEN;
    155                }
    156        }
    157
    158        /**
    159         * 初期値が選択済みの 選択肢(オプション)を返します。
    160         * このオプションは、引数の値を初期値とするオプションタグを返します。
    161         * このメソッドでは、ラベル(短)が設定されている場合でも、これを使用せずに必ずラベル(長)を使用します。
    162         *
    163         * @og.rev 3.6.0.6 (2004/10/22) シーケンスアクセス機能を指定する seqFlag を導入
    164         * @og.rev 4.0.0.0 (2005/01/31) selectValue が、null/ゼロ文字列でない場合に、選択肢にない場合は、エラー
    165         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
    166         *
    167         * @param   selectValue  選択されている値
    168         * @param   seqFlag  シーケンスアクセス機能 [true:ON/false:OFF]
    169         *
    170         * @return  オプションタグ
    171         * @see     #getOption( String, boolean, boolean )
    172         */
    173//      public String getOption( final String selectValue,final boolean seqFlag ) {
    174//              return getOption( selectValue, seqFlag, false );
    175//      }
    176
    177        /**
    178         * 初期値が選択済みの 選択肢(オプション)を返します。
    179         * このオプションは、引数の値を初期値とするオプションタグを返します。
    180         * このメソッドでは、引数のuseShortLabelがtrueに指定された場合に、ラベル(短)をベースとした
    181         * ツールチップ表示を行います。
    182         *
    183         * @og.rev 5.1.3.0 (2010/02/01) 追加
    184         *
    185         * @param   selectValue  選択されている値
    186         * @param   seqFlag  シーケンスアクセス機能 [true:ON/false:OFF]
    187         * @param   useShortLabel ラベル(短)をベースとしたオプション表示を行うかどうか。
    188         *
    189         * @return  オプションタグ
    190         * @see     #getOption( String, boolean )
    191         */
    192        @Override
    193        public String getOption( final String selectValue,final boolean seqFlag, final boolean useShortLabel ) {
    194                int[] adrs = null;
    195                String cache = null;
    196                int len = 0;
    197                if( useShortLabel ) {
    198                        adrs  = ADRS;
    199                        cache = CACHE;
    200                        len   = LEN;
    201                }
    202                else {
    203                        adrs  = LADRS;
    204                        cache = LCACHE;
    205                        len   = LLEN;
    206                }
    207
    208                // マッチするアドレスを探す。
    209                int selected = codeData.getAddress( selectValue );
    210
    211                if( selected < 0 ) {
    212                        // 4.0.0 (2005/01/31)
    213                        if( selectValue != null && selectValue.length() > 0 ) {
    214                                String errMsg = "コードに存在しない値が指定されました。"
    215                                                        + " value=[" + selectValue + "]"
    216                                                        + HybsSystem.CR + codeData ;
    217                                LogWriter.log( errMsg );
    218                        }
    219                        return cache;
    220                }
    221                else {
    222                        StringBuilder buf = new StringBuilder( len );
    223                        // 3.6.0.6 (2004/10/22) シーケンスアクセス機能を指定する seqFlag を導入
    224                        if( seqFlag ) {
    225                                buf.append( "<option value=\"" ).append( codeData.getCodeKey(selected) ).append( "\"" );
    226                        }
    227                        else {
    228                                buf.append( cache.substring( 0,adrs[selected] ) );
    229                        }
    230                        buf.append( " selected=\"selected\"" );
    231                        buf.append( cache.substring( adrs[selected] ) );
    232                        return buf.toString() ;
    233                }
    234        }
    235
    236        /**
    237         * 初期値が選択済みの 選択肢(オプション)を返します。
    238         * このオプションは、引数の値を初期値とするオプションタグを返します。
    239         * ※ このクラスでは実装されていません。
    240         *
    241         * @og.rev 2.1.0.1 (2002/10/17) 選択リストを、正方向にしか選べないようにする sequenceFlag を導入する
    242         * @og.rev 3.8.6.0 (2006/09/29) useLabel 属性 追加
    243         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
    244         *
    245         * @param   name         ラジオの name
    246         * @param   selectValue  選択されている値
    247         * @param   useLabel     ラベル表示の有無 [true:有/false:無]
    248         *
    249         * @return  オプションタグ
    250         */
    251//      public String getRadio( final String name,final String selectValue,final boolean useLabel ) {
    252//              String errMsg = "このクラスでは実装されていません。";
    253//              throw new UnsupportedOperationException( errMsg );
    254//      }
    255
    256        /**
    257         * 初期値が選択済みの 選択肢(オプション)を返します。
    258         * このオプションは、引数の値を初期値とするオプションタグを返します。
    259         * ※ このクラスでは実装されていません。
    260         *
    261         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
    262         *
    263         * @param   selectValue  選択されている値
    264         *
    265         * @return  オプションタグ
    266         */
    267//      public String getRadioLabel( final String selectValue ) {
    268//              String errMsg = "このクラスでは実装されていません。";
    269//              throw new UnsupportedOperationException( errMsg );
    270//      }
    271
    272        /**
    273         * 選択肢(value)に対するラベルを返します。
    274         * 選択肢(value)が、存在しなかった場合は、選択肢そのものを返します。
    275         * getValueLabel( XX ) は、getValueLabel( XX,false ) と同じです。
    276         *
    277         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
    278         *
    279         * @param   selectValue 選択肢の値
    280         *
    281         * @return  選択肢のラベル
    282         * @see     #getValueLabel( String,boolean )
    283         */
    284//      public String getValueLabel( final String selectValue ) {
    285//              return getValueLabel( selectValue,false );
    286//      }
    287
    288        /**
    289         * 選択肢(value)に対するラベルを返します。
    290         * 選択肢(value)が、存在しなかった場合は、選択肢そのものを返します。
    291         * このメソッドでは、短縮ラベルを返すかどうかを指定するフラグを指定します。
    292         * getValueLabel( XX,false ) は、getValueLabel( XX ) と同じです。
    293         *
    294         * @og.rev 4.0.0.0 (2005/11/30) を追加
    295         *
    296         * @param       selectValue     選択肢の値
    297         * @param       flag    短縮ラベルを [true:使用する/false:しない]
    298         *
    299         * @return  選択肢のラベル
    300         * @see     #getValueLabel( String )
    301         */
    302        @Override
    303        public String getValueLabel( final String selectValue,final boolean flag ) {
    304                // マッチするアドレスを探す。
    305                int selected = codeData.getAddress( selectValue );
    306
    307                if( selected < 0 ) {
    308                        // マッチしなければ、選択肢そのものを返す。
    309                        return selectValue;
    310                }
    311                else {
    312                        if( flag ) {
    313                                return codeData.getShortLabel(selected);
    314                        }
    315                        else {
    316                                return codeData.getLongLabel(selected);
    317                        }
    318                }
    319        }
    320
    321        /**
    322         * マルチ・キーセレクトを使用するかどうかを返します。
    323         * true：使用する。false:使用しない です。
    324         * ただし、実際に使用するかどうかは、HTML出力時に決めることが出来ます。
    325         * ここでは、USE_MULTI_KEY_SELECT が true で、USE_SIZE(=20)以上の場合に
    326         * true を返します。
    327         *
    328         * @og.rev 3.5.5.7 (2004/05/10) 新規作成
    329         *
    330         * @return  選択リストで、マルチ・キーセレクトを使用するかどうか(true:使用する)
    331         */
    332        @Override
    333        public boolean useMultiSelect() {
    334                return codeData.useMultiSelect();
    335        }
    336
    337        /**
    338         * オブジェクトのキャッシュが時間切れかどうかを返します。
    339         * キャッシュが時間切れ(無効)であれば、true を、有効であれば、
    340         * false を返します。
    341         *
    342         * @og.rev 4.0.0.0 (2005/01/31) 新規作成
    343         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
    344         *
    345         * @return  キャッシュが時間切れなら true
    346         */
    347//      public boolean isTimeOver() {
    348//              return false;
    349//      }
    350}