From 853d3ac8cb98e218e936056a41c7b6e354225f5d Mon Sep 17 00:00:00 2001 From: David Nestorovic Date: Wed, 16 Apr 2025 15:23:39 +0200 Subject: [PATCH] Print warning when glob is too general --- .../CompressedGlobTrie.java | 1 + .../src/com/oracle/svm/util/GlobUtils.java | 31 +++++++++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/CompressedGlobTrie.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/CompressedGlobTrie.java index d5500fb78fc7..bb2b3d152f64 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/CompressedGlobTrie.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/CompressedGlobTrie.java @@ -109,6 +109,7 @@ public static GlobTrieNode build(List> patterns) { if (!invalidPatterns.isEmpty()) { StringBuilder sb = new StringBuilder("Error: invalid glob patterns found:" + System.lineSeparator()); invalidPatterns.forEach(msg -> sb.append(msg).append(System.lineSeparator())); + throw UserError.abort(sb.toString()); } diff --git a/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/GlobUtils.java b/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/GlobUtils.java index 7c0a21977198..73961aa65ee1 100644 --- a/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/GlobUtils.java +++ b/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/GlobUtils.java @@ -42,11 +42,12 @@ private GlobUtils() { public static final String SAME_LEVEL_IDENTIFIER = "#"; private static final Pattern threeConsecutiveStarsRegex = Pattern.compile(".*[*]{3,}.*"); private static final Pattern emptyLevelsRegex = Pattern.compile(".*/{2,}.*"); + private static final String ALL_UNNAMED = "ALL_UNNAMED"; public static String transformToTriePath(String resource, String module) { String resolvedModuleName; if (module == null || module.isEmpty()) { - resolvedModuleName = "ALL_UNNAMED"; + resolvedModuleName = ALL_UNNAMED; } else { resolvedModuleName = StringUtil.toSlashSeparated(module); } @@ -104,15 +105,25 @@ public static String validatePattern(String pattern) { escapeMode = current == '\\'; } - // check if pattern contains ** without previous Literal parent. Example: */**/... or **/... - outer: for (List levelTokens : tokenize(pattern)) { - for (GlobToken token : levelTokens) { - if (token.kind == GlobToken.Kind.LITERAL) { - break outer; - } else if (token.kind == GlobToken.Kind.STAR_STAR) { - sb.append("Pattern contains ** without previous literal. " + - "This pattern is too generic and therefore can match many resources. " + - "Please make the pattern more specific by adding non-generic level before ** level."); + // check if pattern (that matches something from classpath) contains ** without previous + // Literal parent. Example: */**/... or **/... + if (pattern.startsWith(ALL_UNNAMED)) { + List> patternParts = tokenize(pattern); + + // remove ALL_UNNAMED prefix + patternParts.removeFirst(); + + // check glob without module prefix + outer: for (List levelTokens : patternParts) { + for (GlobToken token : levelTokens) { + if (token.kind == GlobToken.Kind.LITERAL) { + break outer; + } else if (token.kind == GlobToken.Kind.STAR_STAR) { + String patternWithoutModule = pattern.substring(ALL_UNNAMED.length() + 1); + LogUtils.warning("Pattern: " + patternWithoutModule + " contains ** without previous literal. " + + "This pattern is too generic and therefore can match many resources. " + + "Please make the pattern more specific by adding non-generic level before ** level."); + } } } }