2 *******************************************************************************
\r
3 * Copyright (C) 1996-2010, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
8 package com.ibm.icu.util;
\r
10 import java.util.Date;
\r
11 import java.util.Vector;
\r
14 * <b>Note:</b> The Holiday framework is a technology preview.
\r
15 * Despite its age, is still draft API, and clients should treat it as such.
\r
17 * Implementation of DateRule that takes a range.
\r
18 * @draft ICU 2.8 (retainAll)
\r
19 * @provisional This API might change or be removed in a future release.
\r
21 public class RangeDateRule implements DateRule {
\r
24 * @provisional This API might change or be removed in a future release.
\r
26 public RangeDateRule() {
\r
29 // Range is a package-private class so this should be package-private too, probably
\r
30 // public RangeDateRule(Range[] ranges)
\r
32 // for (int i = 0; i < ranges.length; i++) {
\r
33 // this.ranges.addElement(ranges[i]);
\r
39 * @provisional This API might change or be removed in a future release.
\r
41 public void add(DateRule rule) {
\r
42 add(new Date(Long.MIN_VALUE), rule);
\r
47 * @provisional This API might change or be removed in a future release.
\r
49 public void add(Date start, DateRule rule) {
\r
50 // TODO: Insert in the right place
\r
51 // System.out.println("Add: " + start.toString());
\r
52 ranges.addElement(new Range(start, rule));
\r
55 //-----------------------------------------------------------------------
\r
59 * @provisional This API might change or be removed in a future release.
\r
61 public Date firstAfter(Date start) {
\r
62 // Find the range that I should look at
\r
63 int index = startIndex(start);
\r
64 if (index == ranges.size()) {
\r
69 Range r = rangeAt(index);
\r
70 Range e = rangeAt(index+1);
\r
72 if (r != null && r.rule != null)
\r
75 result = r.rule.firstBetween(start, e.start);
\r
77 result = r.rule.firstAfter(start);
\r
85 * @provisional This API might change or be removed in a future release.
\r
87 public Date firstBetween(Date start, Date end) {
\r
89 return firstAfter(start);
\r
92 // Find the range that I should look at
\r
93 int index = startIndex(start);
\r
96 Range next = rangeAt(index);
\r
98 while (result == null && next != null && !next.start.after(end))
\r
101 next = rangeAt(index+1);
\r
103 if (r.rule != null) {
\r
104 Date e = (next != null && !next.start.after(end)) ? next.start
\r
106 result = r.rule.firstBetween(start, e);
\r
114 * @provisional This API might change or be removed in a future release.
\r
116 public boolean isOn(Date date) {
\r
117 Range r = rangeAt(startIndex(date));
\r
118 return r != null && r.rule != null && r.rule.isOn(date);
\r
122 * Check whether this event occurs at least once between the two
\r
125 * @provisional This API might change or be removed in a future release.
\r
127 public boolean isBetween(Date start, Date end) {
\r
128 return firstBetween(start,end) == null;
\r
132 * find the index of the last range whose start date is before "start"
\r
133 * returns an index >= ranges.size() if there is none
\r
135 private int startIndex(Date start) {
\r
136 int lastIndex = ranges.size();
\r
138 for (int i = 0; i < ranges.size(); i++) {
\r
139 Range r = ranges.elementAt(i);
\r
140 if (start.before(r.start)) {
\r
148 private Range rangeAt(int index) {
\r
149 return (index < ranges.size()) ? ranges.elementAt(index)
\r
153 Vector<Range> ranges = new Vector<Range>(2,2);
\r
156 //-----------------------------------------------------------------------
\r
161 public Range(Date start, DateRule rule) {
\r
162 this.start = start;
\r
166 public DateRule rule;
\r