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.system.LogWriter; // 8.5.6.1 (2024/03/29) 019import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE; // 8.5.6.1 (2024/03/29) 020 021/** 022 * データのコード情報を取り扱うSelectionクラスの、NULL時オブジェクトです。 023 * 024 * 以前は、Selection オブジェクトが null の場合に、NullPointerException で 025 * いきなりエラーで停止していましたが、この、NULLセレクションを作成することで、 026 * 取りあえず、どういう状況なのか、判るようにします。 027 * 028 * @og.rev 5.7.3.0 (2014/02/07) 新規追加 029 * @og.rev 5.7.7.1 (2014/06/13) Selectionオブジェクトの基本実装とします。 030 * @og.rev 8.5.6.1 (2024/03/29) 継承で使える実装を、getOption メソッドに設定しておきます。 031 * @og.group 選択データ制御 032 * 033 * @version 4.0 034 * @author Kazuhiko Hasegawa 035 * @since JDK5.0, 036 */ 037public class Selection_NULL implements Selection { 038 private final String initMsg ; 039 040 /** サブクラスで作成される キャッシュ情報 */ 041 protected String cache; // 8.5.6.1 (2024/03/29) 親クラスで定義 042 043 /** 044 * デフォルトコンストラクター 045 * 継承元のクラスから、呼び出させるように、作成しておきます。 046 * 047 * @og.rev 5.7.7.1 (2014/06/13) 新規追加 048 */ 049 public Selection_NULL() { 050 initMsg = null; 051 cache = ""; 052 } 053 054 /** 055 * 引数に初期メッセージを指定して作成する、コンストラクター 056 * 057 * @og.rev 5.7.3.0 (2014/02/07) 新規追加 058 * @og.rev 6.2.6.0 (2015/06/19) type別Selectionの場合、ラベルリソースを使用する為、言語を引数で渡す。 059 * @og.rev 6.3.4.0 (2015/08/01) Selection_NULL の引数から、lang 属性を削除します。 060 * 061 * @param strCode 初期メッセージ文字列 062 */ 063 public Selection_NULL( final String strCode ) { 064 initMsg = strCode ; 065 cache = ""; 066 } 067 068 /** 069 * 初期値が選択済みの 選択肢(オプション)を返します。 070 * このオプションは、引数の値を初期値とするオプションタグを返します。 071 * このクラスでは、useShortLabel は、無視されます。(常に、false です) 072 * 073 * @og.rev 5.7.3.0 (2014/02/07) 新規追加 074 * @og.rev 8.5.6.1 (2024/03/29) 継承で使える実装を、getOption メソッドに設定しておきます。 075 * 076 * @param selectValue 選択されている値 077 * @param seqFlag シーケンスアクセス機能 [true:ON/false:OFF] 078 * @param useShortLabel ラベル(短)をベースとしたオプション表示を行うかどうか(未使用)。 079 * 080 * @return オプションタグ 081 * @og.rtnNotNull 082 */ 083 @Override // Selection 084 public String getOption( final String selectValue,final boolean seqFlag, final boolean useShortLabel ) { 085 final int addIndx = findIndex( selectValue ); // 選択肢があれば、そのアドレス、なければ、-1 086 087 if( addIndx < 0 ) { return cache; } // 引数の値が選択肢に存在しなかった。 088 089 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ); 090 091 if( seqFlag ) { 092 buf.append( "<option value=\"" ).append( selectValue ).append( '"' ); // 6.0.2.5 (2014/10/31) char を append する。 093 } 094 else { 095 buf.append( cache.substring( 0,addIndx ) ); 096 } 097 098 return buf.append( " selected=\"selected\"" ) 099 .append( cache.substring( addIndx ) ) 100 .toString() ; 101 } 102 103 /** 104 * 初期値が選択済みの 選択肢(オプション)を返します。 105 * このオプションは、引数の値を初期値とするオプションタグを返します。 106 * このメソッドでは、引数のuseShortLabelがtrueに指定された場合に、ラベル(短)をベースとした 107 * ツールチップ表示を行います。 108 * これは、ラジオボタンやチェックボックスなど、1コードデータ単位に name を指定する 109 * 場合に使います。 110 * 旧 #getRadio( String , String , boolean ) メソッドの代替えです。 111 * ※ このクラスでは実装されていません。→ 実装を入れます。 112 * 113 * @og.rev 6.0.4.0 (2014/11/28) 実装を入れます。 114 * @og.rev 6.2.2.4 (2015/04/24) メソッド変更。旧 #getRadio( String , String , boolean ) 115 * 116 * @param name ラジオの name 117 * @param selectValue 選択されている値 118 * @param useLabel ラベル表示の有無 [true:有/false:無] 119 * 120 * @return オプションタグ 121 * @og.rtnNotNull 122 */ 123 @Override // Selection 124 public String getOption( final String name,final String selectValue,final boolean useLabel ) { 125 return initMsg + " name=[" + name + "] value=[" + selectValue + "]"; 126 } 127 128 /** 129 * 選択肢(value)に対するラベルを返します。 130 * 選択肢(value)が、存在しなかった場合は、選択肢そのものを返します。 131 * getValueLabel( XX ) は、getValueLabel( XX,false ) と同じです。 132 * 133 * @param selectValue 選択肢の値 134 * 135 * @return 選択肢のラベル 136 * @see #getValueLabel( String,boolean ) 137 */ 138 @Override // Selection 139 public String getValueLabel( final String selectValue ) { 140 return getValueLabel( selectValue,false ); 141 } 142 143 /** 144 * 選択肢(value)に対するラベルを返します。 145 * 無条件で、初期メッセージを返します。 146 * 147 * @og.rev 5.7.3.0 (2014/02/07) 新規追加 148 * 149 * @param selectValue 選択肢の値 150 * @param isSLbl 短縮ラベルを [true:使用する/false:しない](未使用) 151 * 152 * @return 選択肢のラベル 153 * @og.rtnNotNull 154 * @see #getValueLabel( String ) 155 */ 156 @Override // Selection 157 public String getValueLabel( final String selectValue,final boolean isSLbl ) { 158// return initMsg + " value=[" + selectValue + "]"; 159 160 final int addIndx = findIndex( selectValue ); // 選択肢があれば、そのアドレス、なければ、-1 161 162 // マッチしなければ、選択肢そのものを返す。 163 if( addIndx < 0 ) { return selectValue; } // 引数の値が選択肢に存在しなかった。 164 165 final int stIdx = addIndx + 1 ; // +1 は、">" の位置 166 final int edIdx = cache.indexOf( '<',stIdx ); // 終了アドレス 167 168 return cache.substring( stIdx,edIdx ); 169 } 170 171 /** 172 * オブジェクトのキャッシュが時間切れかどうかを返します。 173 * キャッシュが時間切れ(無効)であれば、true を、有効であれば、 174 * false を返します。 175 * 176 * ※ ここでは、常に false を返します。 177 * 178 * @return キャッシュが時間切れなら true 179 */ 180 @Override // Selection 181 public boolean isTimeOver() { 182 return false; 183 } 184 185 /** 186 * 引数の値が選択肢(オプション)に存在しているか判定します。 187 * 存在している場合は、キャッシュに対する位置(発見位置 + 引数の文字数) 188 * を返し、存在しない場合は、-1 を返すとともに、LogWriter にエラー情報を 189 * 書き込みます。 190 * 191 * PMD 7.0.0 OnlyOneReturn 用に判定と処理を一つにまとめました。 192 * 193 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。 194 * 195 * @param selectValue 選択されている値 196 * @return キャッシュに対する位置(発見位置 + 引数の文字数) 197 */ 198 protected int findIndex( final String selectValue ) { 199 // マッチするアドレスを探す。キーの前後のダブルクオートを加味して検索 200 final String selVal = "\"" + selectValue + "\"" ; 201 202 final int rtnIdx ; 203 final int indx = cache.indexOf( selVal ); 204 if( indx < 0 ) { 205 if( selectValue != null && selectValue.length() > 0 ) { 206 final String errMsg = "指定の値は、選択肢に存在していません。" 207 + " value=[" + selectValue + "]" 208 + " initMsg=[" + initMsg + "]" ; 209 LogWriter.log( errMsg ); 210 } 211 rtnIdx = -1; 212 } 213 else { 214 rtnIdx = indx + selVal.length() ; // selected の挿入位置 215 } 216 217 return rtnIdx; 218 } 219 220 /** 221 * コードリソースのパラメータを適切な文字列に変換して返します。 222 * 通常であれば、そのままセットすればよいのですが、既存の処理が、 223 * class属性にセットするという仕様だったので、互換性を考慮した変換を行います。 224 * ここでは、 225 * ① "=" を含む場合は、そのままセット 226 * ② disabled 単体の場合は、disabled="disabled" をセット 227 * ③ 『:』と『;』の両方が存在する場合は、style属性としてセット 228 * ④ それ以外は、class= の後に、引数をセット 229 * します。 230 * 今後は、パラメータに、class="AAA" とセットすることで、徐々に 231 * この変換処理を無くしていきます。 232 * 233 * @og.rev 6.2.0.0 (2015/02/27) コードリソースのパラメータの指定方法を変更します。 234 * @og.rev 7.4.1.0 (2021/04/23) 『:』と『;』の両方が存在する場合は、style属性としてセットする。 235 * @og.rev 8.5.3.2 (2023/10/13) JDK21対応。警告: デフォルトのコンストラクタの使用で、コメントが指定されていません。 を消すため、static化。 236 * @og.rev 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 対応 237 * 238 * @param buf 変換結果を格納するStringBuilder 239 * @param paramKey 変換処理の対象となるパラメータ 240// * @return 引数と同じ、StringBuilder 241 */ 242// protected StringBuilder setCodeParam( final StringBuilder buf , final String paramKey ) { 243// final static protected StringBuilder setCodeParam( final StringBuilder buf , final String paramKey ) { 244 final static protected void setCodeParam( final StringBuilder buf , final String paramKey ) { // 8.5.4.2 (2024/01/12) 245 if( paramKey != null && !paramKey.isEmpty() ) { 246 if( paramKey.indexOf( '=' ) > 0 ) { // ① 247 buf.append( ' ' ).append( paramKey ); 248 } 249 else if( "disabled".equalsIgnoreCase( paramKey ) ) { // ② 250 buf.append( " disabled=\"" ).append( paramKey ).append( '"' ); 251 } 252 else if( paramKey.indexOf( ':' ) >=0 && paramKey.indexOf( ';' ) >=0 ) { // ③ 7.4.1.0 (2021/04/23) 253 buf.append( " style=\"" ).append( paramKey ).append( '"' ); 254 } 255 else { // ④ 256 buf.append( " class=\"" ).append( paramKey ).append( '"' ); 257 } 258 } 259// return buf ; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 対応 260 } 261}