package org.limewire.promotion.containers; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.limewire.util.StringUtils; /** * A container that extends the {@link MultiMessageContainer}, adding start and * end validity dates along with an enforcement of the types of messages that * will be contained within this message. */ public class BucketMessageContainer extends MultiMessageContainer { private static final String KEY_VALID_START = "vs"; private static final String KEY_VALID_END = "ve"; private static final String KEY_NAME = "vn"; private static final String KEY_BUCKET_NUMBER = "vu"; @Override public byte[] getType() { return StringUtils.toUTF8Bytes("BKIT"); } /** * Set a unique name for this bucket, such as "[0103]20080201", for future * lookups. Defaults to currentTimeMillis/1000. Cannot be null. */ public void setName(final String bucketName) { put(KEY_NAME, bucketName); } public String getName() { final String name = getString(KEY_NAME); if (name == null) { setName((System.currentTimeMillis() / 1000) + ""); return getName(); } return name; } /** * Sets the earliest valid start date for all contained promotion messages. * If a contained message also has a start date, the later of the two dates * will be the correct value. This date defaults to Date(Long.MAX_VALUE), so * this date must be set explicitly for this bucket to ever be valid. Cannot * be null. */ public void setValidStart(Date date) { put(KEY_VALID_START, date); } /** * @return the earliest valid start date for all contained promotion * messages. If never set, defaults to Date(Long.MAX_VALUE), so this * date must be set explicitly for this bucket to ever be valid. */ public Date getValidStart() { Date date = getDate(KEY_VALID_START); if (date == null) return new Date(Long.MAX_VALUE); return date; } /** * Sets the latest valid end date for all contained promotion messages. If a * contained message also has an end date, the earlier of the two dates will * be the correct value.This date defaults to Date(0), so this date must be * set explicitly for this bucket to ever be valid. Cannot be null. */ public void setValidEnd(Date date) { put(KEY_VALID_END, date); } /** * @return the earliest valid start date for all contained promotion * messages. If never set, defaults to Date(Long.MAX_VALUE), so this * date must be set explicitly for this bucket to ever be valid. */ public Date getValidEnd() { Date date = getDate(KEY_VALID_END); if (date == null) return new Date(0); return date; } /** * Overrides the super version to enforce via RTE that all messages are * instances of {@link PromotionMessageContainer}. * * @see MultiMessageContainer#setWrappedMessages(List) */ @Override public void setWrappedMessages(final List<MessageContainer> messages) { for (MessageContainer message : messages) { if (!(message instanceof PromotionMessageContainer)) throw new RuntimeException("All wrapped messages must be of type " + PromotionMessageContainer.class.getName()); } super.setWrappedMessages(messages); } /** * Wraps the {@link #getWrappedMessages()} method and returns a correctly * cast list, with any non- {@link PromotionMessageContainer} instances * filtered out of the list. */ public List<PromotionMessageContainer> getPromoMessages() { final List<PromotionMessageContainer> list = new ArrayList<PromotionMessageContainer>(); for (MessageContainer message : getWrappedMessages()) { if (message instanceof PromotionMessageContainer) list.add((PromotionMessageContainer) message); } return list; } /** * @param bucket records the bucket number that this collection of messages * represents */ public void setBucketNumber(int bucket) { put(KEY_BUCKET_NUMBER, bucket); } /** * @return the bucket number as set, or -1 if the bucket wasn't set or there * was a problem parsing. */ public int getBucketNumber() { Long num = getLong(KEY_BUCKET_NUMBER); if (num == null) return -1; return num.intValue(); } }