Example usage for org.joda.time Duration compareTo

List of usage examples for org.joda.time Duration compareTo

Introduction

In this page you can find the example usage for org.joda.time Duration compareTo.

Prototype

public int compareTo(ReadableDuration other) 

Source Link

Document

Compares this duration with the specified duration based on length and direction.

Usage

From source file:kr.debop4j.timeperiod.calendars.CalendarDateAdd.java

License:Apache License

@Override
public DateTime add(DateTime start, Duration offset, SeekBoundaryMode seekBoundary) {

    log.trace("add. start [{}] + offset [{}]? ?? ... seekBoundary=[{}]", start, offset,
            seekBoundary);/*from  www.  j a  v a2  s . c o m*/

    if (getWeekDays().size() == 0 && getExcludePeriods().size() == 0 && getWorkingHours().size() == 0)
        return start.plus(offset);

    Pair<DateTime, Duration> endPair = (offset.compareTo(ZERO) < 0)
            ? calculateEnd(start, Durations.negate(offset), SeekDirection.Backward, seekBoundary)
            : calculateEnd(start, offset, SeekDirection.Forward, seekBoundary);

    DateTime end = endPair.getV1();

    log.trace("add. start [{}] + offset [{}] => end=[{}] seekBoundary=[{}]", start, offset, end, seekBoundary);

    return end;
}

From source file:kr.debop4j.timeperiod.calendars.CalendarDateAdd.java

License:Apache License

@Override
public DateTime subtract(DateTime start, Duration offset, SeekBoundaryMode seekBoundary) {

    log.trace("subtract. start [{}] - offset [{}]? ?? ... seekBoundary=[{}]", start,
            offset, seekBoundary);//from www  .  j  a  va2  s . c  om

    if (getWeekDays().size() == 0 && getExcludePeriods().size() == 0 && getWorkingHours().size() == 0)
        return start.minus(offset);

    Pair<DateTime, Duration> endTuple = (offset.compareTo(ZERO) < 0)
            ? calculateEnd(start, Durations.negate(offset), SeekDirection.Forward, seekBoundary)
            : calculateEnd(start, offset, SeekDirection.Backward, seekBoundary);

    DateTime end = endTuple.getV1();

    log.trace("subtract. start [{}] - offset [{}] => end=[{}] seekBoundary=[{}]", start, offset, end,
            seekBoundary);

    return end;
}

From source file:kr.debop4j.timeperiod.calendars.CalendarDateAdd.java

License:Apache License

/**
 *  ? offset ?  ?? .//from w  ww  .  ja  va 2s. co m
 *
 * @param start         ?
 * @param offset       
 * @param seekDir      ? 
 * @param seekBoundary   ? 
 * @return  ? ?  ?,  
 */
@Override
protected Pair<DateTime, Duration> calculateEnd(DateTime start, Duration offset, SeekDirection seekDir,
        SeekBoundaryMode seekBoundary) {

    log.trace(
            "? offset ?  ?? ... start=[{}], offset=[{}], seekDir=[{}], seekBoundary=[{}]",
            start, offset, seekDir, seekBoundary);
    Guard.shouldBe(offset.compareTo(ZERO) >= 0, "offset ? 0 ?? ? . offset=[%d]",
            offset.getMillis());

    DateTime end = null;
    DateTime moment = start;
    Duration remaining = offset;

    WeekRange week = new WeekRange(start, getTimeCalendar());

    while (week != null) {
        super.getIncludePeriods().clear();
        super.getIncludePeriods().addAll(getAvailableWeekPeriods(week));

        log.trace(" =[{}]", StringTool.listToString(super.getIncludePeriods()));

        Pair<DateTime, Duration> result = super.calculateEnd(moment, remaining, seekDir, seekBoundary);
        end = result.getV1();
        remaining = result.getV2();

        log.trace("? . end=[{}], remaining=[{}]", end, remaining);

        if (end != null || remaining == null)
            break;

        if (seekDir == SeekDirection.Forward) {
            week = findNextWeek(week);
            if (week != null)
                moment = week.getStart();
        } else {
            week = findPreviousWeek(week);
            if (week != null)
                moment = week.getEnd();
        }
    }

    log.trace(
            "? offset ?  ?? . start=[{}], offset=[{}], seekDir=[{}], seekBoundary=[{}], end=[{}], remaining=[{}]",
            start, offset, seekDir, seekBoundary, end, remaining);

    return Pair.create(end, remaining);
}

