package edu.harvard.iq.dataverse.harvest.server.xoai;
import com.lyncode.builder.Builder;
import com.lyncode.xoai.dataprovider.exceptions.*;
import com.lyncode.xoai.dataprovider.handlers.*;
import com.lyncode.xoai.exceptions.InvalidResumptionTokenException;
import com.lyncode.xoai.dataprovider.model.Context;
import com.lyncode.xoai.model.oaipmh.OAIPMH;
import com.lyncode.xoai.model.oaipmh.Request;
import com.lyncode.xoai.dataprovider.parameters.OAICompiledRequest;
import com.lyncode.xoai.dataprovider.parameters.OAIRequest;
import com.lyncode.xoai.dataprovider.repository.Repository;
import com.lyncode.xoai.services.api.DateProvider;
import com.lyncode.xoai.services.impl.UTCDateProvider;
import org.apache.log4j.Logger;
import static com.lyncode.xoai.dataprovider.parameters.OAIRequest.Parameter.*;
/**
*
* @author Leonid Andreev
*/
public class XdataProvider {
private static Logger log = Logger.getLogger(XdataProvider.class);
public static XdataProvider dataProvider (Context context, Repository repository) {
return new XdataProvider(context, repository);
}
private Repository repository;
private DateProvider dateProvider;
private final IdentifyHandler identifyHandler;
private final XgetRecordHandler getRecordHandler;
private final ListSetsHandler listSetsHandler;
private final XlistRecordsHandler listRecordsHandler;
private final ListIdentifiersHandler listIdentifiersHandler;
private final ListMetadataFormatsHandler listMetadataFormatsHandler;
private final ErrorHandler errorsHandler;
public XdataProvider (Context context, Repository repository) {
this.repository = repository;
this.dateProvider = new UTCDateProvider();
this.identifyHandler = new IdentifyHandler(context, repository);
this.listSetsHandler = new ListSetsHandler(context, repository);
this.listMetadataFormatsHandler = new ListMetadataFormatsHandler(context, repository);
this.listRecordsHandler = new XlistRecordsHandler(context, repository);
this.listIdentifiersHandler = new ListIdentifiersHandler(context, repository);
//this.getRecordHandler = new GetRecordHandler(context, repository);
this.getRecordHandler = new XgetRecordHandler(context, repository);
this.errorsHandler = new ErrorHandler();
}
public OAIPMH handle (Builder<OAIRequest> builder) throws OAIException {
return handle(builder.build());
}
public OAIPMH handle (OAIRequest requestParameters) throws OAIException {
log.debug("Handling OAI request");
Request request = new Request(repository.getConfiguration().getBaseUrl())
.withVerbType(requestParameters.get(Verb))
.withResumptionToken(requestParameters.get(ResumptionToken))
.withIdentifier(requestParameters.get(Identifier))
.withMetadataPrefix(requestParameters.get(MetadataPrefix))
.withSet(requestParameters.get(Set))
.withFrom(requestParameters.get(From))
.withUntil(requestParameters.get(Until));
OAIPMH response = new OAIPMH()
.withRequest(request)
.withResponseDate(dateProvider.now());
try {
OAICompiledRequest parameters = compileParameters(requestParameters);
switch (request.getVerbType()) {
case Identify:
response.withVerb(identifyHandler.handle(parameters));
break;
case ListSets:
response.withVerb(listSetsHandler.handle(parameters));
break;
case ListMetadataFormats:
response.withVerb(listMetadataFormatsHandler.handle(parameters));
break;
case GetRecord:
response.withVerb(getRecordHandler.handle(parameters));
break;
case ListIdentifiers:
response.withVerb(listIdentifiersHandler.handle(parameters));
break;
case ListRecords:
response.withVerb(listRecordsHandler.handle(parameters));
break;
}
} catch (HandlerException e) {
log.debug(e.getMessage(), e);
response.withError(errorsHandler.handle(e));
}
return response;
}
private OAICompiledRequest compileParameters(OAIRequest requestParameters) throws IllegalVerbException, UnknownParameterException, BadArgumentException, DuplicateDefinitionException, BadResumptionToken {
try {
return requestParameters.compile();
} catch (InvalidResumptionTokenException e) {
throw new BadResumptionToken("The resumption token is invalid");
}
}
}