/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package edu.harvard.iq.dataverse.harvest.server.xoai;
import edu.harvard.iq.dataverse.harvest.server.xoai.Xitem;
import com.lyncode.xoai.dataprovider.exceptions.IdDoesNotExistException;
import com.lyncode.xoai.dataprovider.exceptions.OAIException;
import com.lyncode.xoai.dataprovider.filter.ScopedFilter;
import com.lyncode.xoai.dataprovider.handlers.results.ListItemIdentifiersResult;
import com.lyncode.xoai.dataprovider.handlers.results.ListItemsResults;
import com.lyncode.xoai.dataprovider.model.Item;
import com.lyncode.xoai.dataprovider.model.ItemIdentifier;
import com.lyncode.xoai.dataprovider.repository.ItemRepository;
import edu.harvard.iq.dataverse.Dataset;
import edu.harvard.iq.dataverse.DatasetServiceBean;
import edu.harvard.iq.dataverse.harvest.server.OAIRecord;
import edu.harvard.iq.dataverse.harvest.server.OAIRecordServiceBean;
import static java.lang.Math.min;
import java.util.ArrayList;
import static java.util.Arrays.asList;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;
import static java.lang.Math.min;
import static java.lang.Math.min;
import static java.lang.Math.min;
/**
*
* @author Leonid Andreev
* Implements an XOAI "Item Repository". Retrieves Dataverse "OAIRecords"
* representing harvestable local datasets and translates them into
* XOAI "items".
*/
public class XitemRepository implements ItemRepository {
private static Logger logger = Logger.getLogger("edu.harvard.iq.dataverse.harvest.server.xoai.XitemRepository");
private OAIRecordServiceBean recordService;
private DatasetServiceBean datasetService;
public XitemRepository (OAIRecordServiceBean recordService, DatasetServiceBean datasetService) {
super();
this.recordService = recordService;
this.datasetService = datasetService;
}
private List<Xitem> list = new ArrayList<Xitem>();
@Override
public Item getItem(String identifier) throws IdDoesNotExistException, OAIException {
logger.fine("getItem; calling findOAIRecordBySetNameandGlobalId, identifier " + identifier);
OAIRecord oaiRecord = recordService.findOAIRecordBySetNameandGlobalId(null, identifier);
if (oaiRecord != null) {
Dataset dataset = datasetService.findByGlobalId(oaiRecord.getGlobalId());
if (dataset != null) {
return new Xitem(oaiRecord).withDataset(dataset);
}
}
throw new IdDoesNotExistException();
}
@Override
public ListItemIdentifiersResult getItemIdentifiers(List<ScopedFilter> filters, int offset, int length) throws OAIException {
return getItemIdentifiers(filters, offset, length, null, null, null);
}
@Override
public ListItemIdentifiersResult getItemIdentifiers(List<ScopedFilter> filters, int offset, int length, Date from) throws OAIException {
return getItemIdentifiers(filters, offset, length, null, from, null);
}
@Override
public ListItemIdentifiersResult getItemIdentifiersUntil(List<ScopedFilter> filters, int offset, int length, Date until) throws OAIException {
return getItemIdentifiers(filters, offset, length, null, null, until);
}
@Override
public ListItemIdentifiersResult getItemIdentifiers(List<ScopedFilter> filters, int offset, int length, Date from, Date until) throws OAIException {
return getItemIdentifiers(filters, offset, length, null, from, until);
}
@Override
public ListItemIdentifiersResult getItemIdentifiers(List<ScopedFilter> filters, int offset, int length, String setSpec) throws OAIException {
return getItemIdentifiers(filters, offset, length, setSpec, null, null);
}
@Override
public ListItemIdentifiersResult getItemIdentifiers(List<ScopedFilter> filters, int offset, int length, String setSpec, Date from) throws OAIException {
return getItemIdentifiers(filters, offset, length, setSpec, from, null);
}
@Override
public ListItemIdentifiersResult getItemIdentifiersUntil(List<ScopedFilter> filters, int offset, int length, String setSpec, Date until) throws OAIException {
return getItemIdentifiers(filters, offset, length, setSpec, null, until);
}
@Override
public ListItemIdentifiersResult getItemIdentifiers(List<ScopedFilter> filters, int offset, int length, String setSpec, Date from, Date until) throws OAIException {
logger.fine("calling getItemIdentifiers; offset=" + offset
+ ", length=" + length
+ ", setSpec=" + setSpec
+ ", from=" + from
+ ", until=" + until);
List<OAIRecord> oaiRecords = recordService.findOaiRecordsBySetName(setSpec, from, until);
logger.fine("total " + oaiRecords.size() + " returned");
List<ItemIdentifier> xoaiItems = new ArrayList<>();
if (oaiRecords != null && !oaiRecords.isEmpty()) {
for (int i = offset; i < offset + length && i < oaiRecords.size(); i++) {
OAIRecord record = oaiRecords.get(i);
xoaiItems.add(new Xitem(record));
}
boolean hasMore = offset + length < oaiRecords.size();
ListItemIdentifiersResult result = new ListItemIdentifiersResult(hasMore, xoaiItems);
logger.fine("returning result with " + xoaiItems.size() + " items.");
return result;
}
return new ListItemIdentifiersResult(false, xoaiItems);
}
@Override
public ListItemsResults getItems(List<ScopedFilter> filters, int offset, int length) throws OAIException {
return getItems(filters, offset, length, null, null, null);
}
@Override
public ListItemsResults getItems(List<ScopedFilter> filters, int offset, int length, Date from) throws OAIException {
return getItems(filters, offset, length, null, from, null);
}
@Override
public ListItemsResults getItemsUntil(List<ScopedFilter> filters, int offset, int length, Date until) throws OAIException {
return getItems(filters, offset, length, null, null, until);
}
@Override
public ListItemsResults getItems(List<ScopedFilter> filters, int offset, int length, Date from, Date until) throws OAIException {
return getItems(filters, offset, length, null, from, until);
}
@Override
public ListItemsResults getItems(List<ScopedFilter> filters, int offset, int length, String setSpec) throws OAIException {
return getItems(filters, offset, length, setSpec, null, null);
}
@Override
public ListItemsResults getItems(List<ScopedFilter> filters, int offset, int length, String setSpec, Date from) throws OAIException {
return getItems(filters, offset, length, setSpec, from, null);
}
@Override
public ListItemsResults getItemsUntil(List<ScopedFilter> filters, int offset, int length, String setSpec, Date until) throws OAIException {
return getItems(filters, offset, length, setSpec, null, until);
}
@Override
public ListItemsResults getItems(List<ScopedFilter> filters, int offset, int length, String setSpec, Date from, Date until) throws OAIException {
logger.fine("calling getItems; offset=" + offset
+ ", length=" + length
+ ", setSpec=" + setSpec
+ ", from=" + from
+ ", until=" + until);
List<OAIRecord> oaiRecords = recordService.findOaiRecordsBySetName(setSpec, from, until);
logger.fine("total " + oaiRecords.size() + " returned");
List<Item> xoaiItems = new ArrayList<>();
if (oaiRecords != null && !oaiRecords.isEmpty()) {
for (int i = offset; i < offset + length && i < oaiRecords.size(); i++) {
OAIRecord oaiRecord = oaiRecords.get(i);
Dataset dataset = datasetService.findByGlobalId(oaiRecord.getGlobalId());
if (dataset != null) {
Xitem xItem = new Xitem(oaiRecord).withDataset(dataset);
xoaiItems.add(xItem);
}
}
boolean hasMore = offset + length < oaiRecords.size();
ListItemsResults result = new ListItemsResults(hasMore, xoaiItems);
logger.fine("returning result with " + xoaiItems.size() + " items.");
return result;
}
return new ListItemsResults(false, xoaiItems);
}
}