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.taglib; 017 018import org.opengion.fukurou.util.XHTMLTag; 019import org.opengion.fukurou.util.ToString; // 6.1.1.0 (2015/01/17) 020 021import static org.opengion.fukurou.util.StringUtil.nval ; 022 023import java.util.stream.Stream; // 6.4.3.4 (2016/03/11) 024import java.util.stream.Collectors; // 6.4.3.4 (2016/03/11) 025 026/** 027 * ラジオボタンで表示順(Order By 句)を指定するタグです。 028 * 029 * name 属性値は、 "ORDER_BY" 固定です。 030 * columns 属性は、CSV形式のカラム属性を設定します。 031 * ロケールは、ユーザー情報の lang 属性を初期値で使用し、 セットされていない場合は、 032 * リクエスト情報のロケールから取得します。 033 * 034 * @og.formSample 035 * ●形式:<og:orderBy columns="…" /> 036 * ●body:なし 037 * 038 * ●Tag定義: 039 * <og:orderBy 040 * columns ○【TAG】表示順対象のカラムをCSV形式で複数指定します(必須)。 041 * checked 【TAG】初めからチェックされた状態(checked)で表示します(初期値:null) 042 * lbls 【TAG】ラベルをCSV形式で複数指定します 043 * checkedValue 【TAG】初めからチェックされた状態にする値を指定します(初期値:null) 044 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 045 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 046 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 047 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 048 * caseIf 【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない) 049 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 050 * /> 051 * 052 * ●使用例 053 * <og:orderBy columns="PN,YOBI" checked="checked" /> 054 * <og:orderBy columns="YOBI,PN" /> 055 * <og:orderBy columns="MKNM,YOBI" /> 056 * 057 * @og.rev 3.1.4.0 (2003/04/18) 継承元を、CommonTagSupport に変更。 058 * @og.group 画面部品 059 * 060 * @version 4.0 061 * @author Kazuhiko Hasegawa 062 * @since JDK5.0, 063 */ 064public class OrderByTag extends CommonTagSupport { 065 /** このプログラムのVERSION文字列を設定します。 {@value} */ 066 private static final String VERSION = "7.0.1.2 (2018/11/04)" ; 067 private static final long serialVersionUID = 701220181104L ; 068 069 private String columns ; 070 private String labels ; 071 private String checked ; 072 private String checkedValue ; 073 074 /** 075 * デフォルトコンストラクター 076 * 077 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 078 */ 079 public OrderByTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 080 081 /** 082 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 083 * 084 * @og.rev 3.1.4.1 (2003/04/21) HTMLTagSupport の継承を廃止した為、doEndTag() を追加。 085 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 086 * 087 * @return 後続処理の指示 088 */ 089 @Override 090 public int doEndTag() { 091 debugPrint(); // 4.0.0 (2005/02/28) 092 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 093 if( useTag() ) { 094 jspPrint( makeTag() ); 095 } 096 return EVAL_PAGE ; 097 } 098 099 /** 100 * タグリブオブジェクトをリリースします。 101 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 102 * 103 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加 104 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 105 * 106 */ 107 @Override 108 protected void release2() { 109 super.release2(); 110 columns = null; 111 labels = null; 112 checked = null; 113 checkedValue = null; 114 } 115 116 /** 117 * 検索条件の入力用のテキストフィールドを作成します。 118 * 119 * テーブルタグによりフィールドは分割されます。 120 * 使用時は、テーブルタグを前後に使用して下さい。 121 * 122 * @og.rev 3.1.1.0 (2003/03/28) radio ボタン等で、ラベルをクリックしても値をセットできるようにする。 123 * @og.rev 7.0.1.2 (2018/11/04) StringBuilder で、若干の見直し 124 * 125 * @return 入力用のテキストフィールドタグ 126 * @og.rtnNotNull 127 */ 128 protected String makeTag() { 129 set( "type","radio" ); 130 set( "name","ORDER_BY" ); 131 set( "value",columns ); 132 if( labels == null ) { setLbls( columns ); } 133 final String lbls = getMsglbl(); 134 135 if( checkedValue != null && checkedValue.length() > 0 ) { 136 if( checkedValue.equals( columns ) ) { 137 set( "checked","checked" ); 138 } 139 } 140 else { 141 set( "checked",checked ); 142 } 143 144 // 7.0.1.2 (2018/11/04) 145// if( get( "id" ) == null ) { set( "id",TaglibUtil.getTagId() ); } 146 final String id = nval( get( "id" ),TaglibUtil.getTagId() ); 147 148 // 7.0.1.2 (2018/11/04) StringBuilder で、若干の見直し 149 return new StringBuilder( BUFFER_MIDDLE ) 150 .append( "<td>" ).append( XHTMLTag.input( getAttributes() ) ) 151 .append( "</td><td><label for=\"" ).append( id ).append( "\">" ) 152 .append( lbls ) 153 .append( "</label></td>" ).toString() ; 154 155// final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ) 156// .append( "<td>" ) 157// .append( XHTMLTag.input( getAttributes() ) ) 158// .append( "</td>" ) 159// .append( "<td>" ) 160// .append( "<label for=\"" ) 161// .append( get( "id" ) ) 162// .append( "\">" ) 163// .append( lbls ) 164// .append( "</label>" ) 165// .append( "</td>" ); 166// 167// return rtn.toString() ; 168 } 169 170 /** 171 * 【TAG】表示順対象のカラムをCSV形式で複数指定します。 172 * 173 * @og.tag 表示順対象のカラムを指定します。 174 * 175 * @param columns カラム(CSV形式) 176 */ 177 public void setColumns( final String columns ) { 178 this.columns = getRequestParameter( columns ); 179 } 180 181 /** 182 * 【TAG】初めからチェックされた状態(checked)で表示します(初期値:null)。 183 * 184 * @og.tag 185 * check 値が "checked" の場合のみ、実行されます。 186 * 187 * @param ch チェック指定 [checked:チェックされた状態で表示/その他:なにもしない] 188 */ 189 public void setChecked( final String ch ) { 190 checked = getRequestParameter( ch ); 191 if( "checked".equals( checked )) { 192 checked = "checked"; 193 } 194 else { 195 checked = null; 196 } 197 } 198 199 /** 200 * 【TAG】初めからチェックされた状態にする値を指定します(初期値:null)。 201 * 202 * @og.tag 203 * チェックバリューが、自分自身のカラム名と同じであれば、チェックがつきます。 204 * 通常、checkedValue = "{@ORDER_BY}" で、自動的にチェックされます。 205 * 206 * @param ch チェックされた状態にする値 207 */ 208 public void setCheckedValue( final String ch ) { 209 checkedValue = nval( getRequestParameter( ch ),checkedValue ); 210 } 211 212 /** 213 * 【TAG】ラベルをCSV形式で複数指定します。 214 * 215 * @og.tag 216 * ラベル(複数)を変更するときに、lbls属性を使います。 217 * 218 * シングルラベルの lbl 属性との違いは、ここではラベルを複数 CSV形式で 219 * 渡すことが可能であることです。これにより、"A,B,C" という値に対して、 220 * "Aのラベル表示,Bのラベル表示,Cのラベル表示" という具合に文字列を 221 * 再合成します。 222 * これは、SQL文のOrder By 句で、ソート順を指定する場合などに便利です。 223 * 224 * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得 225 * @og.rev 5.2.2.0 (2010/11/01) setMsglbl 廃止 ⇒ setLbl に置換え 226 * @og.rev 6.4.3.4 (2016/03/11) CSV形式の文字連結を、stream 経由で行います。 227 * 228 * @param lbls 複数ラベルID(CSV形式) 229 */ 230 public void setLbls( final String lbls ) { 231 labels = getRequestParameter( lbls ) ; 232 233 final String[] array = getCSVParameter( lbls ); 234 235 final String lblCSV = Stream.of( array ) 236 .map( lbl -> getLabel( lbl ) ) 237 .collect( Collectors.joining( "," ) ); 238 239 setLbl( lblCSV ); // 5.2.2.0 (2010/11/01) setMsglbl 廃止 ⇒ setLbl に置換え 240 } 241 242 /** 243 * このオブジェクトの文字列表現を返します。 244 * 基本的にデバッグ目的に使用します。 245 * 246 * @return このクラスの文字列表現 247 * @og.rtnNotNull 248 */ 249 @Override 250 public String toString() { 251 return ToString.title( this.getClass().getName() ) 252 .println( "VERSION" ,VERSION ) 253 .println( "columns" ,columns ) 254 .println( "labels" ,labels ) 255 .println( "checked" ,checked ) 256 .println( "checkedValue" ,checkedValue ) 257 .println( "Other..." ,getAttributes().getAttribute() ) 258 .fixForm().toString() ; 259 } 260}