• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GENERATED SOURCE. DO NOT MODIFY. */
2 // © 2016 and later: Unicode, Inc. and others.
3 // License & terms of use: http://www.unicode.org/copyright.html#License
4 /*
5  *******************************************************************************
6  * Copyright (C) 1996-2010, International Business Machines Corporation and    *
7  * others. All Rights Reserved.                                                *
8  *******************************************************************************
9  */
10 
11 package ohos.global.icu.util;
12 
13 import java.util.ArrayList;
14 import java.util.Date;
15 import java.util.List;
16 
17 /**
18  * <b>Note:</b> The Holiday framework is a technology preview.
19  * Despite its age, is still draft API, and clients should treat it as such.
20  *
21  * Implementation of DateRule that takes a range.
22  * @hide exposed on OHOS
23  * @hide draft / provisional / internal are hidden on OHOS
24  */
25 public class RangeDateRule implements DateRule {
26     /**
27      * @hide draft / provisional / internal are hidden on OHOS
28      */
RangeDateRule()29     public RangeDateRule() {
30     }
31 
32     // Range is a package-private class so this should be package-private too, probably
33 //    public RangeDateRule(Range[] ranges)
34 //    {
35 //        for (int i = 0; i < ranges.length; i++) {
36 //            this.ranges.addElement(ranges[i]);
37 //        }
38 //    }
39 
40     /**
41      * @hide draft / provisional / internal are hidden on OHOS
42      */
add(DateRule rule)43     public void add(DateRule rule) {
44         add(new Date(Long.MIN_VALUE), rule);
45     }
46 
47     /**
48      * @hide draft / provisional / internal are hidden on OHOS
49      */
add(Date start, DateRule rule)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));
54     }
55 
56     //-----------------------------------------------------------------------
57 
58     /**
59      * @hide draft / provisional / internal are hidden on OHOS
60      */
firstAfter(Date start)61     public Date firstAfter(Date start) {
62         // Find the range that I should look at
63         int index = startIndex(start);
64         if (index == ranges.size()) {
65             index = 0;
66         }
67         Date result = null;
68 
69         Range r = rangeAt(index);
70         Range e = rangeAt(index+1);
71 
72         if (r != null && r.rule != null)
73         {
74             if (e != null) {
75                 result = r.rule.firstBetween(start, e.start);
76             } else {
77                 result = r.rule.firstAfter(start);
78             }
79         }
80         return result;
81     }
82 
83     /**
84      * @hide draft / provisional / internal are hidden on OHOS
85      */
firstBetween(Date start, Date end)86     public Date firstBetween(Date start, Date end) {
87         if (end == null) {
88             return firstAfter(start);
89         }
90 
91         // Find the range that I should look at
92         int index = startIndex(start);
93         Date result = null;
94 
95         Range next = rangeAt(index);
96 
97         while (result == null && next != null && !next.start.after(end))
98         {
99             Range r = next;
100             next = rangeAt(index+1);
101 
102             if (r.rule != null) {
103                 Date e = (next != null && !next.start.after(end)) ? next.start
104                                                                   : end;
105                 result = r.rule.firstBetween(start, e);
106             }
107         }
108         return result;
109     }
110 
111     /**
112      * @hide draft / provisional / internal are hidden on OHOS
113      */
isOn(Date date)114     public boolean isOn(Date date) {
115         Range r = rangeAt(startIndex(date));
116         return r != null && r.rule != null && r.rule.isOn(date);
117     }
118 
119     /**
120      * Check whether this event occurs at least once between the two
121      * dates given.
122      * @hide draft / provisional / internal are hidden on OHOS
123      */
isBetween(Date start, Date end)124     public boolean isBetween(Date start, Date end) {
125         return firstBetween(start,end) == null;
126     }
127 
128     /*
129      * find the index of the last range whose start date is before "start"
130      * returns an index >= ranges.size() if there is none
131      */
startIndex(Date start)132     private int startIndex(Date start) {
133         int lastIndex = ranges.size();
134 
135         for (int i = 0; i < ranges.size(); i++) {
136             Range r = ranges.get(i);
137             if (start.before(r.start)) {
138                 break;
139             }
140             lastIndex = i;
141         }
142         return lastIndex;
143     }
144 
rangeAt(int index)145     private Range rangeAt(int index) {
146        return (index < ranges.size()) ? ranges.get(index)
147                                       : null;
148     }
149 
150     List<Range> ranges = new ArrayList<Range>(2);
151 }
152 
153 //-----------------------------------------------------------------------
154 // Privates
155 //
156 
157 class Range {
Range(Date start, DateRule rule)158     public Range(Date start, DateRule rule) {
159         this.start = start;
160         this.rule = rule;
161     }
162     public Date     start;
163     public DateRule rule;
164 }
165 
166