    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 * ●形式：&lt;og:ganttHeader startDate="…" endDate="…" zoom="[…]" /&gt;
    044 * ●body：なし
    045 *
    046 * ●Tag定義：
    047 *   &lt;og:stackHeader
    048 *       startDate          【TAG】表示開始日付けを設定します(yyyyMMdd または、yyyyMMddHHmm 形式)
    049 *       endDate            【TAG】表示最終日を設定します(yyyyMMdd または、yyyyMMddHHmm 形式)
    050 *       zoom               【TAG】ズームを設定します(初期値:DAY)
    051 *       calDB              【TAG】DB検索するＤＢを指定します
    052 *       arg1               【TAG】ＤＢ検索する場合の第１のキーを指定します
    053 *       arg2               【TAG】ＤＢ検索する場合の第２のキーを指定します
    054 *       arg3               【TAG】ＤＢ検索する場合の第３のキーを指定します
    055 *       arg4               【TAG】ＤＢ検索する場合の第４のキーを指定します
    056 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    057 *   /&gt;
    058 *
    059 * ●使用例
    060 *    参照：jsp/GANTT06 フォルダ
    061 *
    062 *     &lt;og:stackHeader
    063 *         startDate = "{&#064;VIEW_DATE}"
    064 *         endDate   = "{&#064;DYMAX}"
    065 *         zoom      = "{&#064;VIEW_ZOOM}"
    066 *         calDB     = "GE13"
    067 *         arg1      = "{&#064;CDJGS}"
    068 *         arg2      = ""
    069 *     /og:stackHeader&gt;
    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) 廃止（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";  // １日の時間範囲(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                //  カレンダ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の３つの設定が可能です。
    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】ＤＢ検索する場合の第１のキーを指定します。
    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】ＤＢ検索する場合の第２のキーを指定します。
    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】ＤＢ検索する場合の第３のキーを指定します。
    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】ＤＢ検索する場合の第４のキーを指定します。
    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}