com.lyncode.xoai.dataprovider.handlers.ListIdentifiersHandler Maven / Gradle / Ivy
The newest version!
package com.lyncode.xoai.dataprovider.handlers;
import com.lyncode.xoai.dataprovider.exceptions.*;
import com.lyncode.xoai.dataprovider.handlers.results.ListItemIdentifiersResult;
import com.lyncode.xoai.dataprovider.handlers.helpers.ItemRepositoryHelper;
import com.lyncode.xoai.dataprovider.handlers.helpers.ResumptionTokenHelper;
import com.lyncode.xoai.dataprovider.model.Context;
import com.lyncode.xoai.dataprovider.model.ItemIdentifier;
import com.lyncode.xoai.dataprovider.model.MetadataFormat;
import com.lyncode.xoai.dataprovider.model.Set;
import com.lyncode.xoai.model.oaipmh.Header;
import com.lyncode.xoai.model.oaipmh.ListIdentifiers;
import com.lyncode.xoai.model.oaipmh.ResumptionToken;
import com.lyncode.xoai.dataprovider.parameters.OAICompiledRequest;
import com.lyncode.xoai.dataprovider.repository.Repository;
import java.util.List;
public class ListIdentifiersHandler extends VerbHandler {
private final ItemRepositoryHelper itemRepositoryHelper;
public ListIdentifiersHandler(Context context, Repository repository) {
super(context, repository);
this.itemRepositoryHelper = new ItemRepositoryHelper(repository.getItemRepository());
}
@Override
public ListIdentifiers handle(OAICompiledRequest parameters) throws OAIException, HandlerException {
ListIdentifiers result = new ListIdentifiers();
if (parameters.hasSet() && !getRepository().getSetRepository().supportSets())
throw new DoesNotSupportSetsException();
int length = getRepository().getConfiguration().getMaxListIdentifiers();
int offset = getOffset(parameters);
ListItemIdentifiersResult listItemIdentifiersResult;
if (!parameters.hasSet()) {
if (parameters.hasFrom() && !parameters.hasUntil())
listItemIdentifiersResult = itemRepositoryHelper.getItemIdentifiers(getContext(), offset, length,
parameters.getMetadataPrefix(), parameters.getFrom());
else if (!parameters.hasFrom() && parameters.hasUntil())
listItemIdentifiersResult = itemRepositoryHelper.getItemIdentifiersUntil(getContext(), offset, length,
parameters.getMetadataPrefix(), parameters.getUntil());
else if (parameters.hasFrom() && parameters.hasUntil())
listItemIdentifiersResult = itemRepositoryHelper.getItemIdentifiers(getContext(), offset, length,
parameters.getMetadataPrefix(), parameters.getFrom(),
parameters.getUntil());
else
listItemIdentifiersResult = itemRepositoryHelper.getItemIdentifiers(getContext(), offset, length,
parameters.getMetadataPrefix());
} else {
if (!getRepository().getSetRepository().exists(parameters.getSet()) && !getContext().hasSet(parameters.getSet()))
throw new NoMatchesException();
if (parameters.hasFrom() && !parameters.hasUntil())
listItemIdentifiersResult = itemRepositoryHelper.getItemIdentifiers(getContext(), offset, length,
parameters.getMetadataPrefix(), parameters.getSet(),
parameters.getFrom());
else if (!parameters.hasFrom() && parameters.hasUntil())
listItemIdentifiersResult = itemRepositoryHelper.getItemIdentifiersUntil(getContext(), offset, length,
parameters.getMetadataPrefix(), parameters.getSet(),
parameters.getUntil());
else if (parameters.hasFrom() && parameters.hasUntil())
listItemIdentifiersResult = itemRepositoryHelper.getItemIdentifiers(getContext(), offset, length,
parameters.getMetadataPrefix(), parameters.getSet(),
parameters.getFrom(), parameters.getUntil());
else
listItemIdentifiersResult = itemRepositoryHelper.getItemIdentifiers(getContext(), offset, length,
parameters.getMetadataPrefix(), parameters.getSet());
}
List itemIdentifiers = listItemIdentifiersResult.getResults();
if (itemIdentifiers.isEmpty()) throw new NoMatchesException();
for (ItemIdentifier itemIdentifier : itemIdentifiers)
result.getHeaders().add(createHeader(parameters, itemIdentifier));
ResumptionToken.Value currentResumptionToken = new ResumptionToken.Value();
if (parameters.hasResumptionToken()) {
currentResumptionToken = parameters.getResumptionToken();
} else if (listItemIdentifiersResult.hasMore()) {
currentResumptionToken = parameters.extractResumptionToken();
}
ResumptionTokenHelper resumptionTokenHelper = new ResumptionTokenHelper(currentResumptionToken,
getRepository().getConfiguration().getMaxListIdentifiers());
result.withResumptionToken(resumptionTokenHelper.resolve(listItemIdentifiersResult.hasMore()));
return result;
}
private int getOffset(OAICompiledRequest parameters) {
if (!parameters.hasResumptionToken())
return 0;
if (parameters.getResumptionToken().getOffset() == null)
return 0;
return parameters.getResumptionToken().getOffset().intValue();
}
private Header createHeader(OAICompiledRequest parameters,
ItemIdentifier itemIdentifier) throws BadArgumentException,
OAIException,
NoMetadataFormatsException {
MetadataFormat format = getContext().formatForPrefix(parameters
.getMetadataPrefix());
if (!itemIdentifier.isDeleted() && !canDisseminate(itemIdentifier, format))
throw new InternalOAIException("The item repository is currently providing items which cannot be disseminated with format "+format.getPrefix());
Header header = new Header();
header.withDatestamp(itemIdentifier.getDatestamp());
header.withIdentifier(itemIdentifier.getIdentifier());
if (itemIdentifier.isDeleted())
header.withStatus(Header.Status.DELETED);
for (Set set : getContext().getSets())
if (set.getCondition().getFilter(getRepository().getFilterResolver()).isItemShown(itemIdentifier))
header.withSetSpec(set.getSpec());
for (Set set : itemIdentifier.getSets())
header.withSetSpec(set.getSpec());
return header;
}
private boolean canDisseminate(ItemIdentifier itemIdentifier, MetadataFormat format) {
return !format.hasCondition() ||
format.getCondition().getFilter(getRepository().getFilterResolver()).isItemShown(itemIdentifier);
}
}