001 package net.sf.cpsolver.exam.model;
002
003 /**
004 * Representation of a period placement of an exam. It contains a period
005 * {@link ExamPeriod} and a penalty associated with a placement of an exam into
006 * the given period. <br>
007 * <br>
008 *
009 * @version ExamTT 1.2 (Examination Timetabling)<br>
010 * Copyright (C) 2008 - 2010 Tomas Muller<br>
011 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
012 * <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
013 * <br>
014 * This library is free software; you can redistribute it and/or modify
015 * it under the terms of the GNU Lesser General Public License as
016 * published by the Free Software Foundation; either version 3 of the
017 * License, or (at your option) any later version. <br>
018 * <br>
019 * This library is distributed in the hope that it will be useful, but
020 * 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. <br>
023 * <br>
024 * You should have received a copy of the GNU Lesser General Public
025 * License along with this library; if not see
026 * <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
027 */
028 public class ExamPeriodPlacement implements Comparable<ExamPeriodPlacement> {
029 private ExamPeriod iPeriod;
030 private int iPenalty;
031
032 /**
033 * Constructor
034 *
035 * @param period
036 * examination period that is available for an exam and that is
037 * of enough length
038 * @param penalty
039 * period penalty for given exam
040 */
041 public ExamPeriodPlacement(ExamPeriod period, int penalty) {
042 iPeriod = period;
043 iPenalty = penalty;
044 }
045
046 /** Examination period */
047 public ExamPeriod getPeriod() {
048 return iPeriod;
049 }
050
051 /** Examination period id */
052 public Long getId() {
053 return getPeriod().getId();
054 }
055
056 /** Examination period index */
057 public int getIndex() {
058 return getPeriod().getIndex();
059 }
060
061 /**
062 * Examination period penalty (for an assignment of this period to the given
063 * exam {@link Exam#getPeriodPlacements()})
064 *
065 * @return given penalty plus global period penalty
066 * {@link ExamPeriod#getPenalty()}
067 */
068 public int getPenalty() {
069 return 2 * iPenalty + iPeriod.getPenalty();
070 }
071
072 /**
073 * Period penalty for given exam
074 */
075 public int getExamPenalty() {
076 return iPenalty;
077 }
078
079 /**
080 * Hash code
081 */
082 @Override
083 public int hashCode() {
084 return getPeriod().hashCode();
085 }
086
087 @Override
088 public String toString() {
089 return getPeriod().toString() + (getPenalty() == 0 ? "" : "/" + getPenalty());
090 }
091
092 /** Compare two room placements for equality */
093 @Override
094 public boolean equals(Object o) {
095 if (o == null)
096 return false;
097 if (o instanceof ExamPeriodPlacement) {
098 return getPeriod().equals(((ExamPeriodPlacement) o).getPeriod());
099 } else if (o instanceof ExamPeriod) {
100 return getPeriod().equals(o);
101 }
102 return false;
103 }
104
105 /** Compare two period placements */
106 @Override
107 public int compareTo(ExamPeriodPlacement o) {
108 return getPeriod().compareTo(o.getPeriod());
109 }
110 }