From source file:kr.debop4j.timeperiod.calendars.DateAdd.java

License:Apache License

/** start ? offset ?  ?? . */
public DateTime add(DateTime start, Duration offset, SeekBoundaryMode seekBoundary) {
    if (isTraceEnable)
        log.trace("Add. start=[{}] + offset=[{}]? ?? . seekBoundaryMode=[{}]", start,
                offset, seekBoundary);//from ww  w .  j a  va  2  s. c o m

    if (getIncludePeriods().size() == 0 && getExcludePeriods().size() == 0)
        return start.plus(offset);

    Pair<DateTime, Duration> results = offset.compareTo(Duration.ZERO) < 0
            ? calculateEnd(start, Durations.negate(offset), SeekDirection.Backward, seekBoundary)
            : calculateEnd(start, offset, SeekDirection.Forward, seekBoundary);

    DateTime end = (results != null) ? results.getV1() : null;
    Duration remaining = (results != null) ? results.getV2() : null;

    if (isDebugEnable)
        log.debug(
                "Add. start=[{}] + offset=[{}] ?  end=[{}], remaining=[{}]. seekBoundaryMode=[{}]",
                start, offset, end, remaining, seekBoundary);

    return end;
}

From source file:kr.debop4j.timeperiod.calendars.DateAdd.java

License:Apache License

/** start ? offset ?  ( ??) ?? . */
public DateTime subtract(DateTime start, Duration offset, SeekBoundaryMode seekBoundary) {
    if (isTraceEnable)
        log.trace("Subtract. start=[{}] - offset=[{}]? ?? . seekBoundaryMode=[{}]",
                start, offset, seekBoundary);

    Pair<DateTime, Duration> results = offset.compareTo(Duration.ZERO) < 0
            ? calculateEnd(start, Durations.negate(offset), SeekDirection.Forward, seekBoundary)
            : calculateEnd(start, offset, SeekDirection.Backward, seekBoundary);

    DateTime end = (results != null) ? results.getV1() : null;
    Duration remaining = (results != null) ? results.getV2() : null;

    if (isDebugEnable)
        log.debug(/*from  w ww  .  ja  v  a  2s.c  o  m*/
                "Subtract. start=[{}] - offset=[{}] ?  end=[{}], remaining=[{}]. seekBoundaryMode=[{}]",
                start, offset, end, remaining, seekBoundary);

    return end;
}

From source file:kr.debop4j.timeperiod.calendars.DateAdd.java

License:Apache License

/**
 *  ? offset ?  ?? .// w w  w  .j  a  v  a 2s . c om
 *
 * @param start         ?
 * @param offset       
 * @param seekDir      ? 
 * @param seekBoundary   ? 
 * @return ? ?,  
 */
