package org.atlasapi.persistence.lookup.entry;
import java.util.List;
import java.util.Set;
import org.atlasapi.media.entity.Alias;
import org.atlasapi.media.entity.Described;
import org.atlasapi.media.entity.LookupRef;
import org.joda.time.DateTime;
import com.google.common.base.Function;
import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.metabroadcast.common.time.DateTimeZones;
public class LookupEntry {
public static LookupEntry lookupEntryFrom(Described c) {
DateTime now = new DateTime(DateTimeZones.UTC);
LookupRef lookupRef = LookupRef.from(c);
ImmutableSet<LookupRef> reflexiveSet = ImmutableSet.of(lookupRef);
return new LookupEntry(c.getCanonicalUri(), c.getId(), lookupRef, c.getAllUris(), c.getAliases(), reflexiveSet, reflexiveSet, reflexiveSet, now, now, c.isActivelyPublished());
}
public static Function<LookupEntry,String> TO_ID = new Function<LookupEntry, String>() {
@Override
public String apply(LookupEntry input) {
return input.uri();
}
};
public static Function<LookupEntry, LookupRef> TO_SELF = new Function<LookupEntry, LookupRef>() {
@Override
public LookupRef apply(LookupEntry input) {
return input.self;
}
};
public static Function<LookupEntry,Set<LookupRef>> TO_EQUIVS = new Function<LookupEntry, Set<LookupRef>>() {
@Override
public Set<LookupRef> apply(LookupEntry input) {
return input.equivalents();
}
};
public static Function<LookupEntry,List<LookupRef>> TO_DIRECT_EQUIVS = new Function<LookupEntry, List<LookupRef>>() {
@Override
public List<LookupRef> apply(LookupEntry input) {
return ImmutableList.copyOf(input.directEquivalents());
}
};
private final String uri;
private final Long id;
private final Set<String> aliasUris;
private final Set<Alias> aliases;
private final Set<LookupRef> directEquivalents;
private final Set<LookupRef> explicit;
private final Set<LookupRef> equivs;
private final DateTime created;
private final DateTime updated;
private final LookupRef self;
private final boolean activelyPublished;
public LookupEntry(String uri, Long id, LookupRef self, Set<String> aliasUris, Set<Alias> aliases, Set<LookupRef> directEquivs, Set<LookupRef> explicit, Set<LookupRef> equivs, DateTime created, DateTime updated, boolean activelyPublished) {
this.uri = uri;
this.id = id;
this.self = self;
this.aliasUris = aliasUris;
this.aliases = aliases;
this.directEquivalents = ImmutableSet.copyOf(directEquivs);
this.explicit = ImmutableSet.copyOf(explicit);
this.equivs = ImmutableSet.copyOf(equivs);
this.created = created;
this.updated = updated;
this.activelyPublished = activelyPublished;
}
public String uri() {
return uri;
}
public Long id() {
return id;
}
public boolean activelyPublished() {
return activelyPublished;
}
public Set<String> aliasUrls() {
return aliasUris;
}
public Set<Alias> aliases() {
return aliases;
}
public Set<String> identifiers() {
return ImmutableSet.<String>builder().add(uri).addAll(aliasUris).build();
}
public Set<LookupRef> explicitEquivalents() {
return explicit;
}
public LookupEntry copyWithExplicitEquivalents(Iterable<LookupRef> newExplicits) {
List<LookupRef> explicit = ImmutableList.<LookupRef>builder().addAll(newExplicits).add(self).build();
return new LookupEntry(uri, id, self, aliasUris, aliases, directEquivalents, ImmutableSet.copyOf(explicit), this.equivs, created, new DateTime(DateTimeZones.UTC), activelyPublished);
}
public Set<LookupRef> equivalents() {
return equivs;
}
public LookupEntry copyWithEquivalents(Iterable<LookupRef> newEquivs) {
Set<LookupRef> equivs = ImmutableSet.<LookupRef>builder().addAll(newEquivs).add(self).build();
return new LookupEntry(uri, id, self, aliasUris, aliases, directEquivalents, explicit, equivs, created, new DateTime(DateTimeZones.UTC), activelyPublished);
}
public Set<LookupRef> directEquivalents() {
return directEquivalents;
}
public LookupEntry copyWithDirectEquivalents(Iterable<LookupRef> directEquivalents) {
List<LookupRef> dequivs = ImmutableList.<LookupRef>builder().addAll(directEquivalents).add(self).build();
return new LookupEntry(uri, id, self, aliasUris, aliases, ImmutableSet.copyOf(dequivs), explicit, equivs, created, new DateTime(DateTimeZones.UTC), activelyPublished);
}
public DateTime created() {
return created;
}
public DateTime updated() {
return updated;
}
public LookupRef lookupRef() {
return self;
}
@Override
public boolean equals(Object that) {
if(this == that) {
return true;
}
if(that instanceof LookupEntry) {
LookupEntry other = (LookupEntry) that;
return uri.equals(other.uri) && equivs.equals(other.equivs) && created.equals(other.created) && updated.equals(other.updated)
&& activelyPublished == other.activelyPublished;
}
return false;
}
@Override
public int hashCode() {
return Objects.hashCode(uri, equivs, created, updated);
}
@Override
public String toString() {
return "Lookup entry for " + uri;
}
}