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.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.XmlTransient; 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.JsonCalendarDeserializerAdapter; import no.niths.domain.adapter.JsonCalendarSerializerAdapter; import no.niths.domain.adapter.XmlCalendarAdapter; import no.niths.domain.location.Location; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; /** * Domain class for Event * * <p> * Event has these variables: name = example Eksamen i PG2100, description = * example Skriftlig, startTime = example 9:00, endTime = example 12:00, tags = * example none * </p> * <p> * And relations too: Committee, Location * </p> * <p> * Holds information about an event. Supports tags, for example all events * belonging to fadderuka 2012, gets the tag fadderuka12. * </p> * */ @XmlRootElement @Entity @Table(name = DomainConstantNames.EVENTS) @XmlAccessorType(XmlAccessType.FIELD) @JsonSerialize(include = Inclusion.NON_NULL) public class Event implements Domain { @Transient private static final long serialVersionUID = 1878727682733503699L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) @Pattern( regexp = ValidationConstants.REGULAR, message = "Invalid name (should be 2 - 80 alphanumeric letters)") private String name; @Column @Pattern( regexp = ValidationConstants.LARGE, message = "Invalid desc (should be 2 - 500 alphanumeric letters)") private String description; @Column(name = "startTime") @Temporal(TemporalType.TIMESTAMP) @XmlSchemaType(name = "date") @XmlJavaTypeAdapter(XmlCalendarAdapter.class) @XmlElement(name = "starttime") private Calendar startTime; @Column(name = "endTime") @Temporal(TemporalType.TIMESTAMP) @XmlSchemaType(name = "date") @XmlJavaTypeAdapter(XmlCalendarAdapter.class) @XmlElement(name = "endtime") private Calendar endTime; @Column(name = "tags") private String tags; @JsonIgnore @XmlTransient @ManyToMany(fetch = FetchType.LAZY, targetEntity = Committee.class) @Cascade(CascadeType.ALL) @JoinTable(name = "committees_events", joinColumns = @JoinColumn(name = "events_id"), inverseJoinColumns = @JoinColumn(name = "committees_id")) private List<Committee> committees = new ArrayList<Committee>(); @ManyToOne(fetch = FetchType.LAZY) @JoinTable(name = "events_location", joinColumns = @JoinColumn(name = "events_id"), inverseJoinColumns = @JoinColumn(name = "location_id")) @Cascade(value = CascadeType.ALL) private Location location; public Event() { this(null, null, null, null); setCommittees(null); setLocation(null); } public Event(String name) { this.name = name; } public Event(Long id, String name, String description, GregorianCalendar startTime, GregorianCalendar endTime) { setId(id); setName(name); setDescription(description); setEndTime(endTime); setStartTime(startTime); } public Event(String name, String description, GregorianCalendar startTime, GregorianCalendar endTime) { setName(name); setDescription(description); setEndTime(endTime); setStartTime(startTime); } public Event(String name, String description, GregorianCalendar startTime, GregorianCalendar endTime, String tags) { setName(name); setDescription(description); setEndTime(endTime); setStartTime(startTime); setTags(tags); } public Event(Long eventId) { setId(eventId); } 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 getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public boolean equals(Object obj) { if (!(obj instanceof Event)) { return false; } Event s = (Event) obj; return s == this ? true : s.getId() == id ? true : false; } @JsonIgnore public boolean isEmpty() { return description == null && name == null && id == null && endTime == null && startTime == null; } @Override public String toString() { return String.format("[%s][%s][%s][%s][%s]", id, name, description, tags, startTime, endTime); } @JsonSerialize(using = JsonCalendarSerializerAdapter.class) public Calendar getEndTime() { return endTime; } @JsonDeserialize(using = JsonCalendarDeserializerAdapter.class) public void setEndTime(Calendar endTime) { this.endTime = endTime; } @JsonSerialize(using = JsonCalendarSerializerAdapter.class) public Calendar getStartTime() { return startTime; } @JsonDeserialize(using = JsonCalendarDeserializerAdapter.class) public void setStartTime(Calendar startTime) { this.startTime = startTime; } public String getTags() { return tags; } public void setTags(String tags) { this.tags = tags; } public List<Committee> getCommittees() { return committees; } public void setCommittees(List<Committee> committees) { this.committees = committees; } @JsonSerialize(as = Location.class) public Location getLocation() { return location; } public void setLocation(Location location) { this.location = location; } }