2 *******************************************************************************
3 * Copyright (C) 1996-2010, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 *******************************************************************************
8 package com.ibm.icu.util;
10 import java.util.ArrayList;
11 import java.util.Date;
12 import java.util.List;
15 * <b>Note:</b> The Holiday framework is a technology preview.
16 * Despite its age, is still draft API, and clients should treat it as such.
18 * Implementation of DateRule that takes a range.
19 * @draft ICU 2.8 (retainAll)
20 * @provisional This API might change or be removed in a future release.
22 public class RangeDateRule implements DateRule {
25 * @provisional This API might change or be removed in a future release.
27 public RangeDateRule() {
30 // Range is a package-private class so this should be package-private too, probably
31 // public RangeDateRule(Range[] ranges)
33 // for (int i = 0; i < ranges.length; i++) {
34 // this.ranges.addElement(ranges[i]);
40 * @provisional This API might change or be removed in a future release.
42 public void add(DateRule rule) {
43 add(new Date(Long.MIN_VALUE), rule);
48 * @provisional This API might change or be removed in a future release.
50 public void add(Date start, DateRule rule) {
51 // TODO: Insert in the right place
52 // System.out.println("Add: " + start.toString());
53 ranges.add(new Range(start, rule));
56 //-----------------------------------------------------------------------
60 * @provisional This API might change or be removed in a future release.
62 public Date firstAfter(Date start) {
63 // Find the range that I should look at
64 int index = startIndex(start);
65 if (index == ranges.size()) {
70 Range r = rangeAt(index);
71 Range e = rangeAt(index+1);
73 if (r != null && r.rule != null)
76 result = r.rule.firstBetween(start, e.start);
78 result = r.rule.firstAfter(start);
86 * @provisional This API might change or be removed in a future release.
88 public Date firstBetween(Date start, Date end) {
90 return firstAfter(start);
93 // Find the range that I should look at
94 int index = startIndex(start);
97 Range next = rangeAt(index);
99 while (result == null && next != null && !next.start.after(end))
102 next = rangeAt(index+1);
104 if (r.rule != null) {
105 Date e = (next != null && !next.start.after(end)) ? next.start
107 result = r.rule.firstBetween(start, e);
115 * @provisional This API might change or be removed in a future release.
117 public boolean isOn(Date date) {
118 Range r = rangeAt(startIndex(date));
119 return r != null && r.rule != null && r.rule.isOn(date);
123 * Check whether this event occurs at least once between the two
126 * @provisional This API might change or be removed in a future release.
128 public boolean isBetween(Date start, Date end) {
129 return firstBetween(start,end) == null;
133 * find the index of the last range whose start date is before "start"
134 * returns an index >= ranges.size() if there is none
136 private int startIndex(Date start) {
137 int lastIndex = ranges.size();
139 for (int i = 0; i < ranges.size(); i++) {
140 Range r = ranges.get(i);
141 if (start.before(r.start)) {
149 private Range rangeAt(int index) {
150 return (index < ranges.size()) ? ranges.get(index)
154 List<Range> ranges = new ArrayList<Range>(2);
157 //-----------------------------------------------------------------------
162 public Range(Date start, DateRule rule) {
167 public DateRule rule;