diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java index fd28d5ff8e6ca6f647b5bdfdee3d46ff2ef837c6..6febc63430ffee347a460c64b871d06a9363404c 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java @@ -2,105 +2,118 @@ package info.textgrid.middleware; import java.util.ArrayList; import java.util.List; - import info.textgrid.middleware.oaipmh.ListIdentifiersType; import info.textgrid.middleware.oaipmh.RequestType; +/** + * + */ public abstract class IdentifierListDelivererAbstract implements IdentifierListDelivererInterface { - protected boolean textgrid; - protected boolean dariah; - private static boolean idiomMets; - private static boolean dublinCore; - - public IdentifierListDelivererAbstract(boolean textgrid, boolean dariah) { - this.textgrid = textgrid; - this.dariah = dariah; - } - - @Override - public ListIdentifiersType processIdentifierList(String from, String to, String set, String resumptionToken) { - // TODO Auto-generated method stub - return null; - } + protected boolean textgrid; + protected boolean dariah; + + /** + * @param textgrid + * @param dariah + */ + public IdentifierListDelivererAbstract(boolean textgrid, boolean dariah) { + this.textgrid = textgrid; + this.dariah = dariah; + } + + /* + * (non-Javadoc) + * + * @see info.textgrid.middleware.IdentifierListDelivererInterface#processIdentifierList(java.lang. + * String, java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public ListIdentifiersType processIdentifierList(String from, String to, String set, + String resumptionToken) { + return null; + } - public static ErrorHandler requestChecker(RequestType request) { + /** + * @param request + * @return + */ + public static ErrorHandler requestChecker(RequestType request) { - ErrorHandler result = new ErrorHandler(); + ErrorHandler result = new ErrorHandler(); - // Check if metadata prefix is existing and valid. - if (request.getMetadataPrefix() != null - && !request.getMetadataPrefix().equals(TGConstants.METADATA_DC_PREFIX) - && !request.getMetadataPrefix().equals(TGConstants.METADATA_IDIOM_PREFIX)) { - result.setError(TGConstants.OAI_METADATA_FORMAT_ERROR, - "The value of the metadataPrefix: " + request.getMetadataPrefix() - + " is not supported by the item identified by the value of: " - + request.getIdentifier()); - } - // Check if resumptioToken is valid - if(request.getResumptionToken() != null) { - - if(IdentifierListDelivererAbstract.isIdiomMets() && IdentifierListDelivererIDIOM.cursorCollector.containsKey(request.getResumptionToken())) { - IdentifierListDelivererAbstract.setIdiomMets(true); - IdentifierListDelivererAbstract.setDublinCore(false); - }else if(IdentifierListDelivererAbstract.isDublinCore() && IdentifierListDelivererDC.cursorCollector.containsKey(request.getResumptionToken())){ - IdentifierListDelivererAbstract.setDublinCore(true); - IdentifierListDelivererAbstract.setIdiomMets(false); - }else { - result.setError(TGConstants.OAI_BAD_RESUMPTION_TOKEN, - "The value of the " + request.getResumptionToken() + " argument is invalid or expired."); - } - } - - if (request.getResumptionToken() == null && request.getMetadataPrefix() != null) { - if(request.getMetadataPrefix().equals(TGConstants.METADATA_IDIOM_PREFIX)) { - IdentifierListDelivererAbstract.setIdiomMets(true); - IdentifierListDelivererAbstract.setDublinCore(false); - } - if(request.getMetadataPrefix().equals(TGConstants.METADATA_DC_PREFIX)) { - IdentifierListDelivererAbstract.setDublinCore(true); - IdentifierListDelivererAbstract.setIdiomMets(false); - } - } - - // Check if other params are existing, they shouldn't! - else { + // Check if metadata prefix is existing and valid. + if (request.getMetadataPrefix() != null + && !request.getMetadataPrefix().equals(TGConstants.METADATA_DC_PREFIX) + && !request.getMetadataPrefix().equals(TGConstants.METADATA_IDIOM_PREFIX)) { + result.setError(TGConstants.OAI_METADATA_FORMAT_ERROR, + "The value of the metadataPrefix: " + request.getMetadataPrefix() + + " is not supported by the item identified by the value of: " + + request.getIdentifier()); + } - List<String> errorValues = new ArrayList<String>(); - - if (request.getResumptionToken() != null && request.getMetadataPrefix() !=null) { - errorValues.add("metadataPrefix"); - } - if (request.getResumptionToken() == null && request.getMetadataPrefix() == null) { - errorValues.add("metadataPrefix"); - } - if (request.getIdentifier() != null) { - errorValues.add("identifier"); - } - if(errorValues.size()>0) { - result.setError(TGConstants.OAI_BAD_ARGUMENT, "The request includes illegal arguments " - + "or is missing required arguments: " + errorValues); - } + // // Check if resumptioToken is valid + // if (request.getResumptionToken() != null) { + // + // if (IdentifierListDelivererAbstract.isIdiomMets() + // && IdentifierListDelivererIDIOM.cursorCollector + // .containsKey(request.getResumptionToken())) { + // IdentifierListDelivererAbstract.setIdiomMets(true); + // IdentifierListDelivererAbstract.setDublinCore(false); + // } else if (IdentifierListDelivererAbstract.isDublinCore() + // && IdentifierListDelivererDC.cursorCollector.containsKey(request.getResumptionToken())) { + // IdentifierListDelivererAbstract.setDublinCore(true); + // IdentifierListDelivererAbstract.setIdiomMets(false); + // } else { + // result.setError(TGConstants.OAI_BAD_RESUMPTION_TOKEN, + // "The value of the " + request.getResumptionToken() + // + " argument is invalid or expired."); + // } + // } - } + // Check if resumptionToken is invalid or existing. + if (request.getResumptionToken() != null) { + boolean restokDCExisting = RecordListDelivererIDIOM.cursorCollector != null + && RecordListDelivererIDIOM.cursorCollector.containsKey(request.getResumptionToken()); + boolean restokIDIOMExisting = RecordListDelivererDC.cursorCollector != null + && RecordListDelivererDC.cursorCollector.containsKey(request.getResumptionToken()); + if (restokDCExisting || restokIDIOMExisting) { + result.setError(TGConstants.OAI_BAD_RESUMPTION_TOKEN, "The value of the " + + request.getResumptionToken() + " argument is invalid or expired."); + } + } - return result; - } + // if (request.getResumptionToken() == null && request.getMetadataPrefix() != null) { + // if (request.getMetadataPrefix().equals(TGConstants.METADATA_IDIOM_PREFIX)) { + // IdentifierListDelivererAbstract.setIdiomMets(true); + // IdentifierListDelivererAbstract.setDublinCore(false); + // } + // if (request.getMetadataPrefix().equals(TGConstants.METADATA_DC_PREFIX)) { + // IdentifierListDelivererAbstract.setDublinCore(true); + // IdentifierListDelivererAbstract.setIdiomMets(false); + // } + // } + // + // // Check if other params are existing, they shouldn't! + // else { - public static boolean isIdiomMets() { - return idiomMets; - } + List<String> errorValues = new ArrayList<String>(); - public static void setIdiomMets(boolean idiomMets) { - IdentifierListDelivererAbstract.idiomMets = idiomMets; - } + if (request.getResumptionToken() != null && request.getMetadataPrefix() != null) { + errorValues.add("metadataPrefix"); + } + if (request.getResumptionToken() == null && request.getMetadataPrefix() == null) { + errorValues.add("metadataPrefix"); + } + if (request.getIdentifier() != null) { + errorValues.add("identifier"); + } + if (errorValues.size() > 0) { + result.setError(TGConstants.OAI_BAD_ARGUMENT, "The request includes illegal arguments " + + "or is missing required arguments: " + errorValues); + } - public static boolean isDublinCore() { - return dublinCore; - } + return result; + } - public static void setDublinCore(boolean dublinCore) { - IdentifierListDelivererAbstract.dublinCore = dublinCore; - } - } diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererDC.java b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererDC.java index 77db4d5e98b7bf24d625c153b8438f8ffdce6ef6..86523c2c6b3c579e529c65a22906ac99545a0bb3 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererDC.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererDC.java @@ -4,13 +4,10 @@ import info.textgrid.middleware.oaipmh.HeaderType; import info.textgrid.middleware.oaipmh.ListIdentifiersType; import info.textgrid.middleware.oaipmh.ResumptionTokenType; import info.textgrid.namespaces.middleware.tgcrud.common.TextGridMimetypes; - import java.text.ParseException; import java.util.Hashtable; import java.util.Map; - import javax.xml.datatype.DatatypeConfigurationException; - import org.apache.commons.logging.LogFactory; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.common.unit.TimeValue; @@ -30,269 +27,331 @@ import org.elasticsearch.search.SearchHit; public class IdentifierListDelivererDC extends IdentifierListDelivererAbstract { - private static org.apache.commons.logging.Log log = LogFactory.getLog(IdentifierListDelivererDC.class); - private String datestamp; - private boolean idExist = true; - private OAI_ESClient oaiEsClient; - - private String[] identifierListFields; //Fields for the elasticsearch request - private String rangeField; // Field for the optional range query - private String dateOfObjectCreation; // Field for the object creation in the repository - private String repositoryObjectURIPrefix; // - private String identifierField; - private static final int lifeTimeResToken = 10000; - - public static Map<String, Integer> cursorCollector = new Hashtable<String, Integer >(); - - private int searchResponseSize; - - - /** - * In OAIPMH a ListIdentifiers request is answered by responding the - * datestamp and the identifier of an object Both will be responded in a - * header element. This function build the header element - * - * @param datestamp - * taken from the elasticSearch index (created element) - * @param identifier - * taken from the elasticSearch index (textgridUri) - * @return the ListIdentifierElement with the responded header element - */ - - public IdentifierListDelivererDC(boolean textgrid, boolean dariah) { - super(textgrid, dariah); - } - - - // FIXME Delete this function and check for empty set string in setListIdentifierHeaderWithSet - - private ListIdentifiersType setListIdentifierHeader(String datestamp, String identifier, ListIdentifiersType lit, String set) { - HeaderType header = new HeaderType(); - header.setDatestamp(datestamp); - header.setIdentifier(identifier); - - if(set!=null){ - header.getSetSpec().add(set); - } - - lit.getHeader().add(header); - return lit; - } - - /** - * To get the required values for the ListIdentifiers request this function - * will ask ElasticSearch for a specific textgridUri the values "created" - * and "textgridUri". - * - * Since the ListIdentifiers request enables the possibility the limit the - * request in a specific time interval, it is necessary to perform a range - * query on the ElasticSearch index - * - * @param from - * : start value for the range query - * @param to - * : end value to the range query - * @return after calling the function "setListIdentifierHeader" the return - * value is the whole ListIdentifiers element - */ - - // FIXME combine it with with getIdentifierListWithSet and check for empty set - - - public ListIdentifiersType processIdentifierList(String from, String to, String set, String resumptionToken) { - ListIdentifiersType lit = new ListIdentifiersType(); - QueryBuilder query = setOrNot(set, from, to); - SearchResponse listListIdentiferValues; - - if(resumptionToken != null){ - listListIdentiferValues = OAI_ESClient.getOaiESClient().prepareSearchScroll(resumptionToken).setScroll(new TimeValue(lifeTimeResToken)).execute().actionGet(); - } - else{ - listListIdentiferValues = OAI_ESClient - .getOaiESClient().prepareSearch(OAI_ESClient.getEsIndex()) - .setTypes(OAI_ESClient.getEsType()) - .setScroll(new TimeValue(lifeTimeResToken)) - .addFields(identifierListFields) - .setQuery(query) - .setSize(searchResponseSize) - .execute() - .actionGet(); - } - listListIdentiferValues = hitHandling(listListIdentiferValues, lit, set, listListIdentiferValues.getScrollId()); - - return lit; - } - - - public SearchResponse hitHandling(SearchResponse listFurtherValues, ListIdentifiersType lit, String set, String resumptionToken){ - - int i = 0; - for (SearchHit hit : listFurtherValues.getHits().getHits()) { - i++; - if (this.textgrid) { - - String datestamp = hit.getFields().get(dateOfObjectCreation).getValue().toString(); - try { - datestamp = OAIPMHUtillities.convertDateFormat(datestamp).toXMLFormat(); - } catch (ParseException e1) { - log.debug(e1); - } catch (DatatypeConfigurationException e1) { - log.debug(e1); - } - String identifier = hit.getFields().get(identifierField).getValue().toString(); - - lit = setListIdentifierHeader(datestamp, identifier, lit, set); - } - - if (this.dariah) { - - datestamp = hit.getFields().get(dateOfObjectCreation).getValue().toString(); - - try { - datestamp = hit.getFields().get(this.dateOfObjectCreation).getValue().toString(); - datestamp = OAIPMHUtillities.convertDateFormat(datestamp).toXMLFormat(); - } catch (ParseException e1) { - log.debug(e1); - } catch (DatatypeConfigurationException e1) { - log.debug(e1); - } - - String identifier = hit.getFields().get(identifierField).getValue().toString(); - lit = setListIdentifierHeader(datestamp, identifier, lit, set); - } - - } - - // Check the need for a resumption token! - ResumptionTokenType resTokenForResponse = OAIPMHUtillities.getResumptionToken( - listFurtherValues.getHits().getTotalHits(), resumptionToken, cursorCollector, - listFurtherValues.getScrollId(), this.searchResponseSize, i); - if (resTokenForResponse != null) { - lit.setResumptionToken(resTokenForResponse); - } - - return listFurtherValues; - } - - public QueryBuilder setOrNot(String set, String from, String to){ - - String filterFormat = ""; - if(textgrid==true) { - filterFormat = TextGridMimetypes.EDITION; - }else { - filterFormat = TextGridMimetypes.DARIAH_COLLECTION; - } - - QueryBuilder rangeQuery = QueryBuilders.rangeQuery(rangeField).from(from).to(to); - QueryBuilder formatQuery = QueryBuilders.matchPhrasePrefixQuery("format", filterFormat); - QueryBuilder query; - - if(set!=null){ - String queryField = ""; - String valueField = ""; - - if (this.dariah == true) { - queryField = "descriptiveMetadata.dc:relation"; - valueField = set; - } - - if (this.textgrid == true) { - String[] setParts = set.split(":"); - if (setParts[0].equals("project")) { - queryField = "project.id"; - valueField = setParts[1]; - } - } - - QueryBuilder matchQuery = QueryBuilders.matchPhraseQuery(queryField, valueField); - if (dariah){ - query = matchQuery; - } - else { - query = QueryBuilders.boolQuery().must(matchQuery).must(formatQuery); - } - - - } else { - if(dariah == true) - query = rangeQuery; - else - query = QueryBuilders.boolQuery().must(rangeQuery).must(formatQuery); - } - - return query; - } - - - public ListIdentifiersType getLit(ListIdentifiersType lit) { - return lit; - } - - public String getDateOfObjectCreation() { - return dateOfObjectCreation; - } - - public void setDateOfObjectCreation(String dateOfObjectCreation) { - this.dateOfObjectCreation = dateOfObjectCreation; - } - - public void setRepositoryObjectURIPrefix(String repositoryObjectURIPrefix) { - this.repositoryObjectURIPrefix = repositoryObjectURIPrefix; - } - - public String getRepositoryObjectURIPrefix() { - return repositoryObjectURIPrefix; - } - - public void setIdExist(boolean validItem) { - idExist = validItem; - } - - public boolean getIdExist() { - return idExist; - } - - public String[] getIdentifierListFields() { - return identifierListFields; - } - - public void setIdentifierListFields(String[] identifierListFields) { - this.identifierListFields = identifierListFields; - } - - public String getFieldForRange() { - return rangeField; - } - - public void setFieldForRange(String fieldForRange) { - this.rangeField = fieldForRange; - } - - public String getIdentifierField() { - return identifierField; - } - - public void setIdentifierField(String identifierPrefix) { - this.identifierField = identifierPrefix; - } - public int getSearchResponseSize() { - return searchResponseSize; - } - - public void setSearchResponseSize(String searchResponseSize) { -// System.out.println(searchResponseSize); - this.searchResponseSize = Integer.parseInt(searchResponseSize); -// System.out.println(this.searchResponseSize); - } - - - public OAI_ESClient getOaiEsClient() { - return oaiEsClient; - } - - - public void setOaiEsClient(OAI_ESClient oaiEsClient) { - this.oaiEsClient = oaiEsClient; - } + private static org.apache.commons.logging.Log log = + LogFactory.getLog(IdentifierListDelivererDC.class); + private String datestamp; + private boolean idExist = true; + private OAI_ESClient oaiEsClient; + + private String[] identifierListFields; // Fields for the elasticsearch request + private String rangeField; // Field for the optional range query + private String dateOfObjectCreation; // Field for the object creation in the repository + private String repositoryObjectURIPrefix; // + private String identifierField; + private static final int lifeTimeResToken = 10000; + + public static Map<String, Integer> cursorCollector = new Hashtable<String, Integer>(); + + private int searchResponseSize; + + /** + * In OAIPMH a ListIdentifiers request is answered by responding the datestamp and the identifier + * of an object Both will be responded in a header element. This function build the header element + * + * @param datestamp taken from the elasticSearch index (created element) + * @param identifier taken from the elasticSearch index (textgridUri) + * @return the ListIdentifierElement with the responded header element + */ + + public IdentifierListDelivererDC(boolean textgrid, boolean dariah) { + super(textgrid, dariah); + } + + + + /** + * @param datestamp + * @param identifier + * @param lit + * @param set + * @return + */ + private static ListIdentifiersType setListIdentifierHeader(String datestamp, String identifier, + ListIdentifiersType lit, String set) { + + // FIXME Delete this function and check for empty set string in setListIdentifierHeaderWithSet + + HeaderType header = new HeaderType(); + header.setDatestamp(datestamp); + header.setIdentifier(identifier); + + if (set != null) { + header.getSetSpec().add(set); + } + lit.getHeader().add(header); + + return lit; + } + + /** + * To get the required values for the ListIdentifiers request this function will ask ElasticSearch + * for a specific textgridUri the values "created" and "textgridUri". + * + * Since the ListIdentifiers request enables the possibility the limit the request in a specific + * time interval, it is necessary to perform a range query on the ElasticSearch index + * + * @param from : start value for the range query + * @param to : end value to the range query + * @return after calling the function "setListIdentifierHeader" the return value is the whole + * ListIdentifiers element + */ + public ListIdentifiersType processIdentifierList(String from, String to, String set, + String resumptionToken) { + + // FIXME combine it with with getIdentifierListWithSet and check for empty set + + ListIdentifiersType lit = new ListIdentifiersType(); + QueryBuilder query = setOrNot(set, from, to); + SearchResponse listListIdentiferValues; + + if (resumptionToken != null) { + listListIdentiferValues = OAI_ESClient.getOaiESClient().prepareSearchScroll(resumptionToken) + .setScroll(new TimeValue(lifeTimeResToken)).execute().actionGet(); + } else { + listListIdentiferValues = OAI_ESClient + .getOaiESClient().prepareSearch(OAI_ESClient.getEsIndex()) + .setTypes(OAI_ESClient.getEsType()) + .setScroll(new TimeValue(lifeTimeResToken)) + .addFields(this.identifierListFields) + .setQuery(query) + .setSize(this.searchResponseSize) + .execute() + .actionGet(); + } + listListIdentiferValues = + hitHandling(listListIdentiferValues, lit, set, listListIdentiferValues.getScrollId()); + + return lit; + } + + /** + * @param listFurtherValues + * @param lit + * @param set + * @param resumptionToken + * @return + */ + public SearchResponse hitHandling(SearchResponse listFurtherValues, ListIdentifiersType lit, + String set, String resumptionToken) { + + int i = 0; + for (SearchHit hit : listFurtherValues.getHits().getHits()) { + i++; + if (this.textgrid) { + + String datestamp = hit.getFields().get(this.dateOfObjectCreation).getValue().toString(); + try { + datestamp = OAIPMHUtillities.convertDateFormat(datestamp).toXMLFormat(); + } catch (ParseException e1) { + log.debug(e1); + } catch (DatatypeConfigurationException e1) { + log.debug(e1); + } + String identifier = hit.getFields().get(this.identifierField).getValue().toString(); + + lit = setListIdentifierHeader(datestamp, identifier, lit, set); + } + + if (this.dariah) { + + this.datestamp = hit.getFields().get(this.dateOfObjectCreation).getValue().toString(); + + try { + this.datestamp = hit.getFields().get(this.dateOfObjectCreation).getValue().toString(); + this.datestamp = OAIPMHUtillities.convertDateFormat(this.datestamp).toXMLFormat(); + } catch (ParseException e1) { + log.debug(e1); + } catch (DatatypeConfigurationException e1) { + log.debug(e1); + } + + String identifier = hit.getFields().get(this.identifierField).getValue().toString(); + lit = setListIdentifierHeader(this.datestamp, identifier, lit, set); + } + } + + // Check the need for a resumption token! + ResumptionTokenType resTokenForResponse = OAIPMHUtillities.getResumptionToken( + listFurtherValues.getHits().getTotalHits(), resumptionToken, cursorCollector, + listFurtherValues.getScrollId(), this.searchResponseSize, i); + if (resTokenForResponse != null) { + lit.setResumptionToken(resTokenForResponse); + } + + return listFurtherValues; + } + + /** + * @param set + * @param from + * @param to + * @return + */ + public QueryBuilder setOrNot(String set, String from, String to) { + + String filterFormat = ""; + if (this.textgrid == true) { + filterFormat = TextGridMimetypes.EDITION; + } else { + filterFormat = TextGridMimetypes.DARIAH_COLLECTION; + } + + QueryBuilder rangeQuery = QueryBuilders.rangeQuery(this.rangeField).from(from).to(to); + QueryBuilder formatQuery = QueryBuilders.matchPhrasePrefixQuery("format", filterFormat); + QueryBuilder query; + + if (set != null) { + String queryField = ""; + String valueField = ""; + + if (this.dariah == true) { + queryField = "descriptiveMetadata.dc:relation"; + valueField = set; + } + + if (this.textgrid == true) { + String[] setParts = set.split(":"); + if (setParts[0].equals("project")) { + queryField = "project.id"; + valueField = setParts[1]; + } + } + + QueryBuilder matchQuery = QueryBuilders.matchPhraseQuery(queryField, valueField); + if (this.dariah) { + query = matchQuery; + } else { + query = QueryBuilders.boolQuery().must(matchQuery).must(formatQuery); + } + + } else { + if (this.dariah == true) + query = rangeQuery; + else + query = QueryBuilders.boolQuery().must(rangeQuery).must(formatQuery); + } + + return query; + } + + /** + * @param lit + * @return + */ + public ListIdentifiersType getLit(ListIdentifiersType lit) { + return lit; + } + + /** + * @return + */ + public String getDateOfObjectCreation() { + return this.dateOfObjectCreation; + } + + /** + * @param dateOfObjectCreation + */ + public void setDateOfObjectCreation(String dateOfObjectCreation) { + this.dateOfObjectCreation = dateOfObjectCreation; + } + + /** + * @param repositoryObjectURIPrefix + */ + public void setRepositoryObjectURIPrefix(String repositoryObjectURIPrefix) { + this.repositoryObjectURIPrefix = repositoryObjectURIPrefix; + } + + /** + * @return + */ + public String getRepositoryObjectURIPrefix() { + return this.repositoryObjectURIPrefix; + } + + /** + * @param validItem + */ + public void setIdExist(boolean validItem) { + this.idExist = validItem; + } + + /** + * @return + */ + public boolean getIdExist() { + return this.idExist; + } + + /** + * @return + */ + public String[] getIdentifierListFields() { + return this.identifierListFields; + } + + /** + * @param identifierListFields + */ + public void setIdentifierListFields(String[] identifierListFields) { + this.identifierListFields = identifierListFields; + } + + /** + * @return + */ + public String getFieldForRange() { + return this.rangeField; + } + + /** + * @param fieldForRange + */ + public void setFieldForRange(String fieldForRange) { + this.rangeField = fieldForRange; + } + + /** + * @return + */ + public String getIdentifierField() { + return this.identifierField; + } + + /** + * @param identifierPrefix + */ + public void setIdentifierField(String identifierPrefix) { + this.identifierField = identifierPrefix; + } + + /** + * @return + */ + public int getSearchResponseSize() { + return this.searchResponseSize; + } + + /** + * @param searchResponseSize + */ + public void setSearchResponseSize(String searchResponseSize) { + this.searchResponseSize = Integer.parseInt(searchResponseSize); + } + + /** + * @return + */ + public OAI_ESClient getOaiEsClient() { + return this.oaiEsClient; + } + + /** + * @param oaiEsClient + */ + public void setOaiEsClient(OAI_ESClient oaiEsClient) { + this.oaiEsClient = oaiEsClient; + } } diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererInterface.java b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererInterface.java index 241d5676df5008a4bbc4fabd15cc5a380e91628d..2e9b56f3cc793b0b6c6b322c1bff0733c0fe8fd3 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererInterface.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererInterface.java @@ -1,11 +1,22 @@ package info.textgrid.middleware; import java.text.ParseException; - import info.textgrid.middleware.oaipmh.ListIdentifiersType; +/** + * + */ public interface IdentifierListDelivererInterface { - - public ListIdentifiersType processIdentifierList(String from, String to, String set, String resumptionToken) throws ParseException; + + /** + * @param from + * @param to + * @param set + * @param resumptionToken + * @return + * @throws ParseException + */ + public ListIdentifiersType processIdentifierList(String from, String to, String set, + String resumptionToken) throws ParseException; } diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHImpl.java b/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHImpl.java index 2e1b3be4572f1721575a44800bc0f9653ef29f3c..e635753b2c41b3164a0497a6970d307b3776d9af 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHImpl.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OAIPMHImpl.java @@ -25,7 +25,7 @@ import info.textgrid.middleware.oaipmh.VerbType; * </p> * * @author Maximilian Brodhun, SUB Göttingen - * @version 2019-03-07 + * @version 2019-05-28 * @since 2014-01-29 */ public class OAIPMHImpl implements OAIPMHProducer { @@ -52,18 +52,19 @@ public class OAIPMHImpl implements OAIPMHProducer { ListIdentifiersType lit = new ListIdentifiersType(); /** - * @param oaiEsClient * @param rep - * @param recDeliv - * @param recordList + * @param recDelivDC + * @param recDelivIDIOM + * @param recordListDC + * @param recordListIDIOM * @param metadataFormatList * @param setList * @param identifierList + * @param identifierListIDIOM */ public OAIPMHImpl(RepIdentification rep, RecordDelivererDC recDelivDC, - RecordDelivererIDIOM recDelivIDIOM, - RecordListDelivererDC recordListDC, RecordListDelivererIDIOM recordListIDIOM, - MetadataFormatListDeliverer metadataFormatList, + RecordDelivererIDIOM recDelivIDIOM, RecordListDelivererDC recordListDC, + RecordListDelivererIDIOM recordListIDIOM, MetadataFormatListDeliverer metadataFormatList, SetDeliverer setList, IdentifierListDelivererDC identifierList, IdentifierListDelivererIDIOM identifierListIDIOM) { this.rep = rep; @@ -236,24 +237,50 @@ public class OAIPMHImpl implements OAIPMHProducer { if (requestErrors.getError().getValue() != null) { oai.getError().add(requestErrors.getError()); } else { - // Default is DC. - IdentifierListDelivererInterface listDeliv = this.identifierListDC; - this.log.info("Actual Value of IDIOM MetsMods Boolean is: " - + IdentifierListDelivererAbstract.isIdiomMets()); - this.log.info("Actual Value of DublinCore Boolean is: " - + IdentifierListDelivererAbstract.isDublinCore()); + // If metadataFormat IS SET, set recordListDeliverer accordingly. + IdentifierListDelivererInterface idListDeliv = null; + if (request.getMetadataPrefix() != null) { + if (request.getMetadataPrefix().equals(TGConstants.METADATA_DC_PREFIX)) { + idListDeliv = this.identifierListDC; + } else { + idListDeliv = this.identifierListIDIOM; + } + } - if (IdentifierListDelivererAbstract.isIdiomMets()) { - listDeliv = this.identifierListIDIOM; - } else if (IdentifierListDelivererAbstract.isDublinCore()) { - listDeliv = this.identifierListDC; + // If metadata format IS NOT SET, check resumption token hash maps to decide if we have to + // serve oai_dc or idiom_mets metadata format. + else { + boolean restokDCExisting = IdentifierListDelivererDC.cursorCollector != null + && IdentifierListDelivererDC.cursorCollector.containsKey(request.getResumptionToken()); + boolean restokIDIOMExisting = IdentifierListDelivererIDIOM.cursorCollector != null + && IdentifierListDelivererIDIOM.cursorCollector + .containsKey(request.getResumptionToken()); + if (restokDCExisting) { + idListDeliv = this.identifierListDC; + } else if (restokIDIOMExisting) { + idListDeliv = this.identifierListIDIOM; + } } - ListIdentifiersType listIdentifiers = new ListIdentifiersType(); - listIdentifiers = listDeliv.processIdentifierList(request.getFrom(), request.getUntil(), - request.getSet(), request.getResumptionToken()); - + // // Default is DC. + // + // IdentifierListDelivererInterface listDeliv = this.identifierListDC; + // + // this.log.info("Actual Value of IDIOM MetsMods Boolean is: " + // + IdentifierListDelivererAbstract.isIdiomMets()); + // this.log.info("Actual Value of DublinCore Boolean is: " + // + IdentifierListDelivererAbstract.isDublinCore()); + // + // if (IdentifierListDelivererAbstract.isIdiomMets()) { + // listDeliv = this.identifierListIDIOM; + // } else if (IdentifierListDelivererAbstract.isDublinCore()) { + // listDeliv = this.identifierListDC; + // } + + ListIdentifiersType listIdentifiers = idListDeliv.processIdentifierList(request.getFrom(), + request.getUntil(), request.getSet(), request.getResumptionToken()); + if (listIdentifiers != null) { oai.setListIdentifiers(listIdentifiers); } else { @@ -300,7 +327,7 @@ public class OAIPMHImpl implements OAIPMHProducer { List<String> errorValues = new ArrayList<String>(); ListMetadataFormatsType listMF = new ListMetadataFormatsType(); JAXBElement<OAIPMHType> oaipmhRoot = obf.createOAIPMH(oai); - + if (this.metadataFormatList.requestChecker(request)) { if (id.isEmpty()) { @@ -351,26 +378,42 @@ public class OAIPMHImpl implements OAIPMHProducer { public JAXBElement<OAIPMHType> listRecordsRequest(ObjectFactory obf, OAIPMHType oai, RequestType request) { + // Create OAIPMH root object. JAXBElement<OAIPMHType> oaipmhRoot = obf.createOAIPMH(oai); - + + // Check request's syntax. ErrorHandler requestErrors = RecordListDelivererAbstract.requestChecker(request); - // System.out.println("DU KOMMST NICHT VORBEI!!!"); if (requestErrors.getError().getCode() != null) { oai.getError().add(requestErrors.getError()); } else { - // Default is DC. - RecordListDelivererInterface recListDeliv = this.recordListDC; - if (RecordListDelivererAbstract.isIdiomMets()) { - recListDeliv = this.recordListIDIOM; - } else if (RecordListDelivererAbstract.isDublinCore()) { - recListDeliv = this.recordListDC; + // If metadataFormat IS SET, set recordListDeliverer accordingly. + RecordListDelivererInterface recListDeliv = null; + if (request.getMetadataPrefix() != null) { + if (request.getMetadataPrefix().equals(TGConstants.METADATA_DC_PREFIX)) { + recListDeliv = this.recordListDC; + } else { + recListDeliv = this.recordListIDIOM; + } + } + + // If metadata format IS NOT SET, check resumption token hash maps to decide if we have to + // serve oai_dc or idiom_mets metadata format. + else { + boolean restokDCExisting = RecordListDelivererDC.cursorCollector != null + && RecordListDelivererDC.cursorCollector.containsKey(request.getResumptionToken()); + boolean restokIDIOMExisting = RecordListDelivererIDIOM.cursorCollector != null + && RecordListDelivererIDIOM.cursorCollector.containsKey(request.getResumptionToken()); + if (restokDCExisting) { + recListDeliv = this.recordListDC; + } else if (restokIDIOMExisting) { + recListDeliv = this.recordListIDIOM; + } } - - ListRecordsType listRecords = new ListRecordsType(); - listRecords = recListDeliv.getRecords(request.getFrom(), request.getUntil(), request.getSet(), - request.getResumptionToken()); + + ListRecordsType listRecords = recListDeliv.getRecords(request.getFrom(), request.getUntil(), + request.getSet(), request.getResumptionToken()); if (listRecords != null) { oai.setListRecords(listRecords); diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererAbstract.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererAbstract.java index 8ffcb85d7158ea9223c29e097fc88b547dbc575b..c5af207168d447627aac9536b323ab8e738838ef 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererAbstract.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererAbstract.java @@ -69,11 +69,10 @@ public abstract class RecordDelivererAbstract implements RecordDelivererInterfac if (request.getIdentifier() == null) { errorValues.add("identifier"); } - if(errorValues.size()>0) { - result.setError(TGConstants.OAI_BAD_ARGUMENT, "The request includes illegal arguments " - + "or is missing required arguments: " + errorValues); + if (errorValues.size() > 0) { + result.setError(TGConstants.OAI_BAD_ARGUMENT, "The request includes illegal arguments " + + "or is missing required arguments: " + errorValues); } - } return result; diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java index d7193d21484f0651fac385d5cbb4d4a4fd5c1be7..eccb54aa5338267acdf80473f08625b3df591133 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java @@ -34,22 +34,6 @@ public class RecordDelivererDC extends RecordDelivererAbstract { * several times */ - // private List<String> contributors = new ArrayList<String>(); - // private List<String> coverages = new ArrayList<String>(); - // private List<String> creators = new ArrayList<String>(); - // private List<String> dates = new ArrayList<String>(); - // private List<String> descriptions = new ArrayList<String>(); - // private List<String> formats = new ArrayList<String>(); - // private List<String> identifiers = new ArrayList<String>(); - // private List<String> languages = new ArrayList<String>(); - // private List<String> publishers = new ArrayList<String>(); - // private List<String> relations = new ArrayList<String>(); - // private List<String> rights = new ArrayList<String>(); - // private List<String> sources = new ArrayList<String>(); - // private List<String> subjects = new ArrayList<String>(); - // private List<String> titles = new ArrayList<String>(); - // private List<String> types = new ArrayList<String>(); - private String[] contributorList; private String[] coverageList; private String[] creatorList; @@ -202,7 +186,9 @@ public class RecordDelivererDC extends RecordDelivererAbstract { GetResponse responseWorkValues = getWorkValues.execute().actionGet(); - // FIXMEMAX!!! + // FIXME MAX!!! DO WE NEED THST DATE??? + // FIXME MAX!!! DO WE NEED THST DATE??? + // FIXME MAX!!! DO WE NEED THST DATE??? // try { // if (responseWorkValues.getField(this.dateOfObjectCreation) != null) { diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererInterface.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererInterface.java index 8e0ee0a8d193f5c368413e6b562d666e8bbefa9c..133a902258065444fc5e24e4a3915ccade5026ea 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererInterface.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererInterface.java @@ -3,8 +3,6 @@ package info.textgrid.middleware; import info.textgrid.middleware.oaipmh.GetRecordType; /** - * FIXME - * * @author Maximilian Brodhun, SUB Göttingen * @author Stefan E. Funk, SUB Göttingen * @version 2019-03-07 diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java index e54a87cd9a069730296598dd7bd378926b5902f0..a62afe19609d2a17f75bac188d051f98d7913555 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java @@ -11,8 +11,6 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer protected boolean textgrid; protected boolean dariah; - private static boolean idiomMets; - private static boolean dublinCore; /** * @param textgrid @@ -40,83 +38,37 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer + " is not supported by the item identified by the value of: " + request.getIdentifier()); } - // Check if resumptioToken is valid - if (request.getResumptionToken() != null) { - - if (RecordListDelivererAbstract.isIdiomMets() - && RecordListDelivererIDIOM.cursorCollector.containsKey(request.getResumptionToken())) { - RecordListDelivererAbstract.setIdiomMets(true); - RecordListDelivererAbstract.setDublinCore(false); - } else if (RecordListDelivererAbstract.isDublinCore() - && RecordListDelivererDC.cursorCollector.containsKey(request.getResumptionToken())) { - RecordListDelivererAbstract.setDublinCore(true); - RecordListDelivererAbstract.setIdiomMets(false); - } else { - result.setError(TGConstants.OAI_BAD_RESUMPTION_TOKEN, - "The value of the " + request.getResumptionToken() - + " argument is invalid or expired."); - } - } - if (request.getResumptionToken() == null && request.getMetadataPrefix() != null) { - if (request.getMetadataPrefix().equals(TGConstants.METADATA_IDIOM_PREFIX)) { - RecordListDelivererAbstract.setIdiomMets(true); - RecordListDelivererAbstract.setDublinCore(false); - } - if (request.getMetadataPrefix().equals(TGConstants.METADATA_DC_PREFIX)) { - RecordListDelivererAbstract.setDublinCore(true); - RecordListDelivererAbstract.setIdiomMets(false); + // Check if resumptionToken is invalid or existing. + if (request.getResumptionToken() != null) { + boolean restokDCExisting = RecordListDelivererIDIOM.cursorCollector != null + && RecordListDelivererIDIOM.cursorCollector.containsKey(request.getResumptionToken()); + boolean restokIDIOMExisting = RecordListDelivererDC.cursorCollector != null + && RecordListDelivererDC.cursorCollector.containsKey(request.getResumptionToken()); + if (restokDCExisting || restokIDIOMExisting) { + result.setError(TGConstants.OAI_BAD_RESUMPTION_TOKEN, "The value of the " + + request.getResumptionToken() + " argument is invalid or expired."); } } - // Check if other params are existing, they shouldn't! - else { - List<String> errorValues = new ArrayList<String>(); - - if (request.getResumptionToken() != null && request.getMetadataPrefix() != null) { - errorValues.add("metadataPrefix"); - } - if (request.getResumptionToken() == null && request.getMetadataPrefix() == null) { - errorValues.add("metadataPrefix"); - } - if (request.getIdentifier() != null) { - errorValues.add("identifier"); - } - if (errorValues.size() > 0) { - result.setError(TGConstants.OAI_BAD_ARGUMENT, "The request includes illegal arguments " - + "or is missing required arguments: " + errorValues); - } + // Check params in general. + List<String> errorValues = new ArrayList<String>(); + if (request.getResumptionToken() != null && request.getMetadataPrefix() != null) { + errorValues.add("metadataPrefix"); + } + if (request.getResumptionToken() == null && request.getMetadataPrefix() == null) { + errorValues.add("metadataPrefix"); + } + if (request.getIdentifier() != null) { + errorValues.add("identifier"); + } + if (errorValues.size() > 0) { + result.setError(TGConstants.OAI_BAD_ARGUMENT, "The request includes illegal arguments " + + "or is missing required arguments: " + errorValues); } return result; } - /** - * @return - */ - public static boolean isIdiomMets() { - return idiomMets; - } - - /** - * @param idiomMets - */ - public static void setIdiomMets(boolean idiomMets) { - RecordListDelivererAbstract.idiomMets = idiomMets; - } - - /** - * @return - */ - public static boolean isDublinCore() { - return dublinCore; - } - - /** - * @param dublinCore - */ - public static void setDublinCore(boolean dublinCore) { - RecordListDelivererAbstract.dublinCore = dublinCore; - } } diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java index f50830e71057a774af39fa439dabf41d49fb62a2..7b434caeb0313fc9b58394c743fed69ff41fc7e1 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java @@ -5,9 +5,7 @@ import java.net.URLDecoder; import java.text.ParseException; import java.util.Hashtable; import java.util.Map; - import javax.xml.datatype.DatatypeConfigurationException; - import org.apache.commons.logging.LogFactory; import org.elasticsearch.action.get.GetRequestBuilder; import org.elasticsearch.action.get.GetResponse; @@ -17,7 +15,6 @@ import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; - import info.textgrid.middleware.oaipmh.HeaderType; import info.textgrid.middleware.oaipmh.ListRecordsType; import info.textgrid.middleware.oaipmh.MetadataType; @@ -25,9 +22,8 @@ import info.textgrid.middleware.oaipmh.RecordType; import info.textgrid.middleware.oaipmh.ResumptionTokenType; /** - * FIXME Care about all repeatable fields as done in TITLE! + * */ - public class RecordListDelivererDC extends RecordListDelivererAbstract { // ** @@ -136,20 +132,19 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { */ public void fetchFields(QueryBuilder query, ListRecordsType recordList, String resumptionToken, String set) throws UnsupportedEncodingException { - + String scrollID = ""; SearchResponse scrollResp; QueryBuilder recordFilter; DublinCoreBuilder dublinCoreBuilder = new DublinCoreBuilder(); if (this.dariah == true) { recordFilter = query; - } else { + } else { recordFilter = QueryBuilders.boolQuery().must(query) - .must(QueryBuilders.matchPhraseQuery(this.formatField, this.formatToFilter)); + .must(QueryBuilders.matchPhraseQuery(this.formatField, this.formatToFilter)); } if (resumptionToken == null) { - scrollResp = OAI_ESClient.getOaiESClient() .prepareSearch(OAI_ESClient.getEsIndex()) .setScroll(new TimeValue(lifeTimeResToken)) @@ -165,7 +160,7 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { } log.info("Queried fields: " + this.fields.toString()); - log.info("Life time for resumption token is set to: " + lifeTimeResToken); + log.info("Lifetime for resumption token is set to: " + lifeTimeResToken); scrollID = scrollResp.getScrollId(); @@ -196,9 +191,8 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { // TextGrid search! String workUri = ""; - if (this.textgrid == true - && hit.getFields().get(this.formatField).values().get(0).toString() - .equals(this.formatToFilter)) { + if (this.textgrid == true && hit.getFields().get(this.formatField).values().get(0) + .toString().equals(this.formatToFilter)) { if (hit.getFields().get(this.relationToFurtherMetadataObject) != null) { workUri = hit.getFields().get(this.relationToFurtherMetadataObject).values().get(0) .toString().substring(this.repositoryObjectURIPrefix.length()); @@ -216,7 +210,7 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { } if (this.dariah == true) { - dublinCoreBuilder = putContentIntoDCFieldLists2(hit, + dublinCoreBuilder = putContentIntoDCFieldLists2(hit, furtherDCElements(hit.getId(), OAI_ESClient.getOaiESClient())); buildRecord(recordList, set, hit.getFields().get(this.identifierField).getValue().toString(), dublinCoreBuilder); @@ -239,65 +233,74 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { /** * @param hit * @param responseWorkValues + * @return */ - public DublinCoreBuilder putContentIntoDCFieldLists(SearchHit hit, GetResponse responseWorkValues) { - - DublinCoreBuilder result = new DublinCoreBuilder(); - - result.setContributor(DublinCoreFieldLoader.setContributor(responseWorkValues, this.contributorList)); - result.setCoverage(DublinCoreFieldLoader.setCoverage(responseWorkValues, this.coverageList)); + public DublinCoreBuilder putContentIntoDCFieldLists(SearchHit hit, + GetResponse responseWorkValues) { + + DublinCoreBuilder result = new DublinCoreBuilder(); + + result.setContributor( + DublinCoreFieldLoader.setContributor(responseWorkValues, this.contributorList)); + result.setCoverage(DublinCoreFieldLoader.setCoverage(responseWorkValues, this.coverageList)); result.setCreator(DublinCoreFieldLoader.setCreator(responseWorkValues, this.creatorList)); result.setDate(DublinCoreFieldLoader.setDate(responseWorkValues, this.dateList)); - result.setDescription(DublinCoreFieldLoader.setDescription(responseWorkValues, this.descriptionList)); + result.setDescription( + DublinCoreFieldLoader.setDescription(responseWorkValues, this.descriptionList)); result.setFormat(DublinCoreFieldLoader.setFormat(hit, this.formatList)); result.setIdentifier(DublinCoreFieldLoader.setIdentifier(hit, this.identifierList)); result.setLanguage(DublinCoreFieldLoader.setLanguage(hit, this.languageList)); result.setPublisher(DublinCoreFieldLoader.setPublisher(hit, this.publisherList)); result.setRelation(DublinCoreFieldLoader.setRelation(hit, this.relationList)); - result.setRelation(DublinCoreFieldLoader.setRelationForWork(responseWorkValues, this.relationForWorkList)); + result.setRelation( + DublinCoreFieldLoader.setRelationForWork(responseWorkValues, this.relationForWorkList)); result.setRights(DublinCoreFieldLoader.setRights(hit, this.rightList)); result.setSource(DublinCoreFieldLoader.setSources(hit, this.sourceList)); result.setSubject(DublinCoreFieldLoader.setSubject(hit, this.subjectList)); result.setTitle(DublinCoreFieldLoader.setTitle(hit, this.titleList)); result.setType(DublinCoreFieldLoader.setType(responseWorkValues, this.typeList)); - + return result; } /** * @param hit * @param responseWorkValues + * @return */ - public DublinCoreBuilder putContentIntoDCFieldLists2(SearchHit hit, GetResponse responseWorkValues) { - - DublinCoreBuilder result = new DublinCoreBuilder(); - - result.setContributor(DublinCoreFieldLoader.setContributor(hit, this.contributorList)); - result.setCoverage(DublinCoreFieldLoader.setCoverage(hit, this.coverageList)); - result.setCreator(DublinCoreFieldLoader.setCreator(hit, this.creatorList)); - result.setDate(DublinCoreFieldLoader.setDate(hit, this.dateList)); - result.setDescription(DublinCoreFieldLoader.setDescription(hit, this.descriptionList)); - result.setFormat(DublinCoreFieldLoader.setFormat(hit, this.formatList)); - result.setIdentifier(DublinCoreFieldLoader.setIdentifier(hit, this.identifierList)); - result.setLanguage(DublinCoreFieldLoader.setLanguage(hit, this.languageList)); - result.setPublisher(DublinCoreFieldLoader.setPublisher(hit, this.publisherList)); - result.setRelation(DublinCoreFieldLoader.setRelation(hit, this.relationList)); - result.setRights(DublinCoreFieldLoader.setRights(hit, this.rightList)); - result.setSource(DublinCoreFieldLoader.setSources(hit, this.sourceList)); - result.setSubject(DublinCoreFieldLoader.setSources(hit, this.subjectList)); - result.setTitle(DublinCoreFieldLoader.setTitle(hit, this.titleList)); - result.setType(DublinCoreFieldLoader.setType(hit, this.typeList)); - - return result; + public DublinCoreBuilder putContentIntoDCFieldLists2(SearchHit hit, + GetResponse responseWorkValues) { + + DublinCoreBuilder result = new DublinCoreBuilder(); + + result.setContributor(DublinCoreFieldLoader.setContributor(hit, this.contributorList)); + result.setCoverage(DublinCoreFieldLoader.setCoverage(hit, this.coverageList)); + result.setCreator(DublinCoreFieldLoader.setCreator(hit, this.creatorList)); + result.setDate(DublinCoreFieldLoader.setDate(hit, this.dateList)); + result.setDescription(DublinCoreFieldLoader.setDescription(hit, this.descriptionList)); + result.setFormat(DublinCoreFieldLoader.setFormat(hit, this.formatList)); + result.setIdentifier(DublinCoreFieldLoader.setIdentifier(hit, this.identifierList)); + result.setLanguage(DublinCoreFieldLoader.setLanguage(hit, this.languageList)); + result.setPublisher(DublinCoreFieldLoader.setPublisher(hit, this.publisherList)); + result.setRelation(DublinCoreFieldLoader.setRelation(hit, this.relationList)); + result.setRights(DublinCoreFieldLoader.setRights(hit, this.rightList)); + result.setSource(DublinCoreFieldLoader.setSources(hit, this.sourceList)); + result.setSubject(DublinCoreFieldLoader.setSources(hit, this.subjectList)); + result.setTitle(DublinCoreFieldLoader.setTitle(hit, this.titleList)); + result.setType(DublinCoreFieldLoader.setType(hit, this.typeList)); + + return result; } /** * @param recordList * @param set * @param headerIdentifier + * @param dublinCoreBuilder * @return */ - public RecordType buildRecord(ListRecordsType recordList, String set, String headerIdentifier, DublinCoreBuilder dublinCoreBuilder) { + public RecordType buildRecord(ListRecordsType recordList, String set, String headerIdentifier, + DublinCoreBuilder dublinCoreBuilder) { MetadataType metadata = new MetadataType(); RecordType record = new RecordType(); @@ -310,12 +313,11 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract { return record; } - /** - * @param from - * @param to - * @param set - * @param resumptionToken - * @return + /* + * (non-Javadoc) + * + * @see info.textgrid.middleware.RecordListDelivererInterface#getRecords(java.lang.String, + * java.lang.String, java.lang.String, java.lang.String) */ public ListRecordsType getRecords(String from, String to, String set, String resumptionToken) { diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java index a5950d92fedaa60c205cfb6e7c49a2f425618536..4eacaf08c7cb0c0444db87991807a9180fefc5e7 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIDIOM.java @@ -28,17 +28,14 @@ public class RecordListDelivererIDIOM extends RecordListDelivererAbstract { */ public RecordListDelivererIDIOM(boolean textgrid, boolean dariah) { super(textgrid, dariah); - // TODO Auto-generated constructor stub } - /* - * (non-Javadoc) - * - * @see - * info.textgrid.middleware.RecordListDelivererInterface#buildRecord(info.textgrid.middleware. - * oaipmh.ListRecordsType, java.lang.String, java.lang.String) + /** + * @param recordList + * @param set + * @param headerIdentifier + * @return */ - //@Override public RecordType buildRecord(ListRecordsType recordList, String set, String headerIdentifier) { MetadataType metadata = new MetadataType(); @@ -74,8 +71,6 @@ public class RecordListDelivererIDIOM extends RecordListDelivererAbstract { // because we are using a hash map for counting the calls). resTokenValue = UUID.randomUUID().toString(); } else { - // FIXME @Max: Hier gibt's eine NPE, wenn ein resumptionToken für oai_dc existiert. Komisch? - // Use given resumption token here. artefactURIs = queries.getArtefactList(cursorCollector.get(resumptionToken)); } @@ -108,7 +103,6 @@ public class RecordListDelivererIDIOM extends RecordListDelivererAbstract { */ @Override public HeaderType setHeader(String set, String headerIdentifier) { - // TODO Auto-generated method stub return null; } diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java index 8fa99ea2eb121ded5452d98c4936d06d43d34742..1dd1f5832b436c2cbb48e67d84ade5af662ca634 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java @@ -3,9 +3,25 @@ package info.textgrid.middleware; import info.textgrid.middleware.oaipmh.HeaderType; import info.textgrid.middleware.oaipmh.ListRecordsType; +/** + * + */ public interface RecordListDelivererInterface { - - public ListRecordsType getRecords(String from, String to, String set, String resumptionToken); - public HeaderType setHeader(String set, String headerIdentifier); + + /** + * @param from + * @param to + * @param set + * @param resumptionToken + * @return + */ + public ListRecordsType getRecords(String from, String to, String set, String resumptionToken); + + /** + * @param set + * @param headerIdentifier + * @return + */ + public HeaderType setHeader(String set, String headerIdentifier); } diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/Rest.java b/oaipmh-core/src/main/java/info/textgrid/middleware/Rest.java index 6ca40e02a4be5d6878f3b138faf077f89ba93e1d..391f12fa45aaf1f306a98938bdb6db976282f857 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/Rest.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/Rest.java @@ -1,18 +1,15 @@ package info.textgrid.middleware; -import info.textgrid.utils.httpclient.TGHttpConnection; - import java.io.IOException; import java.io.InputStream; import java.util.Properties; - import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Response; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import info.textgrid.utils.httpclient.TGHttpConnection; /** * diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTextgridOnlineTests.java b/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTextgridOnlineTests.java index 3e03336ceb4ea49c8c37a113487dcb3ca49d00b2..fc636837280db849529fe44b50cc5d8d361d7374 100644 --- a/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTextgridOnlineTests.java +++ b/oaipmh-core/src/test/java/info/textgrid/middleware/OaiPmhTextgridOnlineTests.java @@ -56,7 +56,7 @@ public class OaiPmhTextgridOnlineTests { // private static String host = "http://localhost:8080/oaipmh-webapp/"; // Time to wait between the single queries using resumption tokens in milliseconds. - private static final Long TIME = 250l; + private static final Long TIME = 50l; // ** // PREPARATIONS @@ -483,6 +483,30 @@ public class OaiPmhTextgridOnlineTests { System.out.println(OK + ": [A1]=" + f1.get() + ", [A2]=" + f2.get() + ", [A3]=" + f3.get()); } + /** + * @throws InterruptedException + * @throws ExecutionException + */ + @Test + public void testRestokConcurrentlyListIdentifiersDCAndIDIOMMets() + throws InterruptedException, ExecutionException { + + System.out.println(TESTING + "testRestokConcurrentlyListIdentifiersDCAndIDIOMMets()"); + + ExecutorService executor = Executors.newFixedThreadPool(3); + + Future<Boolean> f1 = executor.submit(new OaiPmhResumptionTokenTestThread(VERB_LIST_IDENTIFIERS, + NO_SET, OAI_DC_PREFIX, 201, 100, "[DC1]")); + Future<Boolean> f2 = executor.submit(new OaiPmhResumptionTokenTestThread(VERB_LIST_IDENTIFIERS, + NO_SET, OAI_DC_PREFIX, 199, 100, "[DC2]")); + Future<Boolean> f3 = executor.submit(new OaiPmhResumptionTokenTestThread(VERB_LIST_IDENTIFIERS, + NO_SET, OAI_IDIOMMETS_PREFIX, 3, 30, "[IDIOM3]")); + + executor.shutdown(); + + System.out.println(OK + ": [A1]=" + f1.get() + ", [A2]=" + f2.get() + ", [A3]=" + f3.get()); + } + /** * @throws IOException * @throws InterruptedException @@ -507,6 +531,31 @@ public class OaiPmhTextgridOnlineTests { System.out.println(OK + ": [B1]=" + f1.get() + ", [B2]=" + f2.get() + ", [B3]=" + f3.get()); } + /** + * @throws InterruptedException + * @throws ExecutionException + */ + @Test + public void testRestokConcurrentlyListRecordsDCAndIDIOMMets() + throws InterruptedException, ExecutionException { + + System.out.println(TESTING + "testRestokConcurrentlyListRecordsAndIDIOMMets()"); + + ExecutorService executor = Executors.newFixedThreadPool(3); + + Future<Boolean> f1 = executor.submit(new OaiPmhResumptionTokenTestThread(VERB_LIST_RECORDS, + NO_SET, OAI_DC_PREFIX, 66, 100, "[DC1]")); + Future<Boolean> f2 = executor.submit(new OaiPmhResumptionTokenTestThread(VERB_LIST_RECORDS, + NO_SET, OAI_DC_PREFIX, 77, 100, "[DC2]")); + Future<Boolean> f3 = executor.submit(new OaiPmhResumptionTokenTestThread(VERB_LIST_RECORDS, + NO_SET, OAI_IDIOMMETS_PREFIX, 3, 30, "[IDIOM1]")); + + executor.shutdown(); + + System.out + .println(OK + ": [DC1]=" + f1.get() + ", [DC2]=" + f2.get() + ", [IOIOM1]=" + f3.get()); + } + /** * @throws IOException * @throws InterruptedException diff --git a/pom.xml b/pom.xml index 80d1dc9c3cba7c46c9d088213e056f227b276130..cdf19ed3ce4c9dfee6aed8e08095e94e99bb8182 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ <packaging>pom</packaging> <name>DARIAHDE :: OAI-PMH DataProvider</name> <properties> - <tgcrud.version>9.7.1-TG</tgcrud.version> + <tgcrud.version>9.8.2-DH</tgcrud.version> <tghttpclients.version>3.3.1</tghttpclients.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <cxf.version>3.2.8</cxf.version>