package no.niths.domain.school;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.Pattern;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import no.niths.common.constants.DomainConstantNames;
import no.niths.common.constants.ValidationConstants;
import no.niths.domain.Domain;
import no.niths.domain.location.Room;
import no.niths.domain.school.constants.Weekday;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
/**
* Domain class for Subject
*
* <p>
* Subject has these variables:
* name = example Java programmering 1 (must be unique),
* subjectCode = example PG2100 (must be unique),
* description = example innføring i Java,
* weekday = example monday,
* startTime = example 10:00,
* endTime = example 11:00
* </p>
* <p>
* And relations too:
* Student (as tutor),
* Room,
* Course,
* Exam
* </p>
*/
@XmlRootElement
@Entity
@Table(name = DomainConstantNames.SUBJECTS)
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
@XmlAccessorType(XmlAccessType.FIELD)
public class Subject implements Domain {
@Transient
private static final long serialVersionUID = 3477975219659800316L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
@Pattern(
regexp = ValidationConstants.REGULAR,
message = "Invalid name (should be 2 - 80 alphanumeric letters)")
private String name;
@Column(unique = true, name = "subject_code")
@Pattern(
regexp = ValidationConstants.REGULAR,
message = "Invalid name (should be 2 - 80 alphanumeric letters)")
@XmlElement(name="sibjectcode")
private String subjectCode;
@Column
@Pattern(
regexp = ValidationConstants.LARGE,
message = "Invalid name (should be 2 - 500 alphanumeric letters)")
private String description;
@Column
@Enumerated(EnumType.STRING)
private Weekday weekday;
@JsonSerialize(as = Room.class)
@ManyToOne(fetch = FetchType.LAZY)
@JoinTable(
name = "subjects_room",
joinColumns = @JoinColumn(name = "subjects_id"),
inverseJoinColumns = @JoinColumn(name = "room_id"))
private Room room;
@Column(name = "start_time")
@Pattern(
regexp = "(^$)|([0-2]{1}[0-9]{1}:[0-9]{2})",
message = "Not a valid time")
@XmlElement(name = "starttime")
private String startTime;
@Column(name = "end_time")
@Pattern(
regexp = "(^$)|([0-2]{1}[0-9]{1}:[0-9]{2})",
message = "Not a valid time")
@XmlElement(name = "endtime")
private String endTime;
@JsonIgnore
@XmlTransient
@ManyToMany(fetch = FetchType.LAZY, targetEntity = Course.class)
@JoinTable(
name = "courses_subjects",
joinColumns = @JoinColumn(name = "subjects_id"),
inverseJoinColumns = @JoinColumn(name = "courses_id"))
@Cascade(CascadeType.ALL)
private List<Course> courses = new ArrayList<Course>();
@JsonIgnore
@XmlTransient
@OneToMany(fetch = FetchType.LAZY, targetEntity= Exam.class)
@JoinTable(
name = "exam_subjects",
joinColumns = @JoinColumn(name = "subjects_id"),
inverseJoinColumns = @JoinColumn(name = "exams_id"))
@Cascade(CascadeType.ALL)
private List<Exam> exams = new ArrayList<Exam>();
@ManyToMany(fetch = FetchType.LAZY, targetEntity= Student.class)
@JoinTable(
name = "subjects_tutors",
joinColumns = @JoinColumn(name = "subjects_id"),
inverseJoinColumns = @JoinColumn(name = "tutors_id"))
@Cascade(CascadeType.ALL)
private List<Student> tutors = new ArrayList<Student>();
public Subject(){
this(null, null, null, null, null);
setExams(null);
setCourses(null);
setTutors(null);
}
public Subject(String name){
this(name,null, null, null,null);
}
public Subject(String name, String topicCode, String description,
String startTime, String endTime){
setName(name);
setSubjectCode(topicCode);
setDescription(description);
setStartTime(startTime);
setEndTime(endTime);
}
public Subject(Long subjectId) {
setId(subjectId);
}
@Override
public String toString() {
return String.format("[%s][%s][%s]", id, name, description);
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSubjectCode() {
return subjectCode;
}
public void setSubjectCode(String code) {
this.subjectCode = code;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Weekday getWeekday() {
return weekday;
}
public void setWeekday(Weekday weekday) {
this.weekday = weekday;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public List<Course> getCourses() {
return courses;
}
public void setCourses(List<Course> courses) {
this.courses = courses;
}
public List<Exam> getExams() {
return exams;
}
public void setExams(List<Exam> exams) {
this.exams = exams;
}
public List<Student> getTutors() {
return tutors;
}
public void setTutors(List<Student> tutors) {
this.tutors = tutors;
}
public Room getRoom() {
return room;
}
public void setRoom(Room room) {
this.room = room;
}
@Override
public boolean equals(Object that) {
if(!(that instanceof Subject)) return false;
Subject sub = (Subject) that;
return sub == this ? true : sub.getId() == id
? true : false;
}
}