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}