forked from LupusNobilis/java-org.hwo.ui
183 lines
4.2 KiB
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();
|
|
}
|
|
|
|
|
|
}
|