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