package org.atlasapi.persistence.media.entity;
import java.util.Set;
import org.atlasapi.media.entity.Identified;
import org.atlasapi.media.entity.LookupRef;
import org.atlasapi.persistence.ModelTranslator;
import com.metabroadcast.common.persistence.mongo.MongoConstants;
import com.metabroadcast.common.persistence.translator.TranslatorUtils;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
public class IdentifiedTranslator implements ModelTranslator<Identified> {
public static final String CURIE = "curie";
public static final String ALIASES = "aliases";
public static final String IDS = "ids";
public static final String IDS_NAMESPACE = "ids.namespace";
public static final String IDS_VALUE = "ids.value";
public static final String LAST_UPDATED = "lastUpdated";
public static final String EQUIVALENT_TO = "equivalent";
public static final String ID = MongoConstants.ID;
public static final String CANONICAL_URL = "uri";
public static final String TYPE = "type";
public static final String PUBLISHER = "publisher";
public static final String OPAQUE_ID = "aid";
private static final LookupRefTranslator lookupRefTranslator = new LookupRefTranslator();
private static final Function<DBObject, LookupRef> equivalentFromDbo = input -> lookupRefTranslator
.fromDBObject(input, null);
private static Function<LookupRef, DBObject> equivalentToDbo = input -> lookupRefTranslator.toDBObject(
null,
input
);
private final AliasTranslator aliasTranslator = new AliasTranslator();
private boolean useAtlasIdAsId;
public IdentifiedTranslator() {
this(false);
}
public IdentifiedTranslator(boolean atlasIdAsId) {
this.useAtlasIdAsId = atlasIdAsId;
}
@Override
public DBObject toDBObject(DBObject dbObject, Identified entity) {
if (dbObject == null) {
dbObject = new BasicDBObject();
}
if (useAtlasIdAsId) {
TranslatorUtils.from(dbObject, CANONICAL_URL, entity.getCanonicalUri());
TranslatorUtils.from(dbObject, ID, entity.getId());
} else {
TranslatorUtils.from(dbObject, ID, entity.getCanonicalUri());
TranslatorUtils.from(dbObject, OPAQUE_ID, entity.getId());
}
TranslatorUtils.from(dbObject, CURIE, entity.getCurie());
TranslatorUtils.fromSet(dbObject, entity.getAliasUrls(), ALIASES);
// We store the Identified aliases as ids in Mongo
// because the current aliases field in Mongo refers to aliasUrls
TranslatorUtils.from(dbObject, IDS, aliasTranslator.toDBList(entity.getAliases()));
TranslatorUtils.from(dbObject, EQUIVALENT_TO, toDBObject(entity.getEquivalentTo()));
TranslatorUtils.fromDateTime(dbObject, LAST_UPDATED, entity.getLastUpdated());
return dbObject;
}
@Override
public Identified fromDBObject(DBObject dbObject, Identified description) {
if (description == null) {
description = new Identified();
}
if (useAtlasIdAsId) {
description.setCanonicalUri((String) dbObject.get(CANONICAL_URL));
description.setId((Long) dbObject.get(ID));
} else {
description.setCanonicalUri((String) dbObject.get(ID));
description.setId((Long) dbObject.get(OPAQUE_ID));
}
description.setCurie((String) dbObject.get(CURIE));
description.setAliasUrls(TranslatorUtils.toSet(dbObject, ALIASES));
description.setAliases(aliasTranslator.fromDBObjects(TranslatorUtils.toDBObjectList(
dbObject,
IDS
)));
description.setEquivalentTo(equivalentsFrom(dbObject));
description.setLastUpdated(TranslatorUtils.toDateTime(dbObject, LAST_UPDATED));
return description;
}
private Set<LookupRef> equivalentsFrom(DBObject dbObject) {
return Sets.newHashSet(Iterables.transform(
TranslatorUtils.toDBObjectList(
dbObject,
EQUIVALENT_TO
),
equivalentFromDbo
));
}
private BasicDBList toDBObject(Set<LookupRef> equivalentTo) {
BasicDBList list = new BasicDBList();
Iterables.addAll(list, Iterables.transform(equivalentTo, equivalentToDbo));
return list;
}
public void removeFieldsForHash(DBObject dbObject) {
dbObject.removeField(LAST_UPDATED);
}
}