/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.dlect.model; import com.google.common.collect.ImmutableSortedSet; import java.util.Collection; import java.util.SortedSet; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import org.dlect.events.EventID; import org.dlect.events.listenable.EventBuilder; import org.dlect.model.helper.XmlListenable; /** * * @author lee */ @XmlAccessorType(XmlAccessType.FIELD) public class Semester extends XmlListenable<Semester> implements Comparable<Semester> { @XmlElement(name = "number") private int num; @XmlElement(name = "name") private String longName; @XmlElement(name = "prefix") private String coursePostfixName; @XmlElementWrapper(name = "subjects") @XmlElement(name = "subject") private final SortedSet<Subject> subjects; public Semester() { subjects = newWrappedListenableSortedSet(SemesterEventID.SUBJECT); } @Override public int compareTo(Semester o) { if (o == null) { return -1; } return Integer.compare(this.getNum(), o.getNum()); } public int getNum() { return num; } public void setNum(int num) { EventBuilder<Integer> b = event(SemesterEventID.NUMBER).before(getNum()); this.num = num; b.after(getNum()).fire(); } public String getLongName() { return longName; } public void setLongName(String longName) { EventBuilder<String> b = event(SemesterEventID.NUMBER).before(getLongName()); this.longName = longName; b.after(getLongName()).fire(); } public String getCoursePostfixName() { return coursePostfixName; } public void setCoursePostfixName(String coursePostfixName) { EventBuilder<String> b = event(SemesterEventID.NUMBER).before(getCoursePostfixName()); this.coursePostfixName = coursePostfixName; b.after(getCoursePostfixName()).fire(); } /** * An detached immutable copy of the subjects in this semester. The subjects are not copied so any changes made to * the subjects contained in this list will affect the objects stored in this object. * * @return An immutable copy of the subjects in this semester. */ public ImmutableSortedSet<Subject> getSubjects() { return copyOf(subjects); } /** * Store only these subjects in this semester objects. This function will fire events correctly. * * @param subjects The set of subjects to copy and store in this semester. */ public void setSubjects(Collection<Subject> subjects) { setSet(this.subjects, subjects); } @Override public String toString() { return "Semester{" + "num=" + getNum() + ", longName=" + getLongName() + ", coursePostfixName=" + getCoursePostfixName() + ", subject=" + getSubjects() + '}'; } /** * The Event IDs for the semester object. */ public static enum SemesterEventID implements EventID { /** * An event representing a change in the semester ID. This is the unique ID. */ NUMBER, /** * An event representing a change in the semester name. */ LONG_NAME, /** * An event representing a change in the semester's course prefix.. */ COURSE_PREFIX, /** * A <b>list</b> event representing a change in the subjects set contained in the semester object. */ SUBJECT; @Override public Class<?> getAppliedClass() { return Semester.class; } @Override public String getName() { return name(); } } }