From 1e32ab035d5519cfbb0e77c86287680b531a8b84 Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Mon, 1 May 2017 21:13:37 -0400 Subject: [PATCH] Made GetRecord behave the same way as ListIdentifiers and ListRecords, as requested in #3687, with multiple sets showing in the record headers. --- .../harvest/server/OAIRecordServiceBean.java | 4 ++- .../harvest/server/xoai/XitemRepository.java | 26 ++++++++++++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAIRecordServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAIRecordServiceBean.java index 91ac99d31a9..9073bef9ed5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAIRecordServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/harvest/server/OAIRecordServiceBean.java @@ -288,7 +288,7 @@ public OAIRecord findOAIRecordBySetNameandGlobalId(String setName, String global } public List findOaiRecordsByGlobalId(String globalId) { - String query="SELECT h from OAIRecord as h where h.globalId = :globalId"; + String query="SELECT object(h) from OAIRecord h where h.globalId = :globalId"; List oaiRecords = null; try { oaiRecords = em.createQuery(query).setParameter("globalId",globalId).getResultList(); @@ -319,6 +319,8 @@ public List findOaiRecordsBySetName(String setName, Date from, Date u } else { queryString += " and h.setName = :setName"; } + } else { + queryString += " and h.setName is null"; } queryString += from != null ? " and h.lastUpdateTime >= :from" : ""; queryString += until != null ? " and h.lastUpdateTime<=:until" : ""; diff --git a/src/main/java/edu/harvard/iq/dataverse/harvest/server/xoai/XitemRepository.java b/src/main/java/edu/harvard/iq/dataverse/harvest/server/xoai/XitemRepository.java index de512cbcaff..a67e97ad728 100644 --- a/src/main/java/edu/harvard/iq/dataverse/harvest/server/xoai/XitemRepository.java +++ b/src/main/java/edu/harvard/iq/dataverse/harvest/server/xoai/XitemRepository.java @@ -49,12 +49,26 @@ public XitemRepository (OAIRecordServiceBean recordService, DatasetServiceBean d @Override public Item getItem(String identifier) throws IdDoesNotExistException, OAIException { - logger.fine("getItem; calling findOAIRecordBySetNameandGlobalId, identifier " + identifier); - OAIRecord oaiRecord = recordService.findOAIRecordBySetNameandGlobalId(null, identifier); - if (oaiRecord != null) { - Dataset dataset = datasetService.findByGlobalId(oaiRecord.getGlobalId()); - if (dataset != null) { - return new Xitem(oaiRecord).withDataset(dataset); + logger.fine("getItem; calling findOaiRecordsByGlobalId, identifier " + identifier); + List oaiRecords = recordService.findOaiRecordsByGlobalId(identifier); + if (oaiRecords != null && !oaiRecords.isEmpty()) { + Xitem xoaiItem = null; + for (OAIRecord record : oaiRecords) { + if (xoaiItem == null) { + Dataset dataset = datasetService.findByGlobalId(record.getGlobalId()); + if (dataset != null) { + xoaiItem = new Xitem(record).withDataset(dataset); + } + } else { + // Adding extra set specs to the XOAI Item, if this record + // is part of multiple sets: + if (!StringUtil.isEmpty(record.getSetName())) { + xoaiItem.getSets().add(new Set(record.getSetName())); + } + } + } + if (xoaiItem != null) { + return xoaiItem; } }