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    }