com.lyncode.xoai.dataprovider.DataProvider Maven / Gradle / Ivy
The newest version!
/**
* Copyright 2012 Lyncode
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* client://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.lyncode.xoai.dataprovider;
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.*;
public class DataProvider {
private static Logger log = Logger.getLogger(DataProvider.class);
public static DataProvider dataProvider (Context context, Repository repository) {
return new DataProvider(context, repository);
}
private Repository repository;
private DateProvider dateProvider;
private final IdentifyHandler identifyHandler;
private final GetRecordHandler getRecordHandler;
private final ListSetsHandler listSetsHandler;
private final ListRecordsHandler listRecordsHandler;
private final ListIdentifiersHandler listIdentifiersHandler;
private final ListMetadataFormatsHandler listMetadataFormatsHandler;
private final ErrorHandler errorsHandler;
public DataProvider (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 ListRecordsHandler(context, repository);
this.listIdentifiersHandler = new ListIdentifiersHandler(context, repository);
this.getRecordHandler = new GetRecordHandler(context, repository);
this.errorsHandler = new ErrorHandler();
}
public OAIPMH handle (Builder builder) throws OAIException {
return handle(builder.build());
}
public OAIPMH handle (OAIRequest requestParameters) throws OAIException {
log.debug("Starting 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");
}
}
}