[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