From 1ad121b6892d83c1a7526d0b30c8b2e8ecd0c3c9 Mon Sep 17 00:00:00 2001 From: Lennard Golsch Date: Mon, 5 Oct 2026 12:29:48 +0200 Subject: [PATCH 1/5] fix: keep case of file names in alias paths --- .../mycore/alias/servlets/MCRAliasContentServlet.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java b/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java index 10ae8f4..dc368de 100644 --- a/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java +++ b/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java @@ -114,8 +114,7 @@ public MCRContent getContent(HttpServletRequest request, HttpServletResponse res LOGGER.info("Alias was found with Object id: " + rootAlias.get(0).getFieldValue(OBJECT_ID)); - String aliasPathContextOrig = parsePath(path).replaceFirst(decreasedPath, ""); - String aliasPathContext = aliasPathContextOrig.toLowerCase(Locale.ROOT); + String aliasPathContext = parsePath(path).replaceFirst(decreasedPath, ""); contentFromAliasPath = getContentFromAliasPath(aliasPathContext, path, (String) rootAlias.get(0).getFieldValue(OBJECT_ID), request, response); @@ -260,10 +259,10 @@ private MCRContent getContentFromAliasPath(String aliasPathContext, String fullP LOGGER.debug("Process Alias Path Context: Try to shrink Alias Path Context " + aliasPathContext); List pathParts = Stream.of(aliasPathContext.split("/")) .filter(Predicate.not(String::isEmpty)) - .map(p -> p.toLowerCase(Locale.ROOT)) .collect(Collectors.toList()); - String cleanAliasPathContext = String.join("/", pathParts); + String cleanAliasPathContextOrig = String.join("/", pathParts); + String cleanAliasPathContext = cleanAliasPathContextOrig.toLowerCase(Locale.ROOT); // the longer the alias of the document is, the more likely it is the correct one Comparator compareBestMatchingAlias = Comparator @@ -281,7 +280,7 @@ private MCRContent getContentFromAliasPath(String aliasPathContext, String fullP relatedObjectId = (String) relatedDocument.getFieldValue(OBJECT_ID); String alias = getAliasFromDocument(relatedDocument).toLowerCase(Locale.ROOT); - nextAliasPathContextAfter = cleanAliasPathContext.substring(alias.length()); + nextAliasPathContextAfter = cleanAliasPathContextOrig.substring(alias.length()); LOGGER.info("---- Process Alias Path Context: " + alias + " found in " + aliasPathContext + ". Shrink aliasPathContext into " + nextAliasPathContextAfter); } From 76a21c385c984763c5cc37d13815946caba0b499 Mon Sep 17 00:00:00 2001 From: Lennard Golsch Date: Mon, 5 Oct 2026 12:30:51 +0200 Subject: [PATCH 2/5] fix: do not use alias as regular expression when cutting it off the path --- .../java/org/mycore/alias/servlets/MCRAliasContentServlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java b/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java index dc368de..76fa1fc 100644 --- a/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java +++ b/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java @@ -114,7 +114,7 @@ public MCRContent getContent(HttpServletRequest request, HttpServletResponse res LOGGER.info("Alias was found with Object id: " + rootAlias.get(0).getFieldValue(OBJECT_ID)); - String aliasPathContext = parsePath(path).replaceFirst(decreasedPath, ""); + String aliasPathContext = parsePath(path).substring(decreasedPath.length()); contentFromAliasPath = getContentFromAliasPath(aliasPathContext, path, (String) rootAlias.get(0).getFieldValue(OBJECT_ID), request, response); From 0307d4cfe36a1ec407c410ca9a4f53407e032d71 Mon Sep 17 00:00:00 2001 From: Lennard Golsch Date: Mon, 5 Oct 2026 12:31:36 +0200 Subject: [PATCH 3/5] fix: match aliases of related items only on complete path segments --- .../java/org/mycore/alias/servlets/MCRAliasContentServlet.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java b/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java index 76fa1fc..9f21656 100644 --- a/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java +++ b/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java @@ -152,7 +152,8 @@ private static void logPossibleAliasDocument(SolrDocument doc) { } private static boolean isDocumentAliasMatching(String cleanAliasPathContext, SolrDocument doc) { - return cleanAliasPathContext.startsWith(getAliasFromDocument(doc).toLowerCase(Locale.ROOT)); + String alias = getAliasFromDocument(doc).toLowerCase(Locale.ROOT); + return cleanAliasPathContext.equals(alias) || cleanAliasPathContext.startsWith(alias + "/"); } private static boolean documentHasAlias(SolrDocument doc) { From de41d07710bf446136d7427a6ae65bbc0ce75695 Mon Sep 17 00:00:00 2001 From: Lennard Golsch Date: Mon, 5 Oct 2026 12:32:29 +0200 Subject: [PATCH 4/5] fix: escape special characters and whitespace in alias queries --- .../org/mycore/alias/servlets/MCRAliasContentServlet.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java b/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java index 9f21656..a035afe 100644 --- a/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java +++ b/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java @@ -20,6 +20,7 @@ import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.QueryResponse; +import org.apache.solr.client.solrj.util.ClientUtils; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.mycore.access.MCRAccessManager; @@ -33,7 +34,6 @@ import org.mycore.datamodel.niofs.MCRPath; import org.mycore.frontend.servlets.MCRContentServlet; import org.mycore.solr.MCRSolrClientFactory; -import org.mycore.solr.MCRSolrUtils; import org.xml.sax.SAXException; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; @@ -359,7 +359,7 @@ protected SolrDocumentList getMCRObjectsFromSolr(String aliasPart) { try { String searchStr = ALIAS + ":%filter%".replace("%filter%", - aliasPart != null && !aliasPart.isEmpty() ? MCRSolrUtils.escapeSearchValue(aliasPart) : "*"); + aliasPart != null && !aliasPart.isEmpty() ? ClientUtils.escapeQueryChars(aliasPart) : "*"); results = resolveSolrDocuments(searchStr); From 52fd9169e31487dd6afd28943c4640bbfc2cc86a Mon Sep 17 00:00:00 2001 From: Lennard Golsch Date: Mon, 5 Oct 2026 12:33:10 +0200 Subject: [PATCH 5/5] fix: handle empty MCR.Alias.Filepattern property --- .../java/org/mycore/alias/servlets/MCRAliasContentServlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java b/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java index a035afe..3404255 100644 --- a/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java +++ b/src/main/java/org/mycore/alias/servlets/MCRAliasContentServlet.java @@ -75,7 +75,7 @@ public class MCRAliasContentServlet extends MCRContentServlet { @Override public void init() throws ServletException { super.init(); - this.aliasFilePattern = MCRConfiguration2.getString("MCR.Alias.Filepattern").get(); + this.aliasFilePattern = MCRConfiguration2.getString("MCR.Alias.Filepattern").orElse(""); } @Override