package org.atlasapi.persistence.media.entity;
import java.util.List;
import org.atlasapi.media.channel.Channel;
import org.atlasapi.media.channel.ChannelResolver;
import org.atlasapi.media.entity.Broadcast;
import org.atlasapi.media.entity.Publisher;
import org.atlasapi.media.entity.ScheduleEntry;
import org.atlasapi.media.entity.ScheduleEntry.ItemRefAndBroadcast;
import org.joda.time.DateTime;
import org.joda.time.Interval;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.metabroadcast.common.persistence.mongo.MongoConstants;
import com.metabroadcast.common.persistence.translator.TranslatorUtils;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
public class ScheduleEntryTranslator {
private static final String BROADCAST_KEY = "broadcast";
private static final String ITEM_URI_KEY = "itemUri";
private static final String ITEM_REFS_AND_BROADCAST_KEY = "itemsAndBroadcasts";
private final BroadcastTranslator broadcastTranslator = new BroadcastTranslator();
private ChannelResolver channelResolver;
public ScheduleEntryTranslator(ChannelResolver channelResolver) {
this.channelResolver = channelResolver;
}
public DBObject toDb(ScheduleEntry entry) {
DBObject dbObject = new BasicDBObject();
dbObject.put(MongoConstants.ID, entry.toKey());
dbObject.put("publisher", entry.publisher().key());
dbObject.put("channel", entry.channel().getKey());
TranslatorUtils.fromDateTime(dbObject, "intervalStart", entry.interval().getStart());
TranslatorUtils.fromDateTime(dbObject, "intervalEnd", entry.interval().getEnd());
dbObject.put(ITEM_REFS_AND_BROADCAST_KEY, Iterables.transform(entry.getItemRefsAndBroadcasts(), new Function<ItemRefAndBroadcast, DBObject>() {
@Override
public DBObject apply(ItemRefAndBroadcast input) {
BasicDBObject dbo = new BasicDBObject(ITEM_URI_KEY, input.getItemUri());
dbo.put(BROADCAST_KEY, broadcastTranslator.toDBObject(input.getBroadcast()));
return dbo;
}
}));
return dbObject;
}
public List<DBObject> toDbObjects(Iterable<ScheduleEntry> entries) {
ImmutableList.Builder<DBObject> dbObjects = ImmutableList.builder();
for (ScheduleEntry entry: entries) {
dbObjects.add(toDb(entry));
}
return dbObjects.build();
}
@SuppressWarnings("unchecked")
public ScheduleEntry fromDb(DBObject object) {
Publisher publisher = Publisher.fromKey((String) object.get("publisher")).requireValue();
Channel channel = channelResolver.fromKey((String) object.get("channel")).requireValue();
DateTime start = TranslatorUtils.toDateTime(object, "intervalStart");
DateTime end = TranslatorUtils.toDateTime(object, "intervalEnd");
Interval interval = new Interval(start, end);
Iterable<DBObject> itemsAndBroacasts = (Iterable<DBObject>) object.get(ITEM_REFS_AND_BROADCAST_KEY);
if (itemsAndBroacasts == null) {
return new ScheduleEntry(interval, channel, publisher, ImmutableList.<ItemRefAndBroadcast>of());
}
return new ScheduleEntry(interval, channel, publisher, Iterables.transform(itemsAndBroacasts, new Function<DBObject, ItemRefAndBroadcast>() {
@Override
public ItemRefAndBroadcast apply(DBObject dbo) {
Broadcast broadcast = broadcastTranslator.fromDBObject((DBObject) dbo.get(BROADCAST_KEY));
return new ItemRefAndBroadcast((String) dbo.get(ITEM_URI_KEY), broadcast);
}
}));
}
public List<ScheduleEntry> fromDbObjects(Iterable<DBObject> objects) {
ImmutableList.Builder<ScheduleEntry> entries = ImmutableList.builder();
for (DBObject dbObject: objects) {
entries.add(fromDb(dbObject));
}
return entries.build();
}
public DBObject toIndex() {
return new BasicDBObject(MongoConstants.ID, 1).append("channel", 1).append("publisher", 1);
}
}