package org.atlasapi.persistence.event;
import javax.annotation.Nullable;
import org.atlasapi.media.entity.Event;
import org.atlasapi.media.entity.Publisher;
import org.atlasapi.media.entity.Topic;
import org.atlasapi.persistence.media.entity.ChildRefTranslator;
import org.atlasapi.persistence.media.entity.IdentifiedTranslator;
import org.atlasapi.persistence.media.entity.OrganisationTranslator;
import org.atlasapi.persistence.media.entity.PersonTranslator;
import org.atlasapi.persistence.media.entity.TopicTranslator;
import com.metabroadcast.common.persistence.translator.TranslatorUtils;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
public class EventTranslator {
public static final String TITLE_KEY = "title";
public static final String PUBLISHER_KEY = "publisher";
public static final String VENUE_KEY = "venue";
public static final String START_TIME_KEY = "startTime";
public static final String END_TIME_KEY = "endTime";
public static final String PARTICIPANTS_KEY = "participants";
public static final String ORGANISATIONS_KEY = "organisations";
public static final String EVENT_GROUPS_KEY = "eventGroups";
public static final String CONTENT_KEY = "content";
private final IdentifiedTranslator identifiedTranslator = new IdentifiedTranslator(true);
private final TopicTranslator topicTranslator = new TopicTranslator();
private final OrganisationTranslator organisationTranslator = new OrganisationTranslator();
private final PersonTranslator personTranslator = new PersonTranslator();
private final ChildRefTranslator childRefTranslator = new ChildRefTranslator();
public DBObject toDBObject(Event event) {
DBObject dbo = new BasicDBObject();
identifiedTranslator.toDBObject(dbo, event);
TranslatorUtils.from(dbo, TITLE_KEY, event.title());
TranslatorUtils.from(dbo, PUBLISHER_KEY, event.publisher().key());
TranslatorUtils.from(dbo, VENUE_KEY, topicTranslator.toDBObject(event.venue()));
TranslatorUtils.fromDateTime(dbo, START_TIME_KEY, event.startTime());
TranslatorUtils.fromDateTime(dbo, END_TIME_KEY, event.endTime());
TranslatorUtils.fromIterable(dbo, PARTICIPANTS_KEY, event.participants(), personTranslator.translatePerson());
TranslatorUtils.fromIterable(dbo, ORGANISATIONS_KEY, event.organisations(), organisationTranslator.translateToDBObject());
TranslatorUtils.fromIterable(dbo, EVENT_GROUPS_KEY, event.eventGroups(), topicToDBObject());
TranslatorUtils.from(dbo, CONTENT_KEY, childRefTranslator.toDBList(event.content()));
return dbo;
}
public @Nullable Event fromDBObject(@Nullable DBObject dbo) {
if (dbo == null) {
return null;
}
Optional<Iterable<Topic>> eventGroups = TranslatorUtils.toIterable(dbo, EVENT_GROUPS_KEY, topicFromDBObject());
@SuppressWarnings("deprecation") // Uses Maybe
Event.Builder event = Event.builder()
.withTitle(TranslatorUtils.toString(dbo, TITLE_KEY))
.withPublisher(Publisher.fromKey(TranslatorUtils.toString(dbo, PUBLISHER_KEY)).requireValue())
.withVenue(topicTranslator.fromDBObject(TranslatorUtils.toDBObject(dbo, VENUE_KEY)))
.withStartTime(TranslatorUtils.toDateTime(dbo, START_TIME_KEY))
.withEndTime(TranslatorUtils.toDateTime(dbo, END_TIME_KEY))
.withParticipants(personTranslator.fromDBObjects(TranslatorUtils.toDBObjectList(dbo, PARTICIPANTS_KEY)))
.withContent(childRefTranslator.fromDBObjects(TranslatorUtils.toDBObjectList(dbo, CONTENT_KEY)))
.withOrganisations(organisationTranslator.fromDBObjects(TranslatorUtils.toDBObjectList(dbo, ORGANISATIONS_KEY)));
if (eventGroups.isPresent()) {
event = event.withEventGroups(eventGroups.get());
}
return (Event) identifiedTranslator.fromDBObject(dbo, event.build());
}
public Function<DBObject, Event> translateDBObject() {
return new Function<DBObject, Event>() {
@Override
public Event apply(DBObject input) {
return fromDBObject(input);
}
};
}
private Function<DBObject, Topic> topicFromDBObject() {
return new Function<DBObject, Topic>() {
@Override
public Topic apply(DBObject input) {
return topicTranslator.fromDBObject(input);
}
};
}
private Function<Topic, DBObject> topicToDBObject() {
return new Function<Topic, DBObject>() {
@Override
public DBObject apply(Topic input) {
return topicTranslator.toDBObject(input);
}
};
}
}