    001package net.sf.cpsolver.exam.model;
    002
    003/**
    004 * Representation of a room placement of an exam. It contains a room
    005 * {@link ExamRoom} and a penalty associated with a placement of an exam into
    006 * the given room. <br>
    007 * <br>
    008 *
    009 * @version ExamTT 1.2 (Examination Timetabling)<br>
    010 *          Copyright (C) 2008 - 2010 Tomáš Müller<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 */
    028public class ExamRoomPlacement implements Comparable<ExamRoomPlacement> {
    029    private ExamRoom iRoom;
    030    private int iPenalty = 0;
    031    private int iMaxPenalty = 100;
    032
    033    /**
    034     * Constructor
    035     *
    036     * @param room
    037     *            examination room
    038     */
    039    public ExamRoomPlacement(ExamRoom room) {
    040        iRoom = room;
    041    }
    042
    043    /**
    044     * Constructor
    045     *
    046     * @param room
    047     *            examination room
    048     * @param penalty
    049     *            penalty for using this room
    050     */
    051    public ExamRoomPlacement(ExamRoom room, int penalty) {
    052        this(room);
    053        iPenalty = penalty;
    054    }
    055
    056    /**
    057     * Constructor
    058     *
    059     * @param room
    060     *            examination room
    061     * @param penalty
    062     *            penalty for using this room
    063     * @param maxPenalty
    064     *            maximal penalty imposed of
    065     *            {@link ExamRoom#getPenalty(ExamPeriod)}, i.e., a placement
    066     *            with greater penalty is not allowed to be made
    067     */
    068    public ExamRoomPlacement(ExamRoom room, int penalty, int maxPenalty) {
    069        this(room, penalty);
    070        iMaxPenalty = maxPenalty;
    071    }
    072
    073    /** Examination room */
    074    public ExamRoom getRoom() {
    075        return iRoom;
    076    }
    077
    078    /** Examination room id */
    079    public long getId() {
    080        return getRoom().getId();
    081    }
    082
    083    /** Examination room name */
    084    public String getName() {
    085        return getRoom().getName();
    086    }
    087
    088    /** Examination room availability */
    089    public boolean isAvailable(ExamPeriod period) {
    090        return iRoom.isAvailable(period) && iRoom.getPenalty(period) <= iMaxPenalty;
    091    }
    092
    093    /**
    094     * Penalty for assignment of an exam into this room
    095     * {@link Exam#getRoomPlacements()}
    096     */
    097    public int getPenalty() {
    098        return iPenalty;
    099    }
    100
    101    /**
    102     * Maximal penalty imposed of {@link ExamRoom#getPenalty(ExamPeriod)}, i.e.,
    103     * a placement with greater penalty is not allowed to be made
    104     */
    105    public int getMaxPenalty() {
    106        return iMaxPenalty;
    107    }
    108
    109    /**
    110     * Penalty for assignment of an exam into this room
    111     * {@link Exam#getRoomPlacements()}
    112     */
    113    public void setPenalty(int penalty) {
    114        iPenalty = penalty;
    115    }
    116
    117    /**
    118     * Maximal penalty imposed of {@link ExamRoom#getPenalty(ExamPeriod)}, i.e.,
    119     * a placement with greater penalty is not allowed to be made
    120     */
    121    public void setMaxPenalty(int maxPenalty) {
    122        iMaxPenalty = maxPenalty;
    123    }
    124
    125    /**
    126     * Penalty for assignment of an exam into this room
    127     * {@link Exam#getRoomPlacements()} and the given examination period
    128     *
    129     * @return {@link ExamRoomPlacement#getPenalty()} +
    130     *         {@link ExamRoom#getPenalty(ExamPeriod)}
    131     */
    132    public int getPenalty(ExamPeriod period) {
    133        return 2 * iPenalty + iRoom.getPenalty(period);
    134        // return (iPenalty != 0 ? iPenalty : iRoom.getPenalty(period));
    135    }
    136
    137    /**
    138     * Room size
    139     *
    140     * @param altSeating
    141     *            examination seeting (pass {@link Exam#hasAltSeating()})
    142     * @return room size or room alternative size, based on given seating
    143     */
    144    public int getSize(boolean altSeating) {
    145        return (altSeating ? getRoom().getAltSize() : getRoom().getSize());
    146    }
    147
    148    /**
    149     * Room distance
    150     *
    151     * @return appropriate {@link ExamRoom#getDistanceInMeters(ExamRoom)}
    152     */
    153    public double getDistanceInMeters(ExamRoomPlacement other) {
    154        return getRoom().getDistanceInMeters(other.getRoom());
    155    }
    156
    157    /**
    158     * Hash code
    159     */
    160    @Override
    161    public int hashCode() {
    162        return getRoom().hashCode();
    163    }
    164
    165    @Override
    166    public String toString() {
    167        return getRoom().toString() + (getPenalty() == 0 ? "" : "/" + getPenalty());
    168    }
    169
    170    /** Compare two room placements for equality */
    171    @Override
    172    public boolean equals(Object o) {
    173        if (o == null)
    174            return false;
    175        if (o instanceof ExamRoomPlacement) {
    176            return getRoom().equals(((ExamRoomPlacement) o).getRoom());
    177        } else if (o instanceof ExamRoom) {
    178            return getRoom().equals(o);
    179        }
    180        return false;
    181    }
    182
    183    /** Compare two room placements */
    184    @Override
    185    public int compareTo(ExamRoomPlacement o) {
    186        return getRoom().compareTo(o.getRoom());
    187    }
    188}