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     */
016    package org.opengion.hayabusa.db;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.fukurou.util.LogWriter;
020    import org.opengion.hayabusa.resource.CodeData;
021    
022    /**
023     * ãƒ??ã‚¿ã®ã‚³ãƒ¼ãƒ‰æƒ…報をå–り扱ã?‚¯ãƒ©ã‚¹ã§ã™ã?
024     *
025     * コードã?キーã¨ãƒ©ãƒ™ãƒ«ã®æƒ??ã‹ã‚‰ã€HTMLã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚?ƒªã‚¹ãƒˆã‚’作æ?ã™ã‚‹ãŸã‚㮠オプション
026     * タグを作æ?ã—ãŸã‚Šã?与ãˆã‚‰ã‚ŒãŸã‚­ãƒ¼ã‚’ã‚‚ã¨ã«ã€ãƒã‚§ãƒ?‚¯æ¸ˆã¿ã®ã‚ªãƒ—ションタグを作æ?ã—ãŸã‚?
027     * ã—ã¾ã™ã?
028     *
029     * @og.group é¸æŠžãƒ‡ãƒ¼ã‚¿åˆ¶å¾¡
030     *
031     * @version  4.0
032     * @author   Kazuhiko Hasegawa
033     * @since    JDK5.0,
034     */
035    public class Selection_CODE implements Selection {
036            private final CodeData codeData ;
037    
038            private final int[]    ADRS  ;
039            private final String   CACHE ;
040            private final int      LEN   ;
041    
042            private final int[]    LADRS  ; // 5.1.3.0 (2010/02/01)
043            private final String   LCACHE ; // 5.1.3.0 (2010/02/01)
044            private final int      LLEN   ; // 5.1.3.0 (2010/02/01)
045    
046            /**
047             * コンストラクター
048             *
049             * @og.rev 4.0.0.0 (2007/11/07) ã‚³ãƒ¼ãƒ‰ãƒªã‚½ãƒ¼ã‚¹ã®æœ‰ç„¡ã¯DBColumnã§ãƒã‚§ãƒ?‚¯ã™ã‚‹ã€?
050             * @og.rev 4.3.8.0 (2009/08/01) ãƒ??ルãƒãƒƒãƒ—表示機è?追åŠ?
051             * @og.rev 5.1.3.0 (2010/02/01) ä¸?¦§è¡¨ç¤ºä»¥å¤–ã?ã€ãƒ„ールãƒãƒƒãƒ—表示ã—ãªã?
052             * @og.rev 5.1.9.0 (2010/08/01) グループ機è?ã¨ãƒ‘ラメータ機è?ã®è¿½åŠ?
053             *
054             * @param       cdData  コードデータオブジェク�
055             */
056            public Selection_CODE( final CodeData cdData ) {
057    
058    // 4.0.0.0 (2007/11/07)
059    //              if( cdData == null ) {
060    //                      String errMsg = "コードリソースãŒå®šç¾©ã•れã¦ã?¾ã›ã‚“ã€? + HybsSystem.CR ;
061    //                      throw new HybsSystemException( errMsg );
062    //              }
063                    codeData = cdData ;
064                    int size = codeData.getSize();
065    
066                    // 5.1.9.0 (2010/08/01) グループ機è?ã¨ãƒ‘ラメータã®åˆ¤å®?
067                    boolean isLbl = codeData.useLebel();
068                    boolean isCls = codeData.useParam();
069                    boolean isLblSet = false;
070    
071                    ADRS  = new int[size];
072                    StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
073                    boolean useTitle = false; // 4.3.8.0 (2009/08/01) title属æ?付加フラグ
074                    for( int i=0; i<size; i++ ) {
075                            if( ! codeData.isUse(i) ) { continue; }
076    
077                            String rslbl = codeData.getRawShortLabel(i);
078                            String lblb  = codeData.getLongLabel(i);
079    
080                            // 5.1.9.0 (2010/08/01) コードレベルã®åˆ¤å®?
081                            if( isLbl ) {
082                                    if( "0".equals( codeData.getCodeLebel(i) ) ) {
083                                            if( isLblSet ) { buf.append( "</optgroup>" ); }
084    
085                                            buf.append( "<optgroup label=\"" + rslbl + "\">" );
086                                            isLblSet = true;
087                                            continue;
088                                    }
089                            }
090    
091                            buf.append( "<option value=\"" ).append( codeData.getCodeKey(i) ).append( "\"" );
092                            ADRS[i] = buf.length() ;
093    
094                            // 5.1.9.0 (2010/08/01) パラメータã®åˆ©ç”¨
095                            if( isCls ) {
096                                    String classKey = codeData.getCodeParam(i);
097                                    if( ! "".equals( classKey ) ) {
098                                            buf.append( " class=\"" ).append( classKey ).append( "\"" );
099                                    }
100                            }
101    
102                            // 4.3.8.0 (2009/08/01) LongLabelã¯RawShortLabelã¨ç•°ãªã‚‹ã¨ãã«ãƒ??ルãƒãƒƒãƒ—ã¨ã—ã¦è¡¨ç¤ºã•ã›ã‚?
103                            if( ! rslbl.equals( lblb ) ){
104                                    buf.append(" title=\"").append( lblb ).append("\"");
105                                    useTitle = true;
106                            }
107                            // ShortLabelã‚’BODYã«ã™ã‚‹ã€?
108                            buf.append( ">" ).append( rslbl ).append( "</option>" );
109                    }
110                    if( isLbl ) {
111                            buf.append( "</optgroup>" );
112                    }
113    
114                    CACHE = buf.toString();
115                    LEN   = CACHE.length() + 30;
116    
117                    // 5.1.3.0 (2010/02/01) ãƒ??ルãƒãƒƒãƒ—表示ãŒé©ç”¨ã•れã¦ã?‚‹å ´åˆã?ã¿ã€ãƒ„ールãƒãƒƒãƒ—ãªã—ã?状態ã?optionをキャãƒ?‚·ãƒ¥ã™ã‚‹ã€?
118                    if( useTitle ) {
119                            isLblSet = false;
120    
121                            LADRS  = new int[size];
122                            StringBuilder lbuf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
123                            for( int i=0; i<size; i++ ) {
124                                    String lblb  = codeData.getLongLabel(i);
125                                    // 5.1.9.0 (2010/08/01) グループ機è?ã®åˆ¤å®?
126                                    if( isLbl ) {
127                                            if( "0".equals( codeData.getCodeLebel(i) ) ) {
128                                                    if( isLblSet ) { lbuf.append( "</optgroup>" ); }
129    
130                                                    lbuf.append( "<optgroup label=\"" + lblb + "\">" );
131                                                    isLblSet = true;
132                                                    continue;
133                                            }
134                                    }
135    
136                                    lbuf.append( "<option value=\"" ).append( codeData.getCodeKey(i) ).append( "\"" );
137                                    LADRS[i] = lbuf.length() ;
138    
139                                    // 5.1.9.0 (2010/08/01) パラメータã®åˆ©ç”¨
140                                    if( isCls ) {
141                                            String classKey = codeData.getCodeParam(i);
142                                            if( ! "".equals( classKey ) ) {
143                                                    lbuf.append( " class=\"" ).append( classKey ).append( "\"" );
144                                            }
145                                    }
146    
147                                    lbuf.append( ">" ).append( lblb ).append( "</option>" );
148                            }
149                            if( isLbl ) {
150                                    buf.append( "</optgroup>" );
151                            }
152    
153                            LCACHE = lbuf.toString();
154                            LLEN   = LCACHE.length() + 30;
155                    }
156                    else {
157                            LADRS  = ADRS;
158                            LCACHE = CACHE;
159                            LLEN   = LEN;
160                    }
161            }
162    
163            /**
164             * åˆæœŸå€¤ãŒé¸æŠžæ¸ˆã¿ã® é¸æŠžè‚¢(オプション)ã‚’è¿”ã—ã¾ã™ã?
165             * ã“ã?オプションã¯ã€å¼•æ•°ã®å€¤ã‚’å?期å?ã¨ã™ã‚‹ã‚ªãƒ—ションタグを返ã—ã¾ã™ã?
166             * ã“ã?メソãƒ?ƒ‰ã§ã¯ã€ãƒ©ãƒ™ãƒ«(短)ãŒè¨­å®šã•れã¦ã?‚‹å ´åˆã§ã‚‚ã?ã“れを使用ã›ãšã«å¿?šãƒ©ãƒ™ãƒ«(é•·)を使用ã—ã¾ã™ã?
167             *
168             * @og.rev 3.6.0.6 (2004/10/22) シーケンスアクセス機è?を指定ã™ã‚?seqFlag ã‚’å°Žå?
169             * @og.rev 4.0.0.0 (2005/01/31) selectValue ãŒã?null/ゼロæ–?­—å?ã§ãªã??åˆã«ã€?¸æŠžè‚¢ã«ãªã??åˆã?ã€ã‚¨ãƒ©ãƒ¼
170             *
171             * @param   selectValue  é¸æŠžã•れã¦ã?‚‹å€¤
172             * @param   seqFlag  シーケンスアクセス機è? [true:ON/false:OFF]
173             *
174             * @return  オプションタグ
175             * @see     #getOption( String, boolean, boolean )
176             */
177            public String getOption( final String selectValue,final boolean seqFlag ) {
178                    return getOption( selectValue, seqFlag, false );
179            }
180    
181            /**
182             * åˆæœŸå€¤ãŒé¸æŠžæ¸ˆã¿ã® é¸æŠžè‚¢(オプション)ã‚’è¿”ã—ã¾ã™ã?
183             * ã“ã?オプションã¯ã€å¼•æ•°ã®å€¤ã‚’å?期å?ã¨ã™ã‚‹ã‚ªãƒ—ションタグを返ã—ã¾ã™ã?
184             * ã“ã?メソãƒ?ƒ‰ã§ã¯ã€å¼•æ•°ã®useShortLabelãŒtrueã«æŒ?®šã•れãŸå ´åˆã«ã€ãƒ©ãƒ™ãƒ«(短)ã‚’ã?ースã¨ã—ãŸ
185             * ãƒ??ルãƒãƒƒãƒ—表示を行ã„ã¾ã™ã?
186             *
187             * @og.rev 5.1.3.0 (2010/02/01) 追�
188             *
189             * @param   selectValue  é¸æŠžã•れã¦ã?‚‹å€¤
190             * @param   seqFlag  シーケンスアクセス機è? [true:ON/false:OFF]
191             * @param   useShortLabel ラベル(短)ã‚’ã?ースã¨ã—ãŸã‚ªãƒ—ション表示を行ã†ã‹ã©ã?‹ã€?
192             *
193             * @return  オプションタグ
194             * @see     #getOption( String, boolean )
195             */
196            public String getOption( final String selectValue,final boolean seqFlag, final boolean useShortLabel ) {
197                    int[] adrs = null;
198                    String cache = null;
199                    int len = 0;
200                    if( useShortLabel ) {
201                            adrs  = ADRS;
202                            cache = CACHE;
203                            len   = LEN;
204                    }
205                    else {
206                            adrs  = LADRS;
207                            cache = LCACHE;
208                            len   = LLEN;
209                    }
210    
211                    // マッãƒã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’探ã™ã?
212                    int selected = codeData.getAddress( selectValue );
213    
214                    if( selected < 0 ) {
215                            // 4.0.0 (2005/01/31)
216                            if( selectValue != null && selectValue.length() > 0 ) {
217                                    String errMsg = "コードã«å­˜åœ¨ã—ãªã??ãŒæŒ‡å®šã•れã¾ã—ãŸã€?
218                                                            + " value=[" + selectValue + "]"
219                                                            + HybsSystem.CR + codeData ;
220                                    LogWriter.log( errMsg );
221                            }
222                            return cache;
223                    }
224                    else {
225                            StringBuilder buf = new StringBuilder( len );
226                            // 3.6.0.6 (2004/10/22) シーケンスアクセス機è?を指定ã™ã‚?seqFlag ã‚’å°Žå?
227                            if( seqFlag ) {
228                                    buf.append( "<option value=\"" ).append( codeData.getCodeKey(selected) ).append( "\"" );
229                            }
230                            else {
231                                    buf.append( cache.substring( 0,adrs[selected] ) );
232                            }
233                            buf.append( " selected=\"selected\"" );
234                            buf.append( cache.substring( adrs[selected] ) );
235                            return buf.toString() ;
236                    }
237            }
238    
239            /**
240             * åˆæœŸå€¤ãŒé¸æŠžæ¸ˆã¿ã® é¸æŠžè‚¢(オプション)ã‚’è¿”ã—ã¾ã™ã?
241             * ã“ã?オプションã¯ã€å¼•æ•°ã®å€¤ã‚’å?期å?ã¨ã™ã‚‹ã‚ªãƒ—ションタグを返ã—ã¾ã™ã?
242             * ※ ã“ã?クラスã§ã¯å®Ÿè£?•れã¦ã?¾ã›ã‚“ã€?
243             *
244             * @og.rev 2.1.0.1 (2002/10/17) é¸æŠžãƒªã‚¹ãƒˆã‚’ã€æ­£æ–¹å‘ã«ã—ã‹é¸ã¹ãªã?‚ˆã?«ã™ã‚‹ sequenceFlag ã‚’å°Žå?ã™ã‚‹
245             * @og.rev 3.8.6.0 (2006/09/29) useLabel 属æ? 追åŠ?
246             *
247             * @param   name         ラジオ㮠name
248             * @param   selectValue  é¸æŠžã•れã¦ã?‚‹å€¤
249             * @param   useLabel     ãƒ©ãƒ™ãƒ«è¡¨ç¤ºã®æœ‰ç„¡ [true:æœ?false:ç„¡]
250             *
251             * @return  オプションタグ
252             */
253            public String getRadio( final String name,final String selectValue,final boolean useLabel ) {
254                    String errMsg = "ã“ã?クラスã§ã¯å®Ÿè£?•れã¦ã?¾ã›ã‚“ã€?;
255                    throw new UnsupportedOperationException( errMsg );
256            }
257    
258            /**
259             * åˆæœŸå€¤ãŒé¸æŠžæ¸ˆã¿ã® é¸æŠžè‚¢(オプション)ã‚’è¿”ã—ã¾ã™ã?
260             * ã“ã?オプションã¯ã€å¼•æ•°ã®å€¤ã‚’å?期å?ã¨ã™ã‚‹ã‚ªãƒ—ションタグを返ã—ã¾ã™ã?
261             * ※ ã“ã?クラスã§ã¯å®Ÿè£?•れã¦ã?¾ã›ã‚“ã€?
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             * @param   selectValue é¸æŠžè‚¢ã®å€¤
278             *
279             * @return  é¸æŠžè‚¢ã®ãƒ©ãƒ™ãƒ«
280             * @see     #getValueLabel( String,boolean )
281             */
282            public String getValueLabel( final String selectValue ) {
283                    return getValueLabel( selectValue,false );
284            }
285    
286            /**
287             * é¸æŠžè‚¢(value)ã«å¯¾ã™ã‚‹ãƒ©ãƒ™ãƒ«ã‚’è¿”ã—ã¾ã™ã?
288             * é¸æŠžè‚¢(value)ãŒã?存在ã—ãªã‹ã£ãŸå?åˆã?ã€?¸æŠžè‚¢ãã?ã‚‚ã?ã‚’è¿”ã—ã¾ã™ã?
289             * ã“ã?メソãƒ?ƒ‰ã§ã¯ã€çŸ­ç¸®ãƒ©ãƒ™ãƒ«ã‚’è¿”ã™ã‹ã©ã?‹ã‚’指定ã™ã‚‹ãƒ•ラグを指定ã—ã¾ã™ã?
290             * getValueLabel( XX,false ) ã¯ã€getValueLabel( XX ) ã¨åŒã˜ã§ã™ã?
291             *
292             * @og.rev 4.0.0.0 (2005/11/30) を追�
293             *
294             * @param       selectValue     é¸æŠžè‚¢ã®å€¤
295             * @param       flag    短縮ラベルã‚?[true:使用ã™ã‚‹/false:ã—ãªã„]
296             *
297             * @return  é¸æŠžè‚¢ã®ãƒ©ãƒ™ãƒ«
298             * @see     #getValueLabel( String )
299             */
300            public String getValueLabel( final String selectValue,final boolean flag ) {
301                    // マッãƒã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’探ã™ã?
302                    int selected = codeData.getAddress( selectValue );
303    
304                    if( selected < 0 ) {
305                            // マッãƒã—ãªã‘れã°ã€?¸æŠžè‚¢ãã?ã‚‚ã?ã‚’è¿”ã™ã€?
306                            return selectValue;
307                    }
308                    else {
309                            if( flag ) {
310                                    return codeData.getShortLabel(selected);
311                            }
312                            else {
313                                    return codeData.getLongLabel(selected);
314                            }
315                    }
316            }
317    
318            /**
319             * マルãƒã?キーセレクトを使用ã™ã‚‹ã‹ã©ã?‹ã‚’è¿”ã—ã¾ã™ã?
320             * true?šä½¿ç”¨ã™ã‚‹ã€‚false:使用ã—ãªã?ã§ã™ã?
321             * ãŸã ã—ã?実際ã«ä½¿ç”¨ã™ã‚‹ã‹ã©ã?‹ã¯ã€HTMLå‡ºåŠ›æ™‚ã«æ±ºã‚ã‚‹ã“ã¨ãŒå?æ¥ã¾ã™ã?
322             * ã“ã“ã§ã¯ã€USE_MULTI_KEY_SELECT ã?true ã§ã€USE_SIZE(=20)以上ã?å ´åˆã«
323             * true ã‚’è¿”ã—ã¾ã™ã?
324             *
325             * @og.rev 3.5.5.7 (2004/05/10) æ–°è¦ä½œæ?
326             *
327             * @return  é¸æŠžãƒªã‚¹ãƒˆã§ã€ã?ルãƒã?キーセレクトを使用ã™ã‚‹ã‹ã©ã?‹(true:使用ã™ã‚‹)
328             */
329            public boolean useMultiSelect() {
330                    return codeData.useMultiSelect();
331            }
332    
333            /**
334             * オブジェクトã?キャãƒ?‚·ãƒ¥ãŒæ™‚é–“å?れã‹ã©ã?‹ã‚’è¿”ã—ã¾ã™ã?
335             * キャãƒ?‚·ãƒ¥ãŒæ™‚é–“å?ã‚?無効)ã§ã‚れã°ã€true ã‚’ã?有効ã§ã‚れã°ã€?
336             * false ã‚’è¿”ã—ã¾ã™ã?
337             *
338             * @og.rev 4.0.0.0 (2005/01/31) æ–°è¦ä½œæ?
339             *
340             * @return  キャãƒ?‚·ãƒ¥ãŒæ™‚é–“å?れãªã‚?true
341             */
342            public boolean isTimeOver() {
343                    return false;
344            }
345    }