package org.atlasapi.persistence.media.entity;
import org.atlasapi.media.entity.Publisher;
import org.atlasapi.media.entity.Topic;
import org.atlasapi.persistence.content.mongo.DbObjectHashCodeDebugger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.metabroadcast.common.persistence.mongo.MongoConstants;
import com.metabroadcast.common.persistence.translator.ModelTranslator;
import com.metabroadcast.common.persistence.translator.TranslatorUtils;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
public class TopicTranslator implements ModelTranslator<Topic> {
private static final Logger log = LoggerFactory.getLogger(TopicTranslator.class);
public static final String VALUE = "value";
public static final String NAMESPACE = "namespace";
public static final String TOPIC_TYPE = "topicType";
public static final String PUBLISHER = "publisher";
private final DescribedTranslator describedTranslator;
private final DbObjectHashCodeDebugger dboHashCodeDebugger = new DbObjectHashCodeDebugger();
public TopicTranslator() {
this.describedTranslator = new DescribedTranslator(new IdentifiedTranslator(true), new ImageTranslator());
}
public DBObject toDBObject(Topic model) {
return this.toDBObject(new BasicDBObject(), model);
}
@Override
public DBObject toDBObject(DBObject dbObject, Topic model) {
if (dbObject == null) {
dbObject = new BasicDBObject();
}
describedTranslator.toDBObject(dbObject, model);
if (model.getType() != null) {
TranslatorUtils.from(dbObject, TOPIC_TYPE, model.getType().key());
}
TranslatorUtils.from(dbObject, NAMESPACE, model.getNamespace());
TranslatorUtils.from(dbObject, VALUE, model.getValue());
TranslatorUtils.from(dbObject, PUBLISHER, Publisher.TO_KEY.apply(model.getPublisher()));
return dbObject;
}
public Topic fromDBObject(DBObject dbObject) {
return this.fromDBObject(dbObject, null);
}
@Override
public Topic fromDBObject(DBObject dbObject, Topic model) {
if (model == null) {
model = new Topic(TranslatorUtils.toLong(dbObject, MongoConstants.ID));
}
describedTranslator.fromDBObject(dbObject, model);
String typeKey = TranslatorUtils.toString(dbObject, TOPIC_TYPE);
if (typeKey != null) {
model.setType(Topic.Type.fromKey(typeKey));
}
model.setNamespace(TranslatorUtils.toString(dbObject, NAMESPACE));
model.setValue(TranslatorUtils.toString(dbObject, VALUE));
model.setPublisher(Publisher.fromKey(TranslatorUtils.toString(dbObject, PUBLISHER)).valueOrNull());
model.setReadHash(generateHashByRemovingFieldsFromTheDbo(dbObject));
return model;
}
public String hashCodeOf(Topic topic) {
return generateHashByRemovingFieldsFromTheDbo(toDBObject(topic));
}
private String generateHashByRemovingFieldsFromTheDbo(DBObject dbObject) {
removeFieldsForHash(dbObject);
if (log.isTraceEnabled()) {
dboHashCodeDebugger.logHashCodes(dbObject, log);
}
return String.valueOf(dbObject.hashCode());
}
public void removeFieldsForHash(DBObject dbObject) {
describedTranslator.removeFieldsForHash(dbObject);
}
}