001package net.sf.cpsolver.studentsct.reservation; 002 003import java.util.Collection; 004import java.util.HashSet; 005import java.util.Set; 006 007import net.sf.cpsolver.studentsct.model.AcademicAreaCode; 008import net.sf.cpsolver.studentsct.model.Offering; 009import net.sf.cpsolver.studentsct.model.Student; 010 011/** 012 * Curriculum reservation. Students are matched based on their academic area. 013 * If classifications and/or majors are included, student must match on them as well. 014 * 015 * <br> 016 * <br> 017 * 018 * @version StudentSct 1.2 (Student Sectioning)<br> 019 * Copyright (C) 2007 - 2010 Tomáš Müller<br> 020 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br> 021 * <a href="http://muller.unitime.org">http://muller.unitime.org</a><br> 022 * <br> 023 * This library is free software; you can redistribute it and/or modify 024 * it under the terms of the GNU Lesser General Public License as 025 * published by the Free Software Foundation; either version 3 of the 026 * License, or (at your option) any later version. <br> 027 * <br> 028 * This library is distributed in the hope that it will be useful, but 029 * WITHOUT ANY WARRANTY; without even the implied warranty of 030 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 031 * Lesser General Public License for more details. <br> 032 * <br> 033 * You should have received a copy of the GNU Lesser General Public 034 * License along with this library; if not see 035 * <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>. 036 */ 037public class CurriculumReservation extends Reservation { 038 private double iLimit; 039 private String iAcadArea; 040 private Set<String> iClassifications = new HashSet<String>(); 041 private Set<String> iMajors = new HashSet<String>(); 042 043 /** 044 * Constructor 045 * @param id unique id 046 * @param limit reservation limit (-1 for unlimited) 047 * @param offering instructional offering on which the reservation is set 048 * @param acadArea academic area 049 * @param classifications zero or more classifications (classifications must match if not empty) 050 * @param majors zero or more majors (majors must match if not empty) 051 */ 052 public CurriculumReservation(long id, double limit, Offering offering, String acadArea, Collection<String> classifications, Collection<String> majors) { 053 super(id, offering); 054 iLimit = limit; 055 iAcadArea = acadArea; 056 if (classifications != null) 057 iClassifications.addAll(classifications); 058 if (majors != null) 059 iMajors.addAll(majors); 060 } 061 062 /** 063 * Curriculum reservation cannot go over the limit 064 */ 065 @Override 066 public boolean canAssignOverLimit() { 067 return false; 068 } 069 070 /** 071 * Curriculum reservation do not need to be used 072 */ 073 @Override 074 public boolean mustBeUsed() { 075 return false; 076 } 077 078 /** 079 * Reservation limit (-1 for unlimited) 080 */ 081 @Override 082 public double getReservationLimit() { 083 return iLimit; 084 } 085 086 /** 087 * Set reservation limit (-1 for unlimited) 088 */ 089 public void setReservationLimit(double limit) { 090 iLimit = limit; 091 } 092 093 /** 094 * Reservation priority (lower than individual and group reservations) 095 */ 096 @Override 097 public int getPriority() { 098 return 3; 099 } 100 101 /** 102 * Academic area 103 */ 104 public String getAcademicArea() { 105 return iAcadArea; 106 } 107 108 /** 109 * Majors 110 */ 111 public Set<String> getMajors() { 112 return iMajors; 113 } 114 115 /** 116 * Academic classifications 117 */ 118 public Set<String> getClassifications() { 119 return iClassifications; 120 } 121 122 /** 123 * Check the area, classifications and majors 124 */ 125 @Override 126 public boolean isApplicable(Student student) { 127 boolean match = false; 128 if (student.getAcademicAreaClasiffications() == null) return false; 129 for (AcademicAreaCode aac: student.getAcademicAreaClasiffications()) { 130 if (getAcademicArea().equals(aac.getArea())) { 131 if (getClassifications().isEmpty() || getClassifications().contains(aac.getCode())) { 132 match = true; break; 133 } 134 } 135 } 136 if (!match) return false; 137 for (AcademicAreaCode aac: student.getMajors()) { 138 if (getAcademicArea().equals(aac.getArea())) { 139 if (getMajors().isEmpty() || getMajors().contains(aac.getCode())) 140 return true; 141 } 142 } 143 return getMajors().isEmpty(); 144 } 145 146 147}