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