package org.xbib.elasticsearch.oai; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.common.component.AbstractLifecycleComponent; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.rest.RestRequest; import org.xbib.oai.exceptions.OAIException; import org.xbib.oai.server.ServerOAIRequest; import org.xbib.util.DateUtil; import java.util.Date; public class OAIServer extends AbstractLifecycleComponent<OAIServer> { private final Logger logger = LogManager.getLogger(OAIServer.class); @Inject public OAIServer(Settings settings) { super(settings); } @Override protected void doStart() throws ElasticsearchException { } @Override protected void doStop() throws ElasticsearchException { } @Override protected void doClose() throws ElasticsearchException { } public String verbOf(RestRequest request) { return request.hasParam("verb") ? request.param("verb") : "identify"; } public void listRecords(final ServerOAIRequest request, SearchRequestBuilder searchRequestBuilder) throws OAIException { String index = getIndexFrom(request); String type = getTypeFrom(request); Date dateFrom = request.getFrom(); Date dateUntil = request.getUntil(); if (dateFrom == null || dateUntil == null || dateFrom.before(dateUntil)) { throw new OAIException("illegal date arguments"); } String from = DateUtil.formatDateISO(dateFrom); String to = DateUtil.formatDateISO(dateUntil); QueryBuilder query = QueryBuilders .rangeQuery("xbib:timestamp") .from(from) .to(to) .includeLower(true) .includeUpper(true); searchRequestBuilder .setIndices(index) .setTypes(type) .setFrom(request.getResumptionToken().getPosition()) .setSize(request.getResumptionToken().getInterval()) .setQuery(query); } private String getIndexFrom(ServerOAIRequest request) { String index = null; String path = request.getPath(); path = path != null && path.startsWith("/oai") ? path.substring(4) : path; if (path != null) { String[] spec = path.split("/"); if (spec.length > 1) { index = spec[spec.length - 2]; } else if (spec.length == 1) { index = spec[spec.length - 1]; } } return index; } private String getTypeFrom(ServerOAIRequest request) { String type = null; String path = request.getPath(); path = path != null && path.startsWith("/oai") ? path.substring(4) : path; if (path != null) { String[] spec = path.split("/"); if (spec.length > 1) { type = spec[spec.length - 1]; } else if (spec.length == 1) { type = null; } } return type; } }