package org.atlasapi.persistence.media.entity;
import java.util.List;
import java.util.Set;
import org.atlasapi.media.entity.Organisation;
import org.atlasapi.media.entity.Person;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.metabroadcast.common.persistence.mongo.MongoConstants;
import com.metabroadcast.common.persistence.translator.TranslatorUtils;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
public class OrganisationTranslator {
public static final String MEMBERS_KEY = "members";
public static final String ALTERNATIVE_TITLES = "alternativeTitles";
private final ContentGroupTranslator contentGroupTranslator = new ContentGroupTranslator(false);
private final PersonTranslator personTranslator = new PersonTranslator();
private final ChildRefTranslator childRefTranslator = new ChildRefTranslator();
public DBObject toDBObject(Organisation model) {
DBObject dbo = new BasicDBObject();
contentGroupTranslator.toDBObject(dbo, model);
TranslatorUtils.fromIterable(dbo, MEMBERS_KEY, model.members(), personTranslator.translatePerson());
TranslatorUtils.fromIterable(dbo, model.getAlternativeTitles(), ALTERNATIVE_TITLES);
return dbo;
}
public Organisation fromDBObject(DBObject dbo) {
if (dbo == null) {
return null;
}
List<Person> members = personTranslator.fromDBObjects(TranslatorUtils.toDBObjectList(dbo, MEMBERS_KEY));
Set<String> alternativeTitles = TranslatorUtils.toSet(dbo, ALTERNATIVE_TITLES);
Organisation organisation = new Organisation(members, alternativeTitles);
contentGroupTranslator.fromDBObject(dbo, organisation);
return organisation;
}
public DBObject updateContentUris(Organisation entity) {
return new BasicDBObject(MongoConstants.ADD_TO_SET, new BasicDBObject(ContentGroupTranslator.CONTENT_URIS_KEY, new BasicDBObject("$each", childRefTranslator.toDBList(entity.getContents()))));
}
public List<Organisation> fromDBObjects(Iterable<DBObject> dbObjects) {
ImmutableList.Builder<Organisation> organisations = ImmutableList.builder();
for (DBObject dbObject: dbObjects) {
organisations.add(fromDBObject(dbObject));
}
return organisations.build();
}
public Function<Organisation, DBObject> translateToDBObject() {
return new Function<Organisation, DBObject>() {
@Override
public DBObject apply(Organisation input) {
return toDBObject(input);
}
};
}
}