kr.debop4j.timeperiod.timerange.WeekTimeRange.java Source code

Java tutorial

Introduction

Here is the source code for kr.debop4j.timeperiod.timerange.WeekTimeRange.java

Source

/*
 * Copyright 2011-2013 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package kr.debop4j.timeperiod.timerange;

import com.google.common.collect.Lists;
import kr.debop4j.core.Guard;
import kr.debop4j.core.tools.HashTool;
import kr.debop4j.timeperiod.*;
import kr.debop4j.timeperiod.tools.Durations;
import kr.debop4j.timeperiod.tools.TimeSpec;
import kr.debop4j.timeperiod.tools.Times;
import kr.debop4j.timeperiod.tools.Weeks;
import lombok.Getter;
import org.joda.time.DateTime;

import java.util.List;

/**
 * kr.debop4j.timeperiod.timerange.WeekTimeRange
 *
 * @author ? sunghyouk.bae@gmail.com
 * @since 13. 5. 13.  2:29
 */
public abstract class WeekTimeRange extends CalendarTimeRange {

    private static final long serialVersionUID = -1899389597363540458L;

    /**
     * Instantiates a new Week time range.
     *
     * @param period       the period
     * @param timeCalendar the time calendar
     */
    protected WeekTimeRange(ITimePeriod period, ITimeCalendar timeCalendar) {
        super(getPeriodOf(period.getStart(), 1, timeCalendar), timeCalendar);

        YearAndWeek yw = Weeks.getYearAndWeek(period.getStart(), timeCalendar);
        this.year = yw.getYear();
        this.startWeekOfYear = yw.getWeekOfYear();
        this.weekCount = 1;
    }

    /**
     * Instantiates a new Week time range.
     *
     * @param moment       the moment
     * @param weekCount    the week count
     * @param timeCalendar the time calendar
     */
    protected WeekTimeRange(DateTime moment, int weekCount, ITimeCalendar timeCalendar) {
        super(getPeriodOf(moment, weekCount, timeCalendar), timeCalendar);

        YearAndWeek yw = Weeks.getYearAndWeek(moment, timeCalendar);
        this.year = yw.getYear();
        this.startWeekOfYear = yw.getWeekOfYear();
        this.weekCount = weekCount;
    }

    /**
     * Instantiates a new Week time range.
     *
     * @param year       the year
     * @param weekOfYear the week of year
     * @param weekCount  the week count
     */
    protected WeekTimeRange(int year, int weekOfYear, int weekCount) {
        this(year, weekOfYear, weekCount, new TimeCalendar());
    }

    /**
     * Instantiates a new Week time range.
     *
     * @param year         the year
     * @param weekOfYear   the week of year
     * @param weekCount    the week count
     * @param timeCalendar the time calendar
     */
    protected WeekTimeRange(int year, int weekOfYear, int weekCount, ITimeCalendar timeCalendar) {
        super(getPeriodOf(year, weekOfYear, weekCount, timeCalendar), timeCalendar);
        Guard.shouldBePositiveNumber(weekCount, "weekCount");

        this.year = year;
        this.startWeekOfYear = weekOfYear;
        this.weekCount = weekCount;
    }

    @Getter
    private final int year;
    @Getter
    private final int startWeekOfYear;
    @Getter
    private final int weekCount;

    /**
     * Gets end week of year.
     *
     * @return the end week of year
     */
    public int getEndWeekOfYear() {
        return startWeekOfYear + weekCount - 1;
    }

    /**
     * Gets days.
     *
     * @return the days
     */
    public List<DayRange> getDays() {
        DateTime startDay = getStartDayStart();
        int dayCount = weekCount * TimeSpec.DaysPerWeek;

        List<DayRange> days = Lists.newArrayListWithCapacity(dayCount);
        for (int d = 0; d < dayCount; d++) {
            days.add(new DayRange(startDay.plusDays(d), getTimeCalendar()));
        }
        return days;
    }

    @Override
    public int hashCode() {
        return HashTool.compute(super.hashCode(), year, startWeekOfYear, weekCount);
    }

    //    @Override
    //    protected Objects.ToStringHelper buildStringHelper() {
    //        return super.buildStringHelper()
    //                .add("year", year)
    //                .add("startWeekOfYear", startWeekOfYear)
    //                .add("weekCount", weekCount);
    //    }

    private static TimeRange getPeriodOf(DateTime moment, int weekCount, ITimeCalendar timeCalendar) {
        assert weekCount > 0;
        DateTime startOfWeek = Times.startTimeOfWeek(moment, timeCalendar.getFirstDayOfWeek());
        return new TimeRange(startOfWeek, Durations.weeks(weekCount));
    }

    private static TimeRange getPeriodOf(int year, int weekOfYear, int weekCount, ITimeCalendar timeCalendar) {
        assert weekCount > 0;

        DateTime startWeek = Times.startTimeOfWeek(year, weekOfYear, timeCalendar);
        return new TimeRange(startWeek, startWeek.plusWeeks(weekCount));
    }
}