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.hayabusa.html.TableFormatter;
020import org.opengion.hayabusa.html.FormatterType;
021
022import static org.opengion.fukurou.util.StringUtil.nval ;
023
024/**
025 * ヘッダ、フッター、ボディー部のフォーマットを汎用的に定義するタグです。
026 *
027 * thead,tfoot,tbody に代わる表示フォーマットをカスタマイズするときに使用する親クラスです。
028 * このクラス自身がタグとしては表に現れません。
029 *
030 * @og.formSample
031 * ●形式:(タグとしては使われません)
032 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
033 *
034 * @og.rev 3.5.4.0 (2003/11/25) 新規追加
035 * @og.rev 3.5.4.2 (2003/12/15) カスタムタグクラスから削除します。(abstract化)
036 * @og.rev 4.0.0.0 (2006/01/31) カスタムタグクラスに復活させます。(public化)
037 * @og.group 画面部品
038 *
039 * @version  4.0
040 * @author       Kazuhiko Hasegawa
041 * @since    JDK5.0,
042 */
043public class TFormatTag extends CommonTagSupport {
044        //* このプログラムのVERSION文字列を設定します。   {@value} */
045        private static final String VERSION = "5.7.6.3 (2014/05/23)" ;
046
047        private static final long serialVersionUID = 576320140523L ;
048
049        private String rowspan          = "2";
050        private String noClass          = "false";
051        private String usableKey        = null;
052        private String usableList       = "1" ;
053        private String itdBody          = "";                   // 3.5.6.0 (2004/06/18)
054        private String keyBreakClm      = null;                 // 5.7.6.3 (2014/05/23)
055        private boolean useTrCut        = true;                 // 5.5.0.3 (2012/03/13)
056
057        /**
058         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
059         *
060         * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
061         *
062         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
063         */
064        @Override
065        public int doStartTag() {
066                // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
067                if( useTag() ) {
068                        return EVAL_BODY_BUFFERED ;     // Body を評価する。( extends BodyTagSupport 時)
069                }
070                return SKIP_BODY ;                              // Body を評価しない
071        }
072
073        /**
074         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
075         *
076         * @og.rev 3.5.6.0 (2004/06/18) setItdBody メソッドによる itdBody の登録処理追加
077         * @og.rev 5.1.7.0 (2010/06/01) フォーマットの{@XXXX}の値に[が含まれる場合は、サイニタイズ("\\]\\"に変換)する。
078         * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
079         * @og.rev 5.7.6.3 (2014/05/23) useKeyBreak 属性の追加
080         *
081         * @return      後続処理の指示(EVAL_PAGE)
082         */
083        @Override
084        public int doEndTag() {
085                debugPrint();           // 4.0.0 (2005/02/28)
086                // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
087                if( useTag() ) {
088                        ViewFormTag viewform = (ViewFormTag)findAncestorWithClass( this,ViewFormTag.class );
089                        if( viewform == null ) {
090                                String errMsg = "<b>" + getTagName() + "タグは、ViewFormTagの内側(要素)に記述してください。</b>";
091                                throw new HybsSystemException( errMsg );
092                        }
093                        // 5.1.7.0 (2010/06/01) フォーマットの{@XXXX}の値に[が含まれる場合は、サイニタイズ("\\]\\"に変換)する。
094        //              String bodyFormat = getBodyString();
095                        String bodyFormat = getSanitizedBodyString();
096
097                        TableFormatter format = new TableFormatter();
098                        format.setFormatType( getType() );
099                        format.setFormat( bodyFormat, useTrCut );       // 5.5.0.3 (2012/03/13)
100                        format.setRowspan( rowspan );
101                        format.setNoClass( noClass );
102                        format.setUsableKey( usableKey );
103                        format.setUsableList( usableList );
104                        format.setItdBody( itdBody );                           // 3.5.6.0 (2004/06/18)
105                        format.setKeyBreakClm( keyBreakClm );           // 5.7.6.3 (2014/05/23)
106                        viewform.addFormatter( format );
107                }
108                return EVAL_PAGE ;              // ページの残りを評価する。
109        }
110
111        /**
112         * タグリブオブジェクトをリリースします。
113         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
114         *
115         * @og.rev 3.5.6.0 (2004/06/18) itdBody 属性の追加
116         * @og.rev 5.7.6.3 (2014/05/23) useTrCut,useKeyBreak 属性の追加
117         *
118         */
119        @Override
120        protected void release2() {
121                super.release2();
122                rowspan         = "2";
123                noClass         = "false";
124                usableKey       = null;
125                usableList      = "1" ;
126                itdBody         = "";                   // 3.5.6.0 (2004/06/18)
127                useTrCut        = true;                 // 5.7.6.3 (2014/05/23)
128                keyBreakClm     = null;                 // 5.7.6.3 (2014/05/23)
129        }
130
131        /**
132         * 【TAG】表示データを作成する場合のフォーマットの行数(rowspan)をセットします(初期値:2)。
133         *
134         * @og.tag
135         * 表示データを作成する場合のフォーマットの行数をセットします。
136         * 上位の viewFormタグより、こちらが優先されます。
137         *
138         * @param       span フォーマットの行数
139         */
140        public void setRowspan( final String span ) {
141                rowspan = span;
142        }
143
144        /**
145         * 【TAG】カラムのクラス名(VERCHAR2,NUMBER など)を使用するかどうか[true/false]を指定します(初期値:false)。
146         *
147         * @og.tag
148         * "true" で、クラス属性を設定しません。これは、CSSファイルに書かれている属性を
149         * 使用しないことを意味します。
150         * 初期値は、"false" です。
151         *
152         * @param       flag クラス名使用の有無(true:使用しない/false:使用する。)
153         */
154        public void setNoClass( final String flag ) {
155                this.noClass = flag;
156        }
157
158        /**
159         * このフォーマットのタイプを返します。
160         *
161         * タイプは、"head/body/foot" の中から、指定します。
162         *
163         * @og.rev 3.5.5.8 (2004/05/20) abstract します。
164         *
165         * @return      このフォーマットのタイプを返します。
166         */
167        protected FormatterType getType() {
168                String errMsg = "このメソッドは、THead/TBody/TFoot の各サブクラスで実装してください。";
169                throw new UnsupportedOperationException( errMsg );
170        }
171
172        /**
173         * 【TAG】フォーマットの使用可否を判断するキーとなるカラム名を指定します。
174         *
175         * @og.tag
176         * キーが、usableList に含まれる場合は、このフォームを使用できます。
177         * キー(カラム名)が指定されない場合は、常に使用されます。
178         * ※ 現時点では、BODYタイプのみ使用しています。
179         * ※ この属性は、リクエスト変数処理を行いません。
180         *
181         * @param  key フォーマットの使用可否を判断するカラム名
182         */
183        public void setUsableKey( final String key ) {
184                usableKey = key;
185        }
186
187        /**
188         * 【TAG】フォーマットの使用可否を判断する文字列リストを指定します(初期値:"1")。
189         *
190         * @og.tag
191         * キーが、この文字列リスト中に存在する場合は、このフォームを使用できます。
192         * この文字列リストは、固定な文字列です。{&#064;XXXX}は使用できますが、[XXXX]は
193         * 使用できません。
194         * 初期値は、"1" です。
195         * ※ 現時点では、BODYタイプのみ使用しています。
196         *
197         * @param  list フォーマットの使用可否を判断する文字列リスト
198         */
199        public void setUsableList( final String list ) {
200                usableList = nval( getRequestParameter(list),usableList );
201        }
202
203        /**
204         *  itdフォーマット文字列を設定します。
205         *
206         * itd ボディ部の文字列を指定します。
207         * itd ボディは、繰り返し処理を行います。これを、上位のボディ文字列の中の
208         * HYBS_ITD_MARKER 文字列 と置き換えます。
209         * ※ この属性は、リクエスト変数処理を行いません。
210         *
211         * @og.rev 3.5.6.0 (2004/06/18) itdフォーマット文字列の取り込み
212         *
213         * @param  itd itdフォーマットの文字列
214         */
215        public void setItdBody( final String itd ) {
216                if( itd != null ) {
217                        itdBody = itd;
218                }
219        }
220
221        /**
222         * 【TAG】ここで指定したカラムの値が、キーブレイクした場合、このタグを使用します(初期値:null)。
223         *
224         * @og.tag
225         * usableKey,usableList の様に、予め決められた値の時に、適用されるのではなく、
226         * キーブレイクで 使用可否を指定する為の機能です。
227         * この設定値は、usableKey,usableList とは、独立しているため、それぞれで
228         * 有効になれば、使用されると判断されます。
229         * キーブレイク判定では、最初の1件目は、必ず使用されると判断されます。
230         *
231         * @og.rev 5.7.6.3 (2014/05/23) 新規追加
232         *
233         * @param  kclm  キーブレイクをチェックするカラムID
234         */
235        public void setKeyBreakClm( final String kclm ) {
236                keyBreakClm = nval( getRequestParameter( kclm ),keyBreakClm );
237        }
238
239        /**
240         * 【TAG】 先頭trタグを削除するかどうか[true/false]を指定します(初期値:true)。
241         *
242         * @og.tag
243         * フォーマットの先頭がtrタグの場合は削除する処理がありますが、
244         * CustomDataのような場合では削除したくありません。
245         * falseを指定すると削除処理を行わないようになります。
246         *
247         * @og.rev 5.5.0.3 (2012/03/13) 新規追加
248         *
249         * @param  useFlg  情報出力を指定 [true:有効/false:無効]
250         */
251        public void setUseTrCut( final String useFlg ) {
252                useTrCut = nval( getRequestParameter( useFlg ),useTrCut );
253        }
254
255        /**
256         * このオブジェクトの文字列表現を返します。
257         * 基本的にデバッグ目的に使用します。
258         *
259         * @return このクラスの文字列表現
260         */
261        @Override
262        public String toString() {
263                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
264        //                      .println( "VERSION"             ,VERSION        )
265                                .println( "rowspan"             ,rowspan        )
266                                .println( "noClass"             ,noClass        )
267                                .println( "usableKey"   ,usableKey      )
268                                .println( "usableList"  ,usableList     )
269                                .println( "itdBody"             ,itdBody        )
270                                .println( "keyBreakClm" ,keyBreakClm)
271                                .println( "Other..."    ,getAttributes().getAttribute() )
272                                .fixForm().toString() ;
273        }
274}