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.HybsSystem; 019import org.opengion.hayabusa.common.HybsSystemException; 020import org.opengion.hayabusa.html.ViewStackTableParam; 021import org.opengion.hayabusa.resource.CalendarData; 022import org.opengion.hayabusa.resource.CalendarFactory; 023import static org.opengion.fukurou.util.StringUtil.nval ; 024 025import java.util.List; 026import java.util.ArrayList; 027import java.util.Calendar; 028import java.util.Date; 029import java.util.Locale ; 030import java.text.DateFormat; 031import java.text.SimpleDateFormat; 032 033/** 034 * 【廃止】スタックガントチャート用のヘッダー情報(日付け等)を出力するタグです。 035 * 036 * スライドバー式ガントチャートの表示時に、スライドバーの長さと日付とを関連付けるための 037 * ヘッダー情報(日付け等)を出力します。スライドバーと日付間隔は、zoom 属性によって、 038 * CSSファイルのフォントサイズと、JavaScript の内部配列に依存しています。 039 * また、このヘッダーでは、日付の休日情報を、カレンダテーブルを参照することで取得しています。 040 * calDB 属性への指定は、CalendarFactory で生成されるテーブル名(CalendarDataの実装クラス) 041 * を指定します。 042 * 043 * @og.formSample 044 * ●形式:<og:ganttHeader startDate="…" endDate="…" zoom="[…]" /> 045 * ●body:なし 046 * 047 * ●Tag定義: 048 * <og:stackHeader 049 * startDate 【TAG】表示開始日付けを設定します(yyyyMMdd または、yyyyMMddHHmm 形式) 050 * endDate 【TAG】表示最終日を設定します(yyyyMMdd または、yyyyMMddHHmm 形式) 051 * zoom 【TAG】ズームを設定します(初期値:DAY) 052 * calDB 【TAG】DB検索するDBを指定します 053 * arg1 【TAG】DB検索する場合の第1のキーを指定します 054 * arg2 【TAG】DB検索する場合の第2のキーを指定します 055 * arg3 【TAG】DB検索する場合の第3のキーを指定します 056 * arg4 【TAG】DB検索する場合の第4のキーを指定します 057 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 058 * /> 059 * 060 * ●使用例 061 * 参照:jsp/GANTT06 フォルダ 062 * 063 * <og:stackHeader 064 * startDate = "{@VIEW_DATE}" 065 * endDate = "{@DYMAX}" 066 * zoom = "{@VIEW_ZOOM}" 067 * calDB = "GE13" 068 * arg1 = "{@CDJGS}" 069 * arg2 = "" 070 * /og:stackHeader> 071 * 072 * 073 * ●定義・解説 074 * stackedGanttView用のヘッダー作成タグです。 075 * 076 * 表示のタイプ(zoom)は 077 * DAY(日単位)、WEEK(週単位)、MONTH(月単位) 078 * です。 079 * 080 * 081 * ヘッダー部のカレンダに、事業所カレンダを使用することが出来ます。 082 * 使用する場合は、事業所コード( arg1 )属性のセットと、システムパラメータ の 083 * USE_CALENDAR_DATABASE 属性を true に設定しておく必要があります。 084 * このフラグは、事業所カレンダテーブル(GE13)を使用するために必要です。 085 * 086 * zoom="WEEK"(週単位) を使用の週数の計算は、年初の最初の7日間が含まれる週を、第1週と数えます。 087 * 088 * @og.rev 5.5.7.0 (2012/10/01) 新規作成 089 * @og.rev 5.6.1.2 (2013/02/22) 廃止(GanttHeaderTagに統合) 090 * @og.group (廃止)画面部品 091 * 092 * @version 5.0 093 * @author Takahashi Masakazu 094 * @since JDK5.0, 095 */ 096@Deprecated public class StackHeaderTag extends CommonTagSupport { 097 //* このプログラムのVERSION文字列を設定します。 {@value} */ 098 private static final String VERSION = "5.6.1.2 (2013/02/22)" ; 099 100 private static final long serialVersionUID = 561220130222L ; 101 102 private String startDate = null; 103 private String endDate = null; 104 private String zoom = ViewStackTableParam.STACK_ZOOM_DAY; 105 private String daySpan = "0700-2000"; // 1日の時間範囲(HHmm-HHmm) 106 private String calDB = null; // DB検索するDBのキー 107 private String arg1 = null; // DB検索の第1キー(事業所コードなど) 108 private String arg2 = null; // DB検索の第2キー(WCコードなど) 109 private String arg3 = null; // DB検索の第3キー(事業所コードなど) 110 private String arg4 = null; // DB検索の第4キー(WCコードなど) 111 private String calStr = null; // 出勤日・休日のフラグ 112 113 private List<String[]> calList = null; // 5.5.8.3 (2012/11/17) 開始、休日判定、次枠開始 114 115 private static final String BLUE_COLOR = "<span style=\"color:Blue;\">" ; 116 private static final String RED_COLOR = "<span style=\"color:Red;\">" ; 117 private static final String END_SPAN = "</span>" ; 118 private static final String BR = "<br/>" ; 119 120 /** 121 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 122 * 123 * @og.rev 5.5.8.3 (2012/11/17) 枠のListをObjectとしてviewformに渡す。 124 * @og.rev 5.5.9.0 (2012/12/03) ObjectではなくArrayList渡し 125 * 126 * @return 後続処理の指示 127 */ 128 @Override 129 public int doEndTag() { 130 debugPrint(); // 4.0.0 (2005/02/28) 131 if( startDate == null || endDate == null || 132 startDate.length() < 8 || endDate.length() < 8 ) { 133 String errMsg = "開始日と終了日は、どちらも yyyyMMdd 形式で、必須です。" 134 + " startDate=[" + startDate + "] endDate=[" + endDate + "]" ; 135 throw new HybsSystemException( errMsg ); 136 } 137 138 ViewFormTag viewform = (ViewFormTag)findAncestorWithClass( this,ViewFormTag.class ); 139 140 String header = ""; 141 if( ViewStackTableParam.STACK_ZOOM_MONTH.equals(zoom) ) { 142 header = makeZoom( "yy/ " ,"MM " , 1 ,true ) ; 143 } 144 else if( ViewStackTableParam.STACK_ZOOM_WEEK.equals(zoom) ) { // 月曜開始にはしていない 145 header = makeZoom( "ww'W' " ,"MM/dd " ,7 ,false ) ; 146 } 147 else{ 148 header = makeZoom( "MM/ " ,"dd(EE)" , 1 ,false ) ; 149 } 150 151 // 5.5.9.0 (2012/12/03) objectからArrayList 152 // 5.5.8.3 (2012/11/17) 153 viewform.setViewArrayList( calList ); 154 155 jspPrint( header ); 156 jspPrint(makeHeaderData()); 157 return EVAL_PAGE ; 158 } 159 160 /** 161 * タグリブオブジェクトをリリースします。 162 * 163 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 164 * 165 */ 166 @Override 167 protected void release2() { 168 super.release2(); 169 startDate = null; 170 endDate = null; 171 zoom = ViewStackTableParam.STACK_ZOOM_DAY; 172 calDB = null; // DB検索するDBのキー 173 arg1 = null; // DB検索の第1キー(事業所コードなど) 174 arg2 = null; // DB検索の第2キー(WCコードなど) 175 arg3 = null; // DB検索の第3キー 176 arg4 = null; // DB検索の第4キー 177 calStr = null; 178 daySpan = "0700-2000"; // 開始時刻(HHmm-HHmm) 179 calList = null; 180 } 181 182 /** 183 * 上段・下段のフォーマットと、加算日に応じたヘッダー文字列を作成します。 184 * 185 * 186 * @param upper 上段の表示フォーマット 187 * @param lower 下段の表示フォーマット 188 * @param add 表示日付けの加算 189 * @param useMonth 月日表示でなく、月表示のみにする 190 * 191 * @og.rev 5.5.8.3 (2012/11/17) 内部積上げ対応 192 * 193 * @return ヘッダー文字列 194 */ 195 private String makeZoom( final String upper ,final String lower ,final int add, final boolean useMonth ) { 196 DateFormat format1 = new SimpleDateFormat( upper,Locale.JAPAN ); 197 DateFormat format2 = new SimpleDateFormat( lower,Locale.JAPAN ); 198 199 DateFormat formatCal = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN ); 200 201 // 5.5.8.3 (2012/11/17) スタック用にカレンダー枠の情報を保持 202 calList = new ArrayList<String[]>(); 203 String[] calArray = new String[3]; // 開始、休日判定、次枠開始 204 205 Calendar str = HybsSystem.getCalendar( startDate ); 206 Calendar end = HybsSystem.getCalendar( endDate ); 207 208 // 週単位の場合の特殊処理。 209 // 年の第一週を完全な一週間分(7日間)として、設定します。 210 if( ViewStackTableParam.STACK_ZOOM_WEEK.equals( zoom ) ) { 211 str.setMinimalDaysInFirstWeek( 7 ); 212 format1.setCalendar( str ); 213 format2.setCalendar( str ); 214 } 215 216 if( useMonth ){ 217 str.set(Calendar.DAY_OF_MONTH, 1); 218 startDate = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN ).format(str.getTime()); 219 } 220 221 222 StringBuilder buf1 = new StringBuilder( HybsSystem.BUFFER_SMALL ); 223 StringBuilder buf2 = new StringBuilder( HybsSystem.BUFFER_SMALL ); 224 StringBuilder bufcal = new StringBuilder( HybsSystem.BUFFER_SMALL ); 225 226 // カレンダDB検索機能 227 CalendarData calData = CalendarFactory.getCalendarData( calDB,arg1,arg2,arg3,arg4 ); 228 229 boolean modifyFlag = false; 230 while( str.before( end ) ) { 231 Date dt = str.getTime(); 232 calArray[0] = formatCal.format( dt ); // 5.5.8.3 (2012/11/17) 233 234 // 本日は、青色で示します。 235 if( calData.isContainedToday( str,add ) ) { 236 buf1.append( BLUE_COLOR ); 237 buf2.append( BLUE_COLOR ); 238 bufcal.append( "0" ); 239 calArray[1] = "0"; // 5.5.8.3 (2012/11/17) 240 modifyFlag = true; 241 } 242 243 // 休日判断を、事業所カレンダを使用 244 // modifyFlag が立っていない場合 を条件に追加します。 245 if( !modifyFlag && add == 1 && calData.isHoliday( str ) && !useMonth) { 246 buf1.append( RED_COLOR ); 247 buf2.append( RED_COLOR ); 248 bufcal.append( "1" ); // 休日 249 calArray[1] = "1"; // 5.5.8.3 (2012/11/17) 250 modifyFlag = true; 251 } 252 253 buf1.append( format1.format( dt ) ); 254 buf2.append( format2.format( dt ) ); 255 256 if( modifyFlag ) { 257 buf1.append( END_SPAN ); 258 buf2.append( END_SPAN ); 259 modifyFlag = false; 260 } 261 else{ 262 bufcal.append( "0" ); 263 calArray[1] = "0"; // 5.5.8.3 (2012/11/17) 264 } 265 266 // カレンダーを進める 267 if( useMonth ){ 268 str.add(Calendar.MONTH, add); 269 } 270 else{ 271 str.add(Calendar.DATE, add); 272 } 273 274 dt = str.getTime(); 275 calArray[2] = formatCal.format( dt ); // 5.5.8.3 (2012/11/17) 276 calList.add( calArray.clone() ); 277 } 278 calStr = bufcal.toString(); 279 280 return "<pre>" + buf1.toString() + BR + buf2.toString() + "</pre>"; 281 } 282 283 /** 284 * Headerの属性情報をdisplay:noneで作成します。 285 * ganttHeaderというタグで、id,class共にganttHeaderDataという名称で出力します。 286 * (ganttHeaderと同じ形式での出力) 287 * 288 * @og.rev 5.5.4.0 (2012/07/02) 新規作成 289 * 290 * @return ヘッダー情報の文字列 291 */ 292 private String makeHeaderData() { 293 294 StringBuilder buf1 = new StringBuilder( HybsSystem.BUFFER_SMALL ); 295 296 buf1.append( "\n" ) 297 .append( "<ganttHeader style='display:none' id='ganttHeaderData' class='ganttHeaderData' " ) 298 .append( "startDate='" ).append( startDate ).append( "' " ) 299 .append( "endDate='" ).append( endDate ).append( "' " ) 300 .append( "zoom='" ).append( zoom ).append( "' " ) 301 .append( "calDB='" ).append( calStr ).append( "' " ) 302 .append( "daySpan='" ).append( daySpan ).append( "' " ) 303 .append( " />" ); 304 305 return buf1.toString(); 306 } 307 308 /** 309 * 【TAG】表示開始日付けを設定します(yyyyMMdd または、yyyyMMddHHmm 形式)。 310 * 311 * @og.tag 312 * この値は、ヘッダーの先頭に表示する日付けを指定します。 313 * 通常の日付ヘッダーの場合は、 yyyyMMdd 形式ですが、時間ヘッダーの場合は、 314 * yyyyMMddHHmm 形式で指定します。 315 * 316 * @param val 表示開始日付(yyyyMMdd または、yyyyMMddHHmm 形式) 317 */ 318 public void setStartDate( final String val ) { 319 startDate = nval( getRequestParameter( val ),startDate ); 320 } 321 322 /** 323 * 【TAG】表示最終日を設定します(yyyyMMdd または、yyyyMMddHHmm 形式)。 324 * 325 * @og.tag 326 * 表示開始日から終了日までを、zoom 変数の値に応じてヘッダーラベルを 327 * 作成します。 328 * 通常の日付ヘッダーの場合は、 yyyyMMdd 形式ですが、時間ヘッダーの場合は、 329 * yyyyMMddHHmm 形式で指定します。 330 * 331 * @param val 表示最終日(yyyyMMdd または、yyyyMMddHHmm 形式) 332 */ 333 public void setEndDate( final String val ) { 334 endDate = nval( getRequestParameter( val ),endDate ); 335 } 336 337 /** 338 * 【TAG】ズームを設定します(初期値:DAY)。 339 * 340 * @og.tag 341 * CSSファイルでの定義と、背景画像との関係で、作成します。 342 * ズーム変数は、CSSファイルや、JavaScript、PL/SQLと連動して、日付間隔 343 * あたりのピクセルを計算して、ヘッダーを作成しています。 344 * また、現在の標準的なクライアントでの換算になる為、高解像度のディスプレイや 345 * 特殊設定された環境では、表示間隔にずれが発生する可能性があります。 346 * DAY,WEEK,MONTHの3つの設定が可能です。 347 * 348 * 349 * @param val ズーム変数(MONTH,WEEK,DAY) 350 */ 351 public void setZoom( final String val ) { 352 zoom = nval( getRequestParameter( val ),zoom ); 353 } 354 355 /** 356 * 【TAG】DB検索するDBを指定します。 357 * 358 * @og.tag 359 * カレンダデータは、システムパラメータ の CalendarQuery_**** で 360 * 指定する、CalendarQuery クラスの QUERY 文で、実際に取得します。 361 * 上記の **** 部分に、ここで指定するキーワードを設定して置きます。 362 * 通常は、データベースID (GE13, ZY01 など)を指定します。 363 * このキーワードに対する実装クラスを、先のシステムパラメータ の 364 * キーワード以下に記述しておきます。 365 * {@og.doc03Link calDB CalendarQuery_****} 366 * 367 * @param db DB検索するDBを指定 368 */ 369 public void setCalDB( final String db ) { 370 calDB = nval( getRequestParameter( db ),calDB ); 371 } 372 373 /** 374 * 【TAG】DB検索する場合の第1のキーを指定します。 375 * 376 * @og.tag 377 * 例えば、GE13, ZY01 では、事業所コード(CDJGS)を設定します。 378 * この値は、システムパラメータ の CalendarQuery_**** で 379 * 指定する、CalendarQuery クラスの QUERY 文に依存します。 380 * データベース定義の統一を望むところです。 381 * 382 * 383 * @param arg DB検索の第1キー(事業所コードなど) 384 */ 385 public void setArg1( final String arg ) { 386 arg1 = nval( getRequestParameter( arg ),arg1 ); 387 } 388 389 /** 390 * 【TAG】DB検索する場合の第2のキーを指定します。 391 * 392 * @og.tag 393 * 例えば、TP652 では、事業部コード(CDJGS) と 物件工程コード(CDKTEI)の2つの 394 * キーで、カレンダを取得します。(+年月で、行を決定) 395 * 引数が、2つまで対応しています 396 * この値は、システムパラメータ の CalendarQuery_**** で 397 * 指定する、CalendarQuery クラスの QUERY 文に依存します。 398 * データベース定義の統一を望むところです。 399 * 400 * 401 * @param arg DB検索の第2キー(WCコードなど) 402 */ 403 public void setArg2( final String arg ) { 404 arg2 = nval( getRequestParameter( arg ),arg2 ); 405 } 406 407 /** 408 * 【TAG】DB検索する場合の第3のキーを指定します。 409 * 410 * @og.tag 411 * この値は、システムパラメータ の CalendarQuery_**** で 412 * 指定する、CalendarQuery クラスの QUERY 文に依存します。 413 * データベース定義の統一を望むところです。 414 * 415 * 416 * @param arg DB検索の第3キー 417 */ 418 public void setArg3( final String arg ) { 419 arg3 = nval( getRequestParameter( arg ),arg3 ); 420 } 421 422 /** 423 * 【TAG】DB検索する場合の第4のキーを指定します。 424 * 425 * @og.tag 426 * この値は、システムパラメータ の CalendarQuery_**** で 427 * 指定する、CalendarQuery クラスの QUERY 文に依存します。 428 * データベース定義の統一を望むところです。 429 * 430 * 431 * @param arg DB検索の第4キー 432 */ 433 public void setArg4( final String arg ) { 434 arg4 = nval( getRequestParameter( arg ),arg4 ); 435 } 436 437 /** 438 * このオブジェクトの文字列表現を返します。 439 * 基本的にデバッグ目的に使用します。 440 * 441 * @return このクラスの文字列表現 442 */ 443 @Override 444 public String toString() { 445 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 446 .println( "VERSION" ,VERSION ) 447 .println( "startDate" ,startDate ) 448 .println( "endDate" ,endDate ) 449 .println( "zoom" ,zoom ) 450 .println( "calDB" ,calDB ) 451 .println( "arg1" ,arg1 ) 452 .println( "arg2" ,arg2 ) 453 .println( "arg3" ,arg3 ) 454 .println( "arg4" ,arg4 ) 455 .println( "Other..." ,getAttributes().getAttribute() ) 456 .fixForm().toString() ; 457 } 458}