package no.niths.domain.school; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; 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.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; 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.XmlSchemaType; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import no.niths.common.constants.DomainConstantNames; import no.niths.common.constants.ValidationConstants; import no.niths.domain.Domain; import no.niths.domain.adapter.JsonCalendarSerializerAdapter; import no.niths.domain.adapter.XmlCalendarAdapter; import no.niths.domain.location.Room; import no.niths.domain.school.constants.ExamType; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.map.annotate.JsonSerialize; import org.hibernate.annotations.Cascade; /** * Domain class for Exam * * <p> * Exam has these variables: * name = example Eksamen i PG2100, * examType = example Skriftlig, * startTime = example 9:00, * endTime = example 12:00, * allowedAid = example none * </p> * <p> * And relations too: * Subject, * Room * </p> */ @XmlRootElement @Entity @Table(name = DomainConstantNames.EXAMS) @XmlAccessorType(XmlAccessType.FIELD) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Exam implements Domain { @Transient private static final long serialVersionUID = 3498003779752196516L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column @Pattern( regexp = ValidationConstants.REGULAR, message = "Invalid name (should be 2 -80 alphanumeric letters") private String name; @Column(name = "exam_type") @Enumerated(EnumType.STRING) @XmlElement(name="examtype") private ExamType examType; @Column(name="start_time") @Temporal(TemporalType.TIMESTAMP) @XmlSchemaType(name = "date") @XmlJavaTypeAdapter(XmlCalendarAdapter.class) @XmlElement(name="starttime") private Calendar startTime; @Column(name="end_time") @Temporal(TemporalType.TIMESTAMP) @XmlSchemaType(name = "date") @XmlJavaTypeAdapter(XmlCalendarAdapter.class) @XmlElement(name="endtime") private Calendar endTime; @Column(name="allowed_aid") @XmlElement(name="allowaid") private String allowedAid; @ManyToOne(fetch = FetchType.LAZY, targetEntity= Subject.class) @JoinTable(name = "exam_subjects", joinColumns = @JoinColumn(name = "exams_id"), inverseJoinColumns = @JoinColumn(name = "subjects_id")) @Cascade(org.hibernate.annotations.CascadeType.ALL) private Subject subject; @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "rooms_exams", joinColumns = @JoinColumn(name = "exams_id"), inverseJoinColumns = @JoinColumn(name = "room_id")) @Cascade(org.hibernate.annotations.CascadeType.ALL) private List<Room> rooms = new ArrayList<Room>(); public Exam(){ this(null,null,null,null,null); this.rooms = null; this.subject = null; } public Exam(String name) { this.name = name; } public Exam(String name, ExamType examType) { this.name = name; this.examType = examType; } public Exam( String name, ExamType examType, String allowedAid, GregorianCalendar startTime, GregorianCalendar endTime) { this.name = name; this.examType = examType; this.allowedAid = allowedAid; this.startTime = startTime; this.endTime = endTime; } 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 ExamType getExamType() { return examType; } public void setExamType(ExamType examType) { this.examType = examType; } public String getAllowedAid() { return allowedAid; } public void setAllowedAid(String allowedAid) { this.allowedAid = allowedAid; } @JsonSerialize(using = JsonCalendarSerializerAdapter.class) public Calendar getStartTime() { return startTime; } public void setStartTime(Calendar startTime) { this.startTime = startTime; } @JsonSerialize(using = JsonCalendarSerializerAdapter.class) public Calendar getEndTime() { return endTime; } public void setEndTime(Calendar endTime) { this.endTime = endTime; } public void setSubject(Subject subject) { this.subject = subject; } @JsonSerialize(as=Subject.class) public Subject getSubject() { return subject; } public void setRooms(List<Room> rooms) { this.rooms = rooms; } public List<Room> getRooms() { return rooms; } @Override public boolean equals(Object that) { if(!(that instanceof Exam)) return false; Exam exam = (Exam) that; return exam == this || exam.getId().equals(id); } @JsonIgnore public boolean isEmpty(){ return (id == null && name == null && examType == null && allowedAid == null && startTime == null && endTime == null); } @Override public String toString() { return String.format("[%s][%s][%s]", id, name, examType); } }