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.fukurou.util.LogWriter;
019import org.opengion.fukurou.util.StringUtil;
020
021import org.opengion.hayabusa.common.HybsSystem;
022
023/**
024 * データのコード情報を取り扱うクラスです。
025 *
026 * 文字列の 「キー:ラベル キー:ラベル」の情報から、HTMLのメニューやリストを作成するための 
027 * オプションタグを作成したり、与えられたキーをもとに、チェック済みのオプションタグを
028 * 作成したりします。
029 * ラベル にスペースを含ませる場合は、ダブルクォーテーションで囲ってください。
030 *
031 * @og.rev 5.6.6.0 (2013/07/05) 新規追加
032 * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 基本実装とします。
033 * @og.group 選択データ制御
034 *
035 * @version  4.0
036 * @author   Kazuhiko Hasegawa
037 * @since    JDK5.0,
038 */
039// public class Selection_KEYVAL implements Selection {
040public class Selection_KEYVAL extends Selection_NULL {
041        private final String    ORG_KEYVAL ;
042
043        private final String    CACHE ;
044
045        /**
046         * コンストラクター
047         *
048         * @og.rev 5.6.7.1 (2013/08/09) 「キー:ラベル キー:ラベル」分解に、クオート処理を加味
049         *
050         * @param       strCode コードデータパラメータ文字列
051         */
052        public Selection_KEYVAL( final String strCode ) {
053                ORG_KEYVAL = strCode ;
054
055                if( strCode != null && strCode.indexOf( ':' ) > 0 ) {
056                        String[] keyvals = StringUtil.csv2Array( strCode, ' ' );        // 5.6.7.1 (2013/08/09) クオート処理を加味
057                        int size = keyvals.length;
058
059                        StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
060                        for( int i=0; i<size; i++ ) {
061                                String keyval = keyvals[i] ;
062                                int idx ;
063                                if( keyval == null || keyval.length() <= 0 || (idx = keyval.indexOf( ':' )) < 0 ) { continue; }         // スペースで分解した結果
064
065                                String key = keyval.substring( 0,idx ).trim();
066                                String val = keyval.substring( idx+1 ).trim();
067
068                                // 5.6.7.1 (2013/08/09) クオート処理を加味。csv2Array では、クオートは残ったままである。
069                                if( val.length() >= 2 && val.charAt(0) == '"' && val.charAt(val.length()-1) == '"' ) {
070                                        // 前後の クオート を取り除く。さらに、その結果を trim する。
071                                        val = val.substring( 1,val.length()-1 ).trim();
072                                }
073
074                                buf.append( "<option value=\"" ).append( key ).append( "\"" );
075                                buf.append( ">" ).append( val ).append( "</option>" );
076                        }
077
078                        CACHE = buf.toString();
079                }
080                else {
081                        CACHE = "";
082                }
083        }
084
085        /**
086         * 初期値が選択済みの 選択肢(オプション)を返します。
087         * このオプションは、引数の値を初期値とするオプションタグを返します。
088         * このメソッドでは、ラベル(短)が設定されている場合でも、これを使用せずに必ずラベル(長)を使用します。
089         *
090         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
091         *
092         * @param   selectValue  選択されている値
093         * @param   seqFlag  シーケンスアクセス機能 [true:ON/false:OFF]
094         *
095         * @return  オプションタグ
096         * @see     #getOption( String, boolean, boolean )
097         */
098//      public String getOption( final String selectValue,final boolean seqFlag ) {
099//              return getOption( selectValue, seqFlag, false );
100//      }
101
102        /**
103         * 初期値が選択済みの 選択肢(オプション)を返します。
104         * このオプションは、引数の値を初期値とするオプションタグを返します。
105         * このクラスでは、useShortLabel は、無視されます。(常に、false です)
106         *
107         * @param   selectValue  選択されている値
108         * @param   seqFlag  シーケンスアクセス機能 [true:ON/false:OFF]
109         * @param   useShortLabel ラベル(短)をベースとしたオプション表示を行うかどうか(常にfalse)。
110         *
111         * @return  オプションタグ
112         * @see     #getOption( String, boolean )
113         */
114        @Override
115        public String getOption( final String selectValue,final boolean seqFlag, final boolean useShortLabel ) {
116                // マッチするアドレスを探す。キーの前後のダブルクオートを加味して検索
117                String selVal = "\"" + selectValue + "\"" ;
118
119                int indx = CACHE.indexOf( selVal );
120
121                if( indx < 0 ) {
122                        // 4.0.0 (2005/01/31)
123                        if( selectValue != null && selectValue.length() > 0 ) {
124                                String errMsg = "コードに存在しない値が指定されました。"
125                                                        + " value=[" + selectValue + "]"
126                                                        + HybsSystem.CR + ORG_KEYVAL ;
127                                LogWriter.log( errMsg );
128                        }
129                        return CACHE;
130                }
131                else {
132                        int addIndx = indx + selVal.length() ;  // selected の挿入位置
133
134                        StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
135                        // 3.6.0.6 (2004/10/22) シーケンスアクセス機能を指定する seqFlag を導入
136                        if( seqFlag ) {
137                                buf.append( "<option value=\"" ).append( selectValue ).append( "\"" );
138                        }
139                        else {
140                                buf.append( CACHE.substring( 0,addIndx ) );
141                        }
142                        buf.append( " selected=\"selected\"" );
143                        buf.append( CACHE.substring( addIndx ) );
144                        return buf.toString() ;
145                }
146        }
147
148        /**
149         * 初期値が選択済みの 選択肢(オプション)を返します。
150         * このオプションは、引数の値を初期値とするオプションタグを返します。
151         * ※ このクラスでは実装されていません。
152         *
153         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
154         *
155         * @param   name         ラジオの name
156         * @param   selectValue  選択されている値
157         * @param   useLabel     ラベル表示の有無 [true:有/false:無]
158         *
159         * @return  オプションタグ
160         */
161//      public String getRadio( final String name,final String selectValue,final boolean useLabel ) {
162//              String errMsg = "このクラスでは実装されていません。";
163//              throw new UnsupportedOperationException( errMsg );
164//      }
165
166        /**
167         * 初期値が選択済みの 選択肢(オプション)を返します。
168         * このオプションは、引数の値を初期値とするオプションタグを返します。
169         * ※ このクラスでは実装されていません。
170         *
171         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
172         *
173         * @param   selectValue  選択されている値
174         *
175         * @return  オプションタグ
176         */
177//      public String getRadioLabel( final String selectValue ) {
178//              String errMsg = "このクラスでは実装されていません。";
179//              throw new UnsupportedOperationException( errMsg );
180//      }
181
182        /**
183         * 選択肢(value)に対するラベルを返します。
184         * 選択肢(value)が、存在しなかった場合は、選択肢そのものを返します。
185         * getValueLabel( XX ) は、getValueLabel( XX,false ) と同じです。
186         *
187         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
188         *
189         * @param   selectValue 選択肢の値
190         *
191         * @return  選択肢のラベル
192         * @see     #getValueLabel( String,boolean )
193         */
194//      public String getValueLabel( final String selectValue ) {
195//              return getValueLabel( selectValue,false );
196//      }
197
198        /**
199         * 選択肢(value)に対するラベルを返します。
200         * 選択肢(value)が、存在しなかった場合は、選択肢そのものを返します。
201         * getValueLabel( XX,false ) は、getValueLabel( XX ) と同じです。
202         *
203         * ※ このクラスでは、短縮ラベルは使用されません。
204         *
205         * @param       selectValue     選択肢の値
206         * @param       flag    短縮ラベルを [true:使用する/false:しない](常に false)
207         *
208         * @return  選択肢のラベル
209         * @see     #getValueLabel( String )
210         */
211        @Override
212        public String getValueLabel( final String selectValue,final boolean flag ) {
213                // マッチするアドレスを探す。キーの前後のダブルクオートを加味して検索
214                String selVal = "\"" + selectValue + "\"" ;
215
216                int indx = CACHE.indexOf( selVal );
217
218                if( indx < 0 ) {
219                        // マッチしなければ、選択肢そのものを返す。
220                        return selectValue;
221                }
222                else {
223                        // マッチすれば、キー以下のBODY部の文字列を切り出して返す。
224                        int stIdx = indx + selVal.length() + 1 ;                        // +1 は、">" の位置
225                        int edIdx = CACHE.indexOf( '<',stIdx );                         // 終了アドレス
226
227                        return CACHE.substring( stIdx,edIdx );
228                }
229        }
230
231        /**
232         * マルチ・キーセレクトを使用するかどうかを返します。
233         * true:使用する。false:使用しない です。
234         * ただし、実際に使用するかどうかは、HTML出力時に決めることが出来ます。
235         * ここでは、USE_MULTI_KEY_SELECT が true で、USE_SIZE(=20)以上の場合に
236         * true を返します。
237         *
238         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
239         *
240         * ※ ここでは、常に false を返します。
241         *
242         * @return  選択リストで、マルチ・キーセレクトを使用するかどうか(true:使用する)
243         */
244//      public boolean useMultiSelect() {
245//              return false;
246//      }
247
248        /**
249         * オブジェクトのキャッシュが時間切れかどうかを返します。
250         * キャッシュが時間切れ(無効)であれば、true を、有効であれば、
251         * false を返します。
252         *
253         * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL を 継承するため、削除
254         *
255         * ※ ここでは、常に false を返します。
256         *
257         * @return  キャッシュが時間切れなら true
258         */
259//      public boolean isTimeOver() {
260//              return false;
261//      }
262}