package org.atlasapi.persistence.content; import static com.google.common.base.Preconditions.checkNotNull; import java.math.BigInteger; import java.util.UUID; import org.atlasapi.media.entity.ContentGroup; 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.SubstitutionTableNumberCodec; import com.metabroadcast.common.queue.MessageSender; import com.metabroadcast.common.queue.MessagingException; import com.metabroadcast.common.time.Timestamper; public class MessageQueuingContentGroupWriter implements ContentGroupWriter { private static final Logger log = LoggerFactory.getLogger(MessageQueuingContentGroupWriter.class); private final SubstitutionTableNumberCodec entityIdCodec = SubstitutionTableNumberCodec.lowerCaseOnly(); private final ContentGroupWriter delegate; private final MessageSender<EntityUpdatedMessage> messageSender; private final Timestamper clock; public MessageQueuingContentGroupWriter(ContentGroupWriter delegate, MessageSender<EntityUpdatedMessage> messageSender, Timestamper clock) { this.delegate = checkNotNull(delegate); this.messageSender = checkNotNull(messageSender); this.clock = checkNotNull(clock); } @Override public void createOrUpdate(ContentGroup group) { try { delegate.createOrUpdate(group); messageSender.sendMessage( createEntityUpdatedMessage(group), Longs.toByteArray(group.getId()) ); } catch (MessagingException e) { log.error("update message failed: " + group.toString(), e); } } private EntityUpdatedMessage createEntityUpdatedMessage(ContentGroup contentGroup) { return new EntityUpdatedMessage( UUID.randomUUID().toString(), clock.timestamp(), entityIdCodec.encode(BigInteger.valueOf(contentGroup.getId())), contentGroup.getClass().getSimpleName().toLowerCase(), contentGroup.getPublisher().key() ); } }