package org.atlasapi.persistence.content.mongo; import static org.atlasapi.persistence.content.listing.ContentListingCriteria.defaultCriteria; import java.util.Iterator; import java.util.List; import java.util.Map; import org.atlasapi.media.channel.ChannelResolver; import org.atlasapi.media.entity.Content; import org.atlasapi.media.entity.Item; import org.atlasapi.media.entity.Publisher; import org.atlasapi.media.entity.ScheduleEntry; import org.atlasapi.persistence.content.ContentCategory; import org.atlasapi.persistence.content.listing.ContentLister; import org.atlasapi.persistence.content.schedule.mongo.ScheduleEntryBuilder; import org.atlasapi.persistence.content.schedule.mongo.ScheduleWriter; import org.joda.time.Duration; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; import com.google.common.collect.Maps; import com.metabroadcast.common.scheduling.ScheduledTask; public class FullMongoScheduleRepopulator extends ScheduledTask { private final ContentLister contentLister; private final ScheduleWriter scheduleStore; private final List<Publisher> publishers; private final ScheduleEntryBuilder scheduleEntryBuilder; private int lastProcessed = 0; public FullMongoScheduleRepopulator(ContentLister contentLister, ChannelResolver channelResolver, ScheduleWriter scheduleStore, Iterable<Publisher> publishers, Duration maxBroadcastAge) { this.contentLister = contentLister; this.scheduleStore = scheduleStore; this.publishers = ImmutableList.copyOf(publishers); this.scheduleEntryBuilder = new ScheduleEntryBuilder(channelResolver, maxBroadcastAge); } public FullMongoScheduleRepopulator(ContentLister contentLister, ChannelResolver channelResolver, ScheduleWriter scheduleStore, Iterable<Publisher> publishers) { this(contentLister, channelResolver, scheduleStore, publishers, Duration.standardDays(28)); } @Override public void runTask() { final Map<String, ScheduleEntry> scheduleEntries = Maps.newHashMap(); int processed = 0; Iterator<Content> items = contentLister.listContent(defaultCriteria().forContent(ImmutableList.copyOf(ContentCategory.ITEMS)).forPublishers(publishers).build()); Iterator<List<Content>> itemLists = Iterators.partition(items, 100); int errors = 0; while (itemLists.hasNext()) { try { Map<String, ScheduleEntry> entries = scheduleEntryBuilder.toScheduleEntries(Iterables.filter(itemLists.next(), Item.class)); for (ScheduleEntry entry : entries.values()) { ScheduleEntry existingEntry = scheduleEntries.get(entry.toKey()); if (existingEntry == null) { scheduleEntries.put(entry.toKey(), entry); } else { existingEntry.withItems(Iterables.concat(existingEntry.getItemRefsAndBroadcasts(), entry.getItemRefsAndBroadcasts())); } } } catch(Exception e) { errors++; e.printStackTrace(); } reportStatus(String.format("Building schedule entries. Processed %s (%s), %s errors", processed, lastProcessed, errors)); } reportStatus(String.format("Writing %s schedule entries", scheduleEntries.values().size())); for (ScheduleEntry entry : scheduleEntries.values()) { scheduleStore.writeCompleteEntry(entry); } reportStatus(String.format("Wrote %s schedule entries for %s content", scheduleEntries.values().size(), processed)); lastProcessed = processed; } }