All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.ical.values.PeriodValueImpl Maven / Gradle / Ivy

// Copyright (C) 2006 Google Inc.
//
// 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 com.google.ical.values;

import com.google.ical.util.TimeUtils;

/**
 * a half-open range of {@link DateValue}s.
 *
 * @author [email protected] (Mike Samuel)
 */
public class PeriodValueImpl implements PeriodValue {

  private DateValue start, end;

  /**
   * returns a period with the given start and end dates.
   * @param start non null.
   * @param end on or after start.  May/must have a time if the start has a
   *   time.
   */
  public static PeriodValue create(DateValue start, DateValue end) {
    return new PeriodValueImpl(start, end);
  }

  /**
   * returns a period with the given start date and duration.
   * @param start non null.
   * @param dur a positive duration represented as a DateValue.
   */
  public static PeriodValue createFromDuration(DateValue start, DateValue dur) {
    DateValue end = TimeUtils.add(start, dur);
    if (end instanceof TimeValue && !(start instanceof TimeValue)) {
      start = TimeUtils.dayStart(start);
    }
    return new PeriodValueImpl(start, end);
  }

  protected PeriodValueImpl(DateValue start, DateValue end) {
    if (start.compareTo(end) > 0) {
      throw new IllegalArgumentException
          ("Start (" + start + ") must precede end (" + end + ")");
    }
    if ((start instanceof TimeValue) ^ (end instanceof TimeValue)) {
      throw new IllegalArgumentException
        ("Start (" + start + ") and end (" + end +
         ") must both have times or neither have times.");
    }
    this.start = start;
    this.end = end;
  }

  public DateValue start() { return start; }

  public DateValue end() { return end; }

  /** true iff this period overlaps the given period. */
  public boolean intersects(PeriodValue pv) {
    DateValue sa = this.start,
              ea = this.end,
              sb = pv.start(),
              eb = pv.end();

    return sa.compareTo(eb) < 0 && sb.compareTo(ea) < 0;
  }

  /** true iff this period completely contains the given period. */
  public boolean contains(PeriodValue pv) {
    DateValue sa = this.start,
              ea = this.end,
              sb = pv.start(),
              eb = pv.end();

    return !(sb.compareTo(sa) < 0 || ea.compareTo(eb) < 0);
  }

  @Override public boolean equals(Object o) {
    if (!(o instanceof PeriodValue)) { return false; }
    PeriodValue that = (PeriodValue) o;
    return this.start().equals(that.start())
        && this.end().equals(that.end());
  }

  @Override public int hashCode() {
    return start.hashCode() ^ (31 * end.hashCode());
  }

  @Override public String toString() {
    return start().toString() + "/" + end().toString();
  }

}  // PeriodValueImpl




© 2015 - 2024 Weber Informatics LLC | Privacy Policy