package uk.ac.cam.echo.server.models; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.map.annotate.JsonSerialize; import org.hibernate.annotations.Cascade; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import uk.ac.cam.echo.data.*; import uk.ac.cam.echo.server.HibernateUtil; import uk.ac.cam.echo.server.serializers.ConversationSerializer; import javax.persistence.*; import java.util.*; @JsonSerialize(using = ConversationSerializer.class) @Entity @Table(name="Conversation") public class ConversationModel extends BaseModel implements Conversation { public ConversationModel() { } private static String[] allowed = {"name", "conferenceId"}; @JsonCreator public ConversationModel(Map<String, Object> props) { super(props, allowed); } @Id @GeneratedValue(strategy= GenerationType.SEQUENCE, generator="ConversationIdSeq") @SequenceGenerator(name="ConversationIdSeq", sequenceName="Conversation_SEQ", allocationSize=1) private long id; private String name; @ManyToOne(targetEntity = ConferenceModel.class) private Conference conference; @ManyToMany(targetEntity = TagModel.class) @JoinTable(name="CONVERSATION_TAG", joinColumns = {@JoinColumn(name = "conversation_id")}, inverseJoinColumns = {@JoinColumn(name = "tag_id")}) private Set<Tag> tags; @OneToMany(targetEntity = MessageModel.class, mappedBy = "conversation") @OrderBy("timeStamp DESC") private List<Message> messages; @OneToMany(targetEntity = UserModel.class, mappedBy = "currentConversation") @Cascade({org.hibernate.annotations.CascadeType.ALL}) private Set<User> users; public long getId() { return id; } public void setId(long id) { this.id = id; } public void addUser(User u) { users.add(u); } public void removeUser(User u) { if (users.contains(u)) { users.remove(u); } } public void addMessage(Message m) { messages.add(m); } public List<Message> getSortedMessages() { List<Message> ret = HibernateUtil.getTransaction().createCriteria(MessageModel.class) .add(Restrictions.eq("conversation", this)).addOrder(Order.asc("timeStamp")).list(); return ret; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Tag> getTags() { return tags; } public void setTags(Set<Tag> tags) { this.tags = tags; } public List<Message> getMessages() { return messages; } public List<Message> getMessages(int n) { List<Message> ret = HibernateUtil.getTransaction().createCriteria(MessageModel.class) .add(Restrictions.eq("conversation", this)).addOrder(Order.desc("timeStamp")).setMaxResults(n).list(); Collections.reverse(ret); return ret; } public void setMessages(List<Message> messages) { this.messages = messages; } public Set<User> getUsers() { return users; } public Conference getConference() { return conference; } public void setConference(Conference conference) { this.conference = conference; } public void setUsers(Set<User> users) { this.users = users; } public void setConferenceId(Long id) { if (id != null && id != 0) setConference((Conference) HibernateUtil.getSession().load(ConferenceModel.class, id)); } }