package org.atlasapi.persistence.content;
import org.atlasapi.equiv.ContentRef;
import org.atlasapi.media.entity.Container;
import org.atlasapi.media.entity.Content;
import org.atlasapi.media.entity.Item;
import org.atlasapi.media.entity.LookupRef;
import org.atlasapi.media.entity.Publisher;
import org.atlasapi.persistence.lookup.LookupWriter;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
public class EquivalenceWritingContentWriter implements ContentWriter {
private final ContentWriter delegate;
private final LookupWriter equivalenceWriter;
public EquivalenceWritingContentWriter(ContentWriter delegate, LookupWriter lookupWriter) {
this.delegate = delegate;
this.equivalenceWriter = lookupWriter;
}
@Override
public Item createOrUpdate(Item item) {
Item writtenItem = delegate.createOrUpdate(item);
writeEquivalences(item);
return writtenItem;
}
private void writeEquivalences(Content content) {
if (!content.getEquivalentTo().isEmpty()) {
ImmutableSet<Publisher> publishers = publishers(content);
Iterable<ContentRef> equivalentUris = Iterables.transform(content.getEquivalentTo(),
new Function<LookupRef, ContentRef>() {
@Override
public ContentRef apply(LookupRef input) {
return new ContentRef(input.uri(), input.publisher(), null);
}
});
equivalenceWriter.writeLookup(ContentRef.valueOf(content), equivalentUris, publishers);
}
}
private ImmutableSet<Publisher> publishers(Content content) {
return ImmutableSet.<Publisher>builder().add(content.getPublisher()).addAll(Iterables.transform(content.getEquivalentTo(), LookupRef.TO_SOURCE)).build();
}
@Override
public void createOrUpdate(Container container) {
delegate.createOrUpdate(container);
writeEquivalences(container);
}
}