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;
}
}