001package net.sf.cpsolver.studentsct.model; 002 003import java.util.Collections; 004import java.util.HashSet; 005import java.util.Set; 006 007/** 008 * Representation of a course offering. A course offering contains id, subject 009 * area, course number and an instructional offering. <br> 010 * <br> 011 * Each instructional offering (see {@link Offering}) is offered under one or 012 * more course offerings. 013 * 014 * <br> 015 * <br> 016 * 017 * @version StudentSct 1.2 (Student Sectioning)<br> 018 * Copyright (C) 2007 - 2010 Tomáš Müller<br> 019 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br> 020 * <a href="http://muller.unitime.org">http://muller.unitime.org</a><br> 021 * <br> 022 * This library is free software; you can redistribute it and/or modify 023 * it under the terms of the GNU Lesser General Public License as 024 * published by the Free Software Foundation; either version 3 of the 025 * License, or (at your option) any later version. <br> 026 * <br> 027 * This library is distributed in the hope that it will be useful, but 028 * WITHOUT ANY WARRANTY; without even the implied warranty of 029 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 030 * Lesser General Public License for more details. <br> 031 * <br> 032 * You should have received a copy of the GNU Lesser General Public 033 * License along with this library; if not see 034 * <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>. 035 */ 036public class Course { 037 private long iId = -1; 038 private String iSubjectArea = null; 039 private String iCourseNumber = null; 040 private Offering iOffering = null; 041 private int iLimit = 0, iProjected = 0; 042 private double iEnrollmentWeight = 0.0; 043 private Set<Enrollment> iEnrollments = new HashSet<Enrollment>(); 044 private Set<CourseRequest> iRequests = Collections.synchronizedSet(new HashSet<CourseRequest>()); 045 private String iNote = null; 046 047 /** 048 * Constructor 049 * 050 * @param id 051 * course offering unique id 052 * @param subjectArea 053 * subject area (e.g., MA, CS, ENGL) 054 * @param courseNumber 055 * course number under the given subject area 056 * @param offering 057 * instructional offering which is offered under this course 058 * offering 059 */ 060 public Course(long id, String subjectArea, String courseNumber, Offering offering) { 061 iId = id; 062 iSubjectArea = subjectArea; 063 iCourseNumber = courseNumber; 064 iOffering = offering; 065 iOffering.getCourses().add(this); 066 } 067 068 /** 069 * Constructor 070 * 071 * @param id 072 * course offering unique id 073 * @param subjectArea 074 * subject area (e.g., MA, CS, ENGL) 075 * @param courseNumber 076 * course number under the given subject area 077 * @param offering 078 * instructional offering which is offered under this course 079 * offering 080 * @param limit 081 * course offering limit (-1 for unlimited) 082 * @param projected 083 * projected demand 084 */ 085 public Course(long id, String subjectArea, String courseNumber, Offering offering, int limit, int projected) { 086 iId = id; 087 iSubjectArea = subjectArea; 088 iCourseNumber = courseNumber; 089 iOffering = offering; 090 iOffering.getCourses().add(this); 091 iLimit = limit; 092 iProjected = projected; 093 } 094 095 /** Course offering unique id */ 096 public long getId() { 097 return iId; 098 } 099 100 /** Subject area */ 101 public String getSubjectArea() { 102 return iSubjectArea; 103 } 104 105 /** Course number */ 106 public String getCourseNumber() { 107 return iCourseNumber; 108 } 109 110 /** Course offering name: subject area + course number */ 111 public String getName() { 112 return iSubjectArea + " " + iCourseNumber; 113 } 114 115 @Override 116 public String toString() { 117 return getName(); 118 } 119 120 /** Instructional offering which is offered under this course offering. */ 121 public Offering getOffering() { 122 return iOffering; 123 } 124 125 /** Course offering limit */ 126 public int getLimit() { 127 return iLimit; 128 } 129 130 /** Set course offering limit */ 131 public void setLimit(int limit) { 132 iLimit = limit; 133 } 134 135 /** Course offering projected number of students */ 136 public int getProjected() { 137 return iProjected; 138 } 139 140 /** Called when an enrollment with this course is assigned to a request */ 141 public void assigned(Enrollment enrollment) { 142 iEnrollments.add(enrollment); 143 iEnrollmentWeight += enrollment.getRequest().getWeight(); 144 } 145 146 /** Called when an enrollment with this course is unassigned from a request */ 147 public void unassigned(Enrollment enrollment) { 148 iEnrollments.remove(enrollment); 149 iEnrollmentWeight -= enrollment.getRequest().getWeight(); 150 } 151 152 /** 153 * Enrollment weight -- weight of all requests that are enrolled into this course, 154 * excluding the given one. See 155 * {@link Request#getWeight()}. 156 */ 157 public double getEnrollmentWeight(Request excludeRequest) { 158 double weight = iEnrollmentWeight; 159 if (excludeRequest != null && excludeRequest.getAssignment() != null 160 && iEnrollments.contains(excludeRequest.getAssignment())) 161 weight -= excludeRequest.getWeight(); 162 return weight; 163 } 164 165 /** Set of assigned enrollments */ 166 public Set<Enrollment> getEnrollments() { 167 return iEnrollments; 168 } 169 170 /** Set of course requests requesting this course */ 171 public Set<CourseRequest> getRequests() { 172 return iRequests; 173 } 174 175 /** 176 * Course note 177 */ 178 public String getNote() { return iNote; } 179 180 /** 181 * Course note 182 */ 183 public void setNote(String note) { iNote = note; } 184 185 @Override 186 public boolean equals(Object o) { 187 if (o == null || !(o instanceof Course)) return false; 188 return getId() == ((Course)o).getId(); 189 } 190 191 @Override 192 public int hashCode() { 193 return (int) (iId ^ (iId >>> 32)); 194 } 195}