001: /*
002: * JBoss, Home of Professional Open Source
003: * Copyright 2005, JBoss Inc., and individual contributors as indicated
004: * by the @authors tag. See the copyright.txt in the distribution for a
005: * full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jbpm.calendar;
023:
024: import java.io.Serializable;
025: import java.text.*;
026: import java.text.DateFormat;
027: import java.util.*;
028:
029: /**
030: * is part of a day that can for example be used to represent business hours.
031: *
032: */
033: public class DayPart implements Serializable {
034:
035: private static final long serialVersionUID = 1L;
036:
037: int fromHour = -1;
038: int fromMinute = -1;
039: int toHour = -1;
040: int toMinute = -1;
041: Day day = null;
042: int index = -1;
043:
044: public DayPart(String dayPartText, DateFormat dateFormat, Day day,
045: int index) {
046: this .day = day;
047: this .index = index;
048:
049: int separatorIndex = dayPartText.indexOf('-');
050: if (separatorIndex == -1)
051: throw new IllegalArgumentException(
052: "improper format of daypart '" + dayPartText + "'");
053: String fromText = dayPartText.substring(0, separatorIndex)
054: .trim().toLowerCase();
055: String toText = dayPartText.substring(separatorIndex + 1)
056: .trim().toLowerCase();
057:
058: try {
059: Date from = dateFormat.parse(fromText);
060: Date to = dateFormat.parse(toText);
061:
062: Calendar calendar = BusinessCalendar.getCalendar();
063: calendar.setTime(from);
064: fromHour = calendar.get(Calendar.HOUR_OF_DAY);
065: fromMinute = calendar.get(Calendar.MINUTE);
066:
067: calendar.setTime(to);
068: toHour = calendar.get(Calendar.HOUR_OF_DAY);
069: if (toHour == 0) {
070: toHour = 24;
071: }
072: toMinute = calendar.get(Calendar.MINUTE);
073:
074: } catch (ParseException e) {
075: e.printStackTrace();
076: }
077: }
078:
079: public Date add(Date date, Duration duration) {
080: Date end = null;
081:
082: Calendar calendar = BusinessCalendar.getCalendar();
083: calendar.setTime(date);
084: int hour = calendar.get(Calendar.HOUR_OF_DAY);
085: int minute = calendar.get(Calendar.MINUTE);
086:
087: long dateMilliseconds = ((hour * 60) + minute) * 60 * 1000;
088: long dayPartEndMilleseconds = ((toHour * 60) + toMinute) * 60 * 1000;
089: long millisecondsInThisDayPart = dayPartEndMilleseconds
090: - dateMilliseconds;
091:
092: if (duration.milliseconds <= millisecondsInThisDayPart) {
093: end = new Date(date.getTime() + duration.milliseconds);
094: } else {
095: long remainderMillis = duration.milliseconds
096: - millisecondsInThisDayPart;
097: Duration remainder = new Duration(remainderMillis);
098: Date dayPartEndDate = new Date(date.getTime()
099: + duration.milliseconds - remainderMillis);
100:
101: Object[] result = new Object[2];
102: day.findNextDayPartStart(index + 1, dayPartEndDate, result);
103: Date nextDayPartStart = (Date) result[0];
104: DayPart nextDayPart = (DayPart) result[1];
105:
106: end = nextDayPart.add(nextDayPartStart, remainder);
107: }
108:
109: return end;
110: }
111:
112: public boolean isStartAfter(Date date) {
113: Calendar calendar = BusinessCalendar.getCalendar();
114: calendar.setTime(date);
115: int hour = calendar.get(Calendar.HOUR_OF_DAY);
116: int minute = calendar.get(Calendar.MINUTE);
117:
118: return ((hour < fromHour) || ((hour == fromHour) && (minute <= fromMinute)));
119: }
120:
121: public boolean includes(Date date) {
122: Calendar calendar = BusinessCalendar.getCalendar();
123: calendar.setTime(date);
124: int hour = calendar.get(Calendar.HOUR_OF_DAY);
125: int minute = calendar.get(Calendar.MINUTE);
126:
127: return (((fromHour < hour) || ((fromHour == hour) && (fromMinute <= minute))) && ((hour < toHour) || ((hour == toHour) && (minute <= toMinute))));
128: }
129:
130: public Date getStartTime(Date date) {
131: Calendar calendar = BusinessCalendar.getCalendar();
132: calendar.setTime(date);
133: calendar.set(Calendar.HOUR_OF_DAY, fromHour);
134: calendar.set(Calendar.MINUTE, fromMinute);
135: return calendar.getTime();
136: }
137: }
|