1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.joda.time.chrono;
17
18 import java.util.HashMap;
19 import java.util.Map;
20
21 import org.joda.time.Chronology;
22 import org.joda.time.DateTime;
23 import org.joda.time.DateTimeConstants;
24 import org.joda.time.DateTimeField;
25 import org.joda.time.DateTimeFieldType;
26 import org.joda.time.DateTimeZone;
27 import org.joda.time.field.DelegatedDateTimeField;
28 import org.joda.time.field.DividedDateTimeField;
29 import org.joda.time.field.OffsetDateTimeField;
30 import org.joda.time.field.RemainderDateTimeField;
31 import org.joda.time.field.SkipUndoDateTimeField;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 public final class BuddhistChronology extends AssembledChronology {
54
55
56 private static final long serialVersionUID = -3474595157769370126L;
57
58
59
60
61
62 public static final int BE = DateTimeConstants.CE;
63
64
65 private static final DateTimeField ERA_FIELD = new BasicSingleEraDateTimeField("BE");
66
67
68 private static final int BUDDHIST_OFFSET = 543;
69
70
71 private static final Map<DateTimeZone, BuddhistChronology> cCache = new HashMap<DateTimeZone, BuddhistChronology>();
72
73
74 private static final BuddhistChronology INSTANCE_UTC = getInstance(DateTimeZone.UTC);
75
76
77
78
79
80
81
82
83 public static BuddhistChronology getInstanceUTC() {
84 return INSTANCE_UTC;
85 }
86
87
88
89
90
91
92 public static BuddhistChronology getInstance() {
93 return getInstance(DateTimeZone.getDefault());
94 }
95
96
97
98
99
100
101
102
103 public static synchronized BuddhistChronology getInstance(DateTimeZone zone) {
104 if (zone == null) {
105 zone = DateTimeZone.getDefault();
106 }
107 BuddhistChronology chrono = cCache.get(zone);
108 if (chrono == null) {
109
110 chrono = new BuddhistChronology(GJChronology.getInstance(zone, null), null);
111
112 DateTime lowerLimit = new DateTime(1, 1, 1, 0, 0, 0, 0, chrono);
113 chrono = new BuddhistChronology(LimitChronology.getInstance(chrono, lowerLimit, null), "");
114 cCache.put(zone, chrono);
115 }
116 return chrono;
117 }
118
119
120
121
122
123
124
125
126
127 private BuddhistChronology(Chronology base, Object param) {
128 super(base, param);
129 }
130
131
132
133
134 private Object readResolve() {
135 Chronology base = getBase();
136 return base == null ? getInstanceUTC() : getInstance(base.getZone());
137 }
138
139
140
141
142
143
144
145
146 public Chronology withUTC() {
147 return INSTANCE_UTC;
148 }
149
150
151
152
153
154
155
156 public Chronology withZone(DateTimeZone zone) {
157 if (zone == null) {
158 zone = DateTimeZone.getDefault();
159 }
160 if (zone == getZone()) {
161 return this;
162 }
163 return getInstance(zone);
164 }
165
166
167
168
169
170
171
172
173 public boolean equals(Object obj) {
174 return super.equals(obj);
175 }
176
177
178
179
180
181
182
183 public int hashCode() {
184 return "Buddhist".hashCode() * 11 + getZone().hashCode();
185 }
186
187
188
189
190
191
192
193
194 public String toString() {
195 String str = "BuddhistChronology";
196 DateTimeZone zone = getZone();
197 if (zone != null) {
198 str = str + '[' + zone.getID() + ']';
199 }
200 return str;
201 }
202
203 protected void assemble(Fields fields) {
204 if (getParam() == null) {
205
206 DateTimeField field = fields.year;
207 fields.year = new OffsetDateTimeField(
208 new SkipUndoDateTimeField(this, field), BUDDHIST_OFFSET);
209
210
211 field = fields.yearOfEra;
212 fields.yearOfEra = new DelegatedDateTimeField(
213 fields.year, DateTimeFieldType.yearOfEra());
214
215
216 field = fields.weekyear;
217 fields.weekyear = new OffsetDateTimeField(
218 new SkipUndoDateTimeField(this, field), BUDDHIST_OFFSET);
219
220 field = new OffsetDateTimeField(fields.yearOfEra, 99);
221 fields.centuryOfEra = new DividedDateTimeField(
222 field, DateTimeFieldType.centuryOfEra(), 100);
223
224 field = new RemainderDateTimeField(
225 (DividedDateTimeField) fields.centuryOfEra);
226 fields.yearOfCentury = new OffsetDateTimeField(
227 field, DateTimeFieldType.yearOfCentury(), 1);
228
229 field = new RemainderDateTimeField(
230 fields.weekyear, DateTimeFieldType.weekyearOfCentury(), 100);
231 fields.weekyearOfCentury = new OffsetDateTimeField(
232 field, DateTimeFieldType.weekyearOfCentury(), 1);
233
234 fields.era = ERA_FIELD;
235 }
236 }
237
238 }