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    }