001 package net.sf.cpsolver.exam.model;
002
003 /**
004 * Representation of a period placement of an exam. It contains a period {@link ExamPeriod} and a penalty
005 * associated with a placement of an exam into the given period.
006 * <br><br>
007 *
008 * @version
009 * ExamTT 1.1 (Examination Timetabling)<br>
010 * Copyright (C) 2008 Tomáš Müller<br>
011 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
012 * Lazenska 391, 76314 Zlin, Czech Republic<br>
013 * <br>
014 * This library is free software; you can redistribute it and/or
015 * modify it under the terms of the GNU Lesser General Public
016 * License as published by the Free Software Foundation; either
017 * version 2.1 of the License, or (at your option) any later version.
018 * <br><br>
019 * This library is distributed in the hope that it will be useful,
020 * but WITHOUT ANY WARRANTY; without even the implied warranty of
021 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
022 * Lesser General Public License for more details.
023 * <br><br>
024 * You should have received a copy of the GNU Lesser General Public
025 * License along with this library; if not, write to the Free Software
026 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
027 */
028 public class ExamPeriodPlacement implements Comparable {
029 private ExamPeriod iPeriod;
030 private int iPenalty;
031
032 /**
033 * Constructor
034 * @param period examination period that is available for an exam and that is of enough length
035 * @param penalty period penalty for given exam
036 */
037 public ExamPeriodPlacement(ExamPeriod period, int penalty) {
038 iPeriod = period;
039 iPenalty = penalty;
040 }
041
042 /** Examination period */
043 public ExamPeriod getPeriod() { return iPeriod; }
044
045 /** Examination period id */
046 public Long getId() { return getPeriod().getId(); }
047
048 /** Examination period index */
049 public int getIndex() { return getPeriod().getIndex(); }
050
051 /** Examination period penalty (for an assignment of this period to the given exam {@link Exam#getPeriodPlacements()})
052 * @return given penalty plus global period penalty {@link ExamPeriod#getPenalty()}
053 */
054 public int getPenalty() { return iPenalty + iPeriod.getPenalty(); }
055
056 /**
057 * Hash code
058 */
059 public int hashCode() {
060 return getPeriod().hashCode();
061 }
062
063 public String toString() {
064 return getPeriod().toString()+(getPenalty()==0?"":"/"+getPenalty());
065 }
066
067 /** Compare two room placements for equality */
068 public boolean equals(Object o) {
069 if (o==null) return false;
070 if (o instanceof ExamPeriodPlacement) {
071 return getPeriod().equals(((ExamPeriodPlacement)o).getPeriod());
072 } else if (o instanceof ExamPeriod) {
073 return getPeriod().equals(o);
074 }
075 return false;
076 }
077
078 /** Compare two period placements */
079 public int compareTo(Object o) {
080 if (o==null || !(o instanceof ExamPeriodPlacement)) return -1;
081 return getPeriod().compareTo(((ExamPeriodPlacement)o).getPeriod());
082 }
083 }