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}