package org.atlasapi.media.channel; import java.util.Set; import org.atlasapi.media.entity.MediaType; import org.atlasapi.media.entity.Publisher; import com.google.common.base.Objects; import com.google.common.base.Optional; import org.joda.time.DateTime; import static com.google.common.base.Preconditions.checkNotNull; public class ChannelQuery { private final Optional<Publisher> broadcaster; private final Optional<MediaType> mediaType; private final Optional<Publisher> availableFrom; private final Optional<Set<Long>> channelGroups; private final Optional<Set<String>> genres; private final Optional<DateTime> advertisedOn; private final Optional<Publisher> publisher; private final Optional<String> uri; private final Optional<String> aliasNamespace; private final Optional<String> aliasValue; private final Optional<ChannelType> channelType; public static Builder builder() { return new Builder(); } private ChannelQuery( Optional<Publisher> broadcaster, Optional<MediaType> mediaType, Optional<Publisher> availableFrom, Optional<Set<Long>> channelGroups, Optional<Set<String>> genres, Optional<DateTime> advertisedOn, Optional<Publisher> publisher, Optional<String> uri, Optional<String> aliasNamespace, Optional<String> aliasValue, Optional<ChannelType> channelType ) { this.broadcaster = checkNotNull(broadcaster); this.mediaType = checkNotNull(mediaType); this.availableFrom = checkNotNull(availableFrom); this.channelGroups = checkNotNull(channelGroups); this.genres = checkNotNull(genres); this.advertisedOn = checkNotNull(advertisedOn); this.publisher = checkNotNull(publisher); this.uri = checkNotNull(uri); this.aliasNamespace = checkNotNull(aliasNamespace); this.aliasValue = checkNotNull(aliasValue); this.channelType = checkNotNull(channelType); } public Optional<Publisher> getBroadcaster() { return broadcaster; } public Optional<MediaType> getMediaType() { return mediaType; } public Optional<Publisher> getAvailableFrom() { return availableFrom; } public Optional<Set<Long>> getChannelGroups() { return channelGroups; } public Optional<Set<String>> getGenres() { return genres; } public Optional<DateTime> getAdvertisedOn() { return advertisedOn; } public Optional<Publisher> getPublisher() { return publisher; } public Optional<String> getUri() { return uri; } public Optional<String> getAliasNamespace() { return aliasNamespace; } public Optional<String> getAliasValue() { return aliasValue; } public Optional<ChannelType> getChannelType() { return channelType; } @Override public String toString() { return Objects.toStringHelper(ChannelQuery.class) .add("broadcaster", broadcaster) .add("mediaType", mediaType) .add("availableFrom", availableFrom) .add("channelGroups", channelGroups) .add("genres", genres) .add("advertiseOn", advertisedOn) .add("publisher", publisher) .add("uri", uri) .add("channelType", channelType) .add("aliasNamespace", aliasNamespace) .add("aliasValue", aliasValue) .toString(); } @Override public int hashCode() { return Objects.hashCode( broadcaster, mediaType, availableFrom, channelGroups, genres, publisher, uri, aliasNamespace, aliasValue, channelType ); } @Override public boolean equals(Object that) { if (this == that) { return true; } if (that instanceof ChannelQuery) { ChannelQuery other = (ChannelQuery) that; return broadcaster.equals(other.broadcaster) && mediaType.equals(other.mediaType) && availableFrom.equals(other.availableFrom) && channelGroups.equals(other.channelGroups) && genres.equals(other.genres) && advertisedOn.equals(other.advertisedOn) && publisher.equals(other.publisher) && uri.equals(other.uri) && aliasNamespace.equals(other.aliasNamespace) && aliasValue.equals(other.aliasValue) && channelType.equals(other.channelType); } return false; } public static class Builder { private Optional<Publisher> broadcaster = Optional.absent(); private Optional<MediaType> mediaType = Optional.absent(); private Optional<Publisher> availableFrom = Optional.absent(); private Optional<Set<Long>> channelGroups = Optional.absent(); private Optional<Set<String>> genres = Optional.absent(); private Optional<DateTime> advertisedOn = Optional.absent(); private Optional<Publisher> source = Optional.absent(); private Optional<Publisher> publisher = Optional.absent(); private Optional<String> uri = Optional.absent(); private Optional<String> aliasNamespace = Optional.absent(); private Optional<String> aliasValue = Optional.absent(); private Optional<ChannelType> channelType = Optional.absent(); private Builder() {} public Builder withBroadcaster(Publisher broadcaster) { this.broadcaster = Optional.fromNullable(broadcaster); return this; } public Builder withMediaType(MediaType mediaType) { this.mediaType = Optional.fromNullable(mediaType); return this; } public Builder withAvailableFrom(Publisher availableFrom) { this.availableFrom = Optional.fromNullable(availableFrom); return this; } public Builder withChannelGroups(Set<Long> channelGroups) { this.channelGroups = Optional.fromNullable(channelGroups); return this; } public Builder withGenres(Set<String> genres) { this.genres = Optional.fromNullable(genres); return this; } public Builder withAdvertisedOn(DateTime advertisedOn) { this.advertisedOn = Optional.fromNullable(advertisedOn); return this; } public Builder withPublisher(Publisher publisher) { this.publisher = Optional.fromNullable(publisher); return this; } public Builder withUri(String uri) { this.uri = Optional.fromNullable(uri); return this; } public Builder withAliasNamespace(String aliasNamespace) { this.aliasNamespace = Optional.fromNullable(aliasNamespace); return this; } public Builder withAliasValue(String aliasValue) { this.aliasValue = Optional.fromNullable(aliasValue); return this; } public Builder withChannelType(ChannelType channelType) { this.channelType = Optional.fromNullable(channelType); return this; } public ChannelQuery build() { return new ChannelQuery( broadcaster, mediaType, availableFrom, channelGroups, genres, advertisedOn, publisher, uri, aliasNamespace, aliasValue, channelType ); } } }