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}