/* * 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.base.Objects; import com.google.common.collect.ImmutableSortedSet; import java.util.Collection; import java.util.SortedSet; import javax.annotation.Nonnull; 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.formatter.PlaylistFormat; import org.dlect.model.formatter.TagFormat; import org.dlect.model.helper.XmlListenable; /** * * @author lee */ @XmlAccessorType(XmlAccessType.FIELD) public class Subject extends XmlListenable<Subject> implements Comparable<Subject> { @XmlElement(name = "id") private String id; @XmlElement(name = "name") private String name; @XmlElement(name = "tagformat") private final TagFormat tagFormat; @XmlElement(name = "playlistformat") private final PlaylistFormat playlistFormat; @XmlElementWrapper(name = "lectures") @XmlElement(name = "lecture") private final SortedSet<Lecture> lectures; @XmlElementWrapper(name = "streams") @XmlElement(name = "stream") private final SortedSet<Stream> streams; public Subject() { lectures = newWrappedListenableSortedSet(SubjectEventID.LECTURE); streams = newWrappedListenableSortedSet(SubjectEventID.STREAM); tagFormat = new TagFormat(); playlistFormat = new PlaylistFormat(); } @Override public int compareTo(Subject o) { if (o == null) { // I am always greater than a null value. return 1; } int c_bbid = ordering().compare(this.getId(), o.getId()); int c_name = ordering().compare(this.getName(), o.getName()); if (c_bbid == 0) { return 0; // Equals consitent. } if (c_name == 0) { // Names are equal but BBIDs are not; use them to keep equals consitency. return c_bbid; } // Names and BBIDs not equal so use the name to get a nice sort. return c_name; } @Override public int hashCode() { return Objects.hashCode(this.id); } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Subject other = (Subject) obj; return Objects.equal(this.getId(), other.getId()); } public String getId() { return id; } public void setId(String bbid) { EventBuilder<String> b = event(SubjectEventID.ID).before(getId()); this.id = bbid; b.after(getId()).fire(); } public String getName() { return name; } public void setName(String name) { EventBuilder<String> b = event(SubjectEventID.NAME).before(getName()); this.name = name; b.after(getName()).fire(); } public ImmutableSortedSet<Lecture> getLectures() { return copyOf(lectures); } public void addLecture(Lecture l) { this.lectures.add(l); } public void setLectures(Collection<Lecture> lectures) { setSet(this.lectures, lectures); } public ImmutableSortedSet<Stream> getStreams() { return copyOf(streams); } public void addStream(Stream s) { this.streams.add(s); } public void setStreams(Collection<Stream> streams) { setSet(this.streams, streams); } @Nonnull public TagFormat getTagFormat() { return tagFormat; } public void setTagFormat(TagFormat format) { this.tagFormat.setFormats(format); } @Nonnull public PlaylistFormat getPlaylistFormat() { return playlistFormat; } public void setPlaylistFormat(PlaylistFormat format) { this.playlistFormat.setFormats(format); } @Override public String toString() { return "Subject{" + "id=" + id + ", name=" + name + ", tagFormat=" + tagFormat + ", playlistFormat=" + playlistFormat + ", lectures=" + lectures + ", streams=" + streams + '}'; } public static enum SubjectEventID implements EventID { ID, NAME, LECTURE, STREAM; @Override public Class<?> getAppliedClass() { return Subject.class; } @Override public String getName() { return name(); } } }