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