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 * 例として、&TMSTART=($1)&TMEND=($2) という文字列の ($*) 部分を解析して割当ます。
054 *
055 * 各属性は、{@XXXX} 変数が使用できます。
056 * これは、ServletRequest から、XXXX をキーに値を取り出し,この変数に割り当てます。
057 * つまり、このXXXXをキーにリクエストすれば、この変数に値をセットすることができます。
058 *
059 * http://localhost/query.jsp?KEY1=VLA1&KEY2=VAL2
060 *
061 * のようなリクエストで、{@KEY1} とすれば、 VAL1 がセットされます。
062 *
063 * @og.formSample
064 * ●形式:<og:timeTableParam minStartTime="・・・" ・・・ />
065 * ●body:なし
066 *
067 * ●Tag定義:
068 *   <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 *   />
077 *
078 * ●使用例
079 *     ViewFormTag の viewFormType が、HTMLTimeTable の場合に使用します。
080 *     useParam 属性を設定しておかないと、使用されません。
081 *     <og:view
082 *         viewFormType = "HTMLTimeTable"
083 *         command      = "{@command}"
084 *         startNo      = "0"
085 *         pageSize     = "20"
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         * 【TAG】タイムテーブルの開始時刻(含む)をセットします(初期値:0800)。
112         *
113         * @og.tag
114         * 時間軸の書き始めの時刻(自分自身を含む時分4桁)を指定します。
115         * この時刻は、8:00 なら、"0800" となり、14:30 なら、"1430" となります。
116         * 初期値は、"0800" です。
117         *
118         * @param       minStTime タイムテーブルの開始時刻(含む)
119         */
120        public void setMinStartTime( final String minStTime ) {
121                putParam( ViewTimeTableParam.MIN_START_TIME,
122                                  nval( getRequestParameter( minStTime ),"0800" ) );
123        }
124
125        /**
126         * 【TAG】タイムテーブルの終了時刻(含まない)をセットします(初期値:2100)。
127         *
128         * @og.tag
129         * 時間軸の最後の時刻(自分自身を含まない時分4桁)を指定します。
130         * この時刻は、9:00 なら、"0900" となり、14:30 なら、"1430" となります。
131         * 初期値は、"2100" です。
132         *
133         * @param       maxEdTime タイムテーブルの終了時刻(含まない)
134         */
135        public void setMaxEndTime( final String maxEdTime ) {
136                putParam( ViewTimeTableParam.MAX_END_TIME,
137                                  nval( getRequestParameter( maxEdTime ),"2100" ) );
138        }
139
140        /**
141         * 【TAG】タイムテーブルのインターバル時間をセットします(初期値:30)。
142         *
143         * @og.tag
144         * タイムテーブルのインターバル時間とは、時刻の最終単位の事です。
145         * この時刻は、"30" なら、30分となります。
146         * 初期値は、"30" です。
147         *
148         * @og.rev 5.4.3.7 (2012/01/20) 指定方法の変更。分を数字で指定します。
149         *
150         * @param       intval タイムテーブルのインターバル時間
151         */
152        public void setTimeInterval( final String intval ) {
153                putParam( ViewTimeTableParam.TIME_INTERVAL,
154                                  nval( getRequestParameter( intval ),"30" ) );
155        }
156
157        /**
158         * 【TAG】タイムテーブルが空きの場合のリンクを指定しているカラム名をセットします。
159         *
160         * @og.tag
161         * これは、タイムテーブルが空きの場合のリンクを作成するにあたり、ベースとなるリンクが
162         * 適用されているカラムを指定します。
163         * このリンクは、特殊で、引数に、パラメータを追加できますが、($1) 等の記号で指定します。
164         * この($1)、($2)には、開始時刻、終了時刻がセットされますが、SELECT文の
165         * 固定カラムと同じ並び順ですが、DBTableModelの値を設定しているわけではありません。
166         * 空きの場合は、データ自体が存在しない場合がありますが、その場合は、開始時刻、終了時刻は
167         * ありません。
168         * その場合は、それぞれ、最小開始時刻と最大終了時刻がセットされます。
169         *
170         * &amp;TMSTART=($1)&amp;TMEND=($2) という文字列の ($*) 部分を解析して割当ます。
171         *
172         * TMSTARTやTMENDは、リンク作成側で自由に指定できます。
173         *
174         * 同様の機能は、BODY部にリンクを指定することも可能です。
175         * この($1)~($4)には、開始時刻、終了時刻、日付、キーがセットされます。
176         *
177         * 6amp;TMSTART=($1)&amp;TMEND=($2)&amp;DYUSE=($3)&amp;UNITID=($4) という文字列の ($*) 部分を解析して割当ます。
178         *
179         * BODY と nullLinkColumn が両方とも指定された場合は、nullLinkColumn の設定が優先されます。
180         *
181         * @param       clm nullのデータに適用するリンクを設定したカラム名
182         */
183        public void setNullLinkColumn( final String clm ) {
184                putParam( ViewTimeTableParam.NULL_LINK_CLM_ID,
185                                  nval( getRequestParameter( clm ),null ) );
186        }
187
188        /**
189         * 【TAG】タイムテーブルにデータを入れるTDタグにclass属性を付与する場合のカラム名をセットします。
190         *
191         * @og.tag
192         * これは、タイムテーブルのリンクや説明を入れるTDに、class属性を付与する場合のカラム名を
193         * 指定します。これにより、TD に色を付けたり、表示の条件を外部から指定できます。
194         * もっとも一般的な想定用途は、タイムテーブルのデータの種別に応じた色分けです。
195         *
196         * @og.rev 5.4.3.7 (2012/01/20) 新規追加
197         *
198         * @param       clm nullのデータを入れるTDタグにclass属性を付与する場合のカラム名
199         */
200        public void setTdClassColumn( final String clm ) {
201                putParam( ViewTimeTableParam.TD_CLASS_COLUMN_ID,
202                                  nval( getRequestParameter( clm ),null ) );
203        }
204
205        /**
206         * 【TAG】日付でブレーク処理を行うかどうかを指定します(初期値:true)。
207         *
208         * @og.tag
209         * 日付でブレーク処理を行う場合、日付単位にテーブルが分かれます。
210         * 日付は、テーブルの先頭に、ブレイクした時点で表示されます。
211         * 日付でブレイクするを指定した場合は、自動的に、noDisplay 属性に日付が
212         * セットされます。
213         * 初期値は、true(日付ブレイクする)です。
214         *
215         * @param       flag 日付でブレーク処理を行うかどうか(true:日付ブレイクする、false しない)
216         */
217        public void setUseDyBreak( final String flag ) {
218                putParam( ViewTimeTableParam.USE_DY_BREAK,
219                                  nval( getRequestParameter( flag ),"true" ) );
220        }
221
222        /**
223         * 【TAG】同一日付でブッキング時にマージ処理を行うかどうかを指定します(初期値:false)。
224         *
225         * @og.tag
226         * 日付、キー(人や施設)で予定時刻が重複している場合の処理方法を指定します。
227         * 通常(初期値:false)では、ブッキングデータはレコードを分けて表示させます。
228         * 例えば、人の予定であれば、仮予約や会議招集などのケースで、重複を表示しておき
229         * 利用者本人に決めさせるというケースが考えられます。
230         * これを、true に設定すると、予定時刻が重複している場合は、マージして、一つの
231         * 予定として表現します。
232         * 初期値は、false(ブッキング時にマージ処理を行わない)です。
233         *
234         * @og.rev 5.4.4.2 (2012/02/03) 新規追加
235         *
236         * @param       flag 同一日付でブッキング時にマージ処理を行うかどうか(true:行うする、false 行わない)
237         */
238        public void setUseBookingMerge( final String flag ) {
239                putParam( ViewTimeTableParam.USE_BOOKING_MERGE,
240                                  nval( getRequestParameter( flag ),"true" ) );
241        }
242
243        /**
244         * タグの名称を、返します。
245         * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。
246         *
247         * @return  タグの名称
248         */
249        @Override
250        protected String getTagName() {
251                return "timeTableParam" ;
252        }
253
254        /**
255         * シリアライズ用のカスタムシリアライズ書き込みメソッド
256         *
257         * @serialData 一部のオブジェクトは、シリアライズされません。
258         *
259         * @param       strm    ObjectOutputStreamオブジェクト
260         * @throws IOException  入出力エラーが発生した場合
261         */
262        private void writeObject( final ObjectOutputStream strm ) throws IOException {
263                strm.defaultWriteObject();
264        }
265
266        /**
267         * シリアライズ用のカスタムシリアライズ読み込みメソッド
268         *
269         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
270         *
271         * @serialData 一部のオブジェクトは、シリアライズされません。
272         *
273         * @param       strm    ObjectInputStreamオブジェクト
274         * @see #release2()
275         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
276         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
277         */
278        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
279                strm.defaultReadObject();
280        }
281}