package org.atlasapi.persistence.audit; import static com.google.common.base.Preconditions.checkNotNull; import static com.metabroadcast.common.persistence.mongo.MongoBuilders.where; import org.atlasapi.media.entity.Described; import org.atlasapi.media.entity.Publisher; import org.atlasapi.persistence.lookup.entry.LookupEntry; import org.joda.time.DateTime; import com.google.common.base.Function; import com.metabroadcast.common.persistence.mongo.MongoUpdateBuilder; import com.metabroadcast.common.time.Clock; import com.mongodb.DBCollection; class MongoPersistenceAuditLog implements PersistenceAuditLog { private static final String PUBLISHER_KEY = "publisher"; private static final String BUCKET_KEY = "timeBucket"; private final DBCollection collection; private final Function<DateTime, String> documentKey; private final Clock clock; public MongoPersistenceAuditLog(DBCollection collection, Function<DateTime, String> documentKey, Clock clock) { this.collection = checkNotNull(collection); this.documentKey = checkNotNull(documentKey); this.clock = clock; } @Override public void logWrite(Described described) { log(described, described.getPublisher(), true); } @Override public void logWrite(LookupEntry lookupEntry) { log(lookupEntry, lookupEntry.lookupRef().publisher(), true); } @Override public void logNoWrite(Described described) { // Removing counting of this temporarily, to reduce oplog load // log(described, false); } @Override public void logNoWrite(LookupEntry lookupEntry) { //log(lookupEntry, true); } private void log(Object object, Publisher publisher, boolean actualWrite) { log(publisher, groupByKey(object.getClass().getSimpleName().toLowerCase(), actualWrite)); } private void log(Publisher publisher, String key) { this.collection.update( where() .fieldEquals(PUBLISHER_KEY, publisher.key()) .fieldEquals(BUCKET_KEY, documentKey.apply(clock.now())) .build(), new MongoUpdateBuilder() .incField(key, 1) .build(), true, false); } private String groupByKey(String type, boolean actualWrite) { return String.format("%s.%s", actualWrite ? "write" : "noWrite", type ); } }