java-org.hwo.ui/src/org/hwo/ui/netplan/ResourceAvailability.java

183 lines
4.2 KiB
Java

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<days;i++){
from.addDays(1);
DateTime aStart = new DateTime(from, timeStart);
DateTime aEnd = new DateTime(from, timeEnd);
if (available[from.getWeekDay()])
head.makeAvailable(aStart, aEnd, Date.weekdays[from.getWeekDay()]);
}
return head.getNext();
}
}