Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
*
*/
Expand All @@ -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;

Expand All @@ -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<MCRObjectID> optObjId = mcrIdMapper.mapMCRObjectID(mcrid);
final String objectId = DECODE_MCR_OBJECT_IDS ? URLDecoder.decode(mcrid, StandardCharsets.UTF_8) : mcrid;
Optional<MCRObjectID> 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<MCRObjectID> optDerId = mcrIdMapper.mapMCRDerivateID(optObjId.get(), derid);
final String derivateId =
DECODE_MCR_OBJECT_IDS ? URLDecoder.decode(derid, StandardCharsets.UTF_8) : derid;
Optional<MCRObjectID> 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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down