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 = "6.4.3.4 (2016/03/11)" ; 067 private static final long serialVersionUID = 643420160311L ; 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 * 124 * @return 入力用のテキストフィールドタグ 125 * @og.rtnNotNull 126 */ 127 protected String makeTag() { 128 set( "type","radio" ); 129 set( "name","ORDER_BY" ); 130 set( "value",columns ); 131 if( labels == null ) { setLbls( columns ); } 132 final String lbls = getMsglbl(); 133 134 if( checkedValue != null && checkedValue.length() > 0 ) { 135 if( checkedValue.equals( columns ) ) { 136 set( "checked","checked" ); 137 } 138 } 139 else { 140 set( "checked",checked ); 141 } 142 143 if( get( "id" ) == null ) { set( "id",TaglibUtil.getTagId() ); } 144 145 final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ) 146 .append( "<td>" ) 147 .append( XHTMLTag.input( getAttributes() ) ) 148 .append( "</td>" ) 149 .append( "<td>" ) 150 .append( "<label for=\"" ) 151 .append( get( "id" ) ) 152 .append( "\">" ) 153 .append( lbls ) 154 .append( "</label>" ) 155 .append( "</td>" ); 156 157 return rtn.toString() ; 158 } 159 160 /** 161 * 【TAG】表示順対象のカラムをCSV形式で複数指定します。 162 * 163 * @og.tag 表示順対象のカラムを指定します。 164 * 165 * @param columns カラム(CSV形式) 166 */ 167 public void setColumns( final String columns ) { 168 this.columns = getRequestParameter( columns ); 169 } 170 171 /** 172 * 【TAG】初めからチェックされた状態(checked)で表示します(初期値:null)。 173 * 174 * @og.tag 175 * check 値が "checked" の場合のみ、実行されます。 176 * 177 * @param ch チェック指定 [checked:チェックされた状態で表示/その他:なにもしない] 178 */ 179 public void setChecked( final String ch ) { 180 checked = getRequestParameter( ch ); 181 if( "checked".equals( checked )) { 182 checked = "checked"; 183 } 184 else { 185 checked = null; 186 } 187 } 188 189 /** 190 * 【TAG】初めからチェックされた状態にする値を指定します(初期値:null)。 191 * 192 * @og.tag 193 * チェックバリューが、自分自身のカラム名と同じであれば、チェックがつきます。 194 * 通常、checkedValue = "{@ORDER_BY}" で、自動的にチェックされます。 195 * 196 * @param ch チェックされた状態にする値 197 */ 198 public void setCheckedValue( final String ch ) { 199 checkedValue = nval( getRequestParameter( ch ),checkedValue ); 200 } 201 202 /** 203 * 【TAG】ラベルをCSV形式で複数指定します。 204 * 205 * @og.tag 206 * ラベル(複数)を変更するときに、lbls属性を使います。 207 * 208 * シングルラベルの lbl 属性との違いは,ここではラベルを複数 CSV形式で 209 * 渡すことが可能であることです。これにより、"A,B,C" という値に対して、 210 * "Aのラベル表示,Bのラベル表示,Cのラベル表示" という具合に文字列を 211 * 再合成します。 212 * これは、SQL文のOrder By 句で、ソート順を指定する場合などに便利です。 213 * 214 * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得 215 * @og.rev 5.2.2.0 (2010/11/01) setMsglbl 廃止 ⇒ setLbl に置換え 216 * @og.rev 6.4.3.4 (2016/03/11) CSV形式の文字連結を、stream 経由で行います。 217 * 218 * @param lbls 複数ラベルID(CSV形式) 219 */ 220 public void setLbls( final String lbls ) { 221 labels = getRequestParameter( lbls ) ; 222 223 final String[] array = getCSVParameter( lbls ); 224 225 final String lblCSV = Stream.of( array ) 226 .map( lbl -> getLabel( lbl ) ) 227 .collect( Collectors.joining( "," ) ); 228 229 setLbl( lblCSV ); // 5.2.2.0 (2010/11/01) setMsglbl 廃止 ⇒ setLbl に置換え 230 231 } 232 233 /** 234 * このオブジェクトの文字列表現を返します。 235 * 基本的にデバッグ目的に使用します。 236 * 237 * @return このクラスの文字列表現 238 * @og.rtnNotNull 239 */ 240 @Override 241 public String toString() { 242 return ToString.title( this.getClass().getName() ) 243 .println( "VERSION" ,VERSION ) 244 .println( "columns" ,columns ) 245 .println( "labels" ,labels ) 246 .println( "checked" ,checked ) 247 .println( "checkedValue" ,checkedValue ) 248 .println( "Other..." ,getAttributes().getAttribute() ) 249 .fixForm().toString() ; 250 } 251}