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.hayabusa.common.HybsSystemException; 019import org.opengion.fukurou.util.ToString; // 6.1.1.0 (2015/01/17) 020 021import static org.opengion.fukurou.util.StringUtil.nval; 022 023/** 024 * タブ形式のリンクを表示する場合に、タブそのものを表示するタグです。 025 * 026 * tabLinkタグを親タグとし、listType="TAG"を指定した場合に、このタグを使用して 027 * タブを個別に定義します。 028 * 029 * タグの使用方法については、tabLinkタグのドキュメントを参照して下さい。 030 * 031 * 各属性は、{@XXXX} 変数が使用できます。 032 * これは、ServletRequest から、XXXXをキーに値を取り出し,この変数に割り当てます。 033 * つまり、このXXXXをキーにリクエストすれば、この変数に値をセットすることができます。 034 * 035 * @og.formSample 036 * ●形式:<og:tabLink href="…" > <og:tabList name="TAB1" … /> … </og:tabLink > 037 * ●body:なし 038 * 039 * ●Tag定義: 040 * <og:tabList 041 * name ○【TAG】要素に対して固有の名前をつけます(必須)。 042 * lbl 【TAG】ラベルリソースのラベルIDを指定します 043 * href 【TAG】リンク先のJSPを指定します(初期値:result.jsp) 044 * term 【TAG】処理する条件を指定します(初期値:null) 045 * termList 【TAG】処理する条件を含むような文字列を指定します 046 * delTerm 【TAG】処理しないタブを選択する条件を指定します(初期値:null) 047 * delTermList 【TAG】処理しない条件を含むような文字列を指定します 048 * unselClass 【TAG】非選択タブのクラスを指定します(初期値:unselTab) 049 * keys 【TAG】リンク先のJSPに引数として渡すキーをCSV形式で指定します 050 * vals 【TAG】リンク先のJSPに引数として渡す値をCSV形式で指定します 051 * roles 【TAG】ロールをセットします 052 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 053 * /> 054 * 055 * ●使用例 056 * tabListタグからタブリストを生成する場合 057 * <og:tabLink 058 * listType = "DB" タブの一覧をどこから取得するか 059 * href = "result.jsp" リンク先のJSP 060 * target = "RESULT" リンクターゲット 061 * openTab = "[true/false]" タブ表示後にタブを自動で開く 062 * openTabName = "{@PN} 自動で開くタブの名前 063 * constKeys = "KEY1" 次画面に固定で渡すキー一覧 064 * constVals = "{@VAL1}" 次画面に固定で渡す値一覧 065 * listCount = "10" 1行辺りに表示するタブの数 066 * selClass = "selTab" 選択タブのクラス 067 * unselClass = "unselTab" 非選択タブのクラス 068 * width = "100px" タブリンクの幅 069 * height = "50px" タブリンクの高さ 070 * > 071 * <og:tabList name="TAB1" href="result1.jsp" keys="PN,CDK" vals="ABC,V" /> 072 * <og:tabList name="TAB2" href="result2.jsp" keys="PN,CDK" vals="BCD,W" /> 073 * <og:tabList name="TAB3" href="result3.jsp" keys="PN,CDK" vals="CDE,X" /> 074 * </og:tabLink> 075 * 076 * @og.group 画面表示 077 * 078 * @version 4.3.5.0 (2008/02/01) 079 * @author Nakamura 080 * @since JDK1.4, 081 */ 082public class TabListTag extends CommonTagSupport { 083 /** このプログラムのVERSION文字列を設定します。 {@value} */ 084 private static final String VERSION = "6.4.2.0 (2016/01/29)" ; 085 private static final long serialVersionUID = 642020160129L ; 086 087 private String name ; 088 private String href ; 089 private String unselClass ; 090 091 private String[] keys ; 092 private String[] vals ; 093 094 private String term ; 095 private String termList ; 096 private String delTerm ; 097 private String delTermList ; 098 private boolean visible ; 099 100 /** 101 * デフォルトコンストラクター 102 * 103 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 104 */ 105 public TabListTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 106 107 /** 108 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 109 * 110 * @og.rev 6.3.9.0 (2015/11/06) TabLinkTagの取得タイミングを、#doEndTag() に移す。 111 * 112 * @return 後続処理の指示 113 */ 114 @Override 115 public int doEndTag() { 116 debugPrint(); 117 118 visible = getUser().isAccess( get( "roles" ) ); 119 120 // delTermが優先 121 if( visible ) { 122 visible = delTermList == null || delTerm == null || delTermList.indexOf( delTerm ) < 0 ; 123 } 124 125 // delTermで表示対象となった場合に、termを処理 126 if( visible ) { 127 visible = termList == null || term == null || termList.indexOf( term ) >= 0 ; 128 } 129 130 // 6.3.9.0 (2015/11/06) TabLinkTagの取得タイミングを、#doEndTag() に移す。 131 final TabLinkTag tabLink = (TabLinkTag)findAncestorWithClass( this,TabLinkTag.class ); 132 if( tabLink == null ) { 133 final String errMsg = "tabLink タグの BODY部で使用してください。"; 134 throw new HybsSystemException( errMsg ); 135 } 136 137 tabLink.addTag( href, name, getMsglbl(), unselClass, visible, keys, vals ); 138 139 return EVAL_PAGE ; 140 } 141 142 /** 143 * タグリブオブジェクトをリリースします。 144 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 145 * 146 * @og.rev 6.3.9.0 (2015/11/06) TabLinkTagの取得タイミングを、#doEndTag() に移す。 147 */ 148 @Override 149 protected void release2() { 150 super.release2(); 151 name = null; 152 href = null; 153 term = null; 154 termList = null; 155 delTerm = null; 156 delTermList = null; 157 unselClass = null; 158 keys = null; 159 vals = null; 160 visible = false; 161 } 162 163 /** 164 * 【TAG】要素に対して固有の名前をつけます。 165 * 166 * @og.tag 167 * 要素に対して固有の名前をつけます。 168 * ここで設定された名称は、自動でタブを表示するためのopenTabName属性判定にも使用されます。 169 * 170 * @param nm タブ名 171 */ 172 public void setName( final String nm ) { 173 name = nval( getRequestParameter( nm ), name ); 174 } 175 176 /** 177 * 【TAG】リンク先のJSPを指定します(初期値:result.jsp)。 178 * 179 * @og.tag 180 * リンク先のJSPを指定します。 181 * ここで指定しない場合は、tagLinkタグの値が適用されます。 182 * 183 * @param hr リンク先のJSP 184 */ 185 public void setHref( final String hr ) { 186 href = nval( getRequestParameter( hr ), href ); 187 } 188 189 /** 190 * 【TAG】処理する条件を指定します(初期値:null)。 191 * 192 * @og.tag 193 * termListで与えられた文字列に、term文字列(大文字/小文字の区別あり)が 194 * 含まれていれば、OPEN選択タブとして処理します。 195 * OPEN選択タブでないタブは、初期値OPENにならないだけで、タブそのものは表示されます。 196 * OPEN選択とDELETE選択が競合した場合は、DELETE選択が優先されます。 197 * 初期値は、 null です。 198 * 199 * @param str 処理する条件文字列 200 */ 201 public void setTerm( final String str ) { 202 term = nval( getRequestParameter( str ),term ); 203 } 204 205 /** 206 * 【TAG】処理する条件を含むような文字列を指定します。 207 * 208 * @og.tag 209 * termListで与えられた文字列に、term文字列(大文字/小文字の区別あり)が 210 * 含まれていれば、OPEN選択タブとして処理します。 211 * 例えば、"A","B","C" という文字列が、term で指定された 212 * 場合に処理するようにしたい場合は、"A|B|C" をセットします。 213 * 初期値は、 null です。 214 * 判定は、文字列を含むかどうかなので、1文字のみの場合は、"|"区切りにする 215 * 必要はありません。 216 * OPEN選択とDELETE選択が競合した場合は、DELETE選択が優先されます。 217 * 218 * @param list 処理する条件 (indexOf による含む/含まない判定) 219 */ 220 public void setTermList( final String list ) { 221 termList = nval( getRequestParameter( list ),termList ); 222 } 223 224 /** 225 * 【TAG】処理しないタブを選択する条件を指定します(初期値:null)。 226 * 227 * @og.tag 228 * delTermListで与えられた文字列に、delTerm文字列(大文字/小文字の区別あり)が 229 * 含まれていれば、DELETE選択タブとして処理します。 230 * DELETE選択タブは、タブそのものが表示されません。 231 * ただし、タブのselectIndex は、DELETEされたタブも含めて、カウントされますので、 232 * JSPでの設定時の順番がインデックス番号になります。 233 * OPEN選択とDELETE選択が競合した場合は、DELETE選択が優先されます。 234 * 初期値は、 null です。 235 * 236 * @param str 非表示タブ 237 */ 238 public void setDelTerm( final String str ) { 239 delTerm = nval( getRequestParameter( str ),delTerm ); 240 } 241 242 /** 243 * 【TAG】処理しない条件を含むような文字列を指定します。 244 * 245 * @og.tag 246 * delTermListで与えられた文字列に、delTerm文字列(大文字/小文字の区別あり)が 247 * 含まれていれば、DELETE選択タブとして処理します。 248 * 例えば、"A","B","C" という文字列が、delTerm で指定された 249 * 場合に処理しないようにしたい場合は、"A|B|C" をセットします。 250 * 初期値は、 null です。 251 * 判定は、文字列を含むかどうかなので、1文字のみの場合は、"|"区切りにする 252 * 必要はありません。 253 * OPEN選択とDELETE選択が競合した場合は、DELETE選択が優先されます。 254 * 255 * @param list 非表示タブ条件 (indexOf による含む/含まない判定) 256 */ 257 public void setDelTermList( final String list ) { 258 delTermList = nval( getRequestParameter( list ),delTermList ); 259 } 260 261 /** 262 * 【TAG】非選択タブのクラスを指定します(初期値:unselTab)。 263 * 264 * @og.tag 265 * タブが選択されていない状態にある場合の、タブ部分のクラス名を指定します。 266 * このクラス名を変更する場合は、そのクラスをcustom/custom.css等で再定義して下さい。 267 * tabListタグで指定された値は、tabLinkタグで指定されたものより優先されます。 268 * 初期値は、unselTabです。 269 * 270 * @param cls 選択タブのクラス名 271 */ 272 public void setUnselClass( final String cls ) { 273 unselClass = nval( getRequestParameter( cls ), unselClass ); 274 } 275 276 /** 277 * 【TAG】リンク先のJSPに引数として渡すキーをCSV形式で指定します。 278 * 279 * @og.tag 280 * リンク先のJSPに引数として渡すキーをCSV形式で指定します。 281 * 282 * @param key キー(CSV形式) 283 */ 284 public void setKeys( final String key ) { 285 keys = getCSVParameter( key ); 286 } 287 288 /** 289 * 【TAG】リンク先のJSPに引数として渡す値をCSV形式で指定します。 290 * 291 * @og.tag 292 * リンク先のJSPに引数として渡す値をCSV形式で指定します。 293 * 294 * @param val 値(CSV形式) 295 */ 296 public void setVals( final String val ) { 297 vals = getCSVParameter( val ); 298 } 299 300 /** 301 * 【TAG】ロールをセットします。 302 * 303 * @og.tag 304 * ここで指定したカラムロールを元に、ユーザー毎のアクセス許可がチェックされます。 305 * アクセス許可されないと、表示されません。 306 * このロールを指定しない場合は、カラムリソースのロールが使用されます。 307 * 308 * @param roles パラメータ 309 */ 310 public void setRoles( final String roles ) { 311 set( "roles",getRequestParameter( roles ) ); 312 } 313 314 /** 315 * このオブジェクトの文字列表現を返します。 316 * 基本的にデバッグ目的に使用します。 317 * 318 * @return このクラスの文字列表現 319 * @og.rtnNotNull 320 */ 321 @Override 322 public String toString() { 323 return ToString.title( this.getClass().getName() ) 324 .println( "VERSION" ,VERSION ) 325 .println( "name" ,name ) 326 .println( "href" ,href ) 327 .println( "term" ,term ) 328 .println( "termList" ,termList ) 329 .println( "delTerm" ,delTerm ) 330 .println( "delTermList" ,delTermList) 331 .println( "Other..." ,getAttributes().getAttribute() ) 332 .fixForm().toString() ; 333 } 334}