From a9bb29985c3182fb640f43b3e7c711bb5a8c9036 Mon Sep 17 00:00:00 2001 From: Thomas Scheffler Date: Tue, 13 Jan 2026 09:15:37 +0100 Subject: [PATCH 1/5] MCR-3585 update dependencies --- mycore-base/pom.xml | 2 +- .../java/org/mycore/common/MCRCalendar.java | 141 ++++++++---------- .../org/mycore/common/xml/MCRURIResolver.java | 6 +- .../datamodel/metadata/MCRObjectService.java | 9 +- .../common/util/MCRTestCaseXSLTUtil.java | 4 +- .../mycore/common/xml/MCRURIResolverTest.java | 6 +- .../org/mycore/test/MCRTestExtension.java | 4 +- .../org/mycore/test/MCRTestUrlExtension.java | 2 +- .../MCRNeo4JMetaHistoryDateParser.java | 4 +- .../MCRNeo4JMetaLangTextParser.java | 4 +- .../metadata/neo4jparser/MCRNeo4JParser.java | 5 +- .../metadata/neo4jutil/MCRNeo4JUtil.java | 5 +- .../mcr/neo4j/proxy/MCRNeo4JProxyServlet.java | 8 +- .../mcr/neo4j/utils/MCRNeo4JQueryRunner.java | 11 +- .../org/mycore/oai/MCROAISolrSearcher.java | 10 +- .../oai/set/MCROAIQuerySetResolver.java | 8 +- .../orcid2/util/MCRORCIDJSONMapper.java | 2 +- .../mycore/restapi/MCRCORSResponseFilter.java | 4 +- .../solr/common/xml/MCRSolrQueryResolver.java | 4 +- .../org/mycore/solr/index/MCRSolrIndexer.java | 8 +- .../solr/proxy/MCRSolrProxyServlet.java | 3 +- .../solr/search/MCRSolrSearchUtils.java | 19 +++ mycore-viewer/pom.xml | 2 +- .../webcli/flow/MCRLogEventProcessor.java | 5 +- pom.xml | 120 ++++++++------- 25 files changed, 206 insertions(+), 190 deletions(-) diff --git a/mycore-base/pom.xml b/mycore-base/pom.xml index b3adf9ce71..f1d7b22dac 100644 --- a/mycore-base/pom.xml +++ b/mycore-base/pom.xml @@ -438,7 +438,7 @@ org.glassfish.jersey.containers - jersey-container-servlet-core + jersey-container-servlet test diff --git a/mycore-base/src/main/java/org/mycore/common/MCRCalendar.java b/mycore-base/src/main/java/org/mycore/common/MCRCalendar.java index 14775e686e..b4880c2200 100644 --- a/mycore-base/src/main/java/org/mycore/common/MCRCalendar.java +++ b/mycore-base/src/main/java/org/mycore/common/MCRCalendar.java @@ -24,6 +24,7 @@ import java.util.Locale; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -541,19 +542,19 @@ protected static JapaneseCalendar getCalendarFromJapaneseDate(String datestr, bo // before parsing we have to remove this final String eraToken; final int era; - if (StringUtils.contains(cleanDate, "M")) { + if (Strings.CS.contains(cleanDate, "M")) { eraToken = "M"; era = JapaneseCalendar.MEIJI; - } else if (StringUtils.contains(cleanDate, "T")) { + } else if (Strings.CS.contains(cleanDate, "T")) { eraToken = "T"; era = JapaneseCalendar.TAISHO; - } else if (StringUtils.contains(cleanDate, "S")) { + } else if (Strings.CS.contains(cleanDate, "S")) { eraToken = "S"; era = JapaneseCalendar.SHOWA; - } else if (StringUtils.contains(cleanDate, "H")) { + } else if (Strings.CS.contains(cleanDate, "H")) { eraToken = "H"; era = JapaneseCalendar.HEISEI; - } else if (StringUtils.contains(cleanDate, "R")) { + } else if (Strings.CS.contains(cleanDate, "R")) { eraToken = "R"; era = JapaneseCalendar.REIWA; } else { @@ -938,8 +939,8 @@ public static int[] parseDateString(String dateString, boolean last, CalendarTyp final String delimiter = delimiter(dateString); // check for positions of year and month delimiters - final int firstdot = StringUtils.indexOf(dateString, delimiter, 1); - final int secdot = StringUtils.indexOf(dateString, delimiter, firstdot + 1); + final int firstdot = Strings.CS.indexOf(dateString, delimiter, 1); + final int secdot = Strings.CS.indexOf(dateString, delimiter, firstdot + 1); final int day; final int mon; @@ -999,7 +1000,7 @@ public static int[] parseDateString(String dateString, boolean last, CalendarTyp * @return true if the given input date is in ISO format (xx-xx-xx), otherwise false */ public static boolean isoFormat(String input) { - return -1 != StringUtils.indexOf(input, "-", 1); + return -1 != Strings.CS.indexOf(input, "-", 1); } /** @@ -1015,7 +1016,7 @@ public static String cleanDate(String input, CalendarType calendarType) { final int end; final int length = StringUtils.length(date); - if (StringUtils.startsWith(date, "-")) { + if (Strings.CS.startsWith(date, "-")) { start = 1; end = length; } else { @@ -1050,14 +1051,14 @@ public static int[] calculateEgyptianDateBorders(String datestr) { final int ende; final int length = StringUtils.length(datestr); - if (StringUtils.startsWith(datestr, "-")) { + if (Strings.CS.startsWith(datestr, "-")) { start = 1; } else { start = 0; } - if (StringUtils.contains(datestr, "A.N.")) { - ende = StringUtils.indexOf(datestr, "A.N."); + if (Strings.CS.contains(datestr, "A.N.")) { + ende = Strings.CS.indexOf(datestr, "A.N."); } else { ende = length; } @@ -1093,7 +1094,7 @@ public static int[] calculateJapaneseDateBorders(String input) { */ public static int[] calculatePersianDateBorders(String dateStr) { final int start; - if (StringUtils.startsWith(dateStr, "-")) { + if (Strings.CS.startsWith(dateStr, "-")) { start = 1; } else { start = 0; @@ -1113,16 +1114,16 @@ public static int[] calculateCopticDateBorders(String input) { final int end; final int length = StringUtils.length(input); - if (StringUtils.startsWith(input, "-")) { + if (Strings.CS.startsWith(input, "-")) { start = 1; end = length; } else { start = 0; - if (StringUtils.contains(input, "A.M")) { - end = StringUtils.indexOf(input, "A.M."); - } else if (StringUtils.contains(input, "E.E.")) { - end = StringUtils.indexOf(input, "E.E."); + if (Strings.CS.contains(input, "A.M")) { + end = Strings.CS.indexOf(input, "A.M."); + } else if (Strings.CS.contains(input, "E.E.")) { + end = Strings.CS.indexOf(input, "E.E."); } else { end = length; } @@ -1170,68 +1171,37 @@ public static int[] calculateIslamicDateBorders(String dateString) { } /** - * Calculates the date borders for a Gregorian date in the form d.m.y [N. CHR|V.CHR|AD|BC] + * Calculates the date borders for a Gregorian date in the form d.m.y [N. CHR|V. CHR|AD|BC] * * @param dateString the date string to parse * @return a field containing the start position of the date string in index 0 and the end position in index 1 */ public static int[] calculateGregorianDateBorders(String dateString) { - final int start; - final int end; final int length = StringUtils.length(dateString); - if (StringUtils.contains(dateString, "N. CHR") || StringUtils.contains(dateString, "V. CHR")) { - final int positionNChr = StringUtils.indexOf(dateString, "N. CHR"); - final int positionVChr = StringUtils.indexOf(dateString, "V. CHR"); - if (positionNChr != -1) { - if (positionNChr == 0) { - start = 7; - end = length; - } else { - start = 0; - end = positionNChr - 1; - } - } else if (positionVChr != -1) { - if (positionVChr == 0) { - start = 7; - end = length; - } else { - start = 0; - end = positionVChr - 1; - } - } else { - start = 0; - end = length; - } - } else if (StringUtils.contains(dateString, "AD") || StringUtils.contains(dateString, "BC")) { - final int positionAD = StringUtils.indexOf(dateString, "AD"); - final int positionBC = StringUtils.indexOf(dateString, "BC"); - if (positionAD != -1) { - if (positionAD == 0) { - start = 2; - end = length; - } else { - start = 0; - end = positionAD - 1; - } - } else if (positionBC != -1) { - if (positionBC == 0) { - start = 2; - end = length; - } else { - start = 0; - end = positionBC - 1; - } - } else { - start = 0; - end = length; - } - } else { - start = 0; - end = length; + int[] borders = resolveEraBorders(dateString, length, EraSpec.N_CHR, EraSpec.V_CHR); + + if (borders == null) { + borders = resolveEraBorders(dateString, length, EraSpec.AD, EraSpec.BC); } - return new int[] { start, end }; + if (borders == null) { + borders = new int[] { 0, length }; + } + + return borders; + } + + private static int[] resolveEraBorders(String dateString, int length, EraSpec... eras) { + for (EraSpec era : eras) { + final int position = Strings.CS.indexOf(dateString, era.token()); + if (position != -1) { + final int start = position == 0 ? era.leadingOffset() : 0; + final int end = position == 0 ? length : position - 1; + return new int[] { start, end }; + } + } + return null; } /** @@ -1245,14 +1215,14 @@ public static int[] calculateBuddhistDateBorders(String datestr) { final int end; final int length = StringUtils.length(datestr); - if (StringUtils.startsWith(datestr, "-")) { + if (Strings.CS.startsWith(datestr, "-")) { start = 1; end = length; } else { start = 0; - if (StringUtils.contains(datestr, "B.E.")) { - end = StringUtils.indexOf(datestr, "B.E."); + if (Strings.CS.contains(datestr, "B.E.")) { + end = Strings.CS.indexOf(datestr, "B.E."); } else { end = length; } @@ -1268,9 +1238,9 @@ public static int[] calculateBuddhistDateBorders(String datestr) { * @return the delimiter for the given date input */ public static String delimiter(String input) { - if (-1 != StringUtils.indexOf(input, "-", 1)) { + if (-1 != Strings.CS.indexOf(input, "-", 1)) { return "-"; - } else if (-1 != StringUtils.indexOf(input, "/", 1)) { + } else if (-1 != Strings.CS.indexOf(input, "/", 1)) { return "/"; } else { return "."; @@ -1293,13 +1263,13 @@ public static String delimiter(String input) { * @return true if the given input date is for the calendars zero date */ public static boolean beforeZero(String input, CalendarType calendarType) { - if (StringUtils.startsWith(input, "-")) { + if (Strings.CS.startsWith(input, "-")) { return true; } return switch (calendarType) { - case BUDDHIST -> StringUtils.contains(input, "B.E."); - case GREGORIAN, JULIAN -> StringUtils.contains(input, "BC") || StringUtils.contains(input, "V. CHR"); + case BUDDHIST -> Strings.CS.contains(input, "B.E."); + case GREGORIAN, JULIAN -> Strings.CS.contains(input, "BC") || Strings.CS.contains(input, "V. CHR"); // these calendars do not allow for an era statement other than - case COPTIC, HEBREW, ETHIOPIC, PERSIC, CHINESE, ISLAMIC, ARMENIAN, EGYPTIAN, JAPANESE -> false; default -> throw new MCRException(String.format(Locale.ROOT, MSG_CALENDAR_UNSUPPORTED, calendarType)); @@ -1410,8 +1380,19 @@ public String getType() { public static CalendarType of(String type) { return Arrays.stream(values()) - .filter(current -> StringUtils.equals(current.getType(), type)) + .filter(current -> Strings.CS.equals(current.getType(), type)) .findFirst().orElseThrow(); } } + + private record EraSpec(String token, int leadingOffset) { + final static EraSpec AD = new EraSpec("AD"); + final static EraSpec BC = new EraSpec("BC"); + final static EraSpec V_CHR = new EraSpec("V. CHR"); + final static EraSpec N_CHR = new EraSpec("N. CHR"); + + EraSpec(String token) { + this(token, token.length()); + } + } } diff --git a/mycore-base/src/main/java/org/mycore/common/xml/MCRURIResolver.java b/mycore-base/src/main/java/org/mycore/common/xml/MCRURIResolver.java index 9764d432ca..ee4593c2c0 100644 --- a/mycore-base/src/main/java/org/mycore/common/xml/MCRURIResolver.java +++ b/mycore-base/src/main/java/org/mycore/common/xml/MCRURIResolver.java @@ -54,7 +54,7 @@ import javax.xml.transform.stream.StreamSource; import javax.xml.xpath.XPathExpressionException; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; @@ -1271,9 +1271,9 @@ public Source resolve(String href, String base) throws TransformerException { final String baseURI = getParentDirectoryResourceURI(base); // set xslt folder final String xslFolder; - if (StringUtils.startsWith(baseURI, "resource:xsl/")) { + if (Strings.CS.startsWith(baseURI, "resource:xsl/")) { xslFolder = "xsl"; - } else if (StringUtils.startsWith(baseURI, "resource:xslt/")) { + } else if (Strings.CS.startsWith(baseURI, "resource:xslt/")) { xslFolder = "xslt"; } else { xslFolder = MCRConfiguration2.getStringOrThrow(PROPERTY_XSL_FOLDER); diff --git a/mycore-base/src/main/java/org/mycore/datamodel/metadata/MCRObjectService.java b/mycore-base/src/main/java/org/mycore/datamodel/metadata/MCRObjectService.java index 2f38400463..55746fb77c 100644 --- a/mycore-base/src/main/java/org/mycore/datamodel/metadata/MCRObjectService.java +++ b/mycore-base/src/main/java/org/mycore/datamodel/metadata/MCRObjectService.java @@ -28,6 +28,7 @@ import java.util.stream.IntStream; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jdom2.Element; @@ -449,7 +450,7 @@ protected final List getFlagsAsList() { */ protected final List getFlagsAsMCRMetaLangText(String type) { return flags.stream() - .filter(metaLangText -> StringUtils.equals(type, metaLangText.getType())) + .filter(metaLangText -> Strings.CS.equals(type, metaLangText.getType())) .collect(Collectors.toCollection(ArrayList::new)); } @@ -524,7 +525,7 @@ public final boolean isFlagSet(String value) { * otherwise false */ public final boolean isFlagTypeSet(String type) { - return flags.stream().anyMatch(flag -> StringUtils.equals(type, flag.getType())); + return flags.stream().anyMatch(flag -> Strings.CS.equals(type, flag.getType())); } /** @@ -551,7 +552,7 @@ public final void removeFlag(int index) throws IndexOutOfBoundsException { * a type as string */ public final void removeFlags(String type) { - flags.removeIf(f -> StringUtils.equals(type, f.getType())); + flags.removeIf(f -> Strings.CS.equals(type, f.getType())); } /** @@ -1281,7 +1282,7 @@ public final void removeClassification(int index) throws IndexOutOfBoundsExcepti */ public final void removeClassifications(String type) { String lType = StringUtils.trim(type); - classifications.removeIf(c -> StringUtils.equals(lType, c.getType())); + classifications.removeIf(c -> Strings.CS.equals(lType, c.getType())); } @Override diff --git a/mycore-base/src/test/java/org/mycore/common/util/MCRTestCaseXSLTUtil.java b/mycore-base/src/test/java/org/mycore/common/util/MCRTestCaseXSLTUtil.java index e9bb9c814e..e514de23cc 100644 --- a/mycore-base/src/test/java/org/mycore/common/util/MCRTestCaseXSLTUtil.java +++ b/mycore-base/src/test/java/org/mycore/common/util/MCRTestCaseXSLTUtil.java @@ -28,7 +28,7 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamSource; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jdom2.Content; @@ -129,7 +129,7 @@ public static Document transform(Document xml, String xsl, Map p private static void log(Message message) { // error codes from https://www.w3.org/2005/xqt-errors/: // XTMM9000, XTMM9001 are messages; other codes are warnings/errors - if (StringUtils.equalsAny(message.getErrorCode().getLocalName(), ERROR_XTMM9000, ERROR_XTMM9001)) { + if (Strings.CS.equalsAny(message.getErrorCode().getLocalName(), ERROR_XTMM9000, ERROR_XTMM9001)) { LOGGER.info(message.getContent()); } else { LOGGER.error(message.getContent()); diff --git a/mycore-base/src/test/java/org/mycore/common/xml/MCRURIResolverTest.java b/mycore-base/src/test/java/org/mycore/common/xml/MCRURIResolverTest.java index 5362522b2d..4c8b38b038 100644 --- a/mycore-base/src/test/java/org/mycore/common/xml/MCRURIResolverTest.java +++ b/mycore-base/src/test/java/org/mycore/common/xml/MCRURIResolverTest.java @@ -30,7 +30,7 @@ import javax.xml.transform.Source; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.junit.jupiter.api.Test; import org.mycore.common.MCRTestConfiguration; import org.mycore.common.MCRTestProperty; @@ -99,13 +99,13 @@ public void testImportFromSameDirectory() throws Exception { Source xslSource = MCRURIResolver.obtainInstance() .resolve("xslImport:xsl-import:functions/xsl-2.xsl", xslResourceUrl); assertNotNull(xslSource); - assertTrue(StringUtils.endsWith(xslSource.getSystemId(), "/xsl/functions/xsl-1.xsl")); + assertTrue(Strings.CS.endsWith(xslSource.getSystemId(), "/xsl/functions/xsl-1.xsl")); String xsltResourceUrl = MCRResourceHelper.getResourceUrl("/xslt/functions/xsl-2.xsl").toString(); Source xsltSource = MCRURIResolver.obtainInstance() .resolve("xslImport:xsl-import:functions/xsl-2.xsl", xsltResourceUrl); assertNotNull(xsltSource); - assertTrue(StringUtils.endsWith(xsltSource.getSystemId(), "/xslt/functions/xsl-1.xsl")); + assertTrue(Strings.CS.endsWith(xsltSource.getSystemId(), "/xslt/functions/xsl-1.xsl")); } diff --git a/mycore-base/src/test/java/org/mycore/test/MCRTestExtension.java b/mycore-base/src/test/java/org/mycore/test/MCRTestExtension.java index fc480c6e12..65a5958509 100644 --- a/mycore-base/src/test/java/org/mycore/test/MCRTestExtension.java +++ b/mycore-base/src/test/java/org/mycore/test/MCRTestExtension.java @@ -101,7 +101,7 @@ public void beforeAll(ExtensionContext context) throws Exception { private Map getConfigProperties(ExtensionContext context) { return context.getRoot().getStore(NAMESPACE) - .getOrComputeIfAbsent(MCRTestExtension.PROPERTIES_MAP_PROPERTY, k -> { + .computeIfAbsent(MCRTestExtension.PROPERTIES_MAP_PROPERTY, k -> { LOGGER.debug(() -> context.getElement().get() + " creating new properties map"); return new HashMap<>(); }, Map.class); @@ -173,7 +173,7 @@ public static Map getClassProperties(ExtensionContext context) { throw new IllegalStateException("This method should only be called for class-level extensions."); } return context.getRoot().getStore(NAMESPACE) - .getOrComputeIfAbsent(MCRTestExtension.CLASS_PROPERTIES_MAP_PROPERTY, k -> { + .computeIfAbsent(MCRTestExtension.CLASS_PROPERTIES_MAP_PROPERTY, k -> { LOGGER.debug("Creating empty extension properties"); return new HashMap<>(); }, Map.class); diff --git a/mycore-base/src/test/java/org/mycore/test/MCRTestUrlExtension.java b/mycore-base/src/test/java/org/mycore/test/MCRTestUrlExtension.java index e91e50e4d0..f619d27316 100644 --- a/mycore-base/src/test/java/org/mycore/test/MCRTestUrlExtension.java +++ b/mycore-base/src/test/java/org/mycore/test/MCRTestUrlExtension.java @@ -100,7 +100,7 @@ private static Data getMethodData(ExtensionContext context) { } private static Data getClassData(ExtensionContext context, Class testClass) { - return (Data) context.getRoot().getStore(NAMESPACE).getOrComputeIfAbsent(testClass, unprocessedTestClass -> { + return (Data) context.getRoot().getStore(NAMESPACE).computeIfAbsent(testClass, unprocessedTestClass -> { Data data = Data.DEFAULT; diff --git a/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jparser/MCRNeo4JMetaHistoryDateParser.java b/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jparser/MCRNeo4JMetaHistoryDateParser.java index 0e0f3e78b5..defd374bc4 100644 --- a/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jparser/MCRNeo4JMetaHistoryDateParser.java +++ b/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jparser/MCRNeo4JMetaHistoryDateParser.java @@ -22,7 +22,7 @@ import java.util.Collections; import java.util.List; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.jdom2.Element; import org.jdom2.Namespace; import org.mycore.datamodel.metadata.MCRObjectID; @@ -46,7 +46,7 @@ public List parse(Element rootTag) { for (Element element : rootTag.getChildren()) { for (Element text : element.getChildren("text")) { final String lang = text.getAttributeValue("lang", Namespace.XML_NAMESPACE); - final String content = StringUtils.replace(text.getTextTrim(), "'", ""); + final String content = Strings.CS.replace(text.getTextTrim(), "'", ""); values.add(new Neo4JNode(lang, content)); } diff --git a/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jparser/MCRNeo4JMetaLangTextParser.java b/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jparser/MCRNeo4JMetaLangTextParser.java index 7600ce3785..dde86e78f4 100644 --- a/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jparser/MCRNeo4JMetaLangTextParser.java +++ b/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jparser/MCRNeo4JMetaLangTextParser.java @@ -22,7 +22,7 @@ import java.util.Collections; import java.util.List; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.jdom2.Element; import org.jdom2.Namespace; import org.mycore.datamodel.metadata.MCRObjectID; @@ -47,7 +47,7 @@ public List parse(Element rootTag) { for (Element element : rootTag.getChildren()) { if (element != null) { final String lang = element.getAttributeValue("lang", Namespace.XML_NAMESPACE); - final String text = StringUtils.replace(element.getTextTrim(), "'", ""); + final String text = Strings.CS.replace(element.getTextTrim(), "'", ""); nodes.add(new Neo4JNode(lang, text)); } } diff --git a/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jparser/MCRNeo4JParser.java b/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jparser/MCRNeo4JParser.java index a1907b9f2c..3ceaf2d38b 100644 --- a/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jparser/MCRNeo4JParser.java +++ b/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jparser/MCRNeo4JParser.java @@ -29,6 +29,7 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jdom2.Attribute; @@ -126,14 +127,14 @@ private String parseSourceNodeInformation(MCRObject mcrObject, XPathFactory xpf, final String lang = entries.getKey(); final List text = entries.getValue(); final String key; - if (StringUtils.equals(lang, LANG_UNSET)) { + if (Strings.CS.equals(lang, LANG_UNSET)) { key = k; } else { key = k + "_" + lang; } final String cleaned = text.stream() - .map(value -> StringUtils.replace(value, "'", "")) + .map(value -> Strings.CS.replace(value, "'", "")) .collect(Collectors.joining("', '", "['", "']")); sbNode.append(", a.").append(key).append('=').append(cleaned); } diff --git a/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jutil/MCRNeo4JUtil.java b/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jutil/MCRNeo4JUtil.java index a3e4b8eb58..e45133d98b 100644 --- a/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jutil/MCRNeo4JUtil.java +++ b/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/datamodel/metadata/neo4jutil/MCRNeo4JUtil.java @@ -27,6 +27,7 @@ import java.util.Optional; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.mycore.common.config.MCRConfiguration2; import org.mycore.datamodel.classifications2.MCRCategory; import org.mycore.datamodel.classifications2.MCRCategoryDAO; @@ -82,11 +83,11 @@ public static Optional getClassLabel(final String classID, final String return category .getLabel(lang) - .map(label -> StringUtils.replace(label.getText(), "'", "")); + .map(label -> Strings.CS.replace(label.getText(), "'", "")); } public static String removeIllegalRelationshipTypeCharacters(String linkType) { - String filteredType = StringUtils.replace(linkType, ":", NEO4J_CLASSID_CATEGID_SEPARATOR); + String filteredType = Strings.CS.replace(linkType, ":", NEO4J_CLASSID_CATEGID_SEPARATOR); filteredType = StringUtils.deleteWhitespace(filteredType); filteredType = StringUtils.remove(filteredType, '-'); filteredType = StringUtils.remove(filteredType, '"'); diff --git a/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/proxy/MCRNeo4JProxyServlet.java b/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/proxy/MCRNeo4JProxyServlet.java index 686480cb64..f55458f329 100644 --- a/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/proxy/MCRNeo4JProxyServlet.java +++ b/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/proxy/MCRNeo4JProxyServlet.java @@ -30,7 +30,7 @@ import java.util.Map; import java.util.Set; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.mycore.common.config.MCRConfiguration2; @@ -144,7 +144,7 @@ private String transformPath(List> result, String lang) thro String key = entry.getKey(); String value = entry.getValue(); - if (StringUtils.contains(key, "node_")) { + if (Strings.CS.contains(key, "node_")) { try { Neo4JNodeJsonRecord nodeObject = objectMapper.readerFor(Neo4JNodeJsonRecord.class) .withRootName("n").readValue(value); @@ -152,7 +152,7 @@ private String transformPath(List> result, String lang) thro } catch (JsonProcessingException e) { LOGGER.error(e); } - } else if (StringUtils.contains(key, "rel_")) { + } else if (Strings.CS.contains(key, "rel_")) { try { Neo4JRelationShipJsonRecord relationShipObject = objectMapper .readerFor(Neo4JRelationShipJsonRecord.class).withRootName("r").readValue(value); @@ -160,7 +160,7 @@ private String transformPath(List> result, String lang) thro } catch (JsonProcessingException e) { LOGGER.error(e); } - } else if (StringUtils.contains(key, "path_")) { + } else if (Strings.CS.contains(key, "path_")) { try { Neo4JPathJsonRecord pathObject = objectMapper.readValue(value, Neo4JPathJsonRecord.class); nodes.addAll(pathObject.nodes()); diff --git a/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/utils/MCRNeo4JQueryRunner.java b/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/utils/MCRNeo4JQueryRunner.java index d9857c913a..33b742b9de 100644 --- a/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/utils/MCRNeo4JQueryRunner.java +++ b/mycore-neo4j/src/main/java/org/mycore/mcr/neo4j/utils/MCRNeo4JQueryRunner.java @@ -28,6 +28,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.mycore.common.config.MCRConfiguration2; @@ -95,16 +96,16 @@ public static List> commitReadOnlyQuery(String queryString, for (String key : thisRecord.keys()) { Value recordData = thisRecord.get(key); counter.getAndAdd(1); - if (StringUtils.equals(recordData.type().name(), "NODE")) { + if (Strings.CS.equals(recordData.type().name(), "NODE")) { String node = gson.toJson(nodeToNeo4JNodeJsonRecord(recordData.asNode(), lang)); String nodeSB = "{\"n\":" + node + "}"; LOGGER.debug("record is Node"); keyMap.put("node_" + key, nodeSB); - } else if (StringUtils.equals(recordData.type().name(), "RELATIONSHIP")) { + } else if (Strings.CS.equals(recordData.type().name(), "RELATIONSHIP")) { LOGGER.debug("record is Relationship"); keyMap.put("rel_" + key, "{\"r\":" + gson.toJson(recordData.asRelationship()) + "}"); - } else if (StringUtils.equals(recordData.type().name(), "PATH")) { + } else if (Strings.CS.equals(recordData.type().name(), "PATH")) { StringBuilder pathSB = new StringBuilder(); LOGGER.debug("record is Path"); //Gather Stuff @@ -127,7 +128,7 @@ public static List> commitReadOnlyQuery(String queryString, pathSB.append("}}"); keyMap.put("path_" + key, pathSB.toString()); - } else if (StringUtils.equals(recordData.type().name(), "NULL")) { + } else if (Strings.CS.equals(recordData.type().name(), "NULL")) { LOGGER.warn("Got record of type {} for key {} which is not parsed and is ignored", () -> recordData.type().name(), () -> key); } else { @@ -201,7 +202,7 @@ static void translateAndMapProperties(List metaDataList, String k .stream() .map(Object::toString) .map(current -> { - if (StringUtils.contains(current, NEO4J_PARAMETER_SEPARATOR)) { + if (Strings.CS.contains(current, NEO4J_PARAMETER_SEPARATOR)) { final String[] values = StringUtils.splitByWholeSeparator(current, NEO4J_PARAMETER_SEPARATOR); return getClassificationLabel(values[0], values[1], lang); } else { diff --git a/mycore-oai/src/main/java/org/mycore/oai/MCROAISolrSearcher.java b/mycore-oai/src/main/java/org/mycore/oai/MCROAISolrSearcher.java index 1a5d4cae4a..915fd05f22 100644 --- a/mycore-oai/src/main/java/org/mycore/oai/MCROAISolrSearcher.java +++ b/mycore-oai/src/main/java/org/mycore/oai/MCROAISolrSearcher.java @@ -90,6 +90,8 @@ public Optional
getHeader(String mcrId) { SolrClient solrClient = MCRSolrCoreManager.getMainSolrClient(); try { QueryRequest queryRequest = new QueryRequest(query); + queryRequest.setPath(getRequestHandlerPath()); + MCRSolrAuthenticationManager.obtainInstance().applyAuthentication(queryRequest, MCRSolrAuthenticationLevel.SEARCH); QueryResponse response = queryRequest.process(solrClient); @@ -159,6 +161,7 @@ protected MCROAISolrResult solrQuery(Optional cursor) throws SolrServerE // do the query SolrClient solrClient = MCRSolrCoreManager.getMainSolrClient(); QueryRequest queryRequest = new QueryRequest(query); + queryRequest.setPath(getRequestHandlerPath()); MCRSolrAuthenticationManager.obtainInstance().applyAuthentication(queryRequest, MCRSolrAuthenticationLevel.SEARCH); QueryResponse response = queryRequest.process(solrClient); @@ -166,6 +169,11 @@ protected MCROAISolrResult solrQuery(Optional cursor) throws SolrServerE return new MCROAISolrResult(response, d -> toHeader(d, setResolver)); } + private String getRequestHandlerPath(){ + String configPrefix = this.identify.getConfigPrefix(); + return MCRConfiguration2.getString(configPrefix + "Search.RequestHandler").orElse("/select"); + } + private SolrQuery getBaseQuery(String restrictionField) { String configPrefix = this.identify.getConfigPrefix(); SolrQuery query = new SolrQuery(); @@ -175,8 +183,6 @@ private SolrQuery getBaseQuery(String restrictionField) { String[] requiredFields = Stream.concat(Stream.of("id", getModifiedField()), getRequiredFieldNames().stream()) .toArray(String[]::new); query.setFields(requiredFields); - // request handler - query.setRequestHandler(MCRConfiguration2.getString(configPrefix + "Search.RequestHandler").orElse("/select")); return query; } diff --git a/mycore-oai/src/main/java/org/mycore/oai/set/MCROAIQuerySetResolver.java b/mycore-oai/src/main/java/org/mycore/oai/set/MCROAIQuerySetResolver.java index fde7c3767a..d47e63e9bd 100644 --- a/mycore-oai/src/main/java/org/mycore/oai/set/MCROAIQuerySetResolver.java +++ b/mycore-oai/src/main/java/org/mycore/oai/set/MCROAIQuerySetResolver.java @@ -67,6 +67,7 @@ public void init(String configPrefix, String setId, Map setMap, QueryResponse response; try { QueryRequest queryRequest = new QueryRequest(getQuery()); + queryRequest.setPath(getRequestHandlerPath()); MCRSolrAuthenticationManager.obtainInstance().applyAuthentication(queryRequest, MCRSolrAuthenticationLevel.SEARCH); response = queryRequest.process(solrClient); @@ -95,10 +96,11 @@ private SolrQuery getQuery() { solrQuery.setFilterQueries(query); solrQuery.setFields("id"); solrQuery.setRows(getResult().size()); - // request handler - solrQuery.setRequestHandler( - MCRConfiguration2.getString(getConfigPrefix() + "Search.RequestHandler").orElse("/select")); return solrQuery; } + private String getRequestHandlerPath() { + return MCRConfiguration2.getString(getConfigPrefix() + "Search.RequestHandler").orElse("/select"); + } + } diff --git a/mycore-orcid2/src/main/java/org/mycore/orcid2/util/MCRORCIDJSONMapper.java b/mycore-orcid2/src/main/java/org/mycore/orcid2/util/MCRORCIDJSONMapper.java index 808c794f37..d033317569 100644 --- a/mycore-orcid2/src/main/java/org/mycore/orcid2/util/MCRORCIDJSONMapper.java +++ b/mycore-orcid2/src/main/java/org/mycore/orcid2/util/MCRORCIDJSONMapper.java @@ -40,7 +40,7 @@ public class MCRORCIDJSONMapper { private static ObjectMapper initMapper() { final ObjectMapper mapper = new ObjectMapper(); mapper.findAndRegisterModules(); - mapper.setSerializationInclusion(Include.NON_NULL); + mapper.setDefaultPropertyInclusion(Include.NON_NULL); return mapper; } diff --git a/mycore-restapi/src/main/java/org/mycore/restapi/MCRCORSResponseFilter.java b/mycore-restapi/src/main/java/org/mycore/restapi/MCRCORSResponseFilter.java index d411cf754d..c12dbd6497 100644 --- a/mycore-restapi/src/main/java/org/mycore/restapi/MCRCORSResponseFilter.java +++ b/mycore-restapi/src/main/java/org/mycore/restapi/MCRCORSResponseFilter.java @@ -27,7 +27,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.mycore.restapi.annotations.MCRAccessControlExposeHeaders; @@ -83,7 +83,7 @@ private static boolean handlePreFlight(ContainerRequestContext requestContext, //todo: may be restricted? responseHeaders.putSingle(ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders); //check if the request is a preflight request and the Authorization header will be sent - if (StringUtils.containsIgnoreCase(requestHeaders, HttpHeaders.AUTHORIZATION)) { + if (Strings.CI.contains(requestHeaders, HttpHeaders.AUTHORIZATION)) { responseHeaders.putSingle(ACCESS_CONTROL_ALLOW_CREDENTIALS, true); responseHeaders.putSingle(ACCESS_CONTROL_ALLOW_ORIGIN, requestContext.getHeaderString(ORIGIN)); } diff --git a/mycore-solr/src/main/java/org/mycore/solr/common/xml/MCRSolrQueryResolver.java b/mycore-solr/src/main/java/org/mycore/solr/common/xml/MCRSolrQueryResolver.java index 8fec358ccf..ee64200ea6 100644 --- a/mycore-solr/src/main/java/org/mycore/solr/common/xml/MCRSolrQueryResolver.java +++ b/mycore-solr/src/main/java/org/mycore/solr/common/xml/MCRSolrQueryResolver.java @@ -29,7 +29,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrClient; -import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.ModifiableSolrParams; import org.mycore.common.MCRException; import org.mycore.common.content.MCRByteContent; @@ -91,9 +90,8 @@ public Source resolve(String href, String base) { .orElse(MCRSolrCoreManager.getMainSolrClient()); ModifiableSolrParams params = MCRSolrUtils.parseQueryString(query.get()); - requestHandler.ifPresent(path -> params.set(CommonParams.QT, path)); try { - InputStream inputStream = MCRSolrSearchUtils.streamRawXML(client, params); + InputStream inputStream = MCRSolrSearchUtils.streamRawXML(client, requestHandler.orElse("/select"), params); MCRByteContent result = new MCRByteContent(inputStream.readAllBytes()); result.setSystemId(href); return result.getSource(); diff --git a/mycore-solr/src/main/java/org/mycore/solr/index/MCRSolrIndexer.java b/mycore-solr/src/main/java/org/mycore/solr/index/MCRSolrIndexer.java index 0bead0f867..ce8692f595 100644 --- a/mycore-solr/src/main/java/org/mycore/solr/index/MCRSolrIndexer.java +++ b/mycore-solr/src/main/java/org/mycore/solr/index/MCRSolrIndexer.java @@ -21,6 +21,7 @@ import static org.mycore.solr.MCRSolrConstants.SOLR_CONFIG_PREFIX; import java.io.IOException; +import java.io.StringWriter; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; @@ -42,6 +43,7 @@ import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrServerException; +import org.apache.solr.client.solrj.impl.XMLRequestWriter; import org.apache.solr.client.solrj.request.UpdateRequest; import org.apache.solr.client.solrj.response.UpdateResponse; import org.mycore.common.MCRException; @@ -256,7 +258,11 @@ public static UpdateResponse deleteById(SolrClient client, String... solrIDs) { //for document without nested req.deleteById(Arrays.asList(solrIDs)); if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Delete request: {}", req.getXML()); + StringWriter writer = new StringWriter(); + XMLRequestWriter requestWriter = new XMLRequestWriter(); + requestWriter.writeXML(req, writer); + writer.flush(); + LOGGER.debug("Delete request: {}", writer); } updateResponse = req.process(client); diff --git a/mycore-solr/src/main/java/org/mycore/solr/proxy/MCRSolrProxyServlet.java b/mycore-solr/src/main/java/org/mycore/solr/proxy/MCRSolrProxyServlet.java index eee278b901..d0eafb1238 100644 --- a/mycore-solr/src/main/java/org/mycore/solr/proxy/MCRSolrProxyServlet.java +++ b/mycore-solr/src/main/java/org/mycore/solr/proxy/MCRSolrProxyServlet.java @@ -53,6 +53,7 @@ import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.params.MultiMapSolrParams; import org.apache.solr.common.util.NamedList; +import org.apache.solr.common.util.SimpleOrderedMap; import org.jdom2.Document; import org.jdom2.Element; import org.mycore.access.MCRAccessManager; @@ -178,7 +179,7 @@ private static void redirectToQueryHandler(HttpServletRequest request, HttpServl } static Map toMultiMap(ModifiableSolrParams solrQueryParameter) { - NamedList namedList = solrQueryParameter.toNamedList(); + NamedList namedList = new SimpleOrderedMap<>(solrQueryParameter); //disabled for MCR-953 and https://issues.apache.org/jira/browse/SOLR-7508 //Map parameters = ModifiableSolrParams.toMultiMap(namedList); Map parameters = new HashMap<>(); diff --git a/mycore-solr/src/main/java/org/mycore/solr/search/MCRSolrSearchUtils.java b/mycore-solr/src/main/java/org/mycore/solr/search/MCRSolrSearchUtils.java index 10e76b61a5..672c884b61 100644 --- a/mycore-solr/src/main/java/org/mycore/solr/search/MCRSolrSearchUtils.java +++ b/mycore-solr/src/main/java/org/mycore/solr/search/MCRSolrSearchUtils.java @@ -31,6 +31,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Spliterator; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -170,8 +171,26 @@ public static Stream stream(SolrClient solrClient, SolrParams para * @throws IOException If there is a low-level I/O error. */ public static InputStream streamRawXML(SolrClient client, SolrParams params) + throws SolrServerException, IOException { + return streamRawXML(client, "/select", params); + } + + /** + * Streams raw xml solr response. + *

+ * While qt parameter is deprecated, it still overwrites path if it's defined. + * + * @param client the client to query + * @param path the request handler path, e.g. "/select" + * @param params solr parameter + * @return stream of the raw xml + * @throws SolrServerException Communication with the solr server failed in any way. + * @throws IOException If there is a low-level I/O error. + */ + public static InputStream streamRawXML(SolrClient client, String path, SolrParams params) throws SolrServerException, IOException { QueryRequest request = new QueryRequest(params); + request.setPath(Objects.requireNonNull(path)); MCRSolrAuthenticationManager.obtainInstance().applyAuthentication(request, SEARCH); InputStreamResponseParser responseParser = new InputStreamResponseParser("xml"); request.setResponseParser(responseParser); diff --git a/mycore-viewer/pom.xml b/mycore-viewer/pom.xml index 280d5c89d8..2f3d0937e1 100644 --- a/mycore-viewer/pom.xml +++ b/mycore-viewer/pom.xml @@ -216,7 +216,7 @@ org.glassfish.jersey.containers - jersey-container-servlet-core + jersey-container-servlet test diff --git a/mycore-webcli/src/main/java/org/mycore/webcli/flow/MCRLogEventProcessor.java b/mycore-webcli/src/main/java/org/mycore/webcli/flow/MCRLogEventProcessor.java index f4c0e09ad7..fb8694d953 100644 --- a/mycore-webcli/src/main/java/org/mycore/webcli/flow/MCRLogEventProcessor.java +++ b/mycore-webcli/src/main/java/org/mycore/webcli/flow/MCRLogEventProcessor.java @@ -45,10 +45,11 @@ public void onNext(LogEvent event) { logEvent.addProperty("logLevel", event.getLevel().toString()); logEvent.addProperty("message", event.getMessage().getFormattedMessage()); String exception = null; - if (event.getThrownProxy() != null) { + Throwable thrown = event.getThrown(); + if (thrown != null) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); - event.getThrownProxy().getThrowable().printStackTrace(pw); + thrown.printStackTrace(pw); pw.close(); exception = sw.toString(); } diff --git a/pom.xml b/pom.xml index 1189e254bf..8eae213119 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ org.mycore mycore-parent - 58 + 59-SNAPSHOT mycore 2026.06.0-SNAPSHOT @@ -54,7 +54,7 @@ Applications based on MyCoRe use a common core, which provides the functionality - 2.29.52 + 2.41.7 2024-12-18 2025.02 @@ -67,41 +67,39 @@ Applications based on MyCoRe use a common core, which provides the functionality ${hibernate.version} ${hibernate.base.version}.13.Final 3.1.1 - 5.4.4 + 5.6 4.5.14 - 5.3.4 - 2.19.0 - 2.1.3 - 2.1.3 + 5.4 + 2.20.1 + 2.1.4 + 2.1.5 21 - 4.0.5 - 3.1.10 + 4.0.6 + 4.0.0 - 11.0.25 - 5.12.2 - 2.24.3 + 11.0.26 + 6.0.2 + 2.25.3 99 -Werror ${java.target.version} ${settings.localRepository}/org/mockito/mockito-core/${mockito.version}/mockito-core-${mockito.version}.jar - 5.20.0 - - - 5.28.5 + 5.21.0 + 6.0.2 true CLASS_FILE_API_FIRST 3.0 - 2.2.2 + 2.2.3 true true 7.16.0 - 5.1.3 - 4.35.0 + 5.2.2 + 4.39.0 - 2.2.30 + 2.2.41 false - 1.26.5 + 1.28.2 9.1.2 2.7.3 1.1.1 @@ -987,7 +985,7 @@ Applications based on MyCoRe use a common core, which provides the functionality com.fasterxml.jackson.core jackson-annotations - ${jackson.version} + 2.20 com.fasterxml.jackson.core @@ -1017,22 +1015,22 @@ Applications based on MyCoRe use a common core, which provides the functionality com.google.code.gson gson - 2.13.1 + 2.13.2 com.google.guava guava - 33.4.8-jre + 33.5.0-jre com.google.protobuf protobuf-java - 4.30.2 + 4.33.4 com.google.zxing core - 3.5.3 + 3.5.4 com.ibm.icu @@ -1042,7 +1040,7 @@ Applications based on MyCoRe use a common core, which provides the functionality com.itextpdf html2pdf - 6.1.0 + 6.3.1 org.bouncycastle @@ -1057,7 +1055,7 @@ Applications based on MyCoRe use a common core, which provides the functionality com.itextpdf kernel - 9.1.0 + 9.5.0 org.bouncycastle @@ -1072,7 +1070,7 @@ Applications based on MyCoRe use a common core, which provides the functionality com.itextpdf layout - 9.1.0 + 9.5.0 org.bouncycastle @@ -1092,7 +1090,7 @@ Applications based on MyCoRe use a common core, which provides the functionality com.zaxxer HikariCP - 6.3.0 + 7.0.2 commons-beanutils @@ -1108,27 +1106,27 @@ Applications based on MyCoRe use a common core, which provides the functionality commons-codec commons-codec - 1.18.0 + 1.20.0 commons-io commons-io - 2.19.0 + 2.21.0 de.larsgrefer.sass sass-embedded-host - 4.1.0 + 4.4.0 de.larsgrefer.sass sass-embedded-protocol - 4.1.0 + 4.4.0 de.undercouch citeproc-java - 3.3.0 + 3.4.1 io.bit3 @@ -1138,7 +1136,7 @@ Applications based on MyCoRe use a common core, which provides the functionality io.github.classgraph classgraph - 4.8.179 + 4.8.184 io.ocfl @@ -1210,7 +1208,7 @@ Applications based on MyCoRe use a common core, which provides the functionality jakarta.validation jakarta.validation-api - 3.1.0 + 3.1.1 jakarta.websocket @@ -1230,7 +1228,7 @@ Applications based on MyCoRe use a common core, which provides the functionality jakarta.xml.bind jakarta.xml.bind-api - 4.0.2 + 4.0.4 jaxen @@ -1280,17 +1278,17 @@ Applications based on MyCoRe use a common core, which provides the functionality org.apache.commons commons-compress - 1.27.1 + 1.28.0 org.apache.commons commons-lang3 - 3.17.0 + 3.20.0 org.apache.commons commons-text - 1.13.1 + 1.15.0 org.apache.httpcomponents.client5 @@ -1330,7 +1328,7 @@ Applications based on MyCoRe use a common core, which provides the functionality org.apache.pdfbox pdfbox - 3.0.4 + 3.0.6 commons-logging @@ -1341,7 +1339,7 @@ Applications based on MyCoRe use a common core, which provides the functionality org.apache.pdfbox pdfbox-io - 3.0.4 + 3.0.6 commons-logging @@ -1352,7 +1350,7 @@ Applications based on MyCoRe use a common core, which provides the functionality org.apache.solr solr-solrj - 9.8.1 + 9.10.0 org.slf4j @@ -1379,7 +1377,7 @@ Applications based on MyCoRe use a common core, which provides the functionality org.apache.xmlgraphics fop-core - 2.10 + 2.11 xml-apis @@ -1410,7 +1408,7 @@ Applications based on MyCoRe use a common core, which provides the functionality org.apache.xmlgraphics xmlgraphics-commons - 2.10 + 2.11 xml-apis @@ -1444,7 +1442,7 @@ Applications based on MyCoRe use a common core, which provides the functionality org.bouncycastle bcprov-jdk18on - 1.80 + 1.83 org.eclipse.jetty @@ -1559,7 +1557,7 @@ Applications based on MyCoRe use a common core, which provides the functionality org.jsoup jsoup - 1.20.1 + 1.22.1 org.mycore @@ -1845,7 +1843,7 @@ Applications based on MyCoRe use a common core, which provides the functionality org.postgresql postgresql - 42.7.7 + 42.7.8 org.tmatesoft.svnkit @@ -1923,13 +1921,13 @@ Applications based on MyCoRe use a common core, which provides the functionality com.github.spotbugs spotbugs-annotations - 4.9.3 + 4.9.8 provided jakarta.servlet jakarta.servlet-api - 6.0.0 + 6.1.0 provided @@ -1953,7 +1951,7 @@ Applications based on MyCoRe use a common core, which provides the functionality com.fasterxml.woodstox woodstox-core - 7.1.0 + 7.1.1 runtime @@ -1966,14 +1964,14 @@ Applications based on MyCoRe use a common core, which provides the functionality net.java.dev.jna jna - 5.17.0 + 5.18.1 runtime true net.sf.saxon Saxon-HE - 12.5 + 12.9 runtime @@ -2032,7 +2030,7 @@ Applications based on MyCoRe use a common core, which provides the functionality org.apache.pdfbox fontbox - 3.0.4 + 3.0.6 runtime @@ -2050,13 +2048,13 @@ Applications based on MyCoRe use a common core, which provides the functionality org.citationstyles locales - 25.4 + 26.1 runtime org.citationstyles styles - 25.4 + 26.1 runtime @@ -2068,13 +2066,13 @@ Applications based on MyCoRe use a common core, which provides the functionality org.eclipse.angus angus-activation - 2.0.2 + 2.0.3 runtime org.eclipse.angus angus-mail - 2.0.3 + 2.0.5 runtime @@ -2098,13 +2096,13 @@ Applications based on MyCoRe use a common core, which provides the functionality com.google.jimfs jimfs - 1.3.0 + 1.3.1 test com.h2database h2 - 2.3.232 + 2.4.240 test From db4d9f2891936cffb0b331776dcf1739b9fe80de Mon Sep 17 00:00:00 2001 From: Thomas Scheffler Date: Wed, 14 Jan 2026 14:15:23 +0100 Subject: [PATCH 2/5] MCR-3585 update to hibernate 7.2 --- .../backend/jpa/MCRJPAConfigurationCheck.java | 37 +++++++++++++--- .../backend/jpa/MCRPersistenceProvider.java | 8 +++- .../jpa/MCRPersistenceUnitDescriptor.java | 16 +++++-- .../impl/MCRCategoryImpl.java | 9 ++-- .../org/mycore/services/queuedjob/MCRJob.java | 16 ++++++- .../services/queuedjob/MCRJobDAOJPAImpl.java | 6 +-- pom.xml | 44 +++++++++++++++---- 7 files changed, 108 insertions(+), 28 deletions(-) diff --git a/mycore-base/src/main/java/org/mycore/backend/jpa/MCRJPAConfigurationCheck.java b/mycore-base/src/main/java/org/mycore/backend/jpa/MCRJPAConfigurationCheck.java index 470ee76426..312d8f61cd 100644 --- a/mycore-base/src/main/java/org/mycore/backend/jpa/MCRJPAConfigurationCheck.java +++ b/mycore-base/src/main/java/org/mycore/backend/jpa/MCRJPAConfigurationCheck.java @@ -20,19 +20,24 @@ import static org.mycore.backend.jpa.MCRPersistenceProvider.JPA_PERSISTENCE_UNIT_PROPERTY_NAME; +import java.net.URL; import java.util.Collections; import java.util.HashSet; +import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.hibernate.jpa.boot.internal.ParsedPersistenceXmlDescriptor; -import org.hibernate.jpa.boot.internal.PersistenceXmlParser; +import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; +import org.hibernate.jpa.boot.spi.PersistenceXmlParser; import org.mycore.common.config.MCRConfiguration2; import org.mycore.common.config.MCRInstanceName; import org.mycore.common.events.MCRStartupHandler.AutoExecutable; +import org.mycore.resource.MCRResourceResolver; +import org.mycore.resource.provider.MCRResourceProvider; import jakarta.servlet.ServletContext; @@ -82,10 +87,7 @@ private void performConfigurationChecks() { LOGGER.trace(() -> "*** Persistence units configured in MyCoRe properties: " + String.join(", ", unitsFromMycoreProperties) + " ***"); - Set unitsFromPersistenceXml = PersistenceXmlParser.locatePersistenceUnits(Collections.emptyMap()) - .stream() - .map(ParsedPersistenceXmlDescriptor::getName) - .collect(Collectors.toSet()); + Set unitsFromPersistenceXml = locatePersistenceUnitNamesFromPersistenceXml(); LOGGER.trace(() -> "*** Persistence units configured in persistence.xml: " + String.join(", ", unitsFromPersistenceXml) + " ***"); @@ -117,6 +119,29 @@ private void performConfigurationChecks() { } + private Set locatePersistenceUnitNamesFromPersistenceXml() { + List persistenceXmlUrls = MCRResourceResolver.obtainInstance() + .resolveAllResource("META-INF/persistence.xml") + .stream() + .map(MCRResourceProvider.ProvidedUrl::url) + .toList(); + if (persistenceXmlUrls.isEmpty()) { + return Collections.emptySet(); + } + + try { + Map descriptors = + PersistenceXmlParser.create(Collections.emptyMap()).parse(persistenceXmlUrls); + + return descriptors.values().stream() + .map(PersistenceUnitDescriptor::getName) + .collect(Collectors.toSet()); + } catch (RuntimeException e) { + LOGGER.warn("Could not parse persistence.xml files for configuration check.", e); + return Collections.emptySet(); + } + } + private static Set intersect(Set set1, Set set2) { Set intersection = new HashSet<>(set1); intersection.retainAll(set2); diff --git a/mycore-base/src/main/java/org/mycore/backend/jpa/MCRPersistenceProvider.java b/mycore-base/src/main/java/org/mycore/backend/jpa/MCRPersistenceProvider.java index 56817dd285..dd9aff4b54 100644 --- a/mycore-base/src/main/java/org/mycore/backend/jpa/MCRPersistenceProvider.java +++ b/mycore-base/src/main/java/org/mycore/backend/jpa/MCRPersistenceProvider.java @@ -23,6 +23,7 @@ import java.util.Optional; import java.util.concurrent.Callable; +import jakarta.persistence.PersistenceConfiguration; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl; @@ -100,7 +101,7 @@ private static void logJPAProperties(MCRPersistenceUnitDescriptor puDescriptor) Optional.ofNullable(puDescriptor.getProviderClassName()) .ifPresent((provider) -> table.add(new Property("ProviderClassName", provider))); - Optional.ofNullable(puDescriptor.getTransactionType()) + Optional.ofNullable(puDescriptor.getPersistenceUnitTransactionType()) .ifPresent((transactionType) -> table.add(new Property("TransactionType", transactionType.name()))); Optional.ofNullable(puDescriptor.getValidationMode()) @@ -163,6 +164,11 @@ public boolean generateSchema(String persistenceUnitName, Map map) { return false; } + @Override + public EntityManagerFactory createEntityManagerFactory(PersistenceConfiguration persistenceConfiguration) { + return null; + } + @Override public ProviderUtil getProviderUtil() { return providerUtil; diff --git a/mycore-base/src/main/java/org/mycore/backend/jpa/MCRPersistenceUnitDescriptor.java b/mycore-base/src/main/java/org/mycore/backend/jpa/MCRPersistenceUnitDescriptor.java index fc872439f8..007fe1ebbc 100644 --- a/mycore-base/src/main/java/org/mycore/backend/jpa/MCRPersistenceUnitDescriptor.java +++ b/mycore-base/src/main/java/org/mycore/backend/jpa/MCRPersistenceUnitDescriptor.java @@ -36,9 +36,9 @@ import org.mycore.common.config.annotation.MCRProperty; import org.mycore.common.config.annotation.MCRRawProperties; +import jakarta.persistence.PersistenceUnitTransactionType; import jakarta.persistence.SharedCacheMode; import jakarta.persistence.ValidationMode; -import jakarta.persistence.spi.PersistenceUnitTransactionType; public class MCRPersistenceUnitDescriptor implements PersistenceUnitDescriptor { @@ -126,13 +126,23 @@ public boolean isExcludeUnlistedClasses() { return excludeUnlistedClasses; } + @Override + public PersistenceUnitTransactionType getPersistenceUnitTransactionType() { + return transactionType; + } + public void setExcludeUnlistedClasses(boolean excludeUnlistedClasses) { this.excludeUnlistedClasses = excludeUnlistedClasses; } @Override - public PersistenceUnitTransactionType getTransactionType() { - return transactionType; + @Deprecated(forRemoval = true) + @SuppressWarnings({"deprecation","removal"}) + public jakarta.persistence.spi.PersistenceUnitTransactionType getTransactionType() { + return switch (transactionType) { + case JTA -> jakarta.persistence.spi.PersistenceUnitTransactionType.JTA; + case RESOURCE_LOCAL -> jakarta.persistence.spi.PersistenceUnitTransactionType.RESOURCE_LOCAL; + }; } public void setTransactionType(PersistenceUnitTransactionType transactionType) { diff --git a/mycore-base/src/main/java/org/mycore/datamodel/classifications2/impl/MCRCategoryImpl.java b/mycore-base/src/main/java/org/mycore/datamodel/classifications2/impl/MCRCategoryImpl.java index 04baa228f5..a42142abf0 100644 --- a/mycore-base/src/main/java/org/mycore/datamodel/classifications2/impl/MCRCategoryImpl.java +++ b/mycore-base/src/main/java/org/mycore/datamodel/classifications2/impl/MCRCategoryImpl.java @@ -91,19 +91,22 @@ query = "FROM MCRCategoryImpl as cat WHERE " + "cat.id.rootID=:classID and (cat.id.id=:categID OR cat.id.id IS NULL AND :categID IS NULL)"), @NamedQuery(name = "MCRCategory.byLabelInClass", - query = "FROM MCRCategoryImpl as cat " + query = "SELECT DISTINCT cat" + + " FROM MCRCategoryImpl as cat " + "INNER JOIN cat.labels as label " + " WHERE cat.id.rootID=:rootID AND " + " cat.left BETWEEN :left and :right AND " + " label.lang=:lang AND " + " label.text=:text"), @NamedQuery(name = "MCRCategory.byLabel", - query = "FROM MCRCategoryImpl as cat " + query = "SELECT DISTINCT cat" + + " FROM MCRCategoryImpl as cat " + " INNER JOIN cat.labels as label " + " WHERE label.lang=:lang AND " + " label.text=:text"), @NamedQuery(name = "MCRCategory.byClassAndLang", - query = "FROM MCRCategoryImpl as cat " + query = "SELECT DISTINCT cat" + + " FROM MCRCategoryImpl as cat " + " INNER JOIN cat.labels as label " + " WHERE cat.id.rootID=:classID" + " AND label.lang=:lang"), diff --git a/mycore-jobqueue/src/main/java/org/mycore/services/queuedjob/MCRJob.java b/mycore-jobqueue/src/main/java/org/mycore/services/queuedjob/MCRJob.java index 0b84dc11cc..744abc0405 100644 --- a/mycore-jobqueue/src/main/java/org/mycore/services/queuedjob/MCRJob.java +++ b/mycore-jobqueue/src/main/java/org/mycore/services/queuedjob/MCRJob.java @@ -25,6 +25,8 @@ import java.util.Map; import java.util.Objects; +import org.mycore.common.MCRClassTools; + import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; import jakarta.persistence.Convert; @@ -41,11 +43,10 @@ import jakarta.persistence.MapKeyColumn; import jakarta.persistence.NamedQueries; import jakarta.persistence.NamedQuery; +import jakarta.persistence.PreRemove; import jakarta.persistence.Table; import jakarta.persistence.Transient; -import org.mycore.common.MCRClassTools; - /** * Container class handled by hibernate to store and retrieve job information. * @@ -252,6 +253,17 @@ public Map getParameters() { return parameters; } + @PreRemove + @SuppressWarnings("unused") + /** + * Delete parameters before removing the job to avoid foreign key constraint violations. + */ + private void preRemove() { + if (parameters != null) { + parameters.clear(); + } + } + /** * Set all job parameters. * diff --git a/mycore-jobqueue/src/main/java/org/mycore/services/queuedjob/MCRJobDAOJPAImpl.java b/mycore-jobqueue/src/main/java/org/mycore/services/queuedjob/MCRJobDAOJPAImpl.java index afbcc5a17c..ee17211fdf 100644 --- a/mycore-jobqueue/src/main/java/org/mycore/services/queuedjob/MCRJobDAOJPAImpl.java +++ b/mycore-jobqueue/src/main/java/org/mycore/services/queuedjob/MCRJobDAOJPAImpl.java @@ -204,11 +204,7 @@ public List getNextJobs(Class action, Integer am query.setMaxResults(amount); } - return query - .getResultList() - .stream() - .peek(em::detach) - .toList(); + return query.getResultList(); } @Override diff --git a/pom.xml b/pom.xml index 8eae213119..8629b9d159 100644 --- a/pom.xml +++ b/pom.xml @@ -63,9 +63,9 @@ Applications based on MyCoRe use a common core, which provides the functionality 1.12.0 4.0.2 3.0 - 6.6 + 7.2 ${hibernate.version} - ${hibernate.base.version}.13.Final + ${hibernate.base.version}.0.Final 3.1.1 5.6 4.5.14 @@ -379,8 +379,8 @@ Applications based on MyCoRe use a common core, which provides the functionality http://www.jdom.org/docs/apidocs/ --> https://logging.apache.org/log4j/2.x/javadoc/log4j-api/ - https://docs.jboss.org/hibernate/orm/${hibernate.base.version}/javadocs/ - https://jakarta.ee/specifications/persistence/3.1/apidocs/ + https://docs.hibernate.org/orm/${hibernate.base.version}/javadocs/ + https://jakarta.ee/specifications/persistence/3.2/apidocs/ @@ -433,7 +433,7 @@ Applications based on MyCoRe use a common core, which provides the functionality org.hibernate.orm - hibernate-jpamodelgen + hibernate-processor ${hibernate.version} @@ -466,6 +466,34 @@ Applications based on MyCoRe use a common core, which provides the functionality + + org.apache.maven.plugins + maven-antrun-plugin + + + + fix-hibernate-jpamodelgen-javadoc + + run + + process-classes + + + + + + + + + + + + + + + + + maven-javadoc-plugin @@ -842,8 +870,8 @@ Applications based on MyCoRe use a common core, which provides the functionality https://jakarta.ee/specifications/platform/10/apidocs/ https://logging.apache.org/log4j/2.x/javadoc/log4j-api/ - https://docs.jboss.org/hibernate/orm/${hibernate.base.version}/javadocs/ - https://jakarta.ee/specifications/persistence/3.1/apidocs/ + https://docs.hibernate.org/orm/${hibernate.base.version}/javadocs/ + https://jakarta.ee/specifications/persistence/3.2/apidocs/ @@ -1203,7 +1231,7 @@ Applications based on MyCoRe use a common core, which provides the functionality jakarta.persistence jakarta.persistence-api - 3.1.0 + 3.2.0 jakarta.validation From d4a10e4489430ffeb56bedf68ffe18cc7fb329fc Mon Sep 17 00:00:00 2001 From: Thomas Scheffler Date: Wed, 14 Jan 2026 15:45:13 +0100 Subject: [PATCH 3/5] MCR-3585 fixed codacy issues --- pom.xml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8629b9d159..709a42953b 100644 --- a/pom.xml +++ b/pom.xml @@ -481,12 +481,20 @@ Applications based on MyCoRe use a common core, which provides the functionality - + - + From 081ff7a3a02f4ffb26ae3710661ad6346617a970 Mon Sep 17 00:00:00 2001 From: Thomas Scheffler Date: Mon, 26 Jan 2026 16:04:27 +0100 Subject: [PATCH 4/5] MCR-3585 too much time, too many updates --- pom.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 709a42953b..c47ee2a4a7 100644 --- a/pom.xml +++ b/pom.xml @@ -54,14 +54,14 @@ Applications based on MyCoRe use a common core, which provides the functionality - 2.41.7 + 2.41.14 2024-12-18 2025.02 true ${user.dir}/checkstyle-suppressions.xml 1.12.0 - 4.0.2 + 5.0.0 3.0 7.2 ${hibernate.version} @@ -70,12 +70,12 @@ Applications based on MyCoRe use a common core, which provides the functionality 5.6 4.5.14 5.4 - 2.20.1 + 2.21.0 2.1.4 2.1.5 21 4.0.6 - 4.0.0 + 4.0.1 11.0.26 6.0.2 @@ -95,9 +95,9 @@ Applications based on MyCoRe use a common core, which provides the functionality true 7.16.0 5.2.2 - 4.39.0 + 4.40.0 - 2.2.41 + 2.2.42 false 1.28.2 9.1.2 @@ -1021,7 +1021,7 @@ Applications based on MyCoRe use a common core, which provides the functionality com.fasterxml.jackson.core jackson-annotations - 2.20 + 2.21 com.fasterxml.jackson.core @@ -1386,7 +1386,7 @@ Applications based on MyCoRe use a common core, which provides the functionality org.apache.solr solr-solrj - 9.10.0 + 9.10.1 org.slf4j @@ -1879,7 +1879,7 @@ Applications based on MyCoRe use a common core, which provides the functionality org.postgresql postgresql - 42.7.8 + 42.7.9 org.tmatesoft.svnkit @@ -2084,13 +2084,13 @@ Applications based on MyCoRe use a common core, which provides the functionality org.citationstyles locales - 26.1 + 26.1.1 runtime org.citationstyles styles - 26.1 + 26.1.1 runtime From d04586a49946e1b42167d08fe0c784fa066dd332 Mon Sep 17 00:00:00 2001 From: Thomas Scheffler Date: Mon, 2 Feb 2026 14:07:09 +0100 Subject: [PATCH 5/5] MCR-3585 YTMT, YTMU --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index c47ee2a4a7..0e8b98faf3 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,7 @@ Applications based on MyCoRe use a common core, which provides the functionality - 2.41.14 + 2.41.19 2024-12-18 2025.02 @@ -75,7 +75,7 @@ Applications based on MyCoRe use a common core, which provides the functionality 2.1.5 21 4.0.6 - 4.0.1 + 4.0.2 11.0.26 6.0.2 @@ -1061,7 +1061,7 @@ Applications based on MyCoRe use a common core, which provides the functionality com.google.protobuf protobuf-java - 4.33.4 + 4.33.5 com.google.zxing @@ -1142,7 +1142,7 @@ Applications based on MyCoRe use a common core, which provides the functionality commons-codec commons-codec - 1.20.0 + 1.21.0 commons-io