package org.jvalue.ods.db; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.inject.Inject; import com.google.inject.name.Named; import org.ektorp.CouchDbConnector; import org.ektorp.DocumentNotFoundException; import org.ektorp.support.CouchDbRepositorySupport; import org.ektorp.support.View; import org.jvalue.commons.couchdb.DbDocument; import org.jvalue.commons.couchdb.DbDocumentAdaptable; import org.jvalue.commons.couchdb.RepositoryAdapter; import org.jvalue.ods.api.sources.DataSource; import java.util.List; public final class DataSourceRepository extends RepositoryAdapter< DataSourceRepository.DataSourceCouchDbRepository, DataSourceRepository.DataSourceDocument, DataSource> { static final String DATABASE_NAME = "dataSources"; private static final String DOCUMENT_ID = "doc.value.id != null && doc.value.domainIdKey != null"; @Inject DataSourceRepository(@Named(DATABASE_NAME) CouchDbConnector connector) { super(new DataSourceCouchDbRepository(connector)); } @View( name = "all", map = "function(doc) { if (" + DOCUMENT_ID + ") emit(null, doc)}") static final class DataSourceCouchDbRepository extends CouchDbRepositorySupport<DataSourceRepository.DataSourceDocument> implements DbDocumentAdaptable<DataSourceDocument, DataSource> { public DataSourceCouchDbRepository(CouchDbConnector connector) { super(DataSourceDocument.class, connector); initStandardDesignDocument(); } @Override @View(name = "by_id", map = "function(doc) { if (" + DOCUMENT_ID + ") emit(doc.value.id, doc._id)}") public DataSourceDocument findById(String sourceId) { List<DataSourceDocument> sources = queryView("by_id", sourceId); if (sources.isEmpty()) throw new DocumentNotFoundException(sourceId); if (sources.size() > 1) throw new IllegalStateException("found more than one source for id " + sourceId); return sources.get(0); } @Override public DataSourceDocument createDbDocument(DataSource source) { return new DataSourceDocument(source); } @Override public String getIdForValue(DataSource source) { return source.getId(); } } static final class DataSourceDocument extends DbDocument<DataSource> { @JsonCreator public DataSourceDocument( @JsonProperty("value") DataSource dataSource) { super(dataSource); } } }