diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDeliverer.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDeliverer.java index cf6ef1e4050fd04312e3c77d93401571322b8327..c1eb588a2d29ce099f1211c7cd6f8367c419017c 100644 --- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDeliverer.java +++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDeliverer.java @@ -7,9 +7,7 @@ import java.util.ArrayList; import java.util.Hashtable; import java.util.List; 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; @@ -19,7 +17,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; @@ -30,694 +27,691 @@ import info.textgrid.middleware.oaipmh.RequestType; import info.textgrid.middleware.oaipmh.ResumptionTokenType; /** - * TODO Care about repeatable fields as done in TITLE! + * FIXME Care about all repeatable fields as done in TITLE! */ - public class RecordListDeliverer { - // ** - // STATICS - // ** - - private static org.apache.commons.logging.Log log = LogFactory.getLog(RecordDeliverer.class); - - // ** - // CLASS VARIABLES - // ** - -// private OAI_ESClient oaiEsClient; - private String[] fields; - private String[] workFields; - private boolean textgrid; - private boolean dariah; - private String formatField; - private String formatToFilter; - private String dateOfObjectCreation; - private String relationToFurtherMetadataObject; - private String repositoryObjectURIPrefix; - private String rangeField; - private String modifiedField; - private String identifierField; - private boolean foundItems; - - - - // ** - // DC-Field Lists - // ** - - 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; - private String[] dateList; - private String[] descriptionList; - private String[] formatList; - private String[] identifierList; - private String[] languageList; - private String[] publisherList; - private String[] relationList; - private String[] relationForWorkList; - private String[] rightList; - private String[] sourceList; - private String[] subjectList; - private String[] titleList; - private String[] typeList; - private String modifiedValue; - private static final int lifeTimeResToken = 60000; - - static Map<String, Integer> cursorCollector = new Hashtable<String, Integer >(); - - private int searchResponseSize; - - /** - * @param oaiEsClient - */ - public RecordListDeliverer(String[] fields,String[] workFields, boolean textgrid, boolean dariah) { -// this.oaiEsClient = oaiEsClient; - this.fields = fields; - this.workFields = workFields; - this.textgrid = textgrid; - this.dariah = dariah; - } - - /** - * the furtherDCElementes fetches the specified fields from the work object. - * This function is called from the function fetchFields - * - * @param id - * @param client - * @throws UnsupportedEncodingException - */ - public GetResponse furtherDCElements(String id, Client client) { - if(id != null){ - try { - id = URLDecoder.decode(id, "UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - GetRequestBuilder getWorkValues = OAI_ESClient.getOaiESClient() - .prepareGet().setIndex(OAI_ESClient.getEsIndex()) - .setType(OAI_ESClient.getEsType()).setId(id) - .setFields(this.workFields); - - GetResponse responseWorkValues = getWorkValues.execute().actionGet(); - return responseWorkValues; - } - - return null; - } - - - /** - * <p> - * The fetchFields function filters all edition and fetch the specified - * fields - * </p> - * - * @param query - * @param recordList - * @throws UnsupportedEncodingException - */ - - public void fetchFields(QueryBuilder query, ListRecordsType recordList, String resumptionToken, String set) throws UnsupportedEncodingException { - String scrollID = ""; - SearchResponse scrollResp; - QueryBuilder recordFilter; - - if(this.dariah == true) { - recordFilter = query; - }else { - recordFilter = QueryBuilders.boolQuery().must(query).must(QueryBuilders.matchPhraseQuery(formatField, formatToFilter)); - } - - if (resumptionToken == null) { - scrollResp = OAI_ESClient.getOaiESClient().prepareSearch(OAI_ESClient.getEsIndex()) - .setScroll(new TimeValue(lifeTimeResToken)) - .setTypes(OAI_ESClient.getEsType()) - .addFields(this.fields) - .setQuery(recordFilter) - .setSize(searchResponseSize) - .execute() - .actionGet(); - - } else { - scrollResp = OAI_ESClient.getOaiESClient().prepareSearchScroll(resumptionToken).setScroll(new TimeValue(lifeTimeResToken)).execute().actionGet(); - } - - scrollID = scrollResp.getScrollId(); - long completeListSize = scrollResp.getHits().totalHits(); - System.out.println("LISTSIZE: " + completeListSize); - - - if (completeListSize > 0) { - setFoundItems(true); - - int i =0; - - for (SearchHit hit : scrollResp.getHits().getHits()) { - - i++; - - if (hit != null && hit.getFields() != null) { - try { - if(hit.getFields().get(this.dateOfObjectCreation)!=null){ - String 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); - } - modifiedValue = hit.getFields().get(this.modifiedField).getValue().toString(); - // TextGrid search! - String workUri = ""; - if (this.textgrid == true && hit.getFields().get(formatField).values().get(0).toString().equals(formatToFilter)) { - if( hit.getFields().get(this.relationToFurtherMetadataObject) != null){ - workUri = hit.getFields().get(this.relationToFurtherMetadataObject).values().get(0).toString() - .substring(this.repositoryObjectURIPrefix.length()); - - if (!workUri.endsWith(".0")) { - workUri = workUri.concat(".0"); - } - } - - putContentIntoDCFieldLists(hit, furtherDCElements(workUri, OAI_ESClient.getOaiESClient())); - buildRecord(recordList, set, hit.getFields().get(this.identifierField).getValue().toString()); - listClearer(); - } - - if (this.dariah == true) { - putContentIntoDCFieldLists2(hit, furtherDCElements(hit.getId(), OAI_ESClient.getOaiESClient())); - buildRecord(recordList, set, hit.getFields().get(this.identifierField).getValue().toString()); - listClearer(); - } - } - - } - - // Check the need for a resumption token! - ResumptionTokenType resTokenForResponse = OAIPMHUtillities.getResumptionToken(completeListSize, resumptionToken, cursorCollector, scrollID, searchResponseSize, i); - if (resTokenForResponse != null) { - recordList.setResumptionToken(resTokenForResponse); - } - - } else { - setFoundItems(false); - } - } - - /** - * @param hit - * @param responseWorkValues - */ - public void putContentIntoDCFieldLists(SearchHit hit, GetResponse responseWorkValues) { - - this.contributors = DublinCoreFieldLoader.setContributor(hit,this.contributorList); - this.coverages = DublinCoreFieldLoader.setCoverage(responseWorkValues,this.coverageList); - this.creators = DublinCoreFieldLoader.setCreator(responseWorkValues,this.creatorList); - this.dates = DublinCoreFieldLoader.setDate(responseWorkValues,this.dateList); - this.descriptions = DublinCoreFieldLoader.setDescription(responseWorkValues, this.descriptionList); - this.formats = DublinCoreFieldLoader.setFormat(hit, this.formatList); - this.identifiers = DublinCoreFieldLoader.setIdentifier(hit,this.identifierList); - this.languages = DublinCoreFieldLoader.setLanguage(hit,this.languageList); - this.publishers = DublinCoreFieldLoader.setPublisher(hit,this.publisherList); - this.relations = DublinCoreFieldLoader.setRelation(hit,this.relationList); - this.relations = DublinCoreFieldLoader.setRelationForWork(responseWorkValues, this.relationForWorkList); - this.rights = DublinCoreFieldLoader.setRights(hit, this.rightList); - this.sources = DublinCoreFieldLoader.setSources(hit, this.sourceList); - this.subjects = DublinCoreFieldLoader.setSubject(hit, this.subjectList); - this.titles = DublinCoreFieldLoader.setTitle(hit, this.titleList); - this.types = DublinCoreFieldLoader.setType(responseWorkValues,this.typeList); - - } - - /** - * @param hit - * @param responseWorkValues - */ - public void putContentIntoDCFieldLists2(SearchHit hit, GetResponse responseWorkValues) { - - this.contributors = DublinCoreFieldLoader.setContributor(hit,this.contributorList); - this.coverages = DublinCoreFieldLoader.setCoverage(hit,this.coverageList); - this.creators = DublinCoreFieldLoader.setCreator(hit, this.creatorList); - this.dates = DublinCoreFieldLoader.setDate(hit, this.dateList); - this.descriptions = DublinCoreFieldLoader.setDescription(hit,this.descriptionList); - this.formats = DublinCoreFieldLoader.setFormat(hit, this.formatList); - this.identifiers = DublinCoreFieldLoader.setIdentifier(hit,this.identifierList); - this.languages = DublinCoreFieldLoader.setLanguage(hit, this.languageList); - this.publishers = DublinCoreFieldLoader.setPublisher(hit, this.publisherList); - this.relations = DublinCoreFieldLoader.setRelation(hit, this.relationList); - this.rights = DublinCoreFieldLoader.setRights(hit, this.rightList); - this.sources = DublinCoreFieldLoader.setSources(hit, this.sourceList); - this.subjects = DublinCoreFieldLoader.setSources(hit, this.subjectList); - - this.titles = DublinCoreFieldLoader.setTitle(hit, this.titleList); - this.types = DublinCoreFieldLoader.setType(hit, this.typeList); - - } - - /** - * @param recordList - * @return - */ - public RecordType buildRecord(ListRecordsType recordList, String set, String headerIdentifier) { - - ObjectFactory of = new ObjectFactory(); - OaiDcType odt = new OaiDcType(); - DublinCoreBuilder newDbc = new DublinCoreBuilder(odt, of); - MetadataType metadata = new MetadataType(); - RecordType record = new RecordType(); - // TODO Test if this is unnecessary - //HeaderType recordHeader = new HeaderType(); - - setDCObject(odt, of); - - /*if (!this.identifiers.isEmpty()) { - recordHeader.setIdentifier(this.identifiers.get(0)); - } - if (!this.dates.isEmpty()) { - recordHeader.setDatestamp(this.dates.get(0)); - }*/ - - metadata = newDbc.getDC(); - record.setMetadata(metadata); - record.setHeader(setHeader(set, headerIdentifier)); - recordList.getRecord().add(record); - - return record; - } - - /** - * @param from - * @param to - * @param set - * @return - */ - public ListRecordsType getRecords(String from, String to, String set, String resumptionToken) { - - ListRecordsType recordList = new ListRecordsType(); - QueryBuilder query; - QueryBuilder rangeQuery = QueryBuilders.rangeQuery(this.rangeField).from(from).to(to); - - 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); - QueryBuilder boolQuery = QueryBuilders.boolQuery().must(rangeQuery).must(matchQuery); - query = boolQuery; - System.out.println(query); - - } else { - query = rangeQuery; - } - try { - fetchFields(query, recordList, resumptionToken, set); - } catch (UnsupportedEncodingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - return recordList; - } - - /** - * @param set - * @return - */ - public HeaderType setHeader(String set, String headerIdentifier) { - //System.out.println("HEADER TIME WITH SET: " + set); - HeaderType header = new HeaderType(); - String identifierForHeader = ""; - //System.out.println("DATESIZE: " + dates.size()); - - //if(dates.size() > 0){ - try { - header.setDatestamp(OAIPMHUtillities.convertDateFormat(this.modifiedValue).toXMLFormat()); - } catch (ParseException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (DatatypeConfigurationException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - if(this.textgrid == true) - if(this.identifiers.isEmpty()){ - System.out.println("HEADER IDENTIFIER: " + headerIdentifier); - } - identifierForHeader = this.identifiers.get(0); - if(identifierForHeader.startsWith("https://textgridrep.org/")){ - identifierForHeader = identifierForHeader.replaceFirst("https://textgridrep.org/", ""); - header.setIdentifier(identifierForHeader); - } - else - header.setIdentifier(headerIdentifier); - if (set != null) { - header.getSetSpec().add(set); - } - return header; - } - - /** - * @param odt - * @param of - * @return - */ - public DublinCoreBuilder setDCObject(OaiDcType odt, ObjectFactory of) { - - DublinCoreBuilder dbc = new DublinCoreBuilder(odt, of); - - dbc.setContributor(this.contributors); - dbc.setCoverage(this.coverages); - dbc.setCreator(this.creators); - dbc.setDate(this.dates); - dbc.setDescription(this.descriptions); - dbc.setFormat(this.formats); - dbc.setIdentifier(this.identifiers); - dbc.setLanguage(this.languages); - dbc.setPublisher(this.publishers); - dbc.setRelation(this.relations); - dbc.setRights(this.rights); - dbc.setSource(this.sources); - dbc.setSubject(this.subjects); - dbc.setTitle(this.titles); - dbc.setType(this.types); - - return dbc; - } - - /** - * - */ - public void listClearer() { - - this.contributors.clear(); - this.coverages.clear(); - this.creators.clear(); - this.dates.clear(); - this.descriptions.clear(); - this.formats.clear(); - this.identifiers.clear(); - this.languages.clear(); - this.publishers.clear(); - this.relations.clear(); - this.rights.clear(); - this.sources.clear(); - this.subjects.clear(); - this.titles.clear(); - this.types.clear(); - } - - /** - * @param formatToFilter - */ - public void setFormatToFilter(String formatToFilter) { - this.formatToFilter = formatToFilter; - } - - /** - * @param formatField - */ - public void setFormatField(String formatField) { - this.formatField = formatField; - } - - /** - * @return - */ - public String getDateOfObjectCreation() { - return this.dateOfObjectCreation; - } - - /** - * @param dateOfObjectCreation - */ - public void setDateOfObjectCreation(String dateOfObjectCreation) { - this.dateOfObjectCreation = dateOfObjectCreation; - } - - /** - * @return - */ - public String getRelationToFurtherMetadataObject() { - return this.relationToFurtherMetadataObject; - } - - /** - * @param relationToFurtherMetadataObject - */ - public void setRelationToFurtherMetadataObject( - String relationToFurtherMetadataObject) { - this.relationToFurtherMetadataObject = relationToFurtherMetadataObject; - } - - /** - * @return - */ - public String getRepositoryObjectURIPrefix() { - return this.repositoryObjectURIPrefix; - } - - /** - * @param repositoryObjectURIPrefix - */ - public void setRepositoryObjectURIPrefix(String repositoryObjectURIPrefix) { - this.repositoryObjectURIPrefix = repositoryObjectURIPrefix; - } - - /** - * @return - */ - public String getFieldForRange() { - return this.rangeField; - } - - /** - * @param fieldForRange - */ - public void setFieldForRange(String fieldForRange) { - this.rangeField = fieldForRange; - } - - /* - * Setter for DublinCore Lists - */ - - /** - * @param contributorList - */ - public void setContributor(String[] contributorList) { - this.contributorList = contributorList; - } - - /** - * @param coveragesList - */ - public void setCoverage(String[] coveragesList) { - this.coverageList = coveragesList; - } - - /** - * @param creatorsList - */ - public void setCreators(String[] creatorsList) { - this.creatorList = creatorsList; - } - - /** - * @param datesList - */ - public void setDates(String[] datesList) { - this.dateList = datesList; - } - - /** - * @param descriptionsList - */ - public void setDescriptions(String[] descriptionsList) { - this.descriptionList = descriptionsList; - } - - /** - * @param formatsList - */ - public void setFormats(String[] formatsList) { - this.formatList = formatsList; - } - - /** - * @param identifiersList - */ - public void setIdentifiers(String[] identifiersList) { - this.identifierList = identifiersList; - } - - /** - * @param languagesList - */ - public void setLanguages(String[] languagesList) { - this.languageList = languagesList; - } - - /** - * @param publishersList - */ - public void setPublishers(String[] publishersList) { - this.publisherList = publishersList; - } - - /** - * @param relationsList - */ - public void setRelations(String[] relationsList) { - this.relationList = relationsList; - } - - /** - * @param relationsList - */ - public void setRelationsForWork(String[] relationsList) { - this.relationForWorkList = relationsList; - } - - /** - * @param rightsList - */ - public void setRights(String[] rightsList) { - this.rightList = rightsList; - } - - /** - * @param sourcesList - */ - public void setSources(String[] sourcesList) { - this.sourceList = sourcesList; - } - - /** - * @param subjectsList - */ - public void setSubjects(String[] subjectsList) { - this.subjectList = subjectsList; - } - - /** - * @param titlesList - */ - public void setTitles(String[] titlesList) { - this.titleList = titlesList; - } - - /** - * @param typesList - */ - public void setTypes(String[] typesList) { - this.typeList = typesList; - } - - /** - * @param request - * @return - */ - public boolean requestChecker(RequestType request) { - - boolean requestCheck; - - if (request.getIdentifier() != null - || request.getMetadataPrefix() == null) { - - requestCheck = false; - } else { - requestCheck = true; - } - - return requestCheck; - } - - /** - * @return - */ - public boolean isFoundItems() { - return this.foundItems; - } - - /** - * @param foundItems - */ - public void setFoundItems(boolean foundItems) { - this.foundItems = foundItems; - } - - public String getModifiedField() { - return modifiedField; - } - - public void setModifiedField(String modifiedField) { - this.modifiedField = modifiedField; - } - - public String getIdentifierField() { - return identifierField; - } - - public void setIdentifierField(String identifierField) { - this.identifierField = identifierField; - } - - public int getSearchResponseSize() { - return searchResponseSize; - } - - public void setSearchResponseSize(String searchResponseSize) { - this.searchResponseSize = Integer.parseInt(searchResponseSize); - } - - /*public void setBlubb(String test) { - System.out.println("blubb: " + test); - }*/ - - - /* - * public String getCollectionTitle() { return collectionTitle; } - * - * public void setCollectionTitle(GetResponse responseWorkValues) { - * - * this.collectionTitle = - * responseWorkValues.getField("metadata.dc:title").getValue().toString(); - * - * - * } - */ + // ** + // STATICS + // ** + + private static org.apache.commons.logging.Log log = LogFactory.getLog(RecordDeliverer.class); + + // ** + // CLASS VARIABLES + // ** + + // private OAI_ESClient oaiEsClient; + private String[] fields; + private String[] workFields; + private boolean textgrid; + private boolean dariah; + private String formatField; + private String formatToFilter; + private String dateOfObjectCreation; + private String relationToFurtherMetadataObject; + private String repositoryObjectURIPrefix; + private String rangeField; + private String modifiedField; + private String identifierField; + private boolean foundItems; + + // ** + // DC-Field Lists + // ** + + 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; + private String[] dateList; + private String[] descriptionList; + private String[] formatList; + private String[] identifierList; + private String[] languageList; + private String[] publisherList; + private String[] relationList; + private String[] relationForWorkList; + private String[] rightList; + private String[] sourceList; + private String[] subjectList; + private String[] titleList; + private String[] typeList; + private String modifiedValue; + private static final int lifeTimeResToken = 60000; + + static Map<String, Integer> cursorCollector = new Hashtable<String, Integer>(); + + private int searchResponseSize; + + /** + * @param fields + * @param workFields + * @param textgrid + * @param dariah + */ + public RecordListDeliverer(String[] fields, String[] workFields, boolean textgrid, + boolean dariah) { + // this.oaiEsClient = oaiEsClient; + this.fields = fields; + this.workFields = workFields; + this.textgrid = textgrid; + this.dariah = dariah; + } + + /** + * the furtherDCElementes fetches the specified fields from the work object. This function is + * called from the function fetchFields + * + * @param id + * @param client + * @return + */ + public GetResponse furtherDCElements(String id, Client client) { + + if (id != null) { + try { + id = URLDecoder.decode(id, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + GetRequestBuilder getWorkValues = + OAI_ESClient.getOaiESClient().prepareGet().setIndex(OAI_ESClient.getEsIndex()) + .setType(OAI_ESClient.getEsType()).setId(id).setFields(this.workFields); + + GetResponse responseWorkValues = getWorkValues.execute().actionGet(); + return responseWorkValues; + } + + return null; + } + + + /** + * <p> + * The fetchFields function filters all edition and fetch the specified fields + * </p> + * + * @param query + * @param recordList + * @param resumptionToken + * @param set + * @throws UnsupportedEncodingException + */ + public void fetchFields(QueryBuilder query, ListRecordsType recordList, String resumptionToken, + String set) throws UnsupportedEncodingException { + + String scrollID = ""; + SearchResponse scrollResp; + QueryBuilder recordFilter; + + if (this.dariah == true) { + recordFilter = query; + } else { + recordFilter = QueryBuilders.boolQuery().must(query) + .must(QueryBuilders.matchPhraseQuery(formatField, formatToFilter)); + } + + if (resumptionToken == null) { + scrollResp = OAI_ESClient.getOaiESClient().prepareSearch(OAI_ESClient.getEsIndex()) + .setScroll(new TimeValue(lifeTimeResToken)).setTypes(OAI_ESClient.getEsType()) + .addFields(this.fields).setQuery(recordFilter).setSize(searchResponseSize).execute() + .actionGet(); + } else { + scrollResp = OAI_ESClient.getOaiESClient().prepareSearchScroll(resumptionToken) + .setScroll(new TimeValue(lifeTimeResToken)).execute().actionGet(); + } + + scrollID = scrollResp.getScrollId(); + long completeListSize = scrollResp.getHits().totalHits(); + + // System.out.println("LISTSIZE: " + completeListSize); + + if (completeListSize > 0) { + setFoundItems(true); + + int i = 0; + + for (SearchHit hit : scrollResp.getHits().getHits()) { + + i++; + + if (hit != null && hit.getFields() != null) { + try { + if (hit.getFields().get(this.dateOfObjectCreation) != null) { + String 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); + } + modifiedValue = hit.getFields().get(this.modifiedField).getValue().toString(); + // TextGrid search! + String workUri = ""; + if (this.textgrid == true && hit.getFields().get(formatField).values().get(0).toString() + .equals(formatToFilter)) { + if (hit.getFields().get(this.relationToFurtherMetadataObject) != null) { + workUri = hit.getFields().get(this.relationToFurtherMetadataObject).values().get(0) + .toString().substring(this.repositoryObjectURIPrefix.length()); + + if (!workUri.endsWith(".0")) { + workUri = workUri.concat(".0"); + } + } + + putContentIntoDCFieldLists(hit, + furtherDCElements(workUri, OAI_ESClient.getOaiESClient())); + buildRecord(recordList, set, + hit.getFields().get(this.identifierField).getValue().toString()); + listClearer(); + } + + if (this.dariah == true) { + putContentIntoDCFieldLists2(hit, + furtherDCElements(hit.getId(), OAI_ESClient.getOaiESClient())); + buildRecord(recordList, set, + hit.getFields().get(this.identifierField).getValue().toString()); + listClearer(); + } + } + } + + // Check the need for a resumption token! + ResumptionTokenType resTokenForResponse = OAIPMHUtillities.getResumptionToken( + completeListSize, resumptionToken, cursorCollector, scrollID, searchResponseSize, i); + if (resTokenForResponse != null) { + recordList.setResumptionToken(resTokenForResponse); + } + + } else { + setFoundItems(false); + } + } + + /** + * @param hit + * @param responseWorkValues + */ + public void putContentIntoDCFieldLists(SearchHit hit, GetResponse responseWorkValues) { + + this.contributors = DublinCoreFieldLoader.setContributor(hit, this.contributorList); + this.coverages = DublinCoreFieldLoader.setCoverage(responseWorkValues, this.coverageList); + this.creators = DublinCoreFieldLoader.setCreator(responseWorkValues, this.creatorList); + this.dates = DublinCoreFieldLoader.setDate(responseWorkValues, this.dateList); + this.descriptions = + DublinCoreFieldLoader.setDescription(responseWorkValues, this.descriptionList); + this.formats = DublinCoreFieldLoader.setFormat(hit, this.formatList); + this.identifiers = DublinCoreFieldLoader.setIdentifier(hit, this.identifierList); + this.languages = DublinCoreFieldLoader.setLanguage(hit, this.languageList); + this.publishers = DublinCoreFieldLoader.setPublisher(hit, this.publisherList); + this.relations = DublinCoreFieldLoader.setRelation(hit, this.relationList); + this.relations = + DublinCoreFieldLoader.setRelationForWork(responseWorkValues, this.relationForWorkList); + this.rights = DublinCoreFieldLoader.setRights(hit, this.rightList); + this.sources = DublinCoreFieldLoader.setSources(hit, this.sourceList); + this.subjects = DublinCoreFieldLoader.setSubject(hit, this.subjectList); + this.titles = DublinCoreFieldLoader.setTitle(hit, this.titleList); + this.types = DublinCoreFieldLoader.setType(responseWorkValues, this.typeList); + + } + + /** + * @param hit + * @param responseWorkValues + */ + public void putContentIntoDCFieldLists2(SearchHit hit, GetResponse responseWorkValues) { + + this.contributors = DublinCoreFieldLoader.setContributor(hit, this.contributorList); + this.coverages = DublinCoreFieldLoader.setCoverage(hit, this.coverageList); + this.creators = DublinCoreFieldLoader.setCreator(hit, this.creatorList); + this.dates = DublinCoreFieldLoader.setDate(hit, this.dateList); + this.descriptions = DublinCoreFieldLoader.setDescription(hit, this.descriptionList); + this.formats = DublinCoreFieldLoader.setFormat(hit, this.formatList); + this.identifiers = DublinCoreFieldLoader.setIdentifier(hit, this.identifierList); + this.languages = DublinCoreFieldLoader.setLanguage(hit, this.languageList); + this.publishers = DublinCoreFieldLoader.setPublisher(hit, this.publisherList); + this.relations = DublinCoreFieldLoader.setRelation(hit, this.relationList); + this.rights = DublinCoreFieldLoader.setRights(hit, this.rightList); + this.sources = DublinCoreFieldLoader.setSources(hit, this.sourceList); + this.subjects = DublinCoreFieldLoader.setSources(hit, this.subjectList); + this.titles = DublinCoreFieldLoader.setTitle(hit, this.titleList); + this.types = DublinCoreFieldLoader.setType(hit, this.typeList); + } + + /** + * @param recordList + * @param set + * @param headerIdentifier + * @return + */ + public RecordType buildRecord(ListRecordsType recordList, String set, String headerIdentifier) { + + ObjectFactory of = new ObjectFactory(); + OaiDcType odt = new OaiDcType(); + DublinCoreBuilder newDbc = new DublinCoreBuilder(odt, of); + MetadataType metadata = new MetadataType(); + RecordType record = new RecordType(); + // TODO Test if this is unnecessary + // HeaderType recordHeader = new HeaderType(); + + setDCObject(odt, of); + + /* + * if (!this.identifiers.isEmpty()) { recordHeader.setIdentifier(this.identifiers.get(0)); } if + * (!this.dates.isEmpty()) { recordHeader.setDatestamp(this.dates.get(0)); } + */ + + metadata = newDbc.getDC(); + record.setMetadata(metadata); + record.setHeader(setHeader(set, headerIdentifier)); + recordList.getRecord().add(record); + + return record; + } + + /** + * @param from + * @param to + * @param set + * @param resumptionToken + * @return + */ + public ListRecordsType getRecords(String from, String to, String set, String resumptionToken) { + + ListRecordsType recordList = new ListRecordsType(); + QueryBuilder query; + QueryBuilder rangeQuery = QueryBuilders.rangeQuery(this.rangeField).from(from).to(to); + + 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); + QueryBuilder boolQuery = QueryBuilders.boolQuery().must(rangeQuery).must(matchQuery); + query = boolQuery; + System.out.println(query); + + } else { + query = rangeQuery; + } + try { + fetchFields(query, recordList, resumptionToken, set); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return recordList; + } + + /** + * @param set + * @param headerIdentifier + * @return + */ + public HeaderType setHeader(String set, String headerIdentifier) { + + // System.out.println("HEADER TIME WITH SET: " + set); + HeaderType header = new HeaderType(); + String identifierForHeader = ""; + // System.out.println("DATESIZE: " + dates.size()); + + // if(dates.size() > 0){ + try { + header.setDatestamp(OAIPMHUtillities.convertDateFormat(this.modifiedValue).toXMLFormat()); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (DatatypeConfigurationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + if (this.textgrid == true) + if (this.identifiers.isEmpty()) { + System.out.println("HEADER IDENTIFIER: " + headerIdentifier); + } + identifierForHeader = this.identifiers.get(0); + if (identifierForHeader.startsWith("https://textgridrep.org/")) { + identifierForHeader = identifierForHeader.replaceFirst("https://textgridrep.org/", ""); + header.setIdentifier(identifierForHeader); + } else + header.setIdentifier(headerIdentifier); + if (set != null) { + header.getSetSpec().add(set); + } + + return header; + } + + /** + * @param odt + * @param of + * @return + */ + public DublinCoreBuilder setDCObject(OaiDcType odt, ObjectFactory of) { + + DublinCoreBuilder dbc = new DublinCoreBuilder(odt, of); + + dbc.setContributor(this.contributors); + dbc.setCoverage(this.coverages); + dbc.setCreator(this.creators); + dbc.setDate(this.dates); + dbc.setDescription(this.descriptions); + dbc.setFormat(this.formats); + dbc.setIdentifier(this.identifiers); + dbc.setLanguage(this.languages); + dbc.setPublisher(this.publishers); + dbc.setRelation(this.relations); + dbc.setRights(this.rights); + dbc.setSource(this.sources); + dbc.setSubject(this.subjects); + dbc.setTitle(this.titles); + dbc.setType(this.types); + + return dbc; + } + + /** + * + */ + public void listClearer() { + this.contributors.clear(); + this.coverages.clear(); + this.creators.clear(); + this.dates.clear(); + this.descriptions.clear(); + this.formats.clear(); + this.identifiers.clear(); + this.languages.clear(); + this.publishers.clear(); + this.relations.clear(); + this.rights.clear(); + this.sources.clear(); + this.subjects.clear(); + this.titles.clear(); + this.types.clear(); + } + + /** + * @param formatToFilter + */ + public void setFormatToFilter(String formatToFilter) { + this.formatToFilter = formatToFilter; + } + + /** + * @param formatField + */ + public void setFormatField(String formatField) { + this.formatField = formatField; + } + + /** + * @return + */ + public String getDateOfObjectCreation() { + return this.dateOfObjectCreation; + } + + /** + * @param dateOfObjectCreation + */ + public void setDateOfObjectCreation(String dateOfObjectCreation) { + this.dateOfObjectCreation = dateOfObjectCreation; + } + + /** + * @return + */ + public String getRelationToFurtherMetadataObject() { + return this.relationToFurtherMetadataObject; + } + + /** + * @param relationToFurtherMetadataObject + */ + public void setRelationToFurtherMetadataObject(String relationToFurtherMetadataObject) { + this.relationToFurtherMetadataObject = relationToFurtherMetadataObject; + } + + /** + * @return + */ + public String getRepositoryObjectURIPrefix() { + return this.repositoryObjectURIPrefix; + } + + /** + * @param repositoryObjectURIPrefix + */ + public void setRepositoryObjectURIPrefix(String repositoryObjectURIPrefix) { + this.repositoryObjectURIPrefix = repositoryObjectURIPrefix; + } + + /** + * @return + */ + public String getFieldForRange() { + return this.rangeField; + } + + /** + * @param fieldForRange + */ + public void setFieldForRange(String fieldForRange) { + this.rangeField = fieldForRange; + } + + /* + * Setter for DublinCore Lists + */ + + /** + * @param contributorList + */ + public void setContributor(String[] contributorList) { + this.contributorList = contributorList; + } + + /** + * @param coveragesList + */ + public void setCoverage(String[] coveragesList) { + this.coverageList = coveragesList; + } + + /** + * @param creatorsList + */ + public void setCreators(String[] creatorsList) { + this.creatorList = creatorsList; + } + + /** + * @param datesList + */ + public void setDates(String[] datesList) { + this.dateList = datesList; + } + + /** + * @param descriptionsList + */ + public void setDescriptions(String[] descriptionsList) { + this.descriptionList = descriptionsList; + } + + /** + * @param formatsList + */ + public void setFormats(String[] formatsList) { + this.formatList = formatsList; + } + + /** + * @param identifiersList + */ + public void setIdentifiers(String[] identifiersList) { + this.identifierList = identifiersList; + } + + /** + * @param languagesList + */ + public void setLanguages(String[] languagesList) { + this.languageList = languagesList; + } + + /** + * @param publishersList + */ + public void setPublishers(String[] publishersList) { + this.publisherList = publishersList; + } + + /** + * @param relationsList + */ + public void setRelations(String[] relationsList) { + this.relationList = relationsList; + } + + /** + * @param relationsList + */ + public void setRelationsForWork(String[] relationsList) { + this.relationForWorkList = relationsList; + } + + /** + * @param rightsList + */ + public void setRights(String[] rightsList) { + this.rightList = rightsList; + } + + /** + * @param sourcesList + */ + public void setSources(String[] sourcesList) { + this.sourceList = sourcesList; + } + + /** + * @param subjectsList + */ + public void setSubjects(String[] subjectsList) { + this.subjectList = subjectsList; + } + + /** + * @param titlesList + */ + public void setTitles(String[] titlesList) { + this.titleList = titlesList; + } + + /** + * @param typesList + */ + public void setTypes(String[] typesList) { + this.typeList = typesList; + } + + /** + * @param request + * @return + */ + public boolean requestChecker(RequestType request) { + + boolean requestCheck; + + if (request.getIdentifier() != null || request.getMetadataPrefix() == null) { + + requestCheck = false; + } else { + requestCheck = true; + } + + return requestCheck; + } + + /** + * @return + */ + public boolean isFoundItems() { + return this.foundItems; + } + + /** + * @param foundItems + */ + public void setFoundItems(boolean foundItems) { + this.foundItems = foundItems; + } + + public String getModifiedField() { + return modifiedField; + } + + public void setModifiedField(String modifiedField) { + this.modifiedField = modifiedField; + } + + public String getIdentifierField() { + return identifierField; + } + + public void setIdentifierField(String identifierField) { + this.identifierField = identifierField; + } + + public int getSearchResponseSize() { + return searchResponseSize; + } + + public void setSearchResponseSize(String searchResponseSize) { + this.searchResponseSize = Integer.parseInt(searchResponseSize); + } + + // public String getCollectionTitle() { + // return collectionTitle; + // } + + // public void setCollectionTitle(GetResponse responseWorkValues) { + // this.collectionTitle = responseWorkValues.getField("metadata.dc:title").getValue().toString(); + // } }