package org.hwo.ui.netplan; import org.hwo.datetime.Date; import org.hwo.datetime.DateTime; import org.hwo.datetime.TimeOfDay; public class ResourceAvailability { private DateTime startTime; private DateTime endTime; private String label; private ResourceAvailability next; public ResourceAvailability(){ this.setStartTime(new DateTime()); this.setEndTime(new DateTime(getStartTime())); this.getEndTime().getDate().addDays(3650); } public ResourceAvailability(DateTime startTime){ this.setStartTime(startTime); this.setEndTime(new DateTime(getStartTime())); this.getEndTime().getDate().addDays(3650); } ResourceAvailability getNextAvailability(){ return this.getNext(); } public DateTime getStartTime() { return new DateTime(startTime); } public void setStartTime(DateTime startTime) { this.startTime = new DateTime(startTime); } public DateTime getEndTime() { return new DateTime(endTime); } public void setEndTime(DateTime endTime) { this.endTime = new DateTime(endTime); } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public ResourceAvailability getNext() { return next; } public void setNext(ResourceAvailability next) { this.next = next; }; public void makeAvailable(DateTime from,DateTime to){ makeAvailable(from, to, "-"); } public void makeAvailable(DateTime from,DateTime to,String label){ ResourceAvailability a = findLastAvailableBefore(from); if (a != null){ ResourceAvailability na = new ResourceAvailability(from); na.setEndTime(to); na.setLabel(label); na.setNext(a.getNext()); a.setNext(na); if (a.getEndTime().isAfter(from)){ a.setEndTime(from); } a = na; while (a.getNext() != null){ if (a.getNext().getStartTime().isBefore(na.getEndTime())){ if (a.getNext().getEndTime().isBefore(na.getEndTime())){ a.setNext( a.getNext().getNext() ); continue; } a.getNext().setStartTime(na.getEndTime()); } a = a.getNext(); } } } public void makeUnAvailable(DateTime from,DateTime to){ ResourceAvailability a = findLastAvailableBefore(from); if (a != null){ if (a.getEndTime().isAfter(from)){ a.setEndTime(from); } while (a.getNext()!=null){ if (a.getNext().getStartTime().isBefore(to)){ if (a.getNext().getEndTime().isBefore(to)){ a.setNext(a.getNext().getNext()); continue; } a.getNext().setStartTime(to); } a = a.getNext(); } } } public ResourceAvailability findLastAvailableBefore(DateTime dateTime){ if (this.startTime.isAfter(dateTime)) return null; if (next != null){ ResourceAvailability a = next.findLastAvailableBefore(dateTime); if (a != null) return a; } return this; } public ResourceAvailability findAvailableAfter(DateTime dateTime){ if (this.endTime.isAfter(dateTime)) return this; if (next != null){ ResourceAvailability a = next.findAvailableAfter(dateTime); if (a != null) return a; } return null; } @Override public String toString() { StringBuilder sb = new StringBuilder(); ResourceAvailability ra = this; while (ra != null){ sb.append(String.format("%s %s - %s %s\n",Date.weekdays[ra.getStartTime().getDate().getWeekDay()],ra.getStartTime().toString(),Date.weekdays[ra.getEndTime().getDate().getWeekDay()],ra.getEndTime().toString())); ra = ra.getNext(); } return sb.toString(); } public static ResourceAvailability generateWeekly(Date from,int days,boolean[] available){ return generateWeekly(from, days, available,new TimeOfDay(),TimeOfDay.beforeMidnight()); } public static ResourceAvailability generateWeekly(Date from,int days,boolean[] available,TimeOfDay timeStart,TimeOfDay timeEnd){ from.addDays(-1); ResourceAvailability head = new ResourceAvailability(new DateTime(from, new TimeOfDay())); head.setEndTime(new DateTime(from, TimeOfDay.beforeMidnight())); for (int i=0;i