/* ************************************************************************
#
# DivConq
#
# http://divconq.com/
#
# Copyright:
# Copyright 2014 eTimeline, LLC. All rights reserved.
#
# License:
# See the license.txt file in the project's top-level directory for details.
#
# Authors:
# * Andy White
#
************************************************************************ */
package divconq.scheduler.limit;
import java.util.BitSet;
import org.joda.time.LocalTime;
import divconq.xml.XElement;
public class WeekdayWindow {
// window to use for this
protected DayWindow dailyWindow = new DayWindow();
// if other types, besides SET, then list here (0 = monday, 6 = sunday)
protected BitSet dayOfWeek = new BitSet(7);
public void init(LimitHelper helper, XElement config) {
if (config != null) {
if ("True".equals(config.getAttribute("All")))
this.dayOfWeek.set(0, 6);
if ("True".equals(config.getAttribute("Monday")))
this.dayOfWeek.set(0);
if ("True".equals(config.getAttribute("Tuesday")))
this.dayOfWeek.set(1);
if ("True".equals(config.getAttribute("Wednesday")))
this.dayOfWeek.set(2);
if ("True".equals(config.getAttribute("Thursday")))
this.dayOfWeek.set(3);
if ("True".equals(config.getAttribute("Friday")))
this.dayOfWeek.set(4);
if ("True".equals(config.getAttribute("Saturday")))
this.dayOfWeek.set(5);
if ("True".equals(config.getAttribute("Sunday")))
this.dayOfWeek.set(6);
// if none set then default to all
if (this.dayOfWeek.cardinality() == 0)
this.dayOfWeek.set(0, 6);
this.dailyWindow.init(config);
// True - use default of 24 hours open if there are no windows given
// False - do not include 24 hour open if there are no windows given
// Parent - use only the parent (if present) if there are no windows given
// serves as a hint to the parser to include parent
String defaultWindow = config.getAttribute("DefaultWindow");
if (("Parent".equals(defaultWindow)) && (helper != null))
this.dailyWindow.setParent(helper.getDailyWindow());
}
}
public boolean excludeAll() {
// do we have any open window during the day?
if (this.dailyWindow.excludeAll())
return true;
if (this.dayOfWeek.cardinality() == 0)
return true;
return false;
}
/*
* search to see if there are any minutes open for this date after or at the current minute
*
* @param si
* @return
*/
public LocalTime nextTimeOn(CheckInfo si) {
if (this.excludeAll())
return null;
if (this.dayOfWeek.get(si.getDayOfWeek() - 1))
return this.dailyWindow.nextTimeOn(si.getWhen());
return null;
}
public CheckLimitResult check(CheckInfo si) {
if (this.excludeAll())
return CheckLimitResult.Fail;
if (this.dayOfWeek.get(si.getDayOfWeek() - 1))
return this.dailyWindow.check(si.getWhen());
return CheckLimitResult.NA;
}
public boolean isDateBlocked(CheckInfo ci) {
return !this.appliesTo(ci);
}
public boolean appliesTo(CheckInfo ci) {
if (this.excludeAll())
return false;
if (this.dayOfWeek.get(ci.getDayOfWeek() - 1))
return true;
return false;
}
}