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