/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.xoai.services.impl.xoai;
import com.google.common.base.Function;
import com.lyncode.builder.ListBuilder;
import com.lyncode.xoai.dataprovider.core.ListItemIdentifiersResult;
import com.lyncode.xoai.dataprovider.core.ListItemsResults;
import com.lyncode.xoai.dataprovider.data.Item;
import com.lyncode.xoai.dataprovider.data.ItemIdentifier;
import com.lyncode.xoai.dataprovider.exceptions.IdDoesNotExistException;
import com.lyncode.xoai.dataprovider.filter.ScopedFilter;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.dspace.xoai.data.DSpaceSolrItem;
import org.dspace.xoai.services.api.CollectionsService;
import org.dspace.xoai.services.api.HandleResolver;
import org.dspace.xoai.services.api.solr.SolrQueryResolver;
import org.dspace.xoai.solr.DSpaceSolrSearch;
import org.dspace.xoai.solr.exceptions.DSpaceSolrException;
import org.dspace.xoai.solr.exceptions.SolrSearchEmptyException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
/**
*
* @author Lyncode Development Team (dspace at lyncode dot com)
*/
public class DSpaceItemSolrRepository extends DSpaceItemRepository
{
private static Logger log = LogManager.getLogger(DSpaceItemSolrRepository.class);
private SolrServer server;
private SolrQueryResolver solrQueryResolver;
public DSpaceItemSolrRepository(SolrServer server, CollectionsService collectionsService, HandleResolver handleResolver, SolrQueryResolver solrQueryResolver)
{
super(collectionsService, handleResolver);
this.server = server;
this.solrQueryResolver = solrQueryResolver;
}
@Override
public Item getItem(String identifier) throws IdDoesNotExistException {
if (identifier == null) throw new IdDoesNotExistException();
String parts[] = identifier.split(Pattern.quote(":"));
if (parts.length == 3)
{
try
{
SolrQuery params = new SolrQuery("item.handle:" + parts[2]);
return new DSpaceSolrItem(DSpaceSolrSearch.querySingle(server, params));
}
catch (SolrSearchEmptyException ex)
{
throw new IdDoesNotExistException(ex);
}
}
throw new IdDoesNotExistException();
}
@Override
public ListItemIdentifiersResult getItemIdentifiers(
List<ScopedFilter> filters, int offset, int length)
{
try
{
QueryResult queryResult = retrieveItems(filters, offset, length);
List<ItemIdentifier> identifierList = new ListBuilder<Item>()
.add(queryResult.getResults())
.build(new Function<Item, ItemIdentifier>() {
@Override
public ItemIdentifier apply(Item elem) {
return elem;
}
});
return new ListItemIdentifiersResult(queryResult.hasMore(), identifierList, queryResult.getTotal());
}
catch (DSpaceSolrException ex)
{
log.error(ex.getMessage(), ex);
return new ListItemIdentifiersResult(false, new ArrayList<ItemIdentifier>());
}
}
@Override
public ListItemsResults getItems(List<ScopedFilter> filters, int offset,
int length)
{
try
{
QueryResult queryResult = retrieveItems(filters, offset, length);
return new ListItemsResults(queryResult.hasMore(), queryResult.getResults(), queryResult.getTotal());
}
catch (DSpaceSolrException ex)
{
log.error(ex.getMessage(), ex);
return new ListItemsResults(false, new ArrayList<Item>());
}
}
private QueryResult retrieveItems (List<ScopedFilter> filters, int offset, int length) throws DSpaceSolrException {
List<Item> list = new ArrayList<Item>();
SolrQuery params = new SolrQuery(solrQueryResolver.buildQuery(filters))
.setRows(length)
.setStart(offset);
SolrDocumentList solrDocuments = DSpaceSolrSearch.query(server, params);
for (SolrDocument doc : solrDocuments)
list.add(new DSpaceSolrItem(doc));
return new QueryResult(list, (solrDocuments.getNumFound() > offset + length), (int) solrDocuments.getNumFound());
}
private class QueryResult {
private List<Item> results;
private boolean hasMore;
private int total;
private QueryResult(List<Item> results, boolean hasMore, int total) {
this.results = results;
this.hasMore = hasMore;
this.total = total;
}
private List<Item> getResults() {
return results;
}
private boolean hasMore() {
return hasMore;
}
private int getTotal() {
return total;
}
}
}