[jboss-svn-commits] JBL Code SVN: r32200 - in labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering: persistence and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Mar 24 16:26:37 EDT 2010
Author: ge0ffrey
Date: 2010-03-24 16:26:37 -0400 (Wed, 24 Mar 2010)
New Revision: 32200
Added:
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/DayOfWeek.java
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/ShiftDate.java
Modified:
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/NurseRoster.java
labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringInputConverter.java
Log:
nurse rostering: shiftDate
Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/DayOfWeek.java (from rev 32055, labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/pas/domain/Gender.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/DayOfWeek.java (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/DayOfWeek.java 2010-03-24 20:26:37 UTC (rev 32200)
@@ -0,0 +1,57 @@
+package org.drools.planner.examples.nurserostering.domain;
+
+import java.util.Calendar;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public enum DayOfWeek {
+ MONDAY("Monday"),
+ TUESDAY("Tuesday"),
+ WEDNESDAY("Wednesday"),
+ THURSDAY("Thursday"),
+ FRIDAY("Friday"),
+ SATURDAY("Saturday"),
+ SUNDAY("Sunday");
+
+ public static DayOfWeek valueOfCalendar(int calendarDayInWeek) {
+ switch (calendarDayInWeek) {
+ case Calendar.SUNDAY:
+ return SUNDAY;
+ case Calendar.MONDAY:
+ return MONDAY;
+ case Calendar.TUESDAY:
+ return TUESDAY;
+ case Calendar.WEDNESDAY:
+ return WEDNESDAY;
+ case Calendar.THURSDAY:
+ return THURSDAY;
+ case Calendar.FRIDAY:
+ return FRIDAY;
+ case Calendar.SATURDAY:
+ return SATURDAY;
+ default:
+ throw new IllegalArgumentException("The calendarDayInWeek (" + calendarDayInWeek + ") is not valid.");
+ }
+ }
+
+ public static DayOfWeek valueOfCode(String code) {
+ for (DayOfWeek dayOfWeek : values()) {
+ if (code.equalsIgnoreCase(dayOfWeek.getCode())) {
+ return dayOfWeek;
+ }
+ }
+ return null;
+ }
+
+ private String code;
+
+ private DayOfWeek(String code) {
+ this.code = code;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/NurseRoster.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/NurseRoster.java 2010-03-24 20:20:11 UTC (rev 32199)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/NurseRoster.java 2010-03-24 20:26:37 UTC (rev 32200)
@@ -27,6 +27,7 @@
private List<Contract> contractList;
private List<Employee> employeeList;
private List<SkillProficiency> skillProficiencyList;
+ private List<ShiftDate> shiftDateList;
private List<NurseAssignment> nurseAssignmentList;
@@ -96,6 +97,14 @@
this.skillProficiencyList = skillProficiencyList;
}
+ public List<ShiftDate> getShiftDateList() {
+ return shiftDateList;
+ }
+
+ public void setShiftDateList(List<ShiftDate> shiftDateList) {
+ this.shiftDateList = shiftDateList;
+ }
+
public List<NurseAssignment> getNurseAssignmentList() {
return nurseAssignmentList;
}
@@ -126,6 +135,7 @@
facts.addAll(contractList);
facts.addAll(employeeList);
facts.addAll(skillProficiencyList);
+ facts.addAll(shiftDateList);
// TODO add more properties
@@ -149,6 +159,7 @@
clone.contractList = contractList;
clone.employeeList = employeeList;
clone.skillProficiencyList = skillProficiencyList;
+ clone.shiftDateList = shiftDateList;
// TODO add more properties
Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/ShiftDate.java (from rev 32153, labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/Employee.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/ShiftDate.java (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/ShiftDate.java 2010-03-24 20:26:37 UTC (rev 32200)
@@ -0,0 +1,54 @@
+package org.drools.planner.examples.nurserostering.domain;
+
+import java.util.Date;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import org.apache.commons.lang.builder.CompareToBuilder;
+import org.drools.planner.examples.common.domain.AbstractPersistable;
+
+/**
+ * @author Geoffrey De Smet
+ */
+ at XStreamAlias("ShiftDate")
+public class ShiftDate extends AbstractPersistable implements Comparable<ShiftDate> {
+
+ private int dayIndex;
+ private String dateString;
+ private DayOfWeek dayOfWeek;
+
+ public int getDayIndex() {
+ return dayIndex;
+ }
+
+ public void setDayIndex(int dayIndex) {
+ this.dayIndex = dayIndex;
+ }
+
+ public String getDateString() {
+ return dateString;
+ }
+
+ public void setDateString(String dateString) {
+ this.dateString = dateString;
+ }
+
+ public DayOfWeek getDayOfWeek() {
+ return dayOfWeek;
+ }
+
+ public void setDayOfWeek(DayOfWeek dayOfWeek) {
+ this.dayOfWeek = dayOfWeek;
+ }
+
+ public int compareTo(ShiftDate other) {
+ return new CompareToBuilder()
+ .append(dayIndex, other.dayIndex)
+ .toComparison();
+ }
+
+ @Override
+ public String toString() {
+ return dateString + "(" + dayOfWeek + ")";
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringInputConverter.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringInputConverter.java 2010-03-24 20:20:11 UTC (rev 32199)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringInputConverter.java 2010-03-24 20:26:37 UTC (rev 32200)
@@ -1,16 +1,24 @@
package org.drools.planner.examples.nurserostering.persistence;
import java.io.IOException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.TimeZone;
import org.drools.planner.core.solution.Solution;
import org.drools.planner.examples.common.persistence.AbstractXmlInputConverter;
import org.drools.planner.examples.nurserostering.domain.Contract;
+import org.drools.planner.examples.nurserostering.domain.DayOfWeek;
import org.drools.planner.examples.nurserostering.domain.Employee;
import org.drools.planner.examples.nurserostering.domain.NurseRoster;
+import org.drools.planner.examples.nurserostering.domain.ShiftDate;
import org.drools.planner.examples.nurserostering.domain.ShiftPattern;
import org.drools.planner.examples.nurserostering.domain.ShiftType;
import org.drools.planner.examples.nurserostering.domain.ShiftTypeSkillRequirement;
@@ -47,8 +55,9 @@
nurseRoster.setId(0L);
nurseRoster.setCode(schedulingPeriodElement.getAttribute("ID").getValue());
- // TODO StartDate EndDate
-
+ Map<String, ShiftDate> shiftDateMap = generateShiftDateList(nurseRoster,
+ schedulingPeriodElement.getChild("StartDate"),
+ schedulingPeriodElement.getChild("EndDate"));
Map<String, Skill> skillMap = readSkillList(nurseRoster,
schedulingPeriodElement.getChild("Skills"));
Map<String, ShiftType> shiftTypeMap = readShiftTypeList(nurseRoster, skillMap,
@@ -67,6 +76,69 @@
return nurseRoster;
}
+ private Map<String, ShiftDate> generateShiftDateList(NurseRoster nurseRoster,
+ Element startDateElement, Element endDateElement) throws JDOMException {
+ // Mimic JSR-310 LocalDate
+ TimeZone LOCAL_TIMEZONE = TimeZone.getTimeZone("GMT");
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeZone(LOCAL_TIMEZONE);
+ calendar.clear();
+ DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+ dateFormat.setCalendar(calendar);
+ Date startDate;
+ try {
+ startDate = dateFormat.parse(startDateElement.getText());
+ } catch (ParseException e) {
+ throw new IllegalArgumentException("Invalid startDate (" + startDateElement.getText() + ").", e);
+ }
+ calendar.setTime(startDate);
+ int startDayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
+ int startYear = calendar.get(Calendar.YEAR);
+ Date endDate;
+ try {
+ endDate = dateFormat.parse(endDateElement.getText());
+ } catch (ParseException e) {
+ throw new IllegalArgumentException("Invalid endDate (" + endDateElement.getText() + ").", e);
+ }
+ calendar.setTime(endDate);
+ int endDayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
+ int endYear = calendar.get(Calendar.YEAR);
+ int maxDayIndex = endDayOfYear - startDayOfYear;
+ if (startYear > endYear) {
+ throw new IllegalStateException("The startYear (" + startYear
+ + " must be before endYear (" + endYear + ").");
+ } if (startYear < endYear) {
+ int tmpYear = startYear;
+ calendar.setTime(startDate);
+ while (tmpYear < endYear) {
+ maxDayIndex += calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
+ calendar.add(Calendar.YEAR, 1);
+ tmpYear++;
+ }
+ }
+ int shiftDateSize = maxDayIndex + 1;
+ List<ShiftDate> shiftDateList = new ArrayList<ShiftDate>(shiftDateSize);
+ Map<String, ShiftDate> shiftDateMap = new HashMap<String, ShiftDate>(shiftDateSize);
+ long id = 0L;
+ int dayIndex = 0;
+ calendar.setTime(startDate);
+ for (int i = 0; i < shiftDateSize; i++) {
+ ShiftDate shiftDate = new ShiftDate();
+ shiftDate.setId(id);
+ shiftDate.setDayIndex(dayIndex);
+ String dateString = dateFormat.format(calendar.getTime());
+ shiftDate.setDateString(dateString);
+ shiftDate.setDayOfWeek(DayOfWeek.valueOfCalendar(calendar.get(Calendar.DAY_OF_WEEK)));
+ shiftDateList.add(shiftDate);
+ shiftDateMap.put(dateString, shiftDate);
+ id++;
+ dayIndex++;
+ calendar.add(Calendar.DAY_OF_YEAR, 1);
+ }
+ nurseRoster.setShiftDateList(shiftDateList);
+ return shiftDateMap;
+ }
+
private Map<String, Skill> readSkillList(NurseRoster nurseRoster, Element skillsElement) throws JDOMException {
List<Element> skillElementList = (List<Element>) skillsElement.getChildren();
List<Skill> skillList = new ArrayList<Skill>(skillElementList.size());
More information about the jboss-svn-commits
mailing list