From d98d94130b11598c7befc00c6acd55e89e335930 Mon Sep 17 00:00:00 2001 From: Lennard Golsch Date: Mon, 2 Feb 2026 09:06:28 +0100 Subject: [PATCH] MCR-3593 Add support for optional URL decoding to MCRNormalizeMCRObjectIDsFilter --- .../MCRNormalizeMCRObjectIDsFilter.java | 20 ++++++++++++------- .../restapi/config/mycore.properties | 1 + 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/mycore-restapi/src/main/java/org/mycore/restapi/MCRNormalizeMCRObjectIDsFilter.java b/mycore-restapi/src/main/java/org/mycore/restapi/MCRNormalizeMCRObjectIDsFilter.java index 7c44aae85e..a4230f0eb7 100644 --- a/mycore-restapi/src/main/java/org/mycore/restapi/MCRNormalizeMCRObjectIDsFilter.java +++ b/mycore-restapi/src/main/java/org/mycore/restapi/MCRNormalizeMCRObjectIDsFilter.java @@ -19,6 +19,8 @@ package org.mycore.restapi; import java.net.URI; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.util.Optional; import org.apache.commons.lang3.StringUtils; @@ -44,7 +46,7 @@ /** * This prematching filter checks the given MCRObjectIDs in an REST API call beginning with /objects, * normalizes them and sends a redirect if necessary. - * + * * @author Robert Stephan * */ @@ -53,6 +55,9 @@ @Priority(Priorities.AUTHORIZATION - 10) public class MCRNormalizeMCRObjectIDsFilter implements ContainerRequestFilter { + private static final boolean DECODE_MCR_OBJECT_IDS = + MCRConfiguration2.getBoolean("MCR.RestAPI.NormalizeMCRObjectIDsFilter.DecodeIDs").orElseThrow(); + @Context ResourceInfo resourceInfo; @@ -77,20 +82,21 @@ public void filter(ContainerRequestContext requestContext) { try { String mcrid = pathParts[mcrIdPos]; String mcridExtension = getExtension(mcrid); - mcrid = mcrid.substring(0, mcrid.length() - mcridExtension.length()); - Optional optObjId = mcrIdMapper.mapMCRObjectID(mcrid); + final String objectId = DECODE_MCR_OBJECT_IDS ? URLDecoder.decode(mcrid, StandardCharsets.UTF_8) : mcrid; + Optional optObjId = mcrIdMapper.mapMCRObjectID(objectId); if (optObjId.isEmpty()) { - throw new NotFoundException("No unique MyCoRe Object ID found for query " + mcrid); + throw new NotFoundException("No unique MyCoRe Object ID found for query " + objectId); } pathParts[mcrIdPos] = optObjId.get().toString() + mcridExtension; if (optObjId.isPresent() && pathParts.length > derIdPos && pathParts[derIdPos - 1].equals("derivates")) { String derid = pathParts[derIdPos]; String deridExtension = getExtension(derid); - derid = derid.substring(0, derid.length() - deridExtension.length()); - Optional optDerId = mcrIdMapper.mapMCRDerivateID(optObjId.get(), derid); + final String derivateId = + DECODE_MCR_OBJECT_IDS ? URLDecoder.decode(derid, StandardCharsets.UTF_8) : derid; + Optional optDerId = mcrIdMapper.mapMCRDerivateID(optObjId.get(), derivateId); if (optDerId.isEmpty()) { - throw new NotFoundException("No unique MyCoRe Derivate ID found for query " + derid); + throw new NotFoundException("No unique MyCoRe Derivate ID found for query " + derivateId); } pathParts[derIdPos] = optDerId.get().toString() + deridExtension; } diff --git a/mycore-restapi/src/main/resources/components/restapi/config/mycore.properties b/mycore-restapi/src/main/resources/components/restapi/config/mycore.properties index 45af9a095f..7549cbe7b4 100644 --- a/mycore-restapi/src/main/resources/components/restapi/config/mycore.properties +++ b/mycore-restapi/src/main/resources/components/restapi/config/mycore.properties @@ -19,6 +19,7 @@ MCR.RestAPI.v1.Upload.Directory=%MCR.datadir%/restapi_uploads MCR.RestAPI.Resource.Packages=org.mycore.restapi.v1 MCR.RestAPI.V2.Resource.Packages=org.mycore.restapi.v2 +MCR.RestAPI.NormalizeMCRObjectIDsFilter.DecodeIDs=false #example configuration to allow certain Solr fields to be used for retrieving MCRObjectIDs #properties deprecated in 2024.06 - code was moved to mycore-solr - use new properties MCR.RestAPI.V2.AlternativeIdentifier.Objects.Keys=