package org.atlasapi.persistence.topic; import org.atlasapi.media.entity.Publisher; import org.atlasapi.media.entity.Topic; import com.metabroadcast.common.base.Maybe; import com.metabroadcast.common.ids.IdGenerator; public class TopicCreatingTopicResolver extends ForwardingTopicStore { private final IdGenerator idGenerator; private final TopicStore delegate; public TopicCreatingTopicResolver(TopicStore delegate, IdGenerator idGenerator) { this.delegate = delegate; this.idGenerator = idGenerator; } public Maybe<Topic> topicFor(String namespace, String value) { Maybe<Topic> topic = delegate().topicFor(namespace, value); return topicOrNewTopic(topic, null, namespace, value); } @Override protected TopicStore delegate() { return delegate; } @Override public Maybe<Topic> topicFor(Publisher publisher, String namespace, String value) { Maybe<Topic> topic = delegate().topicFor(publisher, namespace, value); return topicOrNewTopic(topic, publisher, namespace, value); } private Maybe<Topic> topicOrNewTopic(Maybe<Topic> topic, Publisher publisher, String namespace, String value) { if(topic.hasValue()) { return topic; } else { Topic newTopic = new Topic(idGenerator.generateRaw()); newTopic.setNamespace(namespace); newTopic.setValue(value); newTopic.setPublisher(publisher); return Maybe.just(newTopic); } } }