package org.atlasapi.persistence.content.organisation; import static com.google.common.base.Preconditions.checkNotNull; import java.math.BigInteger; import java.util.UUID; import org.atlasapi.media.entity.Content; import org.atlasapi.media.entity.LookupRef; import org.atlasapi.media.entity.Organisation; import org.atlasapi.messaging.v3.EntityUpdatedMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Optional; import com.google.common.primitives.Longs; 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 QueueingOrganisationStore implements OrganisationStore { private final static Logger log = LoggerFactory.getLogger(QueueingOrganisationStore.class); private final OrganisationStore delegate; private final MessageSender<EntityUpdatedMessage> sender; private final SubstitutionTableNumberCodec entityIdCodec; private final Timestamper clock; public QueueingOrganisationStore(MessageSender<EntityUpdatedMessage> sender, OrganisationStore delegate) { this(checkNotNull(sender), checkNotNull(delegate), new SystemClock(), SubstitutionTableNumberCodec.lowerCaseOnly()); } public QueueingOrganisationStore(MessageSender<EntityUpdatedMessage> sender, OrganisationStore delegate, Timestamper timestamper, SubstitutionTableNumberCodec entityIdCodec) { this.delegate = checkNotNull(delegate); this.sender = checkNotNull(sender); this.clock = checkNotNull(timestamper); this.entityIdCodec = checkNotNull(entityIdCodec); } @Override public void updateOrganisationItems(Organisation organisation) { delegate.updateOrganisationItems(organisation); enqueueMessageUpdatedMessage(organisation); } @Override public void createOrUpdateOrganisation(Organisation organisation) { delegate.createOrUpdateOrganisation(organisation); enqueueMessageUpdatedMessage(organisation); } @Override public Optional<Organisation> organisation(String uri) { return delegate.organisation(uri); } @Override public Optional<Organisation> organisation(Long id) { return delegate.organisation(id); } @Override public Iterable<Organisation> organisations(Iterable<LookupRef> lookupRefs) { return delegate.organisations(lookupRefs); } private void enqueueMessageUpdatedMessage(final Organisation organisation) { try { EntityUpdatedMessage message = createEntityUpdatedMessage(organisation); sender.sendMessage(message, Longs.toByteArray(organisation.getId())); } catch (Exception e) { log.error("update message failed: " + organisation, e); } } private EntityUpdatedMessage createEntityUpdatedMessage(Organisation organisation) { return new EntityUpdatedMessage( UUID.randomUUID().toString(), clock.timestamp(), entityIdCodec.encode(BigInteger.valueOf(organisation.getId())), organisation.getClass().getSimpleName().toLowerCase(), organisation.getPublisher().key()); } }