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 = "true"</b> 087 * > 088 * <og:timeTableParam 089 * minStartTime = "0800" : タイムテーブルの開始時刻(含む)をセットします(初期値:0800) 090 * maxEndTime = "2100" : タイムテーブルの終了時刻(含まない)をセットします(初期値:2100) 091 * timeInterval = "30" : タイムテーブルのインターバル時間をセットします(初期値:30) 092 * nullLinkColumn = "DYUSE" : NULL時リンクを作成するベースとなるカラム名 093 * tdClassColumn = "FGCDACTION" : データを入れるTDタグにclass属性を付与する場合のカラム名 094 * /> 095 * </og:view > 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 * &TMSTART=($1)&TMEND=($2) という文字列の ($*) 部分を解析して割当ます。 195 * 196 * TMSTARTやTMENDは、リンク作成側で自由に指定できます。 197 * 198 * 同様の機能は、BODY部にリンクを指定することも可能です。 199 * この($1)〜($4)には、開始時刻、終了時刻、日付、キーがセットされます。 200 * 201 * 6amp;TMSTART=($1)&TMEND=($2)&DYUSE=($3)&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}