/projects/ganttproject-2.1.1/ganttproject/src/net/sourceforge/ganttproject/calendar/WeekendCalendarImpl.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus · Java · 248 lines · 204 code · 34 blank · 10 comment · 32 complexity · f75db429fdd7c2c3b2ac748c44af6de9 MD5 · raw file

  1. /*
  2. * Created on 18.10.2004
  3. */
  4. package net.sourceforge.ganttproject.calendar;
  5. import java.io.File;
  6. import java.net.URL;
  7. import java.util.ArrayList;
  8. import java.util.Calendar;
  9. import java.util.Collection;
  10. import java.util.Date;
  11. import java.util.GregorianCalendar;
  12. import java.util.HashSet;
  13. import java.util.LinkedHashSet;
  14. import java.util.LinkedList;
  15. import java.util.List;
  16. import java.util.Set;
  17. import net.sourceforge.ganttproject.GanttCalendar;
  18. import net.sourceforge.ganttproject.GanttProject;
  19. import net.sourceforge.ganttproject.parser.HolidayTagHandler;
  20. import net.sourceforge.ganttproject.task.TaskLength;
  21. import net.sourceforge.ganttproject.time.TimeUnit;
  22. import net.sourceforge.ganttproject.time.gregorian.FramerImpl;
  23. /**
  24. * @author bard
  25. */
  26. public class WeekendCalendarImpl extends GPCalendarBase implements GPCalendar {
  27. private final Calendar myCalendar = CalendarFactory.newCalendar();
  28. private final FramerImpl myFramer = new FramerImpl(Calendar.DAY_OF_WEEK);
  29. private DayType[] myTypes = new DayType[7];
  30. private int myWeekendDaysCount;
  31. private Set publicHolidaysArray = new LinkedHashSet();
  32. private final Set myStableHolidays = new LinkedHashSet();
  33. private AlwaysWorkingTimeCalendarImpl myRestlessCalendar = new AlwaysWorkingTimeCalendarImpl();
  34. public WeekendCalendarImpl() {
  35. for (int i = 0; i < myTypes.length; i++) {
  36. myTypes[i] = GPCalendar.DayType.WORKING;
  37. }
  38. setWeekDayType(GregorianCalendar.SATURDAY, GPCalendar.DayType.WEEKEND);
  39. setWeekDayType(GregorianCalendar.SUNDAY, GPCalendar.DayType.WEEKEND);
  40. }
  41. public List/* <GPCalendarActivity> */getActivities(Date startDate,
  42. final Date endDate) {
  43. if (myWeekendDaysCount == 0) {
  44. return myRestlessCalendar.getActivities(startDate, endDate);
  45. }
  46. List result = new ArrayList();
  47. Date curDayStart = myFramer.adjustLeft(startDate);
  48. boolean isWeekendState = isNonWorkingDay(curDayStart);
  49. // System.err.println("getActivities(): start="+startDate+"
  50. // end="+endDate);
  51. while (curDayStart.before(endDate)) {
  52. // System.err.println("curDayStart="+curDayStart);
  53. Date changeStateDayStart = getStateChangeDate(curDayStart,
  54. !isWeekendState);
  55. // System.err.println("changeStateDayStart="+changeStateDayStart);
  56. if (changeStateDayStart.before(endDate)) {
  57. result.add(new CalendarActivityImpl(curDayStart,
  58. changeStateDayStart, !isWeekendState));
  59. curDayStart = changeStateDayStart;
  60. isWeekendState = !isWeekendState;
  61. continue;
  62. } else {
  63. result.add(new CalendarActivityImpl(curDayStart, endDate,
  64. !isWeekendState));
  65. break;
  66. }
  67. }
  68. return result;
  69. }
  70. public boolean isWeekend(Date curDayStart) {
  71. myCalendar.setTime(curDayStart);
  72. int dayOfWeek = myCalendar.get(Calendar.DAY_OF_WEEK);
  73. return myTypes[dayOfWeek - 1] == GPCalendar.DayType.WEEKEND;
  74. }
  75. private Date getStateChangeDate(Date startDate, boolean changeToWeekend) {
  76. Date nextDayStart = myFramer.adjustRight(startDate);
  77. if (!(changeToWeekend ^ isNonWorkingDay(nextDayStart))) {
  78. return nextDayStart;
  79. } else {
  80. return getStateChangeDate(nextDayStart, changeToWeekend);
  81. }
  82. }
  83. private Date getStateChangeDate(Date startDate, TimeUnit timeUnit,
  84. boolean changeToWeekend, boolean moveRightNotLeft) {
  85. Date nextUnitStart = moveRightNotLeft ? timeUnit.adjustRight(startDate)
  86. : timeUnit.jumpLeft(startDate);
  87. if (!(changeToWeekend ^ isNonWorkingDay(nextUnitStart))) {
  88. return nextUnitStart;
  89. } else {
  90. return getStateChangeDate(nextUnitStart, timeUnit, changeToWeekend,
  91. moveRightNotLeft);
  92. }
  93. }
  94. protected List getActivitiesForward(Date startDate, TimeUnit timeUnit,
  95. long unitCount) {
  96. List result = new ArrayList();
  97. Date unitStart = timeUnit.adjustLeft(startDate);
  98. while (unitCount > 0) {
  99. boolean isWeekendState = isNonWorkingDay(unitStart);
  100. if (isWeekendState) {
  101. Date workingUnitStart = getStateChangeDate(unitStart, timeUnit,
  102. false, true);
  103. result.add(new CalendarActivityImpl(unitStart,
  104. workingUnitStart, false));
  105. unitStart = workingUnitStart;
  106. continue;
  107. }
  108. Date nextUnitStart = timeUnit.adjustRight(unitStart);
  109. result
  110. .add(new CalendarActivityImpl(unitStart, nextUnitStart,
  111. true));
  112. unitStart = nextUnitStart;
  113. unitCount--;
  114. }
  115. return result;
  116. }
  117. protected List getActivitiesBackward(Date startDate, TimeUnit timeUnit,
  118. long unitCount) {
  119. List result = new LinkedList();
  120. Date unitStart = timeUnit.adjustLeft(startDate);
  121. while (unitCount > 0) {
  122. Date prevUnitStart = timeUnit.jumpLeft(unitStart);
  123. boolean isWeekendState = isNonWorkingDay(prevUnitStart);
  124. if (isWeekendState) {
  125. Date lastWorkingUnitStart = getStateChangeDate(prevUnitStart,
  126. timeUnit, false, false);
  127. Date firstWeekendUnitStart = timeUnit
  128. .adjustRight(lastWorkingUnitStart);
  129. Date lastWeekendUnitEnd = unitStart;
  130. result.add(0, new CalendarActivityImpl(firstWeekendUnitStart,
  131. lastWeekendUnitEnd, false));
  132. unitStart = firstWeekendUnitStart;
  133. } else {
  134. result.add(0, new CalendarActivityImpl(prevUnitStart,
  135. unitStart, true));
  136. unitCount--;
  137. unitStart = prevUnitStart;
  138. }
  139. }
  140. return result;
  141. }
  142. public void setWeekDayType(int day, DayType type) {
  143. if (type != myTypes[day - 1]) {
  144. myWeekendDaysCount += (type == DayType.WEEKEND ? 1 : -1);
  145. }
  146. myTypes[day - 1] = type;
  147. }
  148. public DayType getWeekDayType(int day) {
  149. return myTypes[day - 1];
  150. }
  151. public Date findClosestWorkingTime(Date time) {
  152. if (myWeekendDaysCount == 0) {
  153. return time;
  154. }
  155. if (!isNonWorkingDay(time)) {
  156. return time;
  157. }
  158. return getStateChangeDate(time, false);
  159. }
  160. public void setPublicHoliDayType(int month, int date) {
  161. setPublicHoliDayType(new GanttCalendar(1, month - 1, date).getTime());
  162. myStableHolidays.add(new GanttCalendar(1, month - 1, date).getTime());
  163. }
  164. public void setPublicHoliDayType(Date curDayStart) {
  165. publicHolidaysArray.add(curDayStart);
  166. }
  167. public boolean isPublicHoliDay(Date curDayStart) {
  168. boolean result = publicHolidaysArray.contains(curDayStart);
  169. if (!result) {
  170. result = myStableHolidays.contains(new GanttCalendar(1, curDayStart.getMonth(), curDayStart.getDate()).getTime());
  171. }
  172. return result;
  173. }
  174. public DayType getDayTypeDate(Date curDayStart) {
  175. myCalendar.setTime(curDayStart);
  176. int dayOfYear = myCalendar.get(Calendar.DAY_OF_YEAR);
  177. myCalendar.setTime(curDayStart);
  178. int dayOfWeek = myCalendar.get(Calendar.DAY_OF_WEEK);
  179. if ((!isPublicHoliDay(curDayStart))
  180. && (getWeekDayType(dayOfWeek) == GPCalendar.DayType.WORKING))
  181. return GPCalendar.DayType.WORKING;
  182. else if (isPublicHoliDay(curDayStart))
  183. return GPCalendar.DayType.HOLIDAY;
  184. else
  185. return GPCalendar.DayType.WEEKEND;
  186. }
  187. public boolean isNonWorkingDay(Date curDayStart) {
  188. if (isWeekend(curDayStart) || isPublicHoliDay(curDayStart))
  189. return true;
  190. else
  191. return false;
  192. }
  193. public void setPublicHolidays(URL calendar, GanttProject gp) {
  194. publicHolidaysArray.clear();
  195. if (calendar != null) {
  196. XMLCalendarOpen opener = new XMLCalendarOpen();
  197. HolidayTagHandler dependencyHandler = new HolidayTagHandler(gp);
  198. opener.addTagHandler(dependencyHandler);
  199. opener.addParsingListener(dependencyHandler);
  200. try {
  201. opener.load(calendar.openStream());
  202. } catch (Exception e) {
  203. throw new RuntimeException(e);
  204. }
  205. }
  206. }
  207. public Collection getPublicHolidays() {
  208. return publicHolidaysArray;
  209. }
  210. public List getActivities(Date startingFrom, TaskLength period) {
  211. return getActivities(startingFrom, period.getTimeUnit(), period
  212. .getLength());
  213. }
  214. }