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         * 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         * 時間軸の書き始めの時刻(自分自身を含む時分4桁)を指定します。
139         * この時刻は、8:00 なら、"0800" となり、14:30 なら、"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         * 時間軸の最後の時刻(自分自身を含まない時分4桁)を指定します。
154         * この時刻は、9:00 なら、"0900" となり、14:30 なら、"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" なら、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】ブレーク処理を行うカラムIDをCSV形式でセットします(初期値:0030)。
231         *
232         * @og.tag
233         * 指定されたカラムIDが、チェンジすると、ブレイク処理を行います。
234         * これは、ブレイク毎にテーブルが分かれて、テーブルの先頭に、ブレイクした
235         * 値が表示されます。
236         * 例えば、日付カラムをブレイクカラムとして設定すると、日付がブレイクするたび、
237         * 日付をヘッダーに出して、テーブルを作成します。
238         * ブレークカラムは、CSV形式で複数指定できます。その場合は、複数指定のカラムの
239         * 合成された値で、キーブレイクの判定を行います。(簡単に言うとOR判定になります。)
240         * なお、ブレイクカラムを指定した場合は、自動的に、noDisplay 属性にその値をセット
241         * します。
242         *
243         * @param       clms ブレーク処理を行うカラムID(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}