diff --git a/solidify-oai-model/src/main/java/ch/unige/solidify/model/oai/OAIToken.java b/solidify-oai-model/src/main/java/ch/unige/solidify/model/oai/OAIToken.java index 0791e946cace9ba9327fb6168668575f834ae42c..6c622b05884c07014a7252bc38e5df697cbd12a1 100644 --- a/solidify-oai-model/src/main/java/ch/unige/solidify/model/oai/OAIToken.java +++ b/solidify-oai-model/src/main/java/ch/unige/solidify/model/oai/OAIToken.java @@ -9,12 +9,12 @@ * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 2 of the * License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-2.0.html>. @@ -79,15 +79,20 @@ public class OAIToken { return this.pageable; } - public ResumptionTokenType getToken(long totalItems, long previousItems, int oaiPmhTokenLifeTime) { + public ResumptionTokenType getToken(long totalItems, long previousItems, int oaiPmhTokenLifeTime, boolean lastPage) { final ResumptionTokenType resumptionToken = new ResumptionTokenType(); - this.setExpirationDate(oaiPmhTokenLifeTime); + // set total items this.setTotalItems(BigInteger.valueOf(totalItems)); - this.setCurrentItems(BigInteger.valueOf(previousItems)); resumptionToken.setCompleteListSize(this.getTotalItems()); + // set cursor = items already read + this.setCurrentItems(BigInteger.valueOf(previousItems)); resumptionToken.setCursor(this.getCurrentItems()); - resumptionToken.setExpirationDate(this.getExpirationDate()); - resumptionToken.setValue(this.encodeResumptionToken()); + if (!lastPage) { + // If token is not on the last page, fill its value + this.setExpirationDate(oaiPmhTokenLifeTime); + resumptionToken.setExpirationDate(this.getExpirationDate()); + resumptionToken.setValue(this.encodeResumptionToken()); + } return resumptionToken; } diff --git a/solidify-oai-pmh/src/main/java/ch/unige/solidify/service/OAIService.java b/solidify-oai-pmh/src/main/java/ch/unige/solidify/service/OAIService.java index 19e6532ccd0d77489075e48262eabc7e294704f7..ecb9606bb637308e7b2413a68edadec28a7300a9 100644 --- a/solidify-oai-pmh/src/main/java/ch/unige/solidify/service/OAIService.java +++ b/solidify-oai-pmh/src/main/java/ch/unige/solidify/service/OAIService.java @@ -251,7 +251,11 @@ public class OAIService { } if (collection.getPage().hasNext()) { idList.setResumptionToken( - oaiToken.getToken(collection.getPage().getTotalItems(), collection.getPage().getPreviousItems(), this.oaiPmhTokenLifeTime)); + oaiToken.getToken(collection.getPage().getTotalItems(), collection.getPage().getPreviousItems(), this.oaiPmhTokenLifeTime, false)); + } else if (token != null) { + // If results are paginated, a resumptionToken must be present on the last page, but with an empty value + idList.setResumptionToken( + oaiToken.getToken(collection.getPage().getTotalItems(), collection.getPage().getPreviousItems(), this.oaiPmhTokenLifeTime, true)); } return idList; } @@ -302,8 +306,13 @@ public class OAIService { if (collection.getPage().hasNext()) { recList.setResumptionToken( - oaiToken.getToken(collection.getPage().getTotalItems(), collection.getPage().getPreviousItems(), this.oaiPmhTokenLifeTime)); + oaiToken.getToken(collection.getPage().getTotalItems(), collection.getPage().getPreviousItems(), this.oaiPmhTokenLifeTime, false)); + } else if (token != null) { + // If results are paginated, a resumptionToken must be present on the last page, but with an empty value + recList.setResumptionToken( + oaiToken.getToken(collection.getPage().getTotalItems(), collection.getPage().getPreviousItems(), this.oaiPmhTokenLifeTime, true)); } + return recList; } diff --git a/solidify-util/src/main/java/ch/unige/solidify/util/OffsetDateTimeAdapter.java b/solidify-util/src/main/java/ch/unige/solidify/util/OffsetDateTimeAdapter.java index 5cd8588b9730650c8c463e8f3899e1a06b1f8ad2..9544fc7410436b30c461f055bf2a69d545439076 100644 --- a/solidify-util/src/main/java/ch/unige/solidify/util/OffsetDateTimeAdapter.java +++ b/solidify-util/src/main/java/ch/unige/solidify/util/OffsetDateTimeAdapter.java @@ -31,11 +31,17 @@ import ch.unige.solidify.SolidifyConstants; public class OffsetDateTimeAdapter { public static OffsetDateTime parseDateTime(String value) { - return OffsetDateTime.parse(value); + if (value != null) { + return OffsetDateTime.parse(value); + } + return null; } public static String printDateTime(OffsetDateTime value) { - return value.format(DateTimeFormatter.ISO_INSTANT); + if (value != null) { + return value.format(DateTimeFormatter.ISO_INSTANT); + } + return null; } /**