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    }