package in.partake.model.dto; import in.partake.base.DateTime; import in.partake.base.TimeUtil; import org.apache.commons.lang.ObjectUtils; import org.codehaus.jackson.node.JsonNodeFactory; import org.codehaus.jackson.node.ObjectNode; import com.google.common.base.Strings; /** * Message を、「他に人に送る」ことを表現するクラス。 * * @author shinyak * */ public class MessageEnvelope extends PartakeModel<MessageEnvelope> { private String id; // Either of these messageId is set. private String userMessageId; private String twitterMessageId; private String userNotificationId; private int numTried; private DateTime lastTriedAt; private DateTime invalidAfter; private DateTime tryAfter; private DateTime createdAt; private DateTime modifiedAt; public static MessageEnvelope createForUserMessage(String id, String userMessageId, DateTime invalidAfter) { MessageEnvelope envelope = new MessageEnvelope(); envelope.id = id; envelope.userMessageId = userMessageId; envelope.numTried = 0; envelope.invalidAfter = invalidAfter; envelope.createdAt = TimeUtil.getCurrentDateTime(); return envelope; } public static MessageEnvelope createForTwitterMessage(String id, String twitterMessageId, DateTime invalidAfter) { MessageEnvelope envelope = new MessageEnvelope(); envelope.id = id; envelope.twitterMessageId = twitterMessageId; envelope.numTried = 0; envelope.invalidAfter = invalidAfter; envelope.createdAt = TimeUtil.getCurrentDateTime(); return envelope; } public static MessageEnvelope createForUserNotification(String id, String userNotificationId, DateTime invalidAfter) { MessageEnvelope envelope = new MessageEnvelope(); envelope.id = id; envelope.userNotificationId = userNotificationId; envelope.numTried = 0; envelope.invalidAfter = invalidAfter; envelope.createdAt = TimeUtil.getCurrentDateTime(); return envelope; } private MessageEnvelope() { } public MessageEnvelope(String id, String userMessageId, String twitterMessageId, String userNotificationId, int numTried, DateTime lastTriedAt, DateTime invalidAfter, DateTime tryAfter, DateTime createdAt, DateTime modifiedAt) { this.id = id; this.userMessageId = userMessageId; this.twitterMessageId = twitterMessageId; this.userNotificationId = userNotificationId; this.numTried = numTried; this.lastTriedAt = lastTriedAt; this.invalidAfter = invalidAfter; this.tryAfter = tryAfter; this.createdAt = createdAt; this.modifiedAt = modifiedAt; } public MessageEnvelope(MessageEnvelope envelope) { this(envelope.id, envelope.userMessageId, envelope.twitterMessageId, envelope.userNotificationId, envelope.numTried, envelope.lastTriedAt, envelope.invalidAfter, envelope.tryAfter, envelope.createdAt, envelope.modifiedAt); } public MessageEnvelope(ObjectNode json) { this.id = json.get("id").asText(); this.userMessageId = Strings.emptyToNull(json.path("userMessageId").asText()); this.twitterMessageId = Strings.emptyToNull(json.path("twitterMessageId").asText()); this.userNotificationId = Strings.emptyToNull(json.path("userNotificationId").asText()); this.numTried = json.get("numTried").asInt(); if (json.has("lastTriedAt")) this.lastTriedAt = new DateTime(json.get("lastTriedAt").asLong()); if (json.has("invalidAfter")) this.invalidAfter = new DateTime(json.get("invalidAfter").asLong()); if (json.has("tryAfter")) this.tryAfter = new DateTime(json.get("tryAfter").asLong()); if (json.has("createdAt")) this.createdAt = new DateTime(json.get("createdAt").asLong()); if (json.has("modifiedAt")) this.modifiedAt = new DateTime(json.get("modifiedAt").asLong()); } @Override public Object getPrimaryKey() { return id; } @Override public ObjectNode toJSON() { ObjectNode obj = new ObjectNode(JsonNodeFactory.instance); obj.put("id", id); if (userMessageId != null) obj.put("userMessageId", userMessageId); if (twitterMessageId != null) obj.put("twitterMessageId", twitterMessageId); if (userNotificationId != null) obj.put("userNotificationId", userNotificationId); obj.put("numTried", numTried); if (lastTriedAt != null) obj.put("lastTriedAt", lastTriedAt.getTime()); if (invalidAfter != null) obj.put("invalidAfter", invalidAfter.getTime()); if (tryAfter != null) obj.put("tryAfter", tryAfter.getTime()); if (createdAt != null) obj.put("createdAt", createdAt.getTime()); if (modifiedAt != null) obj.put("modifiedAt", modifiedAt.getTime()); return obj; } // ---------------------------------------------------------------------- // equals method @Override public boolean equals(Object obj) { if (!(obj instanceof MessageEnvelope)) { return false; } MessageEnvelope lhs = this; MessageEnvelope rhs = (MessageEnvelope) obj; if (!ObjectUtils.equals(lhs.id, rhs.id)) { return false; } if (!ObjectUtils.equals(lhs.userMessageId, rhs.userMessageId)) { return false; } if (!ObjectUtils.equals(lhs.twitterMessageId, rhs.twitterMessageId)) { return false; } if (!ObjectUtils.equals(lhs.userNotificationId, rhs.userNotificationId)) { return false; } if (!ObjectUtils.equals(lhs.numTried, rhs.numTried)) { return false; } if (!ObjectUtils.equals(lhs.lastTriedAt, rhs.lastTriedAt)) { return false; } if (!ObjectUtils.equals(lhs.invalidAfter, rhs.invalidAfter)) { return false; } if (!ObjectUtils.equals(lhs.tryAfter, rhs.tryAfter)) { return false; } if (!ObjectUtils.equals(lhs.createdAt, rhs.createdAt)) { return false; } if (!ObjectUtils.equals(lhs.modifiedAt, rhs.modifiedAt)) { return false; } return true; } @Override public int hashCode() { int code = 0; code = code * 37 + ObjectUtils.hashCode(id); code = code * 37 + ObjectUtils.hashCode(userMessageId); code = code * 37 + ObjectUtils.hashCode(twitterMessageId); code = code * 37 + ObjectUtils.hashCode(userNotificationId); code = code * 37 + ObjectUtils.hashCode(numTried); code = code * 37 + ObjectUtils.hashCode(lastTriedAt); code = code * 37 + ObjectUtils.hashCode(invalidAfter); code = code * 37 + ObjectUtils.hashCode(tryAfter); code = code * 37 + ObjectUtils.hashCode(createdAt); code = code * 37 + ObjectUtils.hashCode(modifiedAt); return code; } // ---------------------------------------------------------------------- // accessors public String getId() { return id; } public String getUserMessageId() { return userMessageId; } public String getTwitterMessageId() { return twitterMessageId; } public String getUserNotificationId() { return userNotificationId; } public int getNumTried() { return numTried; } public DateTime getLastTriedAt() { return lastTriedAt; } public DateTime getInvalidAfter() { return invalidAfter; } public DateTime getTryAfter() { return tryAfter; } public DateTime getCreatedAt() { return createdAt; } public DateTime getModifiedAt() { return modifiedAt; } public void updateForSendingFailure(DateTime retryAfter) { checkFrozen(); this.numTried += 1; this.lastTriedAt = TimeUtil.getCurrentDateTime(); this.tryAfter = retryAfter; } }