[jboss-svn-commits] JBL Code SVN: r32149 - in labs/jbossrules/trunk/drools-planner/drools-planner-examples: src/main/java/org/drools/planner/examples/common/persistence and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Mar 19 11:56:50 EDT 2010


Author: ge0ffrey
Date: 2010-03-19 11:56:49 -0400 (Fri, 19 Mar 2010)
New Revision: 32149

Added:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/ShiftTypeSkillRequirement.java
Modified:
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/pom.xml
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/common/persistence/AbstractXmlInputConverter.java
   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/ShiftType.java
   labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringInputConverter.java
Log:
nurse rostering: bye bye javax.xml hell, welcome jdom heaven + shifttype convertation

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/pom.xml	2010-03-19 15:15:50 UTC (rev 32148)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/pom.xml	2010-03-19 15:56:49 UTC (rev 32149)
@@ -96,5 +96,12 @@
          <groupId>jfree</groupId>
          <artifactId>jfreechart</artifactId>
       </dependency>
+
+      <!-- Converters -->
+      <dependency>
+        <groupId>org.jdom</groupId>
+        <artifactId>jdom</artifactId>
+        <version>1.1</version>
+      </dependency>
    </dependencies>
 </project>

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/common/persistence/AbstractXmlInputConverter.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/common/persistence/AbstractXmlInputConverter.java	2010-03-19 15:15:50 UTC (rev 32148)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/common/persistence/AbstractXmlInputConverter.java	2010-03-19 15:56:49 UTC (rev 32149)
@@ -7,15 +7,12 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
 import org.apache.commons.io.IOUtils;
 import org.drools.planner.core.solution.Solution;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
 
 /**
  * @author Geoffrey De Smet
@@ -38,17 +35,15 @@
         InputStream in = null;
         try {
             in = new FileInputStream(inputFile);
-            DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-            Document document = documentBuilder.parse(in);
+            SAXBuilder builder = new SAXBuilder(false);
+            Document document = builder.build(in);
             XmlInputBuilder txtInputBuilder = createXmlInputBuilder();
             txtInputBuilder.setDocument(document);
             return txtInputBuilder.readSolution();
         } catch (IOException e) {
             throw new IllegalArgumentException(e);
-        } catch (ParserConfigurationException e) {
+        } catch (JDOMException e) {
             throw new IllegalArgumentException(e);
-        } catch (SAXException e) {
-            throw new IllegalArgumentException(e);
         } finally {
             IOUtils.closeQuietly(in);
         }
@@ -68,10 +63,10 @@
         // Helper methods
         // ************************************************************************
 
-        protected void assertNodeName(Node node, String nodeName) {
-            if (!node.getNodeName().equals(nodeName)) {
-                throw new IllegalArgumentException("The node name (" + node.getNodeName()
-                        + ") is expected to be " + nodeName + ".");
+        protected void assertElementName(Element element, String name) {
+            if (!element.getName().equals(name)) {
+                throw new IllegalStateException("Element name (" + element.getName()
+                        + ") should be " + name +".");
             }
         }
 

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-19 15:15:50 UTC (rev 32148)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/NurseRoster.java	2010-03-19 15:56:49 UTC (rev 32149)
@@ -22,6 +22,7 @@
 
     private List<Skill> skillList;
     private List<ShiftType> shiftTypeList;
+    private List<ShiftTypeSkillRequirement> shiftTypeSkillRequirementList;
 
     private List<NurseAssignment> nurseAssignmentList;
 
@@ -51,6 +52,14 @@
         this.shiftTypeList = shiftTypeList;
     }
 
+    public List<ShiftTypeSkillRequirement> getShiftTypeSkillRequirementList() {
+        return shiftTypeSkillRequirementList;
+    }
+
+    public void setShiftTypeSkillRequirementList(List<ShiftTypeSkillRequirement> shiftTypeSkillRequirementList) {
+        this.shiftTypeSkillRequirementList = shiftTypeSkillRequirementList;
+    }
+
     public List<NurseAssignment> getNurseAssignmentList() {
         return nurseAssignmentList;
     }
@@ -76,6 +85,7 @@
         List<Object> facts = new ArrayList<Object>();
         facts.add(skillList);
         facts.addAll(shiftTypeList);
+        facts.addAll(shiftTypeSkillRequirementList);
         // TODO add more properties
 
 
@@ -94,6 +104,7 @@
         clone.code = code;
         clone.skillList = skillList;
         clone.shiftTypeList = shiftTypeList;
+        clone.shiftTypeSkillRequirementList = shiftTypeSkillRequirementList;
         // TODO add more properties
 
 

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/ShiftType.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/ShiftType.java	2010-03-19 15:15:50 UTC (rev 32148)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/ShiftType.java	2010-03-19 15:56:49 UTC (rev 32149)
@@ -15,8 +15,6 @@
     private String endTimeString;
     private String description;
 
-    // TODO many2many to skill
-
     public String getCode() {
         return code;
     }

Copied: labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/ShiftTypeSkillRequirement.java (from rev 32055, labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/Skill.java)
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/ShiftTypeSkillRequirement.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/domain/ShiftTypeSkillRequirement.java	2010-03-19 15:56:49 UTC (rev 32149)
@@ -0,0 +1,44 @@
+package org.drools.planner.examples.nurserostering.domain;
+
+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("ShiftTypeSkillRequirement")
+public class ShiftTypeSkillRequirement extends AbstractPersistable implements Comparable<ShiftTypeSkillRequirement> {
+
+    private ShiftType shiftType;
+    private Skill skill;
+
+    public ShiftType getShiftType() {
+        return shiftType;
+    }
+
+    public void setShiftType(ShiftType shiftType) {
+        this.shiftType = shiftType;
+    }
+
+    public Skill getSkill() {
+        return skill;
+    }
+
+    public void setSkill(Skill skill) {
+        this.skill = skill;
+    }
+
+    public int compareTo(ShiftTypeSkillRequirement other) {
+        return new CompareToBuilder()
+                .append(shiftType, other.shiftType)
+                .append(skill, other.skill)
+                .toComparison();
+    }
+
+    @Override
+    public String toString() {
+        return shiftType + "-" + skill;
+    }
+
+}

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-19 15:15:50 UTC (rev 32148)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-examples/src/main/java/org/drools/planner/examples/nurserostering/persistence/NurseRosteringInputConverter.java	2010-03-19 15:56:49 UTC (rev 32149)
@@ -8,17 +8,15 @@
 import java.util.List;
 import java.util.Map;
 
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
 import org.drools.planner.core.solution.Solution;
 import org.drools.planner.examples.common.persistence.AbstractInputConverter;
 import org.drools.planner.examples.common.persistence.AbstractTxtInputConverter;
 import org.drools.planner.examples.common.persistence.AbstractXmlInputConverter;
 import org.drools.planner.examples.nurserostering.domain.NurseRoster;
+import org.drools.planner.examples.nurserostering.domain.ShiftType;
+import org.drools.planner.examples.nurserostering.domain.ShiftTypeSkillRequirement;
 import org.drools.planner.examples.nurserostering.domain.Skill;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
+import org.jdom.Element;
 
 /**
  * @author Geoffrey De Smet
@@ -40,26 +38,77 @@
     public class NurseRosteringInputBuilder extends XmlInputBuilder {
 
         public Solution readSolution() throws IOException {
+            // Note: javax.xml is terrible. JDom is much much easier.
+
+            Element schedulingPeriodElement = document.getRootElement();
+            // TODO verify root node name
             NurseRoster nurseRoster = new NurseRoster();
             nurseRoster.setId(0L);
+            nurseRoster.setCode(schedulingPeriodElement.getAttribute("ID").getValue());
 
-            Node schedulingPeriodNode = document.getChildNodes().item(0);
-            nurseRoster.setCode(schedulingPeriodNode.getAttributes().getNamedItem("ID").getNodeValue());
-            Node skillsNode = schedulingPeriodNode.getChildNodes().item(5);
-            assertNodeName(skillsNode, "Skills");
-            NodeList skillNodeList = skillsNode.getChildNodes();
-            List<Skill> skillList = new ArrayList<Skill>(skillNodeList.getLength());
-            for (int i = 1; i < skillNodeList.getLength(); i += 2) {
-                Node skillNode = skillNodeList.item(i);
-                assertNodeName(skillNode, "Skill");
+            // TODO StartDate EndDate
+
+            Map<String, Skill> skillMap = readSkillList(nurseRoster, schedulingPeriodElement.getChild("Skills"));
+            readShiftTypeList(nurseRoster, skillMap, schedulingPeriodElement.getChild("ShiftTypes"));
+
+            return nurseRoster;
+        }
+
+        private Map<String, Skill> readSkillList(NurseRoster nurseRoster, Element skillsElement) {
+            List<Element> skillElementList = (List<Element>) skillsElement.getChildren();
+            List<Skill> skillList = new ArrayList<Skill>(skillElementList.size());
+            Map<String, Skill> skillMap = new HashMap<String, Skill>(skillElementList.size());
+            long id = 0L;
+            for (Element skillElement : skillElementList) {
+                assertElementName(skillElement, "Skill");
                 Skill skill = new Skill();
-                skill.setId((long) i);
-                skill.setCode(skillNode.getTextContent());
+                skill.setId(id);
+                skill.setCode(skillElement.getText());
                 skillList.add(skill);
+                skillMap.put(skill.getCode(), skill);
+                id++;
             }
             nurseRoster.setSkillList(skillList);
+            return skillMap;
+        }
 
-            return nurseRoster;
+        private void readShiftTypeList(NurseRoster nurseRoster, Map<String, Skill> skillMap,
+                Element shiftTypesElement) {
+            List<Element> shiftElementList = (List<Element>) shiftTypesElement.getChildren();
+            List<ShiftType> shiftTypeList = new ArrayList<ShiftType>(shiftElementList.size());
+            long id = 0L;
+            List<ShiftTypeSkillRequirement> shiftTypeSkillRequirementList
+                    = new ArrayList<ShiftTypeSkillRequirement>(shiftElementList.size() * 2);
+            long shiftTypeSkillRequirementId = 0L;
+            for (Element shiftElement : shiftElementList) {
+                assertElementName(shiftElement, "Shift");
+                ShiftType shiftType = new ShiftType();
+                shiftType.setId(id);
+                shiftType.setCode(shiftElement.getAttribute("ID").getValue());
+                shiftType.setStartTimeString(shiftElement.getChild("StartTime").getText());
+                shiftType.setEndTimeString(shiftElement.getChild("EndTime").getText());
+                shiftType.setDescription(shiftElement.getChild("Description").getText());
+
+                List<Element> skillElementList = (List<Element>) shiftElement.getChild("Skills").getChildren();
+                for (Element skillElement : skillElementList) {
+                    assertElementName(skillElement, "Skill");
+                    ShiftTypeSkillRequirement shiftTypeSkillRequirement = new ShiftTypeSkillRequirement();
+                    shiftTypeSkillRequirement.setId(shiftTypeSkillRequirementId);
+                    shiftTypeSkillRequirement.setShiftType(shiftType);
+                    Skill skill = skillMap.get(skillElement.getText());
+                    if (skill == null) {
+                        throw new IllegalArgumentException("The skill (" + skillElement.getText()
+                                + ") of shiftType (" + shiftType.getCode() + ") does not exist.");
+                    }
+                    shiftTypeSkillRequirement.setSkill(skill);
+                    shiftTypeSkillRequirementList.add(shiftTypeSkillRequirement);
+                    shiftTypeSkillRequirementId++;
+                }
+                shiftTypeList.add(shiftType);
+                id++;
+            }
+            nurseRoster.setShiftTypeList(shiftTypeList);
+            nurseRoster.setShiftTypeSkillRequirementList(shiftTypeSkillRequirementList);
         }
 
     }



More information about the jboss-svn-commits mailing list