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 java.util.Set; 019import java.util.HashSet; 020import java.util.Arrays; 021 022import org.opengion.hayabusa.common.HybsSystemException; 023import org.opengion.hayabusa.resource.CodeData; 024import static org.opengion.fukurou.system.HybsConst.CR ; // 6.1.0.0 (2014/12/26) 025import static org.opengion.fukurou.system.HybsConst.BUFFER_LARGE; // 6.1.0.0 (2014/12/26) refactoring 026 027/** 028 * データのコード情報を取り扱うクラスです。 029 * 030 * コードのキーとラベルの情報から、HTMLのチェックボックスを作成するための オプション 031 * タグを作成したり、与えられたキーをもとに、チェック済みのオプションタグを作成したり 032 * します。 033 * 034 * ※ このクラスは、CHBOX 用ではなく、CHBOX2 用です。 035 * 036 * @og.group 選択データ制御 037 * @og.rev 6.4.4.0 (2016/03/11) 新規追加 038 * 039 * @version 6.4 040 * @author Kazuhiko Hasegawa 041 * @since JDK8.0, 042 */ 043// 8.5.5.1 (2024/02/29) spotbugs CT_CONSTRUCTOR_THROW(コンストラクタで、Excweptionを出さない) class を final にすれば、警告は消える。 044// public class Selection_CHBOX extends Selection_NULL { 045public final class Selection_CHBOX extends Selection_NULL { 046 private final CodeData codeData ; 047 048 /** 049 * コンストラクター 050 * 051 * @og.rev 6.4.4.0 (2016/03/11) 新規追加 052 * 053 * @param cdData コードデータオブジェクト 054 * 055 */ 056 public Selection_CHBOX( final CodeData cdData ) { 057 super(); // 6.4.1.1 (2016/01/16) PMD refactoring. It is a good practice to call super() in a constructor 058 if( cdData == null ) { 059 final String errMsg = "コードリソースが定義されていません。" + CR ; 060 throw new HybsSystemException( errMsg ); 061 } 062 063 codeData = cdData ; 064 } 065 066 /** 067 * 初期値が選択済みの 選択肢(オプション)を返します。 068 * このオプションは、引数の値を初期値とするオプションタグを返します。 069 * ※ このクラスでは実装されていません。 070 * 071 * @og.rev 6.4.4.0 (2016/03/11) CHBOX2は、コードリソースも使用できるように変更。 072 * 073 * @param selectValue 選択されている値 074 * @param seqFlag シーケンスアクセス機能の指定 075 * @param useShortLabel 短ラベルの指定 076 * 077 * @return オプションタグ 078 */ 079 @Override 080 public String getOption( final String selectValue,final boolean seqFlag, final boolean useShortLabel ) { 081 final String errMsg = "このクラスでは実装されていません。"; 082 throw new UnsupportedOperationException( errMsg ); 083 } 084 085 /** 086 * 初期値が選択済みの 選択肢(オプション)を返します。 087 * このオプションは、引数の値を初期値とするオプションタグを返します。 088 * このメソッドでは、引数のuseShortLabelがtrueに指定された場合に、ラベル(短)をベースとした 089 * ツールチップ表示を行います。 090 * これは、ラジオボタンやチェックボックスなど、1コードデータ単位に name を指定する 091 * 場合に使います。 092 * 旧 #getRadio( String , String , boolean ) メソッドの代替えです。 093 * 選択されている値は、複数指定が可能です。CSV形式データとして渡された場合は、 094 * 個別に分解して、ラベル化します。 095 * 096 * @og.rev 6.4.4.0 (2016/03/11) CHBOX2は、コードリソースも使用できるように変更。 097 * @og.rev 7.0.1.0 (2018/10/15) XHTML → HTML5 対応(空要素の、"/>" 止めを、">" に変更します)。 098 * @og.rev 7.2.6.1 (2020/07/17) codeGroupが使えるように、isUseを判定する。 099 * 100 * @param name ラジオの name 101 * @param selectValue 選択されている値 102 * @param useLabel ラベル表示の有無 [true:有/false:無] 103 * 104 * @return オプションタグ 105 * @og.rtnNotNull 106 */ 107 @Override 108 public String getOption( final String name,final String selectValue,final boolean useLabel ) { 109 // 選択値を、カンマで分解(split)して、Listを作成し、HashSetに渡している。存在チェック用 110 final Set<String> valSet = selectValue == null 111 ? new HashSet<>() 112 : new HashSet<>( Arrays.asList( selectValue.split( "," ) ) ); 113 114 final String inputTag = "<input type=\"checkbox\" name=\"" + name + "\" value=\"" ; 115 final StringBuilder buf = new StringBuilder( BUFFER_LARGE ); 116 final int size = codeData.getSize(); 117 for( int i=0; i<size; i++ ) { 118 if( ! codeData.isUse(i) ) { continue; } // 7.2.6.1 (2020/07/17) 119 120 final String value = codeData.getCodeKey(i); 121 if( useLabel ) { buf.append( "<label>" ); } 122 buf.append( inputTag ).append( value ).append( '"' ); // 6.0.2.5 (2014/10/31) char を append する。 123 if( valSet.contains( value ) ) { 124 buf.append( " checked=\"checked\"" ); 125 } 126// buf.append( "/>" ); 127 buf.append( '>' ); // 7.0.1.0 (2018/10/15) 128 if( useLabel ) { buf.append( codeData.getShortLabel(i) ).append( " </label>" ); } 129 } 130 131 return buf.toString(); 132 } 133 134 /** 135 * 選択肢(value)に対するラベルを返します。 136 * 選択肢(value)が、存在しなかった場合は、選択肢そのものを返します。 137 * このメソッドでは、短縮ラベルを返すかどうかを指定するフラグを指定します。 138 * getValueLabel( XX,false ) は、getValueLabel( XX ) と同じです。 139 * 140 * @og.rev 6.4.4.0 (2016/03/11) CHBOX2は、コードリソースも使用できるように変更。 141 * 142 * @param selectValue 選択肢の値 143 * @param isSLbl 短縮ラベルを使用する [true:使用する/false:しない] 144 * 145 * @return 選択肢のラベル 146 * @see #getValueLabel( String ) 147 */ 148 @Override 149 public String getValueLabel( final String selectValue,final boolean isSLbl ) { 150 // 選択値を、カンマで分解(split)して、Listを作成し、HashSetに渡している。存在チェック用 151 final Set<String> valSet = selectValue == null 152 ? new HashSet<>() 153 : new HashSet<>( Arrays.asList( selectValue.split( "," ) ) ); 154 155 final StringBuilder buf = new StringBuilder( BUFFER_LARGE ); 156 final int size = codeData.getSize(); 157 for( int i=0; i<size; i++ ) { 158 final String value = codeData.getCodeKey(i); 159 if( valSet.contains( value ) ) { 160 buf.append( '■' ); 161 } 162 else { 163 buf.append( '□' ); 164 } 165 166 if( isSLbl ) { buf.append( codeData.getShortLabel(i) ).append( ' ' ); } 167 } 168 return buf.toString(); 169 } 170}