/** * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.planner.examples.nurserostering.domain; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import com.thoughtworks.xstream.annotations.XStreamAlias; import org.apache.commons.lang.builder.HashCodeBuilder; import org.drools.planner.core.score.HardAndSoftScore; import org.drools.planner.core.score.Score; import org.drools.planner.core.solution.Solution; import org.drools.planner.examples.common.domain.AbstractPersistable; import org.drools.planner.examples.nurserostering.domain.contract.Contract; import org.drools.planner.examples.nurserostering.domain.contract.ContractLine; import org.drools.planner.examples.nurserostering.domain.contract.PatternContractLine; import org.drools.planner.examples.nurserostering.domain.request.DayOffRequest; import org.drools.planner.examples.nurserostering.domain.request.DayOnRequest; import org.drools.planner.examples.nurserostering.domain.request.ShiftOffRequest; import org.drools.planner.examples.nurserostering.domain.request.ShiftOnRequest; /** * @author Geoffrey De Smet */ @XStreamAlias("NurseRoster") public class NurseRoster extends AbstractPersistable implements Solution { private String code; private List<Skill> skillList; private List<ShiftType> shiftTypeList; private List<ShiftTypeSkillRequirement> shiftTypeSkillRequirementList; private List<Pattern> patternList; private List<Contract> contractList; private List<ContractLine> contractLineList; private List<PatternContractLine> patternContractLineList; private List<Employee> employeeList; private List<SkillProficiency> skillProficiencyList; private List<ShiftDate> shiftDateList; private List<Shift> shiftList; private List<DayOffRequest> dayOffRequestList; private List<DayOnRequest> dayOnRequestList; private List<ShiftOffRequest> shiftOffRequestList; private List<ShiftOnRequest> shiftOnRequestList; private List<Assignment> assignmentList; private HardAndSoftScore score; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public List<Skill> getSkillList() { return skillList; } public void setSkillList(List<Skill> skillList) { this.skillList = skillList; } public List<ShiftType> getShiftTypeList() { return shiftTypeList; } public void setShiftTypeList(List<ShiftType> shiftTypeList) { this.shiftTypeList = shiftTypeList; } public List<ShiftTypeSkillRequirement> getShiftTypeSkillRequirementList() { return shiftTypeSkillRequirementList; } public void setShiftTypeSkillRequirementList(List<ShiftTypeSkillRequirement> shiftTypeSkillRequirementList) { this.shiftTypeSkillRequirementList = shiftTypeSkillRequirementList; } public List<Pattern> getPatternList() { return patternList; } public void setPatternList(List<Pattern> patternList) { this.patternList = patternList; } public List<Contract> getContractList() { return contractList; } public void setContractList(List<Contract> contractList) { this.contractList = contractList; } public List<ContractLine> getContractLineList() { return contractLineList; } public void setContractLineList(List<ContractLine> contractLineList) { this.contractLineList = contractLineList; } public List<PatternContractLine> getPatternContractLineList() { return patternContractLineList; } public void setPatternContractLineList(List<PatternContractLine> patternContractLineList) { this.patternContractLineList = patternContractLineList; } public List<Employee> getEmployeeList() { return employeeList; } public void setEmployeeList(List<Employee> employeeList) { this.employeeList = employeeList; } public List<SkillProficiency> getSkillProficiencyList() { return skillProficiencyList; } public void setSkillProficiencyList(List<SkillProficiency> skillProficiencyList) { this.skillProficiencyList = skillProficiencyList; } public List<ShiftDate> getShiftDateList() { return shiftDateList; } public void setShiftDateList(List<ShiftDate> shiftDateList) { this.shiftDateList = shiftDateList; } public List<Shift> getShiftList() { return shiftList; } public void setShiftList(List<Shift> shiftList) { this.shiftList = shiftList; } public List<DayOffRequest> getDayOffRequestList() { return dayOffRequestList; } public void setDayOffRequestList(List<DayOffRequest> dayOffRequestList) { this.dayOffRequestList = dayOffRequestList; } public List<DayOnRequest> getDayOnRequestList() { return dayOnRequestList; } public void setDayOnRequestList(List<DayOnRequest> dayOnRequestList) { this.dayOnRequestList = dayOnRequestList; } public List<ShiftOffRequest> getShiftOffRequestList() { return shiftOffRequestList; } public void setShiftOffRequestList(List<ShiftOffRequest> shiftOffRequestList) { this.shiftOffRequestList = shiftOffRequestList; } public List<ShiftOnRequest> getShiftOnRequestList() { return shiftOnRequestList; } public void setShiftOnRequestList(List<ShiftOnRequest> shiftOnRequestList) { this.shiftOnRequestList = shiftOnRequestList; } public List<Assignment> getAssignmentList() { return assignmentList; } public void setAssignmentList(List<Assignment> assignmentList) { this.assignmentList = assignmentList; } public HardAndSoftScore getScore() { return score; } public void setScore(Score score) { this.score = (HardAndSoftScore) score; } public boolean isInitialized() { return (assignmentList != null); } public Collection<? extends Object> getFacts() { List<Object> facts = new ArrayList<Object>(); // TODO add RosterInfo as a property on NurseRoster facts.add(new RosterInfo(shiftDateList.get(0), shiftDateList.get(shiftDateList.size() - 1))); facts.addAll(skillList); facts.addAll(shiftTypeList); facts.addAll(shiftTypeSkillRequirementList); facts.addAll(patternList); facts.addAll(contractList); facts.addAll(contractLineList); facts.addAll(patternContractLineList); facts.addAll(employeeList); facts.addAll(skillProficiencyList); facts.addAll(shiftDateList); facts.addAll(shiftList); facts.addAll(dayOffRequestList); facts.addAll(dayOnRequestList); facts.addAll(shiftOffRequestList); facts.addAll(shiftOnRequestList); // TODO add more properties if (isInitialized()) { facts.addAll(assignmentList); } return facts; } /** * Clone will only deep copy the {@link #assignmentList}. */ public NurseRoster cloneSolution() { NurseRoster clone = new NurseRoster(); clone.id = id; clone.code = code; clone.skillList = skillList; clone.shiftTypeList = shiftTypeList; clone.shiftTypeSkillRequirementList = shiftTypeSkillRequirementList; clone.patternList = patternList; clone.contractList = contractList; clone.contractLineList = contractLineList; clone.patternContractLineList = patternContractLineList; clone.employeeList = employeeList; clone.skillProficiencyList = skillProficiencyList; clone.shiftDateList = shiftDateList; clone.shiftList = shiftList; clone.dayOffRequestList = dayOffRequestList; clone.dayOnRequestList = dayOnRequestList; clone.shiftOffRequestList = shiftOffRequestList; clone.shiftOnRequestList = shiftOnRequestList; List<Assignment> clonedAssignmentList = new ArrayList<Assignment>( assignmentList.size()); for (Assignment assignment : assignmentList) { Assignment clonedAssignment = assignment.clone(); clonedAssignmentList.add(clonedAssignment); } clone.assignmentList = clonedAssignmentList; clone.score = score; return clone; } public boolean equals(Object o) { if (this == o) { return true; } if (id == null || !(o instanceof NurseRoster)) { return false; } else { NurseRoster other = (NurseRoster) o; if (assignmentList.size() != other.assignmentList.size()) { return false; } for (Iterator<Assignment> it = assignmentList.iterator(), otherIt = other.assignmentList.iterator(); it.hasNext();) { Assignment assignment = it.next(); Assignment otherAssignment = otherIt.next(); // Notice: we don't use equals() if (!assignment.solutionEquals(otherAssignment)) { return false; } } return true; } } public int hashCode() { HashCodeBuilder hashCodeBuilder = new HashCodeBuilder(); for (Assignment assignment : assignmentList) { // Notice: we don't use hashCode() hashCodeBuilder.append(assignment.solutionHashCode()); } return hashCodeBuilder.toHashCode(); } }