/* ************************************************************************
#
# 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.ArrayList;
import java.util.BitSet;
import java.util.List;
import org.joda.time.LocalTime;
import divconq.xml.XElement;
public class MonthWindow {
// window to use for this
protected List<MonthdayWindow> monthly = new ArrayList<MonthdayWindow>();
// (0 = jan, 11 = dec)
protected BitSet monthOfYear = new BitSet(12);
public void init(LimitHelper helper, XElement config) {
if (config != null) {
if ("True".equals(config.getAttribute("All")))
this.monthOfYear.set(0, 11);
if ("True".equals(config.getAttribute("January")))
this.monthOfYear.set(0);
if ("True".equals(config.getAttribute("February")))
this.monthOfYear.set(1);
if ("True".equals(config.getAttribute("March")))
this.monthOfYear.set(2);
if ("True".equals(config.getAttribute("April")))
this.monthOfYear.set(3);
if ("True".equals(config.getAttribute("May")))
this.monthOfYear.set(4);
if ("True".equals(config.getAttribute("June")))
this.monthOfYear.set(5);
if ("True".equals(config.getAttribute("July")))
this.monthOfYear.set(6);
if ("True".equals(config.getAttribute("August")))
this.monthOfYear.set(7);
if ("True".equals(config.getAttribute("September")))
this.monthOfYear.set(8);
if ("True".equals(config.getAttribute("October")))
this.monthOfYear.set(9);
if ("True".equals(config.getAttribute("November")))
this.monthOfYear.set(10);
if ("True".equals(config.getAttribute("December")))
this.monthOfYear.set(11);
// if none set, then default to all
if (monthOfYear.cardinality() == 0)
this.monthOfYear.set(0, 11);
for (XElement el : config.selectAll("Monthday")) {
MonthdayWindow ww = new MonthdayWindow();
ww.init(helper, el);
this.monthly.add(ww);
}
for (XElement el : config.selectAll("First")) {
MonthdayWindow ww = new MonthdayWindow();
ww.init(helper, el);
this.monthly.add(ww);
}
for (XElement el : config.selectAll("Second")) {
MonthdayWindow ww = new MonthdayWindow();
ww.init(helper, el);
this.monthly.add(ww);
}
for (XElement el : config.selectAll("Third")) {
MonthdayWindow ww = new MonthdayWindow();
ww.init(helper, el);
this.monthly.add(ww);
}
for (XElement el : config.selectAll("Fourth")) {
MonthdayWindow ww = new MonthdayWindow();
ww.init(helper, el);
this.monthly.add(ww);
}
for (XElement el : config.selectAll("Last")) {
MonthdayWindow ww = new MonthdayWindow();
ww.init(helper, el);
this.monthly.add(ww);
}
}
}
/*
* 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) {
// pick the first window that applies to our info
MonthdayWindow mw = this.getApplicable(si);
if (mw != null)
return mw.nextTimeOn(si);
return null;
}
public CheckLimitResult check(CheckInfo si) {
// pick the first window that applies to our info
MonthdayWindow mw = this.getApplicable(si);
if (mw != null)
return mw.check(si);
return CheckLimitResult.NA;
}
public boolean isDateBlocked(CheckInfo ci) {
return !this.appliesTo(ci);
}
public MonthdayWindow getApplicable(CheckInfo ci) {
if (this.monthOfYear.get(ci.getMonthOfYear() - 1))
for (MonthdayWindow w : this.monthly)
if (w.appliesTo(ci))
return w;
return null;
}
public boolean appliesTo(CheckInfo ci) {
if (this.monthOfYear.get(ci.getMonthOfYear() - 1))
return true;
return false;
}
}