package com.codecademy.eventhub.storage; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.codecademy.eventhub.base.BloomFilter; import com.codecademy.eventhub.list.DmaList; import com.codecademy.eventhub.model.Event; import org.fusesource.hawtjournal.api.Journal; import javax.inject.Named; import javax.inject.Provider; public class EventStorageModule extends AbstractModule { @Override protected void configure() {} @Provides @Named("eventhub.eventstorage.directory") public String getJournalUserStorageDirectory(@Named("eventhub.directory") String directory) { return directory + "/event_storage/"; } @Provides public BloomFilter.Schema getBloomFilterSchema( @Named("eventhub.bloomfilteredeventstorage.numHashes") int numHashes, @Named("eventhub.bloomfilteredeventstorage.bloomFilterSize") int bloomFilterSize) { return new BloomFilter.Schema(numHashes, bloomFilterSize); } @Provides public DmaList<JournalEventStorage.MetaData> getJournalEventStorageMetaDataList( JournalEventStorage.MetaData.Schema schema, @Named("eventhub.eventstorage.directory") String eventStorageDirectory, @Named("eventhub.journaleventstorage.numMetaDataPerFile") int numMetaDataPerFile, @Named("eventhub.journaleventstorage.metaDataFileCacheSize") int metaDataFileCacheSize) { return DmaList.build(schema, eventStorageDirectory + "/journal_event_storage_meta_data/", numMetaDataPerFile, metaDataFileCacheSize); } @Provides @Named("eventhub.journaleventstorage") public Journal getEventJournal( @Named("eventhub.eventstorage.directory") String eventStorageDirectory, @Named("eventhub.journaleventstorage.journalFileSize") int journalFileSize, @Named("eventhub.journaleventstorage.journalWriteBatchSize") int journalWriteBatchSize) { return JournalUtil.createJournal(eventStorageDirectory + "/event_journal/", journalFileSize, journalWriteBatchSize); } @Provides public JournalEventStorage getJournalEventStorage( @Named("eventhub.journaleventstorage") Journal eventJournal, DmaList<JournalEventStorage.MetaData> metaDataList) { JournalEventStorage.MetaData.Schema schema = new JournalEventStorage.MetaData.Schema(); return new JournalEventStorage( eventJournal, schema, metaDataList, metaDataList.getMaxId()); } @Provides public CachedEventStorage getCachedEventStorage( JournalEventStorage journalEventStorage, @Named("eventhub.cachedeventstorage.recordCacheSize") int recordCacheSize) { Cache<Long, Event> eventCache = CacheBuilder.newBuilder() .maximumSize(recordCacheSize) .recordStats() .build(); return new CachedEventStorage(journalEventStorage, eventCache); } @Provides @Named("eventhub.bloomfilteredeventstorage") public DmaList<BloomFilter> getBloomFilterDmaList( @Named("eventhub.eventstorage.directory") String eventStorageDirectory, @Named("eventhub.bloomfilteredeventstorage.numHashes") int numHashes, @Named("eventhub.bloomfilteredeventstorage.bloomFilterSize") int bloomFilterSize, @Named("eventhub.bloomfilteredeventstorage.numMetaDataPerFile") int numMetaDataPerFile, @Named("eventhub.bloomfilteredeventstorage.metaDataFileCacheSize") int metaDataFileCacheSize) { return DmaList.build(new BloomFilter.Schema(numHashes, bloomFilterSize), eventStorageDirectory + "/bloom_filtered_event_storage_meta_data/", numMetaDataPerFile, metaDataFileCacheSize); } @Provides @Named("eventhub.bloomfilteredeventstorage") public BloomFilter getBloomFilter( @Named("eventhub.bloomfilteredeventstorage.numHashes") int numHashes, @Named("eventhub.bloomfilteredeventstorage.bloomFilterSize") int bloomFilterSize) { return BloomFilter.build(numHashes, bloomFilterSize); } @Provides public BloomFilteredEventStorage getBloomFilteredEventStorage( CachedEventStorage cachedEventStorage, @Named("eventhub.bloomfilteredeventstorage") DmaList<BloomFilter> bloomFilterDmaList, @Named("eventhub.bloomfilteredeventstorage") Provider<BloomFilter> bloomFilterProvider) { return new BloomFilteredEventStorage(cachedEventStorage, bloomFilterDmaList, bloomFilterProvider); } }