]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/classes/core/src/com/ibm/icu/util/RangeDateRule.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / classes / core / src / com / ibm / icu / util / RangeDateRule.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1996-2010, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 \r
8 package com.ibm.icu.util;\r
9 \r
10 import java.util.Date;\r
11 import java.util.Vector;\r
12 \r
13 /**\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
16  * \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
20  */\r
21 public class RangeDateRule implements DateRule {\r
22     /**\r
23      * @draft ICU 2.8\r
24      * @provisional This API might change or be removed in a future release.\r
25      */\r
26     public RangeDateRule() {\r
27     }\r
28 \r
29     // Range is a package-private class so this should be package-private too, probably\r
30 //    public RangeDateRule(Range[] ranges)\r
31 //    {\r
32 //        for (int i = 0; i < ranges.length; i++) {\r
33 //            this.ranges.addElement(ranges[i]);\r
34 //        }\r
35 //    }\r
36 \r
37     /**\r
38      * @draft ICU 2.8\r
39      * @provisional This API might change or be removed in a future release.\r
40      */\r
41     public void add(DateRule rule) {\r
42         add(new Date(Long.MIN_VALUE), rule);\r
43     }\r
44 \r
45     /**\r
46      * @draft ICU 2.8\r
47      * @provisional This API might change or be removed in a future release.\r
48      */\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
53     }\r
54 \r
55     //-----------------------------------------------------------------------\r
56 \r
57     /**\r
58      * @draft ICU 2.8\r
59      * @provisional This API might change or be removed in a future release.\r
60      */\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
65             index = 0;\r
66         }\r
67         Date result = null;\r
68 \r
69         Range r = rangeAt(index);\r
70         Range e = rangeAt(index+1);\r
71 \r
72         if (r != null && r.rule != null)\r
73         {\r
74             if (e != null) {\r
75                 result = r.rule.firstBetween(start, e.start);\r
76             } else {\r
77                 result = r.rule.firstAfter(start);\r
78             }\r
79         }\r
80         return result;\r
81     }\r
82 \r
83     /**\r
84      * @draft ICU 2.8\r
85      * @provisional This API might change or be removed in a future release.\r
86      */\r
87     public Date firstBetween(Date start, Date end) {\r
88         if (end == null) {\r
89             return firstAfter(start);\r
90         }\r
91         \r
92         // Find the range that I should look at\r
93         int index = startIndex(start);\r
94         Date result = null;\r
95 \r
96         Range next = rangeAt(index);\r
97 \r
98         while (result == null && next != null && !next.start.after(end))\r
99         {\r
100             Range r = next;\r
101             next = rangeAt(index+1);\r
102 \r
103             if (r.rule != null) {\r
104                 Date e = (next != null && !next.start.after(end)) ? next.start\r
105                                                                   : end;\r
106                 result = r.rule.firstBetween(start, e);\r
107             }\r
108         }\r
109         return result;\r
110     }\r
111 \r
112     /**\r
113      * @draft ICU 2.8\r
114      * @provisional This API might change or be removed in a future release.\r
115      */\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
119     }\r
120 \r
121     /**\r
122      * Check whether this event occurs at least once between the two\r
123      * dates given.\r
124      * @draft ICU 2.8\r
125      * @provisional This API might change or be removed in a future release.\r
126      */\r
127     public boolean isBetween(Date start, Date end) {\r
128         return firstBetween(start,end) == null;\r
129     }\r
130 \r
131     /*\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
134      */\r
135     private int startIndex(Date start) {\r
136         int lastIndex = ranges.size();\r
137 \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
141                 break;\r
142             }\r
143             lastIndex = i;\r
144         }\r
145         return lastIndex;\r
146     }\r
147 \r
148     private Range rangeAt(int index) {\r
149        return (index < ranges.size()) ? ranges.elementAt(index)\r
150                                       : null;\r
151     }\r
152 \r
153     Vector<Range> ranges = new Vector<Range>(2,2);\r
154 }\r
155 \r
156 //-----------------------------------------------------------------------\r
157 // Privates\r
158 //\r
159 \r
160 class Range {\r
161     public Range(Date start, DateRule rule) {\r
162         this.start = start;\r
163         this.rule = rule;\r
164     }\r
165     public Date     start;\r
166     public DateRule rule;\r
167 }\r
168 \r