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 */
016 package org.opengion.hayabusa.taglib;
017
018 import org.opengion.hayabusa.common.HybsSystem;
019 import org.opengion.hayabusa.common.HybsSystemException;
020 import org.opengion.hayabusa.html.ViewStackTableParam;
021 import org.opengion.hayabusa.resource.CalendarData;
022 import org.opengion.hayabusa.resource.CalendarFactory;
023 import static org.opengion.fukurou.util.StringUtil.nval ;
024
025 import java.util.ArrayList;
026 import java.util.Calendar;
027 import java.util.Date;
028 import java.util.Locale ;
029 import java.text.DateFormat;
030 import java.text.SimpleDateFormat;
031
032 /**
033 * 【å»?¢】スタãƒ?‚¯ガントチャート用のヘッãƒ??æƒ??(日付けç?をå?力するタグですã?
034 *
035 * スライドバー式ガントチャートã?表示時に、スライドバーの長さと日付とを関連付けるためã?
036 * ヘッãƒ??æƒ??(日付けç?をå?力しますã?スライドバーと日付間隔ã?、zoom 属æ?によってã€?
037 * CSSファイルのフォントサイズと、JavaScript のå†?ƒ¨配å?に依存してã�?�¾すã?
038 * またã?こã?ヘッãƒ??では、日付ã?休日æƒ??をã?カレンãƒ?ƒ†ーブルを参照することで取得してã�?�¾すã?
039 * calDB 属æ?へのæŒ?®šã?、CalendarFactory で生æ?されるテーブルå�?CalendarDataの実è£?‚¯ラス)
040 * を指定しますã?
041 *
042 * @og.formSample
043 * ●形式ï¼?lt;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検索する?¤?¢を指定しまã�?
052 * arg1 【TAG】D?¢検索する場合ã?第?‘ã?キーを指定しまã�?
053 * arg2 【TAG】D?¢検索する場合ã?第?’ã?キーを指定しまã�?
054 * arg3 【TAG】D?¢検索する場合ã?第?“ã?キーを指定しまã�?
055 * arg4 【TAG】D?¢検索する場合ã?第?”ã?キーを指定しまã�?
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"(週単ä½? を使用の週数の計算ã?、年初ã?æœ??の?—日間が含まれる週をã?第?‘é?と数えますã?
086 *
087 * @og.rev 5.5.7.0 (2012/10/01) 新規作æ?
088 * @og.rev 5.6.1.2 (2013/02/22) å»?¢??anttHeaderTagに統合ï¼?
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"; // ?‘日の時間ç¯?›²(HHmm-HHmm)
105 private String calDB = null; // DB検索する?¤?¢のキー
106 private String arg1 = null; // DB検索の第?‘キー(事業æ‰?‚³ードなど)
107 private String arg2 = null; // DB検索の第?’キー(?·?£コードなど)
108 private String arg3 = null; // DB検索の第?“キー(事業æ‰?‚³ードなど)
109 private String arg4 = null; // DB検索の第?”キー(?·?£コードなど)
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検索する?¤?¢のキー
178 arg1 = null; // DB検索の第?‘キー(事業æ‰?‚³ードなど)
179 arg2 = null; // DB検索の第?’キー(?·?£コードなど)
180 arg3 = null; // DB検索の第?“キー
181 arg4 = null; // DB検索の第?”キー
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 // 年の第ä¸??を完å?なä¸??間å?(?—日é–?として、設定しますã?
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 // カレンãƒ?B検索機è?
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 * ??anttHeaderと同じ形式での出力ï¼?
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の?“つの設定が可能ですã?
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検索する?¤?¢を指定しますã?
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検索する?¤?¢を指å®?
373 */
374 public void setCalDB( final String db ) {
375 calDB = nval( getRequestParameter( db ),calDB );
376 }
377
378 /**
379 * 【TAG】D?¢検索する場合ã?第?‘ã?キーを指定しますã?
380 *
381 * @og.tag
382 * 例えば、GE13, ZY01 では、事業æ‰?‚³ーãƒ?CDJGS)を設定しますã?
383 * こã?値は、シスãƒ?ƒ パラメータ の CalendarQuery_**** で
384 * æŒ?®šするã?CalendarQuery クラスの QUERY æ–?�«依存しますã?
385 * ãƒ??タベã?ス定義の統ä¸?‚’望ã?ところですã?
386 *
387 *
388 * @param arg DB検索の第?‘キー(事業æ‰?‚³ードなど)
389 */
390 public void setArg1( final String arg ) {
391 arg1 = nval( getRequestParameter( arg ),arg1 );
392 }
393
394 /**
395 * 【TAG】D?¢検索する場合ã?第?’ã?キーを指定しますã?
396 *
397 * @og.tag
398 * 例えば、TP652 では、事業部コーãƒ?CDJGS) と 物件工程コーãƒ?CDKTEI)の?’つの
399 * キーで、カレンãƒ?‚’取得しますã?(?‹年月で、行を決å®?
400 * 引数がã??’つまで対応してã�?�¾ã�?
401 * こã?値は、シスãƒ?ƒ パラメータ の CalendarQuery_**** で
402 * æŒ?®šするã?CalendarQuery クラスの QUERY æ–?�«依存しますã?
403 * ãƒ??タベã?ス定義の統ä¸?‚’望ã?ところですã?
404 *
405 *
406 * @param arg DB検索の第?’キー(?·?£コードなど)
407 */
408 public void setArg2( final String arg ) {
409 arg2 = nval( getRequestParameter( arg ),arg2 );
410 }
411
412 /**
413 * 【TAG】D?¢検索する場合ã?第?“ã?キーを指定しますã?
414 *
415 * @og.tag
416 * こã?値は、シスãƒ?ƒ パラメータ の CalendarQuery_**** で
417 * æŒ?®šするã?CalendarQuery クラスの QUERY æ–?�«依存しますã?
418 * ãƒ??タベã?ス定義の統ä¸?‚’望ã?ところですã?
419 *
420 *
421 * @param arg DB検索の第?“キー
422 */
423 public void setArg3( final String arg ) {
424 arg3 = nval( getRequestParameter( arg ),arg3 );
425 }
426
427 /**
428 * 【TAG】D?¢検索する場合ã?第?”ã?キーを指定しますã?
429 *
430 * @og.tag
431 * こã?値は、シスãƒ?ƒ パラメータ の CalendarQuery_**** で
432 * æŒ?®šするã?CalendarQuery クラスの QUERY æ–?�«依存しますã?
433 * ãƒ??タベã?ス定義の統ä¸?‚’望ã?ところですã?
434 *
435 *
436 * @param arg DB検索の第?”キー
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 }