[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