    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を評価し、{&#064;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) フォーマットの{&#064;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" で、クラス属性を設定しません。これは、ＣＳＳファイルに書かれている属性を
    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}