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.resource;
017
018import java.util.Calendar;
019
020/**
021 * カレンダデータインターフェースです。
022 *
023 * カレンダデータは、DBまたは標準のカレンダより休日を求めることができます。
024 *
025 * @og.rev 3.6.0.0 (2004/09/17) 新規作成
026 * @og.group リソース管理
027 *
028 * @version  4.0
029 * @author   Kazuhiko Hasegawa
030 * @since    JDK5.0,
031 */
032public interface CalendarData {
033
034        /**
035         * 指定の日付けが、休日かどうかを返します。
036         * 指定の日付けが、キャッシュしているデータの最大と最小の間に
037         * 存在しない場合は、エラーとします。
038         *
039         * @param       day     指定の日付け
040         *
041         * @return      休日:true それ以外:false
042         *
043         */
044        boolean isHoliday( Calendar day ) ;
045
046        /**
047         * 指定の日付けから、範囲の間に、本日を含むかどうかを返します。
048         * 指定の日付けが、キャッシュしているデータの最大と最小の間に
049         * 存在しない場合は、常に false になります。
050         * 判定は、年月日の項目のみで比較し、時分秒は無視します。
051         *
052         * @og.rev 3.7.1.1 (2005/05/31) 新規追加
053         * @og.rev 8.5.6.1 (2024/03/29) interface にデフォルト実装を書きます。
054         *
055         * @param       day             指定の開始日付け
056         * @param       scope   範囲の日数
057         *
058         * @return      本日:true それ以外:false
059         */
060//      boolean isContainedToday( Calendar day,int scope ) ;
061        default boolean isContainedToday( final Calendar day,final int scope ) {
062                final boolean rtnFlag;
063
064                final Calendar today = Calendar.getInstance();
065                today.set( Calendar.HOUR_OF_DAY ,12 );  // 昼にセット
066                today.set( Calendar.MINUTE ,0 );
067                today.set( Calendar.SECOND ,0 );
068
069                if( scope == 1 ) {
070                        // false の確率の高い方から、比較します。
071                        rtnFlag = day.get( Calendar.DATE )  == today.get( Calendar.DATE  ) &&
072                                                day.get( Calendar.MONTH ) == today.get( Calendar.MONTH ) &&
073                                                day.get( Calendar.YEAR )  == today.get( Calendar.YEAR  ) ;
074                }
075                else {
076                        final Calendar next = (Calendar)day.clone();
077                        next.add( Calendar.DATE,scope );
078                        rtnFlag = day.before( today ) && next.after( today ) ;
079                }
080                return rtnFlag ;
081        }
082
083        /**
084         * 指定の開始、終了日の期間に、平日(稼働日)が何日あるか求めます。
085         * start と end が、リスト範囲外の場合は、エラーとします。
086         * 開始と終了が同じ日の場合は、1を返します。
087         *
088         * @param       start   開始日付け(稼働日に含めます)
089         * @param       end             終了日付け(稼働日に含めます)
090         *
091         * @return      稼働日数
092         *
093         */
094        int getKadoubisu( Calendar start,Calendar end ) ;
095
096        /**
097         * 指定の開始日に平日のみ期間を加算して求められる日付けを返します。
098         * これは、実稼働日計算に使用します。
099         * 例えば、start=20040810 , span=5 で、休日がなければ、10,11,12,13,14 となり、
100         * 20040815 を返します。
101         * 指定の日付けや、期間加算後の日付けが、キャッシュしているデータの
102         * 最大と最小の間に存在しない場合は、エラーとします。
103         *
104         * @og.rev 8.5.6.1 (2024/03/29) interface にデフォルト実装を書きます。
105         *
106         * @param       start   開始日付け(YYYYMMDD 形式)
107         * @param       span    稼動期間
108         *
109         * @return      開始日から稼動期間を加算した日付け(当日を含む)
110         *
111         */
112//      Calendar getAfterDay( Calendar start,int span ) ;
113        default Calendar getAfterDay( final Calendar start,final int span ) {
114                final Calendar tempDay = (Calendar)start.clone();
115                int suSpan = span ;
116                while( suSpan > 0 ) {
117                        if( ! isHoliday( tempDay ) ) { suSpan--; }
118                        tempDay.add(Calendar.DATE, 1);          // 日にちを進める。
119                }
120                return tempDay ;
121        }
122}