package in.partake.model.dto; import in.partake.base.DateTime; import in.partake.base.Util; import in.partake.model.dto.auxiliary.AttendanceStatus; import in.partake.model.dto.auxiliary.ModificationStatus; import in.partake.model.dto.auxiliary.ParticipationStatus; import java.util.List; import java.util.Map; import java.util.UUID; import org.apache.commons.lang.ObjectUtils; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.node.ArrayNode; import org.codehaus.jackson.node.JsonNodeFactory; import org.codehaus.jackson.node.ObjectNode; public class UserTicket extends PartakeModel<UserTicket> { private String id; private String userId; private UUID ticketId; private String eventId; // Note: this is a bit redundant, but this will reduce DB access a lot. private String comment; private ParticipationStatus status; private ModificationStatus modificationStatus; private AttendanceStatus attendanceStatus; private Map<UUID, List<String>> enqueteAnswers; private DateTime appliedAt; private DateTime createdAt; private DateTime modifiedAt; // ---------------------------------------------------------------------- // constructors public UserTicket(String id, String userId, UUID ticketId, String eventId, String comment, ParticipationStatus status, ModificationStatus modificationStatus, AttendanceStatus attendanceStatus, Map<UUID, List<String>> enqueteAnswers, DateTime appliedAt, DateTime createdAt, DateTime modifiedAt) { this.id = id; this.userId = userId; this.ticketId = ticketId; this.eventId = eventId; this.comment = comment; this.status = status; this.modificationStatus = modificationStatus; this.attendanceStatus = attendanceStatus; this.enqueteAnswers = enqueteAnswers; this.appliedAt = appliedAt; this.createdAt = createdAt; this.modifiedAt = modifiedAt; } public UserTicket(UserTicket p) { this(p.id, p.userId, p.ticketId, p.eventId, p.comment, p.status, p.modificationStatus, p.attendanceStatus, p.enqueteAnswers, p.appliedAt, p.createdAt, p.modifiedAt); } public UserTicket(ObjectNode obj) { this.id = obj.get("id").asText(); this.userId = obj.get("userId").asText(); this.ticketId = UUID.fromString(obj.get("ticketId").asText()); this.eventId = obj.get("eventId").asText(); this.comment = obj.get("comment").asText(); this.status = ParticipationStatus.safeValueOf(obj.get("status").asText()); this.modificationStatus = ModificationStatus.safeValueOf(obj.get("modificationStatus").asText()); this.attendanceStatus = AttendanceStatus.safeValueOf(obj.get("attendanceStatus").asText()); if (obj.has("enqueteAnswers")) { JsonNode map = obj.get("enqueteAnswers"); this.enqueteAnswers = Util.parseEnqueteAnswers(map); } this.appliedAt = new DateTime(obj.get("appliedAt").asLong()); this.createdAt = new DateTime(obj.get("createdAt").asLong()); if (obj.has("modifiedAt")) this.modifiedAt = new DateTime(obj.get("modifiedAt").asLong()); } @Override public Object getPrimaryKey() { return id; } @Override public ObjectNode toJSON() { ObjectNode obj = new ObjectNode(JsonNodeFactory.instance); obj.put("id", id); obj.put("userId", userId); obj.put("ticketId", ticketId.toString()); obj.put("eventId", eventId); obj.put("comment", comment); obj.put("status", status.toString()); obj.put("modificationStatus", modificationStatus.toString()); obj.put("attendanceStatus", attendanceStatus.toString()); if (enqueteAnswers != null && !enqueteAnswers.isEmpty()) { ObjectNode enqueteAnswers = new ObjectNode(JsonNodeFactory.instance); for (Map.Entry<UUID, List<String>> entry : this.enqueteAnswers.entrySet()) { ArrayNode array = enqueteAnswers.putArray(entry.getKey().toString()); for (String s : entry.getValue()) array.add(s); } obj.put("enqueteAnswers", enqueteAnswers); } obj.put("appliedAt", appliedAt.getTime()); obj.put("createdAt", createdAt.getTime()); if (modifiedAt != null) obj.put("modifiedAt", modifiedAt.getTime()); return obj; } // ---------------------------------------------------------------------- // equals method public boolean equals(Object obj) { if (!(obj instanceof UserTicket)) { return false; } UserTicket lhs = this; UserTicket rhs = (UserTicket) obj; if (!ObjectUtils.equals(lhs.id, rhs.id)) { return false; } if (!ObjectUtils.equals(lhs.userId, rhs.userId)) { return false; } if (!ObjectUtils.equals(lhs.ticketId, rhs.ticketId)) { return false; } if (!ObjectUtils.equals(lhs.eventId, rhs.eventId)) { return false; } if (!ObjectUtils.equals(lhs.comment, rhs.comment)) { return false; } if (!ObjectUtils.equals(lhs.status, rhs.status)) { return false; } if (!ObjectUtils.equals(lhs.modificationStatus, rhs.modificationStatus)) { return false; } if (!ObjectUtils.equals(lhs.attendanceStatus, rhs.attendanceStatus)) { return false; } if (!ObjectUtils.equals(lhs.enqueteAnswers, rhs.enqueteAnswers)) { return false; } if (!ObjectUtils.equals(lhs.appliedAt, rhs.appliedAt)) { return false; } if (!ObjectUtils.equals(lhs.createdAt, rhs.createdAt)) { return false; } if (!ObjectUtils.equals(lhs.modifiedAt, rhs.modifiedAt)) { return false; } return true; } public int hashCode() { int hashCode = 0; hashCode = hashCode * 37 + ObjectUtils.hashCode(id); hashCode = hashCode * 37 + ObjectUtils.hashCode(userId); hashCode = hashCode * 37 + ObjectUtils.hashCode(ticketId); hashCode = hashCode * 37 + ObjectUtils.hashCode(eventId); hashCode = hashCode * 37 + ObjectUtils.hashCode(comment); hashCode = hashCode * 37 + ObjectUtils.hashCode(status); hashCode = hashCode * 37 + ObjectUtils.hashCode(modificationStatus); hashCode = hashCode * 37 + ObjectUtils.hashCode(attendanceStatus); hashCode = hashCode * 37 + ObjectUtils.hashCode(enqueteAnswers); hashCode = hashCode * 37 + ObjectUtils.hashCode(appliedAt); hashCode = hashCode * 37 + ObjectUtils.hashCode(createdAt); hashCode = hashCode * 37 + ObjectUtils.hashCode(modifiedAt); return hashCode; } // ---------------------------------------------------------------------- // public String getId() { return id; } public String getUserId() { return userId; } public UUID getTicketId() { return ticketId; } public String getEventId() { return eventId; } public String getComment() { return comment; } public ParticipationStatus getStatus() { return status; } /** * 前回チェック時のステータス。ここは、 ENROLLED, NOT_ENROLLED のいずれかでなければならない。 * 変更時に、この値が ENROLLED -> NOT_ENROLLED もしくあh NOT_ENROLLED -> ENROLLED になっていれば、 * DM によって通知を出す。 * @return */ public ModificationStatus getModificationStatus() { return modificationStatus; } public AttendanceStatus getAttendanceStatus() { return attendanceStatus; } public Map<UUID, List<String>> getEnqueteAnswers() { return enqueteAnswers; } public DateTime getAppliedAt() { return appliedAt; } public DateTime getCreatedAt() { return createdAt; } public DateTime getModifiedAt() { return modifiedAt; } public void setId(String id) { checkFrozen(); this.id = id; } public void setUserId(String userId) { checkFrozen(); this.userId = userId; } public void setTicketId(UUID ticketId) { checkFrozen(); this.ticketId = ticketId; } public void setEventId(String eventId) { checkFrozen(); this.eventId = eventId; } public void setComment(String comment) { checkFrozen(); this.comment = comment; } public void setStatus(ParticipationStatus status) { checkFrozen(); this.status = status; } public void setModificationStatus(ModificationStatus lastStatus) { checkFrozen(); this.modificationStatus = lastStatus; } public void setAttendanceStatus(AttendanceStatus attendanceStatus) { checkFrozen(); this.attendanceStatus = attendanceStatus; } public void setEnqueteAnswers(Map<UUID, List<String>> enqueteAnswers) { checkFrozen(); this.enqueteAnswers = enqueteAnswers; } public void setAppliedAt(DateTime appliedAt) { checkFrozen(); this.appliedAt = appliedAt; } public void setCreatedAt(DateTime createdAt) { checkFrozen(); this.createdAt = createdAt; } public void setModifiedAt(DateTime modifiedAt) { checkFrozen(); this.modifiedAt = modifiedAt; } }