io.gdcc.xoai.serviceprovider.parsers.ListIdentifiersParser Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of xoai-service-provider Show documentation
Show all versions of xoai-service-provider Show documentation
OAI-PMH service provider implementation. Use it as a harvesting client to read remote repositories.
The newest version!
/*
* 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 io.gdcc.xoai.serviceprovider.parsers;
import static io.gdcc.xoai.model.oaipmh.Error.Code.NO_RECORDS_MATCH;
import static io.gdcc.xoai.xmlio.matchers.QNameMatchers.localPart;
import static io.gdcc.xoai.xmlio.matchers.XmlEventMatchers.aStartElement;
import static io.gdcc.xoai.xmlio.matchers.XmlEventMatchers.elementName;
import static io.gdcc.xoai.xmlio.matchers.XmlEventMatchers.theEndOfDocument;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.equalTo;
import io.gdcc.xoai.model.oaipmh.results.record.Header;
import io.gdcc.xoai.serviceprovider.exceptions.InvalidOAIResponse;
import io.gdcc.xoai.xmlio.XmlReader;
import io.gdcc.xoai.xmlio.exceptions.XmlReaderException;
import javax.xml.stream.events.XMLEvent;
import org.hamcrest.Matcher;
public class ListIdentifiersParser {
private final XmlReader reader;
private boolean awaitingNextInvocation = false;
public ListIdentifiersParser(XmlReader reader) {
this.reader = reader;
}
public boolean hasNext() throws XmlReaderException {
if (!awaitingNextInvocation)
reader.next(headerElement(), errorElement(), resumptionToken(), theEndOfDocument());
awaitingNextInvocation = true;
if (reader.current(errorElement())) {
String code = reader.getAttributeValue(localPart(equalTo("code")));
if (equalTo(NO_RECORDS_MATCH.id()).matches(code)) return false;
else throw new InvalidOAIResponse("OAI responded with code: " + code);
}
return reader.current(headerElement());
}
private Matcher resumptionToken() {
return allOf(aStartElement(), elementName(localPart(equalTo("resumptionToken"))));
}
public Header next() throws XmlReaderException {
if (!hasNext()) throw new XmlReaderException("No more identifiers available");
awaitingNextInvocation = false;
return new HeaderParser().parse(reader);
}
private Matcher errorElement() {
return elementName(localPart(equalTo("error")));
}
private Matcher headerElement() {
return allOf(aStartElement(), elementName(localPart(equalTo("header"))));
}
}