001 package net.sf.cpsolver.studentsct.reservation;
002
003 import net.sf.cpsolver.studentsct.model.Course;
004 import net.sf.cpsolver.studentsct.model.CourseRequest;
005 import net.sf.cpsolver.studentsct.model.Request;
006 import net.sf.cpsolver.studentsct.model.Student;
007
008 /**
009 * Course reservation. Students are matched based on their course requests.
010 *
011 * <br>
012 * <br>
013 *
014 * @version StudentSct 1.2 (Student Sectioning)<br>
015 * Copyright (C) 2007 - 2010 Tomas Muller<br>
016 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
017 * <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
018 * <br>
019 * This library is free software; you can redistribute it and/or modify
020 * it under the terms of the GNU Lesser General Public License as
021 * published by the Free Software Foundation; either version 3 of the
022 * License, or (at your option) any later version. <br>
023 * <br>
024 * This library is distributed in the hope that it will be useful, but
025 * WITHOUT ANY WARRANTY; without even the implied warranty of
026 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
027 * Lesser General Public License for more details. <br>
028 * <br>
029 * You should have received a copy of the GNU Lesser General Public
030 * License along with this library; if not see
031 * <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
032 */
033 public class CourseReservation extends Reservation {
034 private Course iCourse;
035
036 /**
037 * Constructor
038 * @param id unique id
039 * @param course course offering on which the reservation is set
040 */
041 public CourseReservation(long id, Course course) {
042 super(id, course.getOffering());
043 iCourse = course;
044 }
045
046 /**
047 * Curriculum reservation cannot go over the limit
048 */
049 @Override
050 public boolean canAssignOverLimit() {
051 return false;
052 }
053
054 /**
055 * Course reservation do not need to be used
056 */
057 @Override
058 public boolean mustBeUsed() {
059 return false;
060 }
061
062 /**
063 * Reservation limit (-1 for unlimited)
064 */
065 @Override
066 public double getReservationLimit() {
067 return iCourse.getLimit();
068 }
069
070 /**
071 * Reservation priority (lower than individual and group reservations)
072 */
073 @Override
074 public int getPriority() {
075 return 2;
076 }
077
078 /**
079 * Course offering
080 */
081 public Course getCourse() {
082 return iCourse;
083 }
084
085 /**
086 * Check the area, classifications and majors
087 */
088 @Override
089 public boolean isApplicable(Student student) {
090 for (Request r: student.getRequests()) {
091 if (r instanceof CourseRequest) {
092 for (Course course: ((CourseRequest) r).getCourses()) {
093 if (course.equals(getCourse())) return true;
094 }
095 }
096 }
097 return false;
098 }
099 }