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.assistedinject.Assisted; import org.ektorp.Attachment; import org.ektorp.AttachmentInputStream; import org.ektorp.CouchDbConnector; import org.ektorp.DocumentNotFoundException; import org.ektorp.support.CouchDbRepositorySupport; import org.ektorp.support.View; import org.jvalue.commons.couchdb.DbConnectorFactory; import org.jvalue.commons.couchdb.DbDocument; import org.jvalue.commons.couchdb.DbDocumentAdaptable; import org.jvalue.commons.couchdb.RepositoryAdapter; import org.jvalue.ods.api.processors.PluginMetaData; import java.io.InputStream; import java.util.List; import java.util.Map; public final class PluginMetaDataRepository extends RepositoryAdapter< PluginMetaDataRepository.PluginMetaDataCouchDbRepository, PluginMetaDataRepository.PluginMetaDataDocument, PluginMetaData> { private static final String DOCUMENT_ID = "doc.value.id != null && doc.value.author != null"; @Inject PluginMetaDataRepository(DbConnectorFactory dbConnectorFactory, @Assisted String databaseName) { super(new PluginMetaDataCouchDbRepository(dbConnectorFactory.createConnector(databaseName, true))); } public void addAttachment(PluginMetaData metaData, InputStream stream, String contentType) { repository.addAttachment(repository.findById(metaData.getId()), stream, contentType); } public InputStream getAttachment(PluginMetaData metaData) { return repository.getAttachment(repository.findById(metaData.getId())); } @View( name = "all", map = "function(doc) { if (" + DOCUMENT_ID + ") emit( null, doc)}") static final class PluginMetaDataCouchDbRepository extends CouchDbRepositorySupport<PluginMetaDataRepository.PluginMetaDataDocument> implements DbDocumentAdaptable<PluginMetaDataDocument, PluginMetaData> { private final CouchDbConnector connector; PluginMetaDataCouchDbRepository(CouchDbConnector connector) { super(PluginMetaDataDocument.class, connector); this.connector = connector; initStandardDesignDocument(); } @Override @View(name = "by_id", map = "function(doc) { if (" + DOCUMENT_ID + ") emit(doc.value.id, doc._id) }") public PluginMetaDataDocument findById(String pluginId) { List<PluginMetaDataDocument> plugins = queryView("by_id", pluginId); if (plugins.isEmpty()) throw new DocumentNotFoundException(pluginId); if (plugins.size() > 1) throw new IllegalStateException("found more than one plugin for id " + pluginId); return plugins.get(0); } @Override public PluginMetaDataDocument createDbDocument(PluginMetaData metaData) { return new PluginMetaDataDocument(metaData); } @Override public String getIdForValue(PluginMetaData metaData) { return metaData.getId(); } public void addAttachment(PluginMetaDataDocument metaData, InputStream stream, String contentType) { AttachmentInputStream attachmentInputStream = new AttachmentInputStream(metaData.getValue().getId(), stream, contentType); connector.createAttachment(metaData.getId(), metaData.getRevision(), attachmentInputStream); } public InputStream getAttachment(PluginMetaDataDocument metaData) { Map<String, Attachment> attachments = metaData.getAttachments(); Attachment attachment = attachments.get(metaData.getValue().getId()); if (attachment == null) throw new IllegalStateException("did not find any attachments for plugin " + metaData.getValue().getId()); return connector.getAttachment(metaData.getId(), metaData.getValue().getId()); } } static final class PluginMetaDataDocument extends DbDocument<PluginMetaData> { @JsonCreator public PluginMetaDataDocument( @JsonProperty("value") PluginMetaData metaData) { super(metaData); } } }