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}