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