[jboss-svn-commits] JBL Code SVN: r32261 - 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
Sun Mar 28 05:30:28 EDT 2010


Author: ge0ffrey
Date: 2010-03-28 05:30:28 -0400 (Sun, 28 Mar 2010)
New Revision: 32261

Modified:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/Shift.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringInputConverter.java
Log:
nurse rostering input converter: requiredEmployeeSize

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/Shift.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/Shift.java	2010-03-28 00:35:47 UTC (rev 32260)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/Shift.java	2010-03-28 09:30:28 UTC (rev 32261)
@@ -13,6 +13,8 @@
     private ShiftDate shiftDate;
     private ShiftType shiftType;
 
+    private int requiredEmployeeSize;
+
     public ShiftDate getShiftDate() {
         return shiftDate;
     }
@@ -29,6 +31,14 @@
         this.shiftType = shiftType;
     }
 
+    public int getRequiredEmployeeSize() {
+        return requiredEmployeeSize;
+    }
+
+    public void setRequiredEmployeeSize(int requiredEmployeeSize) {
+        this.requiredEmployeeSize = requiredEmployeeSize;
+    }
+
     public int compareTo(Shift other) {
         return new CompareToBuilder()
                 .append(shiftDate, other.shiftDate)

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-28 00:35:47 UTC (rev 32260)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringInputConverter.java	2010-03-28 09:30:28 UTC (rev 32261)
@@ -55,7 +55,8 @@
         protected Map<String, ShiftDate> shiftDateMap;
         protected Map<String, Skill> skillMap;
         protected Map<String, ShiftType> shiftTypeMap;
-        protected Map<List<String>, Shift> shiftMap;
+        protected Map<List<String>, Shift> dateAndShiftTypeToShiftMap;
+        protected Map<List<Object>, List<Shift>> dayOfWeekAndShiftTypeToShiftListMap;
         protected Map<String, ShiftPattern> shiftPatternMap;
         protected Map<String, Contract> contractMap;
         protected Map<String, Employee> employeeMap;
@@ -77,7 +78,7 @@
             readShiftPatternList(nurseRoster, schedulingPeriodElement.getChild("Patterns"));
             readContractList(nurseRoster, schedulingPeriodElement.getChild("Contracts"));
             readEmployeeList(nurseRoster, schedulingPeriodElement.getChild("Employees"));
-//            readTodoList(nurseRoster, schedulingPeriodElement.getChild("CoverRequirements"));
+            readRequiredEmployeeSizes(nurseRoster, schedulingPeriodElement.getChild("CoverRequirements"));
             readDayOffRequestList(nurseRoster, schedulingPeriodElement.getChild("DayOffRequests"));
             readDayOnRequestList(nurseRoster, schedulingPeriodElement.getChild("DayOnRequests"));
             readShiftOffRequestList(nurseRoster, schedulingPeriodElement.getChild("ShiftOffRequests"));
@@ -182,7 +183,8 @@
             long shiftTypeSkillRequirementId = 0L;
             int shiftListSize = shiftDateMap.size() * shiftElementList.size();
             List<Shift> shiftList = new ArrayList<Shift>(shiftListSize);
-            shiftMap = new HashMap<List<String>, Shift>(shiftListSize);
+            dateAndShiftTypeToShiftMap = new HashMap<List<String>, Shift>(shiftListSize);
+            dayOfWeekAndShiftTypeToShiftListMap = new HashMap<List<Object>, List<Shift>>(7 * shiftElementList.size());
             long shiftId = 0L;
             for (Element element : shiftElementList) {
                 assertElementName(element, "Shift");
@@ -215,10 +217,13 @@
                 for (Map.Entry<String, ShiftDate> shiftDateEntry : shiftDateMap.entrySet()) {
                     Shift shift = new Shift();
                     shift.setId(shiftId);
-                    shift.setShiftDate(shiftDateEntry.getValue());
+                    ShiftDate shiftDate = shiftDateEntry.getValue();
+                    shift.setShiftDate(shiftDate);
                     shift.setShiftType(shiftType);
+                    shift.setRequiredEmployeeSize(0); // Filled in later
                     shiftList.add(shift);
-                    shiftMap.put(Arrays.asList(shiftDateEntry.getKey(), shiftType.getCode()), shift);
+                    dateAndShiftTypeToShiftMap.put(Arrays.asList(shiftDateEntry.getKey(), shiftType.getCode()), shift);
+                    addShiftToDayOfWeekAndShiftTypeToShiftListMap(shiftDate, shiftType, shift);
                     shiftId++;
                 }
 
@@ -231,6 +236,17 @@
             nurseRoster.setShiftList(shiftList);
         }
 
+        private void addShiftToDayOfWeekAndShiftTypeToShiftListMap(ShiftDate shiftDate, ShiftType shiftType,
+                Shift shift) {
+            List<Object> key = Arrays.<Object>asList(shiftDate.getDayOfWeek(), shiftType);
+            List<Shift> dayOfWeekAndShiftTypeToShiftList = dayOfWeekAndShiftTypeToShiftListMap.get(key);
+            if (dayOfWeekAndShiftTypeToShiftList == null) {
+                dayOfWeekAndShiftTypeToShiftList = new ArrayList<Shift>((shiftDateMap.size() + 6) / 7);
+                dayOfWeekAndShiftTypeToShiftListMap.put(key, dayOfWeekAndShiftTypeToShiftList);
+            }
+            dayOfWeekAndShiftTypeToShiftList.add(shift);
+        }
+
         private void readShiftPatternList(NurseRoster nurseRoster, Element patternsElement) throws JDOMException {
             if (patternsElement == null) {
                 return;
@@ -394,6 +410,87 @@
             nurseRoster.setSkillProficiencyList(skillProficiencyList);
         }
 
+//  <CoverRequirements>
+//    <DayOfWeekCover>
+//      <Day>Monday</Day>
+//      <Cover>
+//        <Shift>E</Shift>
+//        <Preferred>8</Preferred>
+//      </Cover>
+//      <Cover>
+//        <Shift>L</Shift>
+//        <Preferred>8</Preferred>
+//      </Cover>
+//      <Cover>
+//        <Shift>D</Shift>
+//        <Preferred>5</Preferred>
+//      </Cover>
+//      <Cover>
+//        <Shift>N</Shift>
+//        <Preferred>6</Preferred>
+//      </Cover>
+//      <Cover>
+//        <Shift>DH</Shift>
+//        <Preferred>2</Preferred>
+//      </Cover>
+//    </DayOfWeekCover>
+        private void readRequiredEmployeeSizes(NurseRoster nurseRoster, Element coverRequirementsElement) {
+            List<Element> coverRequirementElementList = (List<Element>) coverRequirementsElement.getChildren();
+            for (Element element : coverRequirementElementList) {
+                if (element.getName().equals("DayOfWeekCover")) {
+                    Element dayOfWeekElement = element.getChild("Day");
+                    DayOfWeek dayOfWeek = DayOfWeek.valueOfCode(dayOfWeekElement.getText());
+                    if (dayOfWeek == null) {
+                        throw new IllegalArgumentException("The dayOfWeek (" + dayOfWeekElement.getText()
+                                + ") of an entity DayOfWeekCover does not exist.");
+                    }
+
+                    List<Element> coverElementList = (List<Element>) element.getChildren("Cover");
+                    for (Element coverElement : coverElementList) {
+                        Element shiftTypeElement = coverElement.getChild("Shift");
+                        ShiftType shiftType = shiftTypeMap.get(shiftTypeElement.getText());
+                        if (shiftType == null) {
+                            if (shiftTypeElement.getText().equals("Any")) {
+                                throw new IllegalStateException("The shiftType Any is not supported on DayOfWeekCover.");
+                            } else if (shiftTypeElement.getText().equals("None")) {
+                                throw new IllegalStateException("The shiftType None is not supported on DayOfWeekCover.");
+                            } else {
+                                throw new IllegalArgumentException("The shiftType (" + shiftTypeElement.getText()
+                                        + ") of an entity DayOfWeekCover does not exist.");
+                            }
+                        }
+                        List<Object> key = Arrays.<Object>asList(dayOfWeek, shiftType);
+                        List<Shift> shiftList = dayOfWeekAndShiftTypeToShiftListMap.get(key);
+                        if (shiftList == null) {
+                            throw new IllegalArgumentException("The dayOfWeek (" + dayOfWeekElement.getText()
+                                    + ") with the shiftType (" + shiftTypeElement.getText()
+                                    + ") of an entity DayOfWeekCover does not have any shifts.");
+                        }
+                        int requiredEmployeeSize = Integer.parseInt(coverElement.getChild("Preferred").getText());
+                        for (Shift shift : shiftList) {
+                            shift.setRequiredEmployeeSize(shift.getRequiredEmployeeSize() + requiredEmployeeSize);
+                        }
+                    }
+                } else if (element.getName().equals("DateSpecificCover")) {
+                    Element dateElement = element.getChild("Date");
+                    List<Element> coverElementList = (List<Element>) element.getChildren("Cover");
+                    for (Element coverElement : coverElementList) {
+                        Element shiftTypeElement = coverElement.getChild("Shift");
+                        Shift shift = dateAndShiftTypeToShiftMap.get(Arrays.asList(dateElement.getText(), shiftTypeElement.getText()));
+                        if (shift == null) {
+                            throw new IllegalArgumentException("The date (" + dateElement.getText()
+                                    + ") with the shiftType (" + shiftTypeElement.getText()
+                                    + ") of an entity DateSpecificCover does not have a shift.");
+                        }
+                        int requiredEmployeeSize = Integer.parseInt(coverElement.getChild("Preferred").getText());
+                        shift.setRequiredEmployeeSize(shift.getRequiredEmployeeSize() + requiredEmployeeSize);
+                    }
+                } else {
+                    throw new IllegalArgumentException("Unknown cover entity (" + element.getName() + ").");
+                }
+            }
+        }
+
         private void readDayOffRequestList(NurseRoster nurseRoster, Element dayOffRequestsElement) throws JDOMException {
             if (dayOffRequestsElement == null) {
                 return;
@@ -488,7 +585,7 @@
 
                 Element dateElement = element.getChild("Date");
                 Element shiftTypeElement = element.getChild("ShiftTypeID");
-                Shift shift = shiftMap.get(Arrays.asList(dateElement.getText(), shiftTypeElement.getText()));
+                Shift shift = dateAndShiftTypeToShiftMap.get(Arrays.asList(dateElement.getText(), shiftTypeElement.getText()));
                 if (shift == null) {
                     throw new IllegalArgumentException("The date (" + dateElement.getText()
                             + ") or the shiftType (" + shiftTypeElement.getText()
@@ -526,7 +623,7 @@
 
                 Element dateElement = element.getChild("Date");
                 Element shiftTypeElement = element.getChild("ShiftTypeID");
-                Shift shift = shiftMap.get(Arrays.asList(dateElement.getText(), shiftTypeElement.getText()));
+                Shift shift = dateAndShiftTypeToShiftMap.get(Arrays.asList(dateElement.getText(), shiftTypeElement.getText()));
                 if (shift == null) {
                     throw new IllegalArgumentException("The date (" + dateElement.getText()
                             + ") or the shiftType (" + shiftTypeElement.getText()



More information about the jboss-svn-commits mailing list