package org.atlasapi.persistence; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.atlasapi.media.channel.ChannelGroupStore; import org.atlasapi.media.channel.ServiceChannelStore; import org.atlasapi.media.product.ProductResolver; import org.atlasapi.media.product.ProductStore; import org.atlasapi.media.segment.SegmentResolver; import org.atlasapi.media.segment.SegmentWriter; import org.atlasapi.messaging.v3.EntityUpdatedMessage; import org.atlasapi.messaging.v3.KafkaMessagingModule; import org.atlasapi.messaging.v3.MessagingModule; import org.atlasapi.messaging.v3.ScheduleUpdateMessage; import org.atlasapi.persistence.audit.PersistenceAuditLog; import org.atlasapi.persistence.content.ContentGroupResolver; import org.atlasapi.persistence.content.ContentGroupWriter; import org.atlasapi.persistence.content.ContentPurger; import org.atlasapi.persistence.content.ContentResolver; import org.atlasapi.persistence.content.ContentWriter; import org.atlasapi.persistence.content.EquivalentContentResolver; import org.atlasapi.persistence.content.KnownTypeContentResolver; import org.atlasapi.persistence.content.LookupBackedContentIdGenerator; import org.atlasapi.persistence.content.PeopleQueryResolver; import org.atlasapi.persistence.content.listing.MongoProgressStore; import org.atlasapi.persistence.content.mongo.MongoContentLister; import org.atlasapi.persistence.content.organisation.OrganisationStore; import org.atlasapi.persistence.content.people.ItemsPeopleWriter; import org.atlasapi.persistence.content.people.PersonStore; import org.atlasapi.persistence.content.people.QueuingPersonWriter; import org.atlasapi.persistence.content.schedule.mongo.MongoScheduleStore; import org.atlasapi.persistence.event.EventResolver; import org.atlasapi.persistence.event.EventStore; import org.atlasapi.persistence.event.EventWriter; import org.atlasapi.persistence.logging.AdapterLog; import org.atlasapi.persistence.lookup.LookupWriter; import org.atlasapi.persistence.lookup.mongo.MongoLookupEntryStore; import org.atlasapi.persistence.player.PlayerResolver; import org.atlasapi.persistence.service.ServiceResolver; import org.atlasapi.persistence.shorturls.ShortUrlSaver; import org.atlasapi.persistence.topic.TopicQueryResolver; import org.atlasapi.persistence.topic.TopicStore; import com.metabroadcast.common.ids.IdGenerator; import com.metabroadcast.common.persistence.mongo.DatabasedMongo; import com.metabroadcast.common.persistence.mongo.health.MongoIOProbe; import com.metabroadcast.common.properties.Configurer; import com.metabroadcast.common.properties.Parameter; import com.metabroadcast.common.queue.MessageSender; import com.google.common.annotations.VisibleForTesting; import com.mongodb.Mongo; import com.mongodb.ReadPreference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Primary; /** * This is the Spring version of the MongoContentPersistenceModule. * The non-DI version serves as a delegate in this class. */ @Configuration @Import(KafkaMessagingModule.class) public class MongoContentPersistenceModule implements ContentPersistenceModule { public static final String NON_ID_SETTING_CONTENT_WRITER = "nonIdSettingContentWriter"; @Autowired private ReadPreference readPreference; @Autowired private Mongo mongo; @Autowired private DatabasedMongo db; @Autowired private AdapterLog log; @Autowired private MessagingModule messagingModule; private final Parameter processingConfig = Configurer.get("processing.config"); @Value("${messaging.destination.content.changes}") private String contentChanges; @Value("${messaging.destination.topics.changes}") private String topicChanges; @Value("${messaging.destination.schedule.changes}") private String scheduleChanges; @Value("${messaging.destination.content.group.changes}") private String contentGroupChanges; @Value("${messaging.destination.event.changes}") private String eventChanges; @Value("${messaging.destination.organisation.changes}") private String organisationChanges; @Value("${messaging.destination.equiv.assert}") private String equivAssertDest; @Value("${messaging.enabled}") private String messagingEnabled; @Value("${mongo.audit.dbname}") private String auditDbName; @Value("${mongo.audit.enabled}") private boolean auditEnabled; public MongoContentPersistenceModule() {} @VisibleForTesting public MongoContentPersistenceModule( Mongo mongo, DatabasedMongo db, MessagingModule messagingModule, String auditDbName, AdapterLog log, ReadPreference readPreference) { this.mongo = mongo; this.db = db; this.log = log; this.messagingModule = messagingModule; this.auditDbName = auditDbName; this.readPreference = readPreference; } /** * We need both this methods here to initialized the cachedValue of BackgroundComputingValue * that will be used by the CachingChannelStore. */ @PostConstruct public void setUp() { channelStore().start(); } @PreDestroy public void tearDown() { channelStore().shutdown(); } public ConstructorBasedMongoContentPersistenceModule persistenceModule() { return new ConstructorBasedMongoContentPersistenceModule( mongo, db, messagingModule, auditDbName, log, readPreference, contentChanges, topicChanges, scheduleChanges, contentGroupChanges, eventChanges, organisationChanges, Boolean.valueOf(messagingEnabled), auditEnabled, processingConfig, equivAssertDest ); } @Bean @Lazy(true) public MessageSender<EntityUpdatedMessage> contentChanges() { return persistenceModule().contentChanges(); } @Bean @Lazy(true) public MessageSender<EntityUpdatedMessage> topicChanges() { return persistenceModule().topicChanges(); } @Bean @Lazy(true) public MessageSender<ScheduleUpdateMessage> scheduleChanges() { return persistenceModule().scheduleChanges(); } @Bean @Lazy(true) public MessageSender<EntityUpdatedMessage> eventChanges() { return persistenceModule().eventChanges(); } @Bean @Lazy(true) public MessageSender<EntityUpdatedMessage> organizationChanges() { return persistenceModule().organizationChanges(); } @Override @Bean public ContentGroupWriter contentGroupWriter() { return persistenceModule().contentGroupWriter(); } @Override @Bean public ContentGroupResolver contentGroupResolver() { return persistenceModule().contentGroupResolver(); } @Override @Primary @Bean public ContentWriter contentWriter() { return persistenceModule().contentWriter(); } @Override @Bean(name = NON_ID_SETTING_CONTENT_WRITER) public ContentWriter nonIdSettingContentWriter() { return persistenceModule().nonIdSettingContentWriter(); } @Override @Primary @Bean public ContentResolver contentResolver() { return persistenceModule().contentResolver(); } @Primary @Bean public KnownTypeContentResolver knownTypeContentResolver() { return persistenceModule().knownTypeContentResolver(); } @Primary @Bean public MongoLookupEntryStore lookupStore() { return persistenceModule().lookupStore(); } @Override @Primary @Bean public IdGenerator contentIdGenerator() { return persistenceModule().contentIdGenerator(); } @Override @Bean public LookupBackedContentIdGenerator lookupBackedContentIdGenerator() { return persistenceModule().lookupBackedContentIdGenerator(); } public LookupWriter explicitLookupWriter() { return persistenceModule().explicitLookupWriter(); } @Bean public LookupWriter generatedLookupWriter() { return persistenceModule().generatedLookupWriter(); } @Primary @Bean public MongoScheduleStore scheduleStore() { return persistenceModule().scheduleStore(channelStore()); } @Primary @Bean public EquivalentContentResolver equivContentResolver() { return persistenceModule().equivContentResolver(); } @Override @Primary @Bean public ItemsPeopleWriter itemsPeopleWriter() { return persistenceModule().itemsPeopleWriter(); } @Primary @Bean public QueuingPersonWriter personWriter() { return persistenceModule().personWriter(); } @Primary @Bean public PersonStore personStore() { return persistenceModule().personStore(); } @Override @Primary @Bean public ShortUrlSaver shortUrlSaver() { return persistenceModule().shortUrlSaver(); } @Primary @Bean public MongoContentLister contentLister() { return persistenceModule().contentLister(); } @Override @Primary @Bean public TopicStore topicStore() { return persistenceModule().topicStore(); } @Bean public ServiceResolver serviceResolver() { return persistenceModule().serviceResolver(); } @Bean public PlayerResolver playerResolver() { return persistenceModule().playerResolver(); } @Override @Primary @Bean public TopicQueryResolver topicQueryResolver() { return persistenceModule().topicQueryResolver(); } @Override @Primary @Bean public SegmentWriter segmentWriter() { return persistenceModule().segmentWriter(); } @Override @Primary @Bean public SegmentResolver segmentResolver() { return persistenceModule().segmentResolver(); } /** * @deprecated Use {@link MongoContentPersistenceModule#eventWriter()} and * {@link MongoContentPersistenceModule#eventResolver()} instead */ @Deprecated @Bean public EventStore eventStore() { return persistenceModule().eventStore(); } @Bean public EventWriter eventWriter() { return persistenceModule().eventWriter(); } @Bean public EventResolver eventResolver() { return persistenceModule().eventResolver(); } // not sure if this is right @Bean public OrganisationStore organisationStore() { return persistenceModule().organisationStore(); } @Primary @Bean public ServiceChannelStore channelStore() { return persistenceModule().channelStore(); } @Primary @Bean public ChannelGroupStore channelGroupStore() { return persistenceModule().channelGroupStore(); } @Override @Primary @Bean public ProductStore productStore() { return persistenceModule().productStore(); } @Override @Primary @Bean public ProductResolver productResolver() { return persistenceModule().productResolver(); } @Bean MongoIOProbe mongoIoSetProbe() { return persistenceModule().mongoIoSetProbe(); } @Override @Bean public PeopleQueryResolver peopleQueryResolver() { return persistenceModule().peopleQueryResolver(); } @Bean public ContentPurger contentPurger() { return persistenceModule().contentPurger(); } @Bean public PersistenceAuditLog persistenceAuditLog() { return persistenceModule().persistenceAuditLog(); } @Bean public MongoProgressStore mongoProgressStore() { return persistenceModule().mongoProgressStore(); } }