| Duration.java |
1 /**
2 * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20 * SOFTWARE.
21 */
22
23 /*
24 * Copyright (c) 2000, Columbia University. All rights reserved.
25 *
26 * Redistribution and use in source and binary forms, with or without
27 * modification, are permitted provided that the following conditions are met:
28 *
29 * 1. Redistributions of source code must retain the above copyright
30 * notice, this list of conditions and the following disclaimer.
31 *
32 * 2. Redistributions in binary form must reproduce the above copyright
33 * notice, this list of conditions and the following disclaimer in the
34 * documentation and/or other materials provided with the distribution.
35 *
36 * 3. Neither the name of the University nor the names of its contributors
37 * may be used to endorse or promote products derived from this software
38 * without specific prior written permission.
39 *
40 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
41 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
42 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
44 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
45 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
46 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
47 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
48 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
49 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
50 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51 */
52
53 package com.liferay.portal.kernel.cal;
54
55 import java.io.Serializable;
56
57 /**
58 * <a href="Duration.java.html"><b><i>View Source</i></b></a>
59 *
60 * @author Jonathan Lennox
61 *
62 */
63 public class Duration implements Cloneable, Serializable {
64
65 /**
66 * Field weeks
67 */
68 private int weeks;
69
70 /**
71 * Field days
72 */
73 private int days;
74
75 /**
76 * Field hours
77 */
78 private int hours;
79
80 /**
81 * Field minutes
82 */
83 private int minutes;
84
85 /**
86 * Field seconds
87 */
88 private int seconds;
89
90 /**
91 * Field SECONDS_PER_MINUTE
92 */
93 private final static int SECONDS_PER_MINUTE = 60;
94
95 /**
96 * Field MINUTES_PER_HOUR
97 */
98 private final static int MINUTES_PER_HOUR = 60;
99
100 /**
101 * Field HOURS_PER_DAY
102 */
103 private final static int HOURS_PER_DAY = 24;
104
105 /**
106 * Field DAYS_PER_WEEK
107 */
108 private final static int DAYS_PER_WEEK = 7;
109
110 /**
111 * Field MILLIS_PER_SECOND
112 */
113 private final static int MILLIS_PER_SECOND = 1000;
114
115 /**
116 * Field MILLIS_PER_MINUTE
117 */
118 private final static int MILLIS_PER_MINUTE = SECONDS_PER_MINUTE
119 * MILLIS_PER_SECOND;
120
121 /**
122 * Field MILLIS_PER_HOUR
123 */
124 private final static int MILLIS_PER_HOUR = MINUTES_PER_HOUR
125 * MILLIS_PER_MINUTE;
126
127 /**
128 * Field MILLIS_PER_DAY
129 */
130 private final static int MILLIS_PER_DAY = HOURS_PER_DAY * MILLIS_PER_HOUR;
131
132 /**
133 * Field MILLIS_PER_WEEK
134 */
135 private final static int MILLIS_PER_WEEK = DAYS_PER_WEEK * MILLIS_PER_DAY;
136
137 /**
138 * Constructor Duration
139 *
140 *
141 */
142 public Duration() {
143
144 /* Zero-initialization of all fields happens by default */
145
146 }
147
148 /**
149 * Constructor Duration
150 *
151 *
152 * @param d
153 * @param h
154 * @param m
155 * @param s
156 *
157 */
158 public Duration(int d, int h, int m, int s) {
159 days = d;
160 hours = h;
161 minutes = m;
162 seconds = s;
163 }
164
165 /**
166 * Constructor Duration
167 *
168 *
169 * @param h
170 * @param m
171 * @param s
172 *
173 */
174 public Duration(int h, int m, int s) {
175 this(0, h, m, s);
176 }
177
178 /**
179 * Constructor Duration
180 *
181 *
182 * @param w
183 *
184 */
185 public Duration(int w) {
186 weeks = w;
187 }
188
189 /**
190 * Method clear
191 *
192 *
193 */
194 public void clear() {
195 weeks = 0;
196 days = 0;
197 hours = 0;
198 minutes = 0;
199 seconds = 0;
200 }
201 ;
202
203 /**
204 * Method getWeeks
205 *
206 *
207 * @return int
208 *
209 */
210 public int getWeeks() {
211 return weeks;
212 }
213
214 /**
215 * Method setWeeks
216 *
217 *
218 * @param w
219 *
220 */
221 public void setWeeks(int w) {
222 if (w < 0) {
223 throw new IllegalArgumentException("Week value out of range");
224 }
225
226 checkWeeksOkay(w);
227
228 weeks = w;
229 }
230
231 /**
232 * Method getDays
233 *
234 *
235 * @return int
236 *
237 */
238 public int getDays() {
239 return days;
240 }
241
242 /**
243 * Method setDays
244 *
245 *
246 * @param d
247 *
248 */
249 public void setDays(int d) {
250 if (d < 0) {
251 throw new IllegalArgumentException("Day value out of range");
252 }
253
254 checkNonWeeksOkay(d);
255
256 days = d;
257
258 normalize();
259 }
260
261 /**
262 * Method getHours
263 *
264 *
265 * @return int
266 *
267 */
268 public int getHours() {
269 return hours;
270 }
271
272 /**
273 * Method setHours
274 *
275 *
276 * @param h
277 *
278 */
279 public void setHours(int h) {
280 if (h < 0) {
281 throw new IllegalArgumentException("Hour value out of range");
282 }
283
284 checkNonWeeksOkay(h);
285
286 hours = h;
287
288 normalize();
289 }
290
291 /**
292 * Method getMinutes
293 *
294 *
295 * @return int
296 *
297 */
298 public int getMinutes() {
299 return minutes;
300 }
301
302 /**
303 * Method setMinutes
304 *
305 *
306 * @param m
307 *
308 */
309 public void setMinutes(int m) {
310 if (m < 0) {
311 throw new IllegalArgumentException("Minute value out of range");
312 }
313
314 checkNonWeeksOkay(m);
315
316 minutes = m;
317
318 normalize();
319 }
320
321 /**
322 * Method getSeconds
323 *
324 *
325 * @return int
326 *
327 */
328 public int getSeconds() {
329 return seconds;
330 }
331
332 /**
333 * Method setSeconds
334 *
335 *
336 * @param s
337 *
338 */
339 public void setSeconds(int s) {
340 if (s < 0) {
341 throw new IllegalArgumentException("Second value out of range");
342 }
343
344 checkNonWeeksOkay(s);
345
346 seconds = s;
347
348 normalize();
349 }
350
351 /**
352 * Method getInterval
353 *
354 *
355 * @return long
356 *
357 */
358 public long getInterval() {
359 return seconds * MILLIS_PER_SECOND + minutes * MILLIS_PER_MINUTE
360 + hours * MILLIS_PER_HOUR + days * MILLIS_PER_DAY
361 + weeks * MILLIS_PER_WEEK;
362 }
363
364 /**
365 * Method setInterval
366 *
367 *
368 * @param millis
369 *
370 */
371 public void setInterval(long millis) {
372 if (millis < 0) {
373 throw new IllegalArgumentException("Negative-length interval");
374 }
375
376 clear();
377
378 days = (int)(millis / MILLIS_PER_DAY);
379 seconds = (int)((millis % MILLIS_PER_DAY) / MILLIS_PER_SECOND);
380
381 normalize();
382 }
383
384 /**
385 * Method normalize
386 *
387 *
388 */
389 protected void normalize() {
390 minutes += seconds / SECONDS_PER_MINUTE;
391 seconds %= SECONDS_PER_MINUTE;
392 hours += minutes / MINUTES_PER_HOUR;
393 minutes %= MINUTES_PER_HOUR;
394 days += hours / HOURS_PER_DAY;
395 hours %= HOURS_PER_DAY;
396 }
397
398 /**
399 * Method checkWeeksOkay
400 *
401 *
402 * @param f
403 *
404 */
405 protected void checkWeeksOkay(int f) {
406 if ((f != 0)
407 && ((days != 0) || (hours != 0) || (minutes != 0)
408 || (seconds != 0))) {
409 throw new IllegalStateException(
410 "Weeks and non-weeks are incompatible");
411 }
412 }
413
414 /**
415 * Method checkNonWeeksOkay
416 *
417 *
418 * @param f
419 *
420 */
421 protected void checkNonWeeksOkay(int f) {
422 if ((f != 0) && (weeks != 0)) {
423 throw new IllegalStateException(
424 "Weeks and non-weeks are incompatible");
425 }
426 }
427
428 /**
429 * Method clone
430 *
431 *
432 * @return Object
433 *
434 */
435 public Object clone() {
436 try {
437 Duration other = (Duration)super.clone();
438
439 other.weeks = weeks;
440 other.days = days;
441 other.hours = hours;
442 other.minutes = minutes;
443 other.seconds = seconds;
444
445 return other;
446 }
447 catch (CloneNotSupportedException e) {
448 throw new InternalError();
449 }
450 }
451
452 /**
453 * Method toString
454 *
455 *
456 * @return String
457 *
458 */
459 public String toString() {
460 StringBuilder sb = new StringBuilder();
461
462 sb.append(getClass().getName());
463 sb.append("[weeks=");
464 sb.append(weeks);
465 sb.append(",days=");
466 sb.append(days);
467 sb.append(",hours=");
468 sb.append(hours);
469 sb.append(",minutes=");
470 sb.append(minutes);
471 sb.append(",seconds=");
472 sb.append(seconds);
473 sb.append("]");
474
475 return sb.toString();
476 }
477
478 }