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    }