protected Pair<DateTime, Duration> calculateEnd(DateTime start, Duration offset, SeekDirection seekDir,
        SeekBoundaryMode seekBoundary) {
    if (isTraceEnable)
        log.trace(
                "? ?  ?? ... start=[{}], offset=[{}], seekDir=[{}], seekBoundary=[{}]",
                start, offset, seekDir, seekBoundary);
    shouldBe(offset.compareTo(Duration.ZERO) >= 0, "offset? 0 ??? . offset=[%d]",
            offset.getMillis());

    Duration remaining = offset;
    DateTime end;

    // search periods
    ITimePeriodCollection searchPeriods = new TimePeriodCollection(this.includePeriods);
    if (searchPeriods.size() == 0)
        searchPeriods.add(TimeRange.Anytime);

    // available periods
    ITimePeriodCollection availablePeriods = new TimePeriodCollection();
    if (excludePeriods.size() == 0) {
        availablePeriods.addAll(searchPeriods);
    } else {
        if (isTraceEnable)
            log.trace(" ? .");
        TimeGapCalculator<TimeRange> gapCalculator = new TimeGapCalculator<>();
        for (ITimePeriod p : searchPeriods) {
            if (excludePeriods.hasOverlapPeriods(p)) {
                if (isTraceEnable)
                    log.trace(" ? ?  ? ");
                for (ITimePeriod gap : gapCalculator.getGaps(excludePeriods, p))
                    availablePeriods.add(gap);
            } else {
                availablePeriods.add(p);
            }
        }
    }

    if (availablePeriods.size() == 0) {
        if (isTraceEnable)
            log.trace(" period   .");
        return Pair.create(null, remaining);
    }

    if (isTraceEnable)
        log.trace("  ? ?   ? ...");
    TimePeriodCombiner periodCombiner = new TimePeriodCombiner<TimeRange>();
    availablePeriods = periodCombiner.combinePeriods(availablePeriods);

    if (isTraceEnable)
        log.trace(" ? .");

    Pair<ITimePeriod, DateTime> result = (seekDir == SeekDirection.Forward)
            ? findNextPeriod(start, availablePeriods)
            : findPrevPeriod(start, availablePeriods);

    ITimePeriod startPeriod = result.getV1();
    DateTime seekMoment = result.getV2();

    //   ?  .
    if (startPeriod == null) {
        if (isTraceEnable)
            log.trace("  ?  .");
        return Pair.create(null, remaining);
    }

    // offset ? 0 ??,  ? ? seekMoment  .
    if (offset.isEqual(Duration.ZERO)) {
        if (isTraceEnable)
            log.trace("offset ? 0?,  ? ? seekMoment .");
        return Pair.create(seekMoment, remaining);
    }

    if (seekDir == SeekDirection.Forward) {

        for (int i = availablePeriods.indexOf(startPeriod); i < availablePeriods.size(); i++) {
            ITimePeriod gap = availablePeriods.get(i);
            Duration gapRemaining = new Duration(seekMoment, gap.getEnd());

            if (isTraceEnable)
                log.trace("Seek forward. gap=[{}], gapRemaining=[{}], remaining=[{}], seekMoment=[{}]", gap,
                        gapRemaining, remaining, seekMoment);

            boolean isTargetPeriod = (seekBoundary == SeekBoundaryMode.Fill)
                    ? gapRemaining.compareTo(remaining) >= 0
                    : gapRemaining.compareTo(remaining) > 0;

            if (isTargetPeriod) {
                end = seekMoment.plus(remaining);
                remaining = null;
                return Pair.create(end, remaining);
            }

            remaining = remaining.minus(gapRemaining);
            if (i == availablePeriods.size() - 1)
                return Pair.create(null, remaining);

            seekMoment = availablePeriods.get(i + 1).getStart(); // next period
        }
    } else {
        for (int i = availablePeriods.indexOf(startPeriod); i >= 0; i--) {
            ITimePeriod gap = availablePeriods.get(i);
            Duration gapRemaining = new Duration(gap.getStart(), seekMoment);

            if (isTraceEnable)
                log.trace("Seek backward. gap=[{}], gapRemaining=[{}], remaining=[{}], seekMoment=[{}]", gap,
                        gapRemaining, remaining, seekMoment);

            boolean isTargetPeriod = (seekBoundary == SeekBoundaryMode.Fill)
                    ? gapRemaining.compareTo(remaining) >= 0
                    : gapRemaining.compareTo(remaining) > 0;

            if (isTargetPeriod) {
                end = seekMoment.minus(remaining);
                remaining = null;
                return Pair.create(end, remaining);
            }
            remaining = remaining.minus(gapRemaining);
            if (i == 0)
                return Pair.create(null, remaining);

            seekMoment = availablePeriods.get(i - 1).getEnd();
        }
    }

    if (isTraceEnable)
        log.trace(" ??  .");
    return Pair.create(null, remaining);
}

From source file:kr.debop4j.timeperiod.calendars.DateAdd.java

License:Apache License

/**
 * start periods?  ?   ? ?   ? ,  start    period .
 *
 * @param start    ??//from w w w .j ava 2s . co  m
 * @param periods ? 
 * @return period  ?  ??
 */
private static Pair<ITimePeriod, DateTime> findNextPeriod(DateTime start,
        Iterable<? extends ITimePeriod> periods) {
    if (isTraceEnable)
        log.trace("?? ? ? ... start=[{}], periods=[{}]", start,
                StringTool.listToString(periods));

    ITimePeriod nearest = null;
    DateTime moment = start;
    Duration difference = TimeSpec.MaxDuration;

    for (ITimePeriod period : periods) {

        // ? start ??? (before)
        if (period.getEnd().compareTo(start) < 0)
            continue;

        // start ? ?...
        if (period.hasInside(start)) {
            nearest = period;
            moment = start;
            break;
        }
        //  ? ? ?
        Duration periodToMoment = new Duration(start, period.getStart());
        if (periodToMoment.compareTo(difference) >= 0)
            continue;

        difference = periodToMoment;
        nearest = period;
        moment = period.getStart();
    }

    if (isTraceEnable)
        log.trace("?? ? ? . start=[{}], moment=[{}], neearest=[{}]",
                start, moment, nearest);

    return Pair.create(nearest, moment);
}

From source file:kr.debop4j.timeperiod.calendars.DateAdd.java

License:Apache License

/**
 * start periods  ?   ? ?   ? ,  start    period .
 *
 * @param start    ??//w  w  w  .j a v  a  2  s. c om
 * @param periods ? 
 * @return period  ?  ??
 */
private static Pair<ITimePeriod, DateTime> findPrevPeriod(DateTime start,
        Iterable<? extends ITimePeriod> periods) {
    if (isTraceEnable)
        log.trace("?? ? ? ... start=[{}], periods=[{}]", start,
                StringTool.listToString(periods));

    ITimePeriod nearest = null;
    DateTime moment = start;
    Duration difference = TimeSpec.MaxDuration;

    for (ITimePeriod period : periods) {

        // ? start ??? (after)
        if (period.getStart().compareTo(start) > 0)
            continue;

        // start ? ?...
        if (period.hasInside(start)) {
            nearest = period;
            moment = start;
            break;
        }
        //  ? ? ?
        Duration periodToMoment = new Duration(start, period.getEnd());
        if (periodToMoment.compareTo(difference) >= 0)
            continue;

        difference = periodToMoment;
        nearest = period;
        moment = period.getEnd();
    }

    if (isTraceEnable)
        log.trace("?? ? ? . start=[{}], moment=[{}], neearest=[{}]",
                start, moment, nearest);

    return Pair.create(nearest, moment);
}

From source file:kr.debop4j.timeperiod.DateTimeSet.java

License:Apache License

@Override
public boolean isMoment() {
    Duration duration = getDuration();
    return (duration != null) && (duration.compareTo(Duration.ZERO) == 0);
}

From source file:kr.debop4j.timeperiod.test.samples.TimeBlockPeriodRelationTestData.java

License:Apache License

public TimeBlockPeriodRelationTestData(DateTime start, DateTime end, Duration duration) {

    Guard.shouldBe(duration.compareTo(Duration.ZERO) >= 0,
            "duration? 0??? ?  .");

    setReference(new TimeBlock(start, end, true));

    DateTime beforeEnd = start.minus(duration);
    DateTime beforeStart = beforeEnd.minus(reference.getDuration());
    DateTime insideStart = start.plus(duration);
    DateTime insideEnd = end.minus(duration);
    DateTime afterStart = end.plus(duration);
    DateTime afterEnd = afterStart.plus(reference.getDuration());

    after = new TimeBlock(beforeStart, beforeEnd, true);
    startTouching = new TimeBlock(beforeStart, start, true);
    startInside = new TimeBlock(beforeStart, insideStart, true);
    insideStartTouching = new TimeBlock(start, afterStart, true);
    enclosingStartTouching = new TimeBlock(start, insideEnd, true);
    enclosing = new TimeBlock(insideStart, insideEnd, true);
    enclosingEndTouching = new TimeBlock(insideStart, end, true);
    exactMatch = new TimeBlock(start, end, true);
    inside = new TimeBlock(beforeStart, afterEnd, true);
    insideEndTouching = new TimeBlock(beforeStart, end, true);
    endInside = new TimeBlock(insideEnd, afterEnd, true);
    endTouching = new TimeBlock(end, afterEnd, true);
    before = new TimeBlock(afterStart, afterEnd, true);

    allPeriods.add(reference);/*from  w  w w.  j av a 2s  . c o  m*/
    allPeriods.add(after);
    allPeriods.add(startTouching);
    allPeriods.add(startInside);
    allPeriods.add(insideStartTouching);
    allPeriods.add(enclosingStartTouching);
    allPeriods.add(enclosing);
    allPeriods.add(enclosingEndTouching);
    allPeriods.add(exactMatch);
    allPeriods.add(inside);
    allPeriods.add(insideEndTouching);
    allPeriods.add(endInside);
    allPeriods.add(endTouching);
    allPeriods.add(before);
}