package org.gbif.checklistbank.registry;
import org.gbif.api.model.common.paging.Pageable;
import org.gbif.api.model.common.paging.PagingResponse;
import org.gbif.api.model.registry.Dataset;
import org.gbif.api.model.registry.Endpoint;
import org.gbif.api.model.registry.Metadata;
import org.gbif.api.model.registry.Network;
import org.gbif.api.service.registry.DatasetService;
import org.gbif.api.vocabulary.Country;
import org.gbif.api.vocabulary.DatasetType;
import org.gbif.api.vocabulary.EndpointType;
import org.gbif.api.vocabulary.MetadataType;
import org.gbif.utils.file.csv.CSVReader;
import org.gbif.utils.file.csv.CSVReaderFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
import com.google.common.base.Throwables;
import com.google.common.collect.Maps;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A simple implementation of a read-only DatasetService of the registry backed by a CSV file.
*/
public class DatasetServiceFileImpl extends EmptyNetworkEntityService<Dataset> implements DatasetService {
private static final Logger LOG = LoggerFactory.getLogger(DatasetServiceFileImpl.class);
private final File dataFile;
private final TreeMap<UUID, Dataset> datasets;
/**
* TAB delimited file with columns:
* key (UUID)
* title (String)
* dwca url (URL)
*/
public DatasetServiceFileImpl(File dataFile) {
this.dataFile = dataFile;
datasets = Maps.newTreeMap();
try (InputStream in = new FileInputStream(dataFile)) {
CSVReader reader = CSVReaderFactory.buildUtf8TabReader(in);
int endKey = 1;
for (String[] row : reader) {
if (row != null && row.length >= 3 && !row[0].startsWith("#")) {
Dataset d = new Dataset();
d.setType(DatasetType.CHECKLIST);
d.setKey(UUID.fromString(row[0].trim()));
d.setTitle(row[1].trim());
Endpoint end = new Endpoint();
end.setKey(endKey++);
end.setType(EndpointType.DWC_ARCHIVE);
end.setUrl(URI.create(row[2].trim()));
d.getEndpoints().add(end);
datasets.put(d.getKey(), d);
}
}
} catch (IOException e) {
Throwables.propagate(e);
}
LOG.info("Loaded {} datasets into registry from {}", datasets.size(), dataFile.getAbsolutePath());
}
@Override
public Dataset get(@NotNull UUID key) {
return datasets.get(key);
}
@Override
public Map<UUID, String> getTitles(Collection<UUID> keys) {
return datasets.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> e.getValue().getTitle()));
}
@Override
public PagingResponse<Dataset> list(@Nullable Pageable page) {
if (page == null) {
page = new PagingResponse<Dataset>();
}
PagingResponse<Dataset> resp = new PagingResponse<Dataset>();
int idx = 1;
for (Map.Entry<UUID, Dataset> e: datasets.entrySet()) {
if (idx >= page.getOffset()) {
if (idx >= page.getLimit()) {
break;
}
resp.getResults().add(e.getValue());
}
idx++;
}
resp.setCount((long) datasets.size());
return resp;
}
@Override
public PagingResponse<Dataset> listConstituents(UUID datasetKey, @Nullable Pageable page) {
throw new UnsupportedOperationException();
}
@Override
public PagingResponse<Dataset> listConstituents(@Nullable Pageable page) {
throw new UnsupportedOperationException();
}
@Override
public PagingResponse<Dataset> listByCountry(Country country, @Nullable DatasetType type, @Nullable Pageable page) {
throw new UnsupportedOperationException();
}
@Override
public PagingResponse<Dataset> listByType(DatasetType type, @Nullable Pageable page) {
throw new UnsupportedOperationException();
}
@Override
public List<Metadata> listMetadata(UUID datasetKey, @Nullable MetadataType type) {
throw new UnsupportedOperationException();
}
@Override
public List<Network> listNetworks(UUID datasetKey) {
throw new UnsupportedOperationException();
}
@Override
public Metadata getMetadata(int metadataKey) {
throw new UnsupportedOperationException();
}
@Override
public void deleteMetadata(int metadataKey) {
throw new UnsupportedOperationException();
}
@Override
public Metadata insertMetadata(UUID datasetKey, InputStream document) {
throw new UnsupportedOperationException();
}
@Override
public InputStream getMetadataDocument(UUID datasetKey) {
throw new UnsupportedOperationException();
}
@Override
public InputStream getMetadataDocument(int metadataKey) {
throw new UnsupportedOperationException();
}
@Override
public PagingResponse<Dataset> listDeleted(@Nullable Pageable page) {
throw new UnsupportedOperationException();
}
@Override
public PagingResponse<Dataset> listDuplicates(@Nullable Pageable page) {
throw new UnsupportedOperationException();
}
@Override
public PagingResponse<Dataset> listDatasetsWithNoEndpoint(@Nullable Pageable page) {
throw new UnsupportedOperationException();
}
}