    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.html.ViewTimeTableParam;
    019
    020import static org.opengion.fukurou.util.StringUtil.nval ;
    021
    022import java.io.ObjectOutputStream;
    023import java.io.ObjectInputStream;
    024import java.io.IOException;
    025
    026/**
    027 * viewタグの viewFormType が HTMLTimeTable の場合にパラメータを設定します。
    028 *
    029 * 時間軸を持つタイムテーブルの表示を行う、ViewForm_HTMLTimeTable クラスに対して、
    030 * 各種パラメータを設定します。
    031 * パラメータが設定されていない場合は、ViewForm_HTMLTimeTable の初期値が使用されます。
    032 * (パラメータを使用するには、viewタグのuseParam 属性をtrueに設定する必要があります。)
    033 *
    034 * SELECT文は、日付、キー、備考、開始時刻、終了時刻、リンクが、必須項目で、この並び順は、
    035 * 完全に固定です。よって、カラム位置を指定する必要はありませんが、SELECT文を自由に
    036 * 設定することも出来ませんので、ご注意ください。
    037 * この固定化に伴い、WRITABLE 指定も使用できません。
    038 * なお、日付、キー、備考 に関しては、columnDisplay 属性で、表示の ON/OFF 制御は可能です。
    039 * また、日付ブレイク、キーブレイクの設定で、カラム自体をテーブルの外に出すことが可能です。
    040 * (キーと備考はセットになっています。)
    041 *
    042 * タイムテーブルが空きの場合のリンクは、ViewTimeTableParam.NULL_LINK_CLM_ID で指定します。
    043 * (ViewTimeTableParam の nullLinkColumn 属性)
    044 * 指定しない場合は、空きのリンクは作成されません。
    045 * このリンクは、特殊で、引数に、パラメータを追加できますが、"($1)"、"($2)" で指定します。
    046 * この($1)、($2)は、開始時刻、終了時刻がセットされますが、SELECT文の固定カラムと同じ
    047 * 並び順ですが、DBTableModelの値を設定しているわけではありません。
    048 * 空きの場合は、データ自体が存在しない場合と、日付、キー のみが 外部結合で生成された
    049 * レコードが実際に存在する場合がありますが、外部結合で生成されたレコードには、
    050 * 開始時刻、終了時刻はありません。($1) と($2)には、それぞれ、最小開始時刻と最大終了時刻を
    051 * セットします。
    052 *
    053 * 例として、&amp;TMSTART=($1)&amp;TMEND=($2) という文字列の ($*) 部分を解析して割当ます。
    054 *
    055 * 各属性は、{&#064;XXXX} 変数が使用できます。
    056 * これは、ServletRequest から、XXXX をキーに値を取り出し,この変数に割り当てます。
    057 * つまり、このXXXXをキーにリクエストすれば、この変数に値をセットすることができます。
    058 *
    059 * http://localhost/query.jsp?KEY1=VLA1&amp;KEY2=VAL2
    060 *
    061 * のようなリクエストで、{&#064;KEY1} とすれば、 VAL1 がセットされます。
    062 *
    063 * @og.formSample
    064 * ●形式：&lt;og:timeTableParam minStartTime="･･･" ･･･ /&gt;
    065 * ●body：なし
    066 *
    067 * ●Tag定義：
    068 *   &lt;og:timeTableParam
    069 *       minStartTime       【TAG】タイムテーブルの開始時刻(含む)をセットします(初期値:0800)
    070 *       maxEndTime         【TAG】タイムテーブルの終了時刻(含まない)をセットします(初期値:2100)
    071 *       timeInterval       【TAG】タイムテーブルのインターバル時間をセットします(初期値:30)
    072 *       nullLinkColumn     【TAG】タイムテーブルが空きの場合のリンクを指定しているカラム名をセットします
    073 *       useDyBreak         【TAG】日付でブレーク処理を行うかどうかを指定します(初期値:true)
    074 *       tdClassColumn      【TAG】タイムテーブルにデータを入れるTDタグにclass属性を付与する場合のカラム名をセットします
    075 *       useBookingMerge    【TAG】同一日付でブッキング時にマージ処理を行うかどうかを指定します(初期値:false)
    076 *   /&gt;
    077 *
    078 * ●使用例
    079 *     ViewFormTag の viewFormType が、HTMLTimeTable の場合に使用します。
    080 *     useParam 属性を設定しておかないと、使用されません。
    081 *     &lt;og:view
    082 *         viewFormType = &quot;HTMLTimeTable&quot;
    083 *         command      = &quot;{&#064;command}&quot;
    084 *         startNo      = &quot;0&quot;
    085 *         pageSize     = &quot;20&quot;
    086 *         <b>useParam     = &quot;true&quot;</b>
    087 *     &gt;
    088 *         &lt;og:timeTableParam
    089 *             minStartTime   = "0800"       : タイムテーブルの開始時刻(含む)をセットします(初期値:0800)
    090 *             maxEndTime     = "2100"       : タイムテーブルの終了時刻(含まない)をセットします(初期値:2100)
    091 *             timeInterval   = "30"         : タイムテーブルのインターバル時間をセットします(初期値:30)
    092 *             nullLinkColumn = "DYUSE"      : NULL時リンクを作成するベースとなるカラム名
    093 *             tdClassColumn  = "FGCDACTION" : データを入れるTDタグにclass属性を付与する場合のカラム名
    094 *         /&gt;
    095 *     &lt;/og:view &gt;
    096 *
    097 * @og.group 画面表示
    098 * @og.rev 5.4.0.0 (2011/10/01) 新規追加
    099 *
    100 * @version  4.0
    101 * @author       Kazuhiko Hasegawa
    102 * @since    JDK5.0,
    103 */
    104public class ViewTimeTableParamTag extends ViewParamTag {
    105        //* このプログラムのVERSION文字列を設定します。   {@value} */
    106        private static final String VERSION = "5.4.4.2 (2012/02/03)" ;
    107
    108        private static final long serialVersionUID = 544220120203L ;
    109
    110        /**
    111         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    112         *
    113         * @return      後続処理の指示
    114         */
    115//      @Override
    116//      public int doStartTag() {
    117//              return ( EVAL_BODY_BUFFERED );          // Body を評価する
    118//      }
    119
    120        /**
    121         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
    122         *
    123         * @return      後続処理の指示(SKIP_BODY)
    124         */
    125//      @Override
    126//      public int doAfterBody() {
    127//
    128//              putParam( ViewTimeTableParam.BODY_LINK_VALUE,
    129//                                nval( getBodyString(),null ) );
    130//
    131//              return ( SKIP_BODY );
    132//      }
    133
    134        /**
    135         * 【TAG】タイムテーブルの開始時刻(含む)をセットします(初期値:0800)。
    136         *
    137         * @og.tag
    138         * 時間軸の書き始めの時刻(自分自身を含む時分４桁)を指定します。
    139         * この時刻は、８:００ なら、"0800" となり、１４:３０ なら、"1430" となります。
    140         * 初期値は、"0800" です。
    141         *
    142         * @param       minStTime タイムテーブルの開始時刻(含む)
    143         */
    144        public void setMinStartTime( final String minStTime ) {
    145                putParam( ViewTimeTableParam.MIN_START_TIME,
    146                                  nval( getRequestParameter( minStTime ),"0800" ) );
    147        }
    148
    149        /**
    150         * 【TAG】タイムテーブルの終了時刻(含まない)をセットします(初期値:2100)。
    151         *
    152         * @og.tag
    153         * 時間軸の最後の時刻(自分自身を含まない時分４桁)を指定します。
    154         * この時刻は、９:００ なら、"0900" となり、１４:３０ なら、"1430" となります。
    155         * 初期値は、"2100" です。
    156         *
    157         * @param       maxEdTime タイムテーブルの終了時刻(含まない)
    158         */
    159        public void setMaxEndTime( final String maxEdTime ) {
    160                putParam( ViewTimeTableParam.MAX_END_TIME,
    161                                  nval( getRequestParameter( maxEdTime ),"2100" ) );
    162        }
    163
    164        /**
    165         * 【TAG】タイムテーブルのインターバル時間をセットします(初期値:30)。
    166         *
    167         * @og.tag
    168         * タイムテーブルのインターバル時間とは、時刻の最終単位の事です。
    169         * この時刻は、"30" なら、３０分となります。
    170         * 初期値は、"30" です。
    171         *
    172         * @og.rev 5.4.3.7 (2012/01/20) 指定方法の変更。分を数字で指定します。
    173         *
    174         * @param       intval タイムテーブルのインターバル時間
    175         */
    176        public void setTimeInterval( final String intval ) {
    177                putParam( ViewTimeTableParam.TIME_INTERVAL,
    178                                  nval( getRequestParameter( intval ),"30" ) );
    179        }
    180
    181        /**
    182         * 【TAG】タイムテーブルが空きの場合のリンクを指定しているカラム名をセットします。
    183         *
    184         * @og.tag
    185         * これは、タイムテーブルが空きの場合のリンクを作成するにあたり、ベースとなるリンクが
    186         * 適用されているカラムを指定します。
    187         * このリンクは、特殊で、引数に、パラメータを追加できますが、($1) 等の記号で指定します。
    188         * この($1)、($2)には、開始時刻、終了時刻がセットされますが、SELECT文の
    189         * 固定カラムと同じ並び順ですが、DBTableModelの値を設定しているわけではありません。
    190         * 空きの場合は、データ自体が存在しない場合がありますが、その場合は、開始時刻、終了時刻は
    191         * ありません。
    192         * その場合は、それぞれ、最小開始時刻と最大終了時刻がセットされます。
    193         *
    194         * &amp;TMSTART=($1)&amp;TMEND=($2) という文字列の ($*) 部分を解析して割当ます。
    195         *
    196         * TMSTARTやTMENDは、リンク作成側で自由に指定できます。
    197         *
    198         * 同様の機能は、BODY部にリンクを指定することも可能です。
    199         * この($1)〜($4)には、開始時刻、終了時刻、日付、キーがセットされます。
    200         *
    201         * 6amp;TMSTART=($1)&amp;TMEND=($2)&amp;DYUSE=($3)&amp;UNITID=($4) という文字列の ($*) 部分を解析して割当ます。
    202         *
    203         * BODY と nullLinkColumn が両方とも指定された場合は、nullLinkColumn の設定が優先されます。
    204         *
    205         * @param       clm nullのデータに適用するリンクを設定したカラム名
    206         */
    207        public void setNullLinkColumn( final String clm ) {
    208                putParam( ViewTimeTableParam.NULL_LINK_CLM_ID,
    209                                  nval( getRequestParameter( clm ),null ) );
    210        }
    211
    212        /**
    213         * 【TAG】タイムテーブルにデータを入れるTDタグにclass属性を付与する場合のカラム名をセットします。
    214         *
    215         * @og.tag
    216         * これは、タイムテーブルのリンクや説明を入れるTDに、class属性を付与する場合のカラム名を
    217         * 指定します。これにより、TD に色を付けたり、表示の条件を外部から指定できます。
    218         * もっとも一般的な想定用途は、タイムテーブルのデータの種別に応じた色分けです。
    219         *
    220         * @og.rev 5.4.3.7 (2012/01/20) 新規追加
    221         *
    222         * @param       clm nullのデータを入れるTDタグにclass属性を付与する場合のカラム名
    223         */
    224        public void setTdClassColumn( final String clm ) {
    225                putParam( ViewTimeTableParam.TD_CLASS_COLUMN_ID,
    226                                  nval( getRequestParameter( clm ),null ) );
    227        }
    228
    229        /**
    230         * 【TAG】ブレーク処理を行うカラムＩＤをCSV形式でセットします(初期値:0030)。
    231         *
    232         * @og.tag
    233         * 指定されたカラムＩＤが、チェンジすると、ブレイク処理を行います。
    234         * これは、ブレイク毎にテーブルが分かれて、テーブルの先頭に、ブレイクした
    235         * 値が表示されます。
    236         * 例えば、日付カラムをブレイクカラムとして設定すると、日付がブレイクするたび、
    237         * 日付をヘッダーに出して、テーブルを作成します。
    238         * ブレークカラムは、CSV形式で複数指定できます。その場合は、複数指定のカラムの
    239         * 合成された値で、キーブレイクの判定を行います。(簡単に言うとＯＲ判定になります。)
    240         * なお、ブレイクカラムを指定した場合は、自動的に、noDisplay 属性にその値をセット
    241         * します。
    242         *
    243         * @param       clms ブレーク処理を行うカラムＩＤ(CSV形式)
    244         */
    245//      public void setBreakClms( final String clms ) {
    246//              putParam( ViewTimeTableParam.BREAK_CLMS,
    247//                                nval( getRequestParameter( clms ),null ) );
    248//      }
    249
    250        /**
    251         * 【TAG】日付でブレーク処理を行うかどうかを指定します(初期値:true)。
    252         *
    253         * @og.tag
    254         * 日付でブレーク処理を行う場合、日付単位にテーブルが分かれます。
    255         * 日付は、テーブルの先頭に、ブレイクした時点で表示されます。
    256         * 日付でブレイクするを指定した場合は、自動的に、noDisplay 属性に日付が
    257         * セットされます。
    258         * 初期値は、true(日付ブレイクする)です。
    259         *
    260         * @param       flag 日付でブレーク処理を行うかどうか(true:日付ブレイクする、false しない)
    261         */
    262        public void setUseDyBreak( final String flag ) {
    263                putParam( ViewTimeTableParam.USE_DY_BREAK,
    264                                  nval( getRequestParameter( flag ),"true" ) );
    265        }
    266
    267        /**
    268         * 【TAG】同一日付でブッキング時にマージ処理を行うかどうかを指定します(初期値:false)。
    269         *
    270         * @og.tag
    271         * 日付、キー(人や施設)で予定時刻が重複している場合の処理方法を指定します。
    272         * 通常(初期値:false)では、ブッキングデータはレコードを分けて表示させます。
    273         * 例えば、人の予定であれば、仮予約や会議招集などのケースで、重複を表示しておき
    274         * 利用者本人に決めさせるというケースが考えられます。
    275         * これを、true に設定すると、予定時刻が重複している場合は、マージして、一つの
    276         * 予定として表現します。
    277         * 初期値は、false(ブッキング時にマージ処理を行わない)です。
    278         *
    279         * @og.rev 5.4.4.2 (2012/02/03) 新規追加
    280         *
    281         * @param       flag 同一日付でブッキング時にマージ処理を行うかどうか(true:行うする、false 行わない)
    282         */
    283        public void setUseBookingMerge( final String flag ) {
    284                putParam( ViewTimeTableParam.USE_BOOKING_MERGE,
    285                                  nval( getRequestParameter( flag ),"true" ) );
    286        }
    287
    288        /**
    289         * タグの名称を、返します。
    290         * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。
    291         *
    292         * @return  タグの名称
    293         */
    294        @Override
    295        protected String getTagName() {
    296                return "timeTableParam" ;
    297        }
    298
    299        /**
    300         * シリアライズ用のカスタムシリアライズ書き込みメソッド
    301         *
    302         * @serialData 一部のオブジェクトは、シリアライズされません。
    303         *
    304         * @param       strm    ObjectOutputStreamオブジェクト
    305         * @throws IOException  入出力エラーが発生した場合
    306         */
    307        private void writeObject( final ObjectOutputStream strm ) throws IOException {
    308                strm.defaultWriteObject();
    309        }
    310
    311        /**
    312         * シリアライズ用のカスタムシリアライズ読み込みメソッド
    313         *
    314         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
    315         *
    316         * @serialData 一部のオブジェクトは、シリアライズされません。
    317         *
    318         * @param       strm    ObjectInputStreamオブジェクト
    319         * @see #release2()
    320         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
    321         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
    322         */
    323        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
    324                strm.defaultReadObject();
    325        }
    326}