package org.atlasapi.persistence.topic; import java.math.BigInteger; import java.util.UUID; import org.atlasapi.media.entity.Topic; import org.atlasapi.messaging.v3.EntityUpdatedMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.primitives.Longs; import com.metabroadcast.common.ids.NumberToShortStringCodec; import com.metabroadcast.common.ids.SubstitutionTableNumberCodec; import com.metabroadcast.common.queue.MessageSender; import com.metabroadcast.common.time.SystemClock; import com.metabroadcast.common.time.Timestamper; public class MessageQueueingTopicWriter extends ForwardingTopicStore { private static final Logger log = LoggerFactory.getLogger(MessageQueueingTopicWriter.class); private final MessageSender<EntityUpdatedMessage> sender; private final TopicStore delegate; private final Timestamper clock; private final NumberToShortStringCodec entityIdCodec = SubstitutionTableNumberCodec.lowerCaseOnly(); public MessageQueueingTopicWriter(MessageSender<EntityUpdatedMessage> sender, TopicStore delegate) { this.sender = sender; this.delegate = delegate; this.clock = new SystemClock(); } @Override protected TopicStore delegate() { return delegate; } @Override public void write(final Topic topic) { delegate.write(topic); try { sender.sendMessage(createEntityUpdatedMessage(topic), Longs.toByteArray(topic.getId())); } catch (Exception e) { log.error("update message failed: " + topic, e); } } private EntityUpdatedMessage createEntityUpdatedMessage(Topic topic) { return new EntityUpdatedMessage( UUID.randomUUID().toString(), clock.timestamp(), entityIdCodec.encode(BigInteger.valueOf(topic.getId())), topic.getClass().getSimpleName().toLowerCase(), topic.getPublisher().key()); } }