From 51e42f22b9eabf1978c7cec8cb6d44e2d431237f Mon Sep 17 00:00:00 2001 From: Matt D'Souza Date: Wed, 12 Mar 2025 11:12:31 -0400 Subject: [PATCH 1/6] Move GlobUtils to com.oracle.svm.util --- .../src/com/oracle/svm/core/jdk/Resources.java | 2 +- .../jdk/resources/CompressedGlobTrie/CompressedGlobTrie.java | 1 + .../src/com/oracle/svm/hosted/ResourcesFeature.java | 2 +- .../src/com/oracle/svm/util}/GlobUtils.java | 4 +--- 4 files changed, 4 insertions(+), 5 deletions(-) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie => com.oracle.svm.util/src/com/oracle/svm/util}/GlobUtils.java (95%) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java index 076605a2b065..614ab5cb7b6d 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java @@ -69,13 +69,13 @@ import com.oracle.svm.core.jdk.resources.ResourceURLConnection; import com.oracle.svm.core.jdk.resources.CompressedGlobTrie.CompressedGlobTrie; import com.oracle.svm.core.jdk.resources.CompressedGlobTrie.GlobTrieNode; -import com.oracle.svm.core.jdk.resources.CompressedGlobTrie.GlobUtils; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonSupport; import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton; import com.oracle.svm.core.layeredimagesingleton.UnsavedSingleton; import com.oracle.svm.core.util.ImageHeapMap; import com.oracle.svm.core.util.VMError; +import com.oracle.svm.util.GlobUtils; import com.oracle.svm.util.LogUtils; /** 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 6dc93f7c95b5..4973831b959a 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 @@ -40,6 +40,7 @@ import org.graalvm.nativeimage.Platforms; import com.oracle.svm.core.util.UserError; +import com.oracle.svm.util.GlobUtils; import com.oracle.svm.util.StringUtil; /** diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java index e7513df7dc52..f643775f994d 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java @@ -83,7 +83,6 @@ import com.oracle.svm.core.jdk.resources.NativeImageResourceFileSystemProvider; import com.oracle.svm.core.jdk.resources.CompressedGlobTrie.CompressedGlobTrie; import com.oracle.svm.core.jdk.resources.CompressedGlobTrie.GlobTrieNode; -import com.oracle.svm.core.jdk.resources.CompressedGlobTrie.GlobUtils; import com.oracle.svm.core.option.AccumulatingLocatableMultiOptionValue; import com.oracle.svm.core.option.HostedOptionKey; import com.oracle.svm.core.option.HostedOptionValues; @@ -97,6 +96,7 @@ import com.oracle.svm.hosted.reflect.NativeImageConditionResolver; import com.oracle.svm.hosted.snippets.SubstrateGraphBuilderPlugins; import com.oracle.svm.hosted.util.ResourcesUtils; +import com.oracle.svm.util.GlobUtils; import com.oracle.svm.util.LogUtils; import com.oracle.svm.util.ModuleSupport; import com.oracle.svm.util.ReflectionUtil; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/GlobUtils.java b/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/GlobUtils.java similarity index 95% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/GlobUtils.java rename to substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/GlobUtils.java index bf2c9fc39d5d..64b1190335e7 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/GlobUtils.java +++ b/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/GlobUtils.java @@ -23,12 +23,10 @@ * questions. */ -package com.oracle.svm.core.jdk.resources.CompressedGlobTrie; +package com.oracle.svm.util; import java.util.List; -import com.oracle.svm.util.StringUtil; - public class GlobUtils { /* list of glob wildcards we are always escaping because they are not supported yet */ From 25391bbc98a27313ed31eef1028c6148dc586236 Mon Sep 17 00:00:00 2001 From: Matt D'Souza Date: Wed, 12 Mar 2025 11:23:29 -0400 Subject: [PATCH 2/6] Perform glob validation in GlobUtils without constructing a trie --- .../config/ResourceConfiguration.java | 2 +- .../LegacyResourceConfigurationParser.java | 4 +- .../CompressedGlobTrie.java | 147 +++--------------- .../CompressedGlobTrie/DoubleStarNode.java | 4 +- .../CompressedGlobTrie/GlobTrieNode.java | 13 +- .../CompressedGlobTrie/StarTrieNode.java | 4 +- .../src/com/oracle/svm/util/GlobUtils.java | 109 ++++++++++++- 7 files changed, 145 insertions(+), 138 deletions(-) diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java index 982d4a5e1f77..954156f26801 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java @@ -49,8 +49,8 @@ import com.oracle.svm.core.configure.ResourceConfigurationParser; import com.oracle.svm.core.configure.ResourcesRegistry; import com.oracle.svm.core.jdk.Resources; -import com.oracle.svm.core.jdk.resources.CompressedGlobTrie.GlobUtils; import com.oracle.svm.core.util.VMError; +import com.oracle.svm.util.GlobUtils; import jdk.graal.compiler.util.json.JsonPrinter; import jdk.graal.compiler.util.json.JsonWriter; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacyResourceConfigurationParser.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacyResourceConfigurationParser.java index 25487904cc63..780dfa422d61 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacyResourceConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacyResourceConfigurationParser.java @@ -34,7 +34,7 @@ import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; import com.oracle.svm.core.TypeResult; -import com.oracle.svm.core.jdk.resources.CompressedGlobTrie.CompressedGlobTrie; +import com.oracle.svm.util.GlobUtils; final class LegacyResourceConfigurationParser extends ResourceConfigurationParser { LegacyResourceConfigurationParser(ConfigurationConditionResolver conditionResolver, ResourcesRegistry registry, boolean strictConfiguration) { @@ -120,7 +120,7 @@ private void parsePatternEntry(Object data, BiConsumer resourceRegist /* Parse fully literal regex as globs */ if (value.startsWith("\\Q") && value.endsWith("\\E") && value.indexOf("\\E") == value.lastIndexOf("\\E")) { String globValue = value.substring("\\Q".length(), value.length() - "\\E".length()); - if (CompressedGlobTrie.validatePattern(globValue).isEmpty()) { + if (GlobUtils.validatePattern(globValue).isEmpty()) { globRegistry.accept(resolvedConfigurationCondition.get(), null, globValue); return; } 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 4973831b959a..d5500fb78fc7 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 @@ -25,16 +25,15 @@ package com.oracle.svm.core.jdk.resources.CompressedGlobTrie; -import static com.oracle.svm.core.jdk.resources.CompressedGlobTrie.GlobTrieNode.LEVEL_IDENTIFIER; -import static com.oracle.svm.core.jdk.resources.CompressedGlobTrie.GlobTrieNode.STAR; -import static com.oracle.svm.core.jdk.resources.CompressedGlobTrie.GlobTrieNode.STAR_STAR; +import static com.oracle.svm.util.GlobUtils.LEVEL_IDENTIFIER; +import static com.oracle.svm.util.GlobUtils.STAR; +import static com.oracle.svm.util.GlobUtils.STAR_STAR; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.function.Predicate; -import java.util.regex.Pattern; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; @@ -49,8 +48,8 @@ * * The structure can be created using {@link CompressedGlobTrieBuilder#build(List)} where list * parameter represents list of glob patterns given in any order. At the very beginning, all given - * globs will be validated using {@link CompressedGlobTrieBuilder#validatePattern(String)}. If all - * globs were correct, they will be classified (with + * globs will be validated using {@link GlobUtils#validatePattern(String)}. If all globs were + * correct, they will be classified (with * {@link CompressedGlobTrieBuilder#classifyPatterns(List, List, List, List)}) and sorted (using * {@link CompressedGlobTrieBuilder#comparePatterns(GlobWithInfo, GlobWithInfo)} as the comparator * function). This preprocessing phase allows incremental structure build, going from the most @@ -219,7 +218,7 @@ private static List classifyPatterns(List> patterns, List invalidPatterns = new ArrayList<>(); for (GlobWithInfo patternWithInfo : patterns) { /* validate patterns */ - String error = validatePattern(patternWithInfo.pattern()); + String error = GlobUtils.validatePattern(patternWithInfo.pattern()); if (!error.isEmpty()) { invalidPatterns.add(error); continue; @@ -380,132 +379,32 @@ private static String escapeAllStars(String text) { return text.replace("*", "\\*"); } - private static final Pattern threeConsecutiveStarsRegex = Pattern.compile(".*[*]{3,}.*"); - private static final Pattern emptyLevelsRegex = Pattern.compile(".*/{2,}.*"); - - public static String validatePattern(String pattern) { - StringBuilder sb = new StringBuilder(); - - if (pattern.isEmpty()) { - sb.append("Pattern ").append(pattern).append(" : Pattern cannot be empty. "); - return sb.toString(); - } - - // check if pattern contains more than 2 consecutive characters. Example: a/***/b - if (threeConsecutiveStarsRegex.matcher(pattern).matches()) { - sb.append("Pattern contains more than two consecutive * characters. "); - } - - /* check if pattern contains empty levels. Example: a//b */ - if (emptyLevelsRegex.matcher(pattern).matches()) { - sb.append("Pattern contains empty levels. "); - } - - /* check unnecessary ** repetition */ - if (pattern.contains("**/**")) { - sb.append("Pattern contains invalid sequence **/**. Valid pattern should have ** followed by something other than **. "); - } - - /* check if there are unescaped wildcards */ - boolean escapeMode = false; - for (int i = 0; i < pattern.length(); i++) { - char current = pattern.charAt(i); - if (GlobUtils.ALWAYS_ESCAPED_GLOB_WILDCARDS.contains(current) && !escapeMode) { - sb.append("Pattern contains unescaped character ").append(current).append(". "); - } - - escapeMode = current == '\\'; - } - - // check if pattern contains ** without previous Literal parent. Example: */**/... or **/... - List> patternParts = getPatternParts(pattern); - for (GlobTrieNode part : patternParts) { - if (part instanceof LiteralNode) { - break; - } - - if (part instanceof DoubleStarNode) { - 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."); - } - } - - if (!sb.isEmpty()) { - sb.insert(0, "Pattern " + pattern + " : "); - } - - return sb.toString(); - } - /** * Returns list of glob pattern parts that will represent nodes in final Trie. This function is * used as a helper function in tests as well, and therefore must remain public. */ public static List> getPatternParts(String glob) { String pattern = !glob.endsWith("/") ? glob : glob.substring(0, glob.length() - 1); - List> parts = new ArrayList<>(); - /* we are splitting patterns on levels */ - List levels = Arrays.stream(pattern.split(LEVEL_IDENTIFIER)).toList(); - for (String level : levels) { - if (level.equals(STAR_STAR)) { - DoubleStarNode tmp = new DoubleStarNode<>(); - tmp.setNewLevel(); - parts.add(tmp); - continue; + List> tokens = GlobUtils.tokenize(pattern); + List> parts = new ArrayList<>(tokens.size()); + + for (List levelTokens : tokens) { + List> thisLevelParts = new ArrayList<>(levelTokens.size()); + for (GlobUtils.GlobToken token : levelTokens) { + thisLevelParts.add(switch (token.kind()) { + case STAR_STAR -> new DoubleStarNode<>(); + case STAR -> new StarTrieNode<>(true); + case LITERAL_STAR -> new StarTrieNode<>(token.value()); + case LITERAL -> new LiteralNode<>(token.value()); + }); } - - if (level.equals(STAR)) { - /* special case when * is alone on one level */ - StarTrieNode tmp = new StarTrieNode<>(true); - tmp.setNewLevel(); - parts.add(tmp); - continue; - } - - /* adding a*bc and a*dc patterns will produce: a* -> bc a* -> dc */ - int s = level.indexOf(STAR.charAt(0)); - if (s != -1) { - /* - * this level contains at least one star, but maybe it has more. E.g.: - * something/a*b*c*d/else - */ - - List> thisLevelParts = new ArrayList<>(); - StringBuilder currentPart = new StringBuilder(); - StarCollectorMode currentMode = StarCollectorMode.NORMAL; - for (char c : level.toCharArray()) { - currentPart.append(c); - if (c == STAR.charAt(0) && currentMode == StarCollectorMode.NORMAL) { - thisLevelParts.add(new StarTrieNode<>(currentPart.toString())); - currentPart.setLength(0); - } - - currentMode = c == '\\' ? StarCollectorMode.ESCAPE : StarCollectorMode.NORMAL; - } - - if (!currentPart.isEmpty()) { - /* this level ends with some literal node */ - thisLevelParts.add(new LiteralNode<>(currentPart.toString())); - } - thisLevelParts.get(0).setNewLevel(); - parts.addAll(thisLevelParts); - continue; - } - - LiteralNode tmp = new LiteralNode<>(level); - tmp.setNewLevel(); - parts.add(tmp); + thisLevelParts.getFirst().setNewLevel(); + parts.addAll(thisLevelParts); } return parts; } - private enum StarCollectorMode { - NORMAL, - ESCAPE - } - private static void getAllPatterns(GlobTrieNode node, List> parts, int i, List> matches) { if (patternReachedEnd(i, parts)) { if (node.isLeaf()) { @@ -596,14 +495,14 @@ private static List> getAllAvailablePaths(DoubleStarNode n } private static int getIndexOfFirstUnescapedStar(String level) { - StarCollectorMode currentMode = StarCollectorMode.NORMAL; + boolean escaped = false; for (int i = 0; i < level.length(); i++) { char c = level.charAt(i); - if (c == STAR.charAt(0) && currentMode == StarCollectorMode.NORMAL) { + if (c == STAR.charAt(0) && !escaped) { return i; } - currentMode = c == '\\' ? StarCollectorMode.ESCAPE : StarCollectorMode.NORMAL; + escaped = c == '\\'; } return -1; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/DoubleStarNode.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/DoubleStarNode.java index d96f9819b3ad..de3bfa1a16e0 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/DoubleStarNode.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/DoubleStarNode.java @@ -25,8 +25,10 @@ package com.oracle.svm.core.jdk.resources.CompressedGlobTrie; +import com.oracle.svm.util.GlobUtils; + final class DoubleStarNode extends GlobTrieNode { DoubleStarNode() { - super(STAR_STAR); + super(GlobUtils.STAR_STAR); } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/GlobTrieNode.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/GlobTrieNode.java index ff0f7aa1cee8..0b555b60e6fc 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/GlobTrieNode.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/GlobTrieNode.java @@ -37,12 +37,9 @@ import com.oracle.svm.core.SubstrateUtil; import com.oracle.svm.core.heap.UnknownObjectField; import com.oracle.svm.core.heap.UnknownPrimitiveField; +import com.oracle.svm.util.GlobUtils; public class GlobTrieNode { - protected static final String STAR = "*"; - protected static final String STAR_STAR = "**"; - protected static final String LEVEL_IDENTIFIER = "/"; - public static final String SAME_LEVEL_IDENTIFIER = "#"; private String content; @UnknownObjectField(fullyQualifiedTypes = {"java.util.HashMap", "java.util.ImmutableCollections$MapN", "java.util.ImmutableCollections$Map1"}) // @@ -130,14 +127,14 @@ protected void removeChildren(List> childKeys) { * complex level (with stars), all children from the same level will have * SAME_LEVEL_IDENTIFIER, so we must append it here */ - String sameLevel = !child.isNewLevel() ? SAME_LEVEL_IDENTIFIER : ""; + String sameLevel = !child.isNewLevel() ? GlobUtils.SAME_LEVEL_IDENTIFIER : ""; String childKey = child.getContent() + sameLevel; children.remove(childKey); } } protected GlobTrieNode getChildFromSameLevel(String child) { - return children.get(child + SAME_LEVEL_IDENTIFIER); + return children.get(child + GlobUtils.SAME_LEVEL_IDENTIFIER); } protected GlobTrieNode addChild(String child, GlobTrieNode childValue) { @@ -146,7 +143,7 @@ protected GlobTrieNode addChild(String child, GlobTrieNode childValue) { // to make difference between a*b* (represented as: a* -> b*#) // and a*/b* (represented as: a* -> b*) append # when current node is a part of previous one if (!childValue.isNewLevel()) { - sb.append(SAME_LEVEL_IDENTIFIER); + sb.append(GlobUtils.SAME_LEVEL_IDENTIFIER); } /* only add if we don't have same child to avoid duplicates */ @@ -170,7 +167,7 @@ protected List> getChildrenWithLiteral() { } protected DoubleStarNode getDoubleStarNode() { - return (DoubleStarNode) getChild(STAR_STAR); + return (DoubleStarNode) getChild(GlobUtils.STAR_STAR); } /** diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/StarTrieNode.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/StarTrieNode.java index 6e163f425677..10c27d94f6d1 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/StarTrieNode.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/CompressedGlobTrie/StarTrieNode.java @@ -25,6 +25,8 @@ package com.oracle.svm.core.jdk.resources.CompressedGlobTrie; +import com.oracle.svm.util.GlobUtils; + final class StarTrieNode extends GlobTrieNode { private final boolean matchingWholeLevel; @@ -34,7 +36,7 @@ final class StarTrieNode extends GlobTrieNode { } StarTrieNode(boolean matchesWholeLevel) { - super(STAR); + super(GlobUtils.STAR); this.matchingWholeLevel = matchesWholeLevel; } 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 64b1190335e7..a7efe99121a1 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 @@ -25,12 +25,23 @@ package com.oracle.svm.util; +import java.util.ArrayList; import java.util.List; +import java.util.regex.Pattern; -public class GlobUtils { +public final class GlobUtils { + + private GlobUtils() { + } /* list of glob wildcards we are always escaping because they are not supported yet */ public static final List ALWAYS_ESCAPED_GLOB_WILDCARDS = List.of('?', '[', ']', '{', '}'); + public static final String STAR = "*"; + public static final String STAR_STAR = "**"; + public static final String LEVEL_IDENTIFIER = "/"; + public static final String SAME_LEVEL_IDENTIFIER = "#"; + private static final Pattern threeConsecutiveStarsRegex = Pattern.compile(".*[*]{3,}.*"); + private static final Pattern emptyLevelsRegex = Pattern.compile(".*/{2,}.*"); public static String transformToTriePath(String resource, String module) { String resolvedModuleName; @@ -58,4 +69,100 @@ public static String transformToTriePath(String resource, String module) { return resolvedModuleName + resolvedResourceName; } + + public static String validatePattern(String pattern) { + StringBuilder sb = new StringBuilder(); + + if (pattern.isEmpty()) { + sb.append("Pattern ").append(pattern).append(" : Pattern cannot be empty. "); + return sb.toString(); + } + + // check if pattern contains more than 2 consecutive characters. Example: a/***/b + if (threeConsecutiveStarsRegex.matcher(pattern).matches()) { + sb.append("Pattern contains more than two consecutive * characters. "); + } + + /* check if pattern contains empty levels. Example: a//b */ + if (emptyLevelsRegex.matcher(pattern).matches()) { + sb.append("Pattern contains empty levels. "); + } + + /* check unnecessary ** repetition */ + if (pattern.contains("**/**")) { + sb.append("Pattern contains invalid sequence **/**. Valid pattern should have ** followed by something other than **. "); + } + + /* check if there are unescaped wildcards */ + boolean escapeMode = false; + for (int i = 0; i < pattern.length(); i++) { + char current = pattern.charAt(i); + if (ALWAYS_ESCAPED_GLOB_WILDCARDS.contains(current) && !escapeMode) { + sb.append("Pattern contains unescaped character ").append(current).append(". "); + } + + 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."); + } + } + } + + if (!sb.isEmpty()) { + sb.insert(0, "Pattern " + pattern + " : "); + } + + return sb.toString(); + } + + public static List> tokenize(String glob) { + String pattern = !glob.endsWith("/") ? glob : glob.substring(0, glob.length() - 1); + List> parts = new ArrayList<>(); + for (String level : pattern.split(LEVEL_IDENTIFIER)) { + parts.add(tokenizePart(level)); + } + return parts; + } + + private static List tokenizePart(String glob) { + if (glob.equals(STAR_STAR)) { + return List.of(new GlobToken(GlobToken.Kind.STAR_STAR, glob)); + } else if (glob.equals(STAR)) { + return List.of(new GlobToken(GlobToken.Kind.STAR, glob)); + } + // some combination of LITERAL_STAR and LITERAL tokens. + List tokens = new ArrayList<>(); + StringBuilder currentToken = new StringBuilder(); + boolean escaped = false; + for (char c : glob.toCharArray()) { + currentToken.append(c); + if (c == STAR.charAt(0) && !escaped) { + tokens.add(new GlobToken(GlobToken.Kind.LITERAL_STAR, currentToken.toString())); + currentToken.setLength(0); // clear + } + escaped = c == '\\'; + } + if (!currentToken.isEmpty()) { + tokens.add(new GlobToken(GlobToken.Kind.LITERAL, currentToken.toString())); + } + return tokens; + } + + public record GlobToken(Kind kind, String value) { + public enum Kind { + STAR_STAR, + STAR, + LITERAL_STAR, + LITERAL + } + } } From 9c3da40de390a6b65ba29e94ffe11600c344fdff Mon Sep 17 00:00:00 2001 From: Matt D'Souza Date: Wed, 12 Mar 2025 16:57:12 -0400 Subject: [PATCH 3/6] Remove most dependencies between com.oracle.svm.configure and com.oracle.svm.core --- .../oracle/svm/agent/NativeImageAgent.java | 4 +- ...ditionalConfigurationPartialRunWriter.java | 2 +- .../ConfigurationVerifier.java | 5 +- .../test/config/OmitPreviousConfigTests.java | 9 +- .../config/ResourceConfigurationTest.java | 11 +- .../ConditionalConfigurationParser.java | 82 +++++++ .../svm}/configure/ConditionalElement.java | 2 +- .../svm/configure/ConfigurationBase.java | 2 - .../svm}/configure/ConfigurationFile.java | 10 +- .../svm}/configure/ConfigurationParser.java | 16 +- .../ConfigurationTypeDescriptor.java | 2 +- .../LegacyReflectionConfigurationParser.java | 5 +- .../LegacyResourceConfigurationParser.java | 5 +- ...egacySerializationConfigurationParser.java | 10 +- .../NamedConfigurationTypeDescriptor.java | 2 +- .../PredefinedClassesConfigurationParser.java | 2 +- .../configure/PredefinedClassesRegistry.java | 2 +- .../configure/ProxyConfigurationParser.java | 9 +- .../ProxyConfigurationTypeDescriptor.java | 6 +- .../ReflectionConfigurationParser.java | 5 +- ...ReflectionConfigurationParserDelegate.java | 4 +- .../configure/ReflectionMetadataParser.java | 5 +- .../ResourceConfigurationParser.java | 12 +- .../configure/ResourceMetadataParser.java | 4 +- .../svm}/configure/ResourcesRegistry.java | 2 +- .../SerializationConfigurationParser.java | 4 +- .../SerializationMetadataParser.java | 3 +- .../command/ConfigurationGenerateCommand.java | 2 +- ...figurationGenerateConditionalsCommand.java | 2 +- .../ConfigurationConditionPrintable.java | 2 +- .../config/ConfigurationFileCollection.java | 12 +- .../configure/config/ConfigurationMethod.java | 2 +- .../configure/config/ConfigurationSet.java | 9 +- .../configure/config/ConfigurationType.java | 2 +- .../config/ParserConfigurationAdapter.java | 53 +++-- .../PredefinedClassesConfiguration.java | 13 +- .../configure/config/ProxyConfiguration.java | 13 +- .../config/ResourceConfiguration.java | 27 ++- .../config/SerializationConfiguration.java | 8 +- ...ationConfigurationLambdaCapturingType.java | 2 +- .../SerializationConfigurationType.java | 4 +- .../configure/config/TypeConfiguration.java | 15 +- .../ConditionalConfigurationComputer.java | 3 +- .../ConditionalConfigurationPredicate.java | 4 +- .../ConfigurationConditionResolver.java | 6 +- ...HumanReadableConfigurationWithOrigins.java | 2 +- .../config/conditional/MethodCallNode.java | 2 +- .../PartialConfigurationWithOrigins.java | 4 +- .../filters/FilterConfigurationParser.java | 2 +- .../filters/HierarchyFilterNode.java | 2 +- .../svm/configure/filters/RegexFilter.java | 2 +- .../svm/configure/trace/JsonFileWriter.java | 4 +- .../configure/trace/ReflectionProcessor.java | 6 +- .../trace/SerializationProcessor.java | 2 +- .../core/configure/ConfigurationFiles.java | 1 + .../snippets/SubstrateAllocationSnippets.java | 2 +- .../svm/core/jdk/JavaNetHttpFeature.java | 2 +- .../com/oracle/svm/core/jdk/Resources.java | 16 +- .../jdk/localization/LocalizationSupport.java | 24 -- .../OptimizedLocalizationSupport.java | 3 +- .../resources/NativeImageResourcePath.java | 166 +------------- .../svm/driver/metainf/MetaInfFileType.java | 6 +- .../ForeignFunctionsConfigurationParser.java | 3 +- .../foreign/ForeignFunctionsFeature.java | 4 +- .../svm/hosted/ClassPredefinitionFeature.java | 6 +- .../svm/hosted/ConfigurationTypeResolver.java | 2 +- .../oracle/svm/hosted/ImageClassLoader.java | 2 +- .../oracle/svm/hosted/ResourcesFeature.java | 20 +- .../svm/hosted/SecurityServicesFeature.java | 2 +- .../config/ConfigurationParserUtils.java | 12 +- .../config/ReflectionRegistryAdapter.java | 6 +- .../svm/hosted/config/RegistryAdapter.java | 10 +- .../HostedImageLayerBuildingSupport.java | 2 +- .../hosted/jdk/JDKInitializationFeature.java | 2 +- .../svm/hosted/jdk/JmxServerFeature.java | 2 +- .../jdk/localization/LocalizationFeature.java | 5 +- .../svm/hosted/jni/JNIAccessFeature.java | 8 +- .../reflect/NativeImageConditionResolver.java | 6 +- .../svm/hosted/reflect/ReflectionFeature.java | 6 +- .../reflect/proxy/DynamicProxyFeature.java | 6 +- .../serialize/SerializationFeature.java | 6 +- .../hosted/snippets/ReflectionPlugins.java | 2 +- .../hosted/xml/XMLParsersRegistration.java | 2 +- .../truffle/tck/AbstractMethodListParser.java | 2 +- .../src/com/oracle/svm/util/GlobUtils.java | 2 +- .../src/com/oracle/svm/util/LocaleUtil.java | 54 +++++ ...NativeImageResourcePathRepresentation.java | 212 ++++++++++++++++++ .../src/com/oracle/svm/util}/TypeResult.java | 8 +- 88 files changed, 603 insertions(+), 439 deletions(-) create mode 100644 substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConditionalConfigurationParser.java rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/ConditionalElement.java (98%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/ConfigurationFile.java (92%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/ConfigurationParser.java (94%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/ConfigurationTypeDescriptor.java (98%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/LegacyReflectionConfigurationParser.java (98%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/LegacyResourceConfigurationParser.java (97%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/LegacySerializationConfigurationParser.java (92%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/NamedConfigurationTypeDescriptor.java (98%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/PredefinedClassesConfigurationParser.java (99%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/PredefinedClassesRegistry.java (97%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/ProxyConfigurationParser.java (94%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/ProxyConfigurationTypeDescriptor.java (93%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/ReflectionConfigurationParser.java (98%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/ReflectionConfigurationParserDelegate.java (97%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/ReflectionMetadataParser.java (97%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/ResourceConfigurationParser.java (94%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/ResourceMetadataParser.java (94%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/ResourcesRegistry.java (98%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/SerializationConfigurationParser.java (97%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.configure/src/com/oracle/svm}/configure/SerializationMetadataParser.java (96%) rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core/configure => com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional}/ConfigurationConditionResolver.java (92%) create mode 100644 substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/LocaleUtil.java create mode 100644 substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/NativeImageResourcePathRepresentation.java rename substratevm/src/{com.oracle.svm.core/src/com/oracle/svm/core => com.oracle.svm.util/src/com/oracle/svm/util}/TypeResult.java (92%) diff --git a/substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/NativeImageAgent.java b/substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/NativeImageAgent.java index 74e13121c7bc..e8f2971d4c7d 100644 --- a/substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/NativeImageAgent.java +++ b/substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/NativeImageAgent.java @@ -74,6 +74,8 @@ import com.oracle.svm.agent.tracing.TraceFileWriter; import com.oracle.svm.agent.tracing.core.Tracer; import com.oracle.svm.agent.tracing.core.TracingResultWriter; +import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.PredefinedClassesConfigurationParser; import com.oracle.svm.configure.config.ConfigurationFileCollection; import com.oracle.svm.configure.config.ConfigurationSet; import com.oracle.svm.configure.config.conditional.ConditionalConfigurationPredicate; @@ -82,8 +84,6 @@ import com.oracle.svm.configure.filters.HierarchyFilterNode; import com.oracle.svm.configure.trace.AccessAdvisor; import com.oracle.svm.configure.trace.TraceProcessor; -import com.oracle.svm.core.configure.ConfigurationFile; -import com.oracle.svm.core.configure.PredefinedClassesConfigurationParser; import com.oracle.svm.core.jni.headers.JNIEnvironment; import com.oracle.svm.core.jni.headers.JNIJavaVM; import com.oracle.svm.core.jni.headers.JNIObjectHandle; diff --git a/substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/conditionalconfig/ConditionalConfigurationPartialRunWriter.java b/substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/conditionalconfig/ConditionalConfigurationPartialRunWriter.java index 5e57f1dc4952..aa56a86b26a7 100644 --- a/substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/conditionalconfig/ConditionalConfigurationPartialRunWriter.java +++ b/substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/conditionalconfig/ConditionalConfigurationPartialRunWriter.java @@ -32,7 +32,7 @@ import com.oracle.svm.agent.configwithorigins.ConfigurationWithOriginsTracer; import com.oracle.svm.agent.tracing.core.TracingResultWriter; import com.oracle.svm.configure.config.conditional.PartialConfigurationWithOrigins; -import com.oracle.svm.core.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationFile; import jdk.graal.compiler.util.json.JsonWriter; diff --git a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/conditionalconfig/ConfigurationVerifier.java b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/conditionalconfig/ConfigurationVerifier.java index 5134dd918bb7..a845a2b319dc 100644 --- a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/conditionalconfig/ConfigurationVerifier.java +++ b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/conditionalconfig/ConfigurationVerifier.java @@ -35,11 +35,10 @@ import org.junit.Test; import com.oracle.svm.configure.ConfigurationBase; +import com.oracle.svm.configure.ConfigurationFile; import com.oracle.svm.configure.config.ConfigurationFileCollection; import com.oracle.svm.configure.config.ConfigurationSet; import com.oracle.svm.configure.test.AddExports; -import com.oracle.svm.core.configure.ConfigurationFile; -import com.oracle.svm.core.util.VMError; import jdk.graal.compiler.util.json.JsonWriter; @@ -105,7 +104,7 @@ private static ConfigurationSet loadExpectedConfig() throws Exception { URL resourceURL = ConfigurationVerifier.class.getResource(resourceName); return resourceURL == null ? null : resourceURL.toURI(); } catch (Exception e) { - throw VMError.shouldNotReachHere("Unexpected error while locating the configuration files.", e); + throw new AssertionError("Unexpected error while locating the configuration files.", e); } }); return configurationFileCollection.loadConfigurationSet(e -> e, null, null); diff --git a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/OmitPreviousConfigTests.java b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/OmitPreviousConfigTests.java index f7d020858dca..bdf714732a39 100644 --- a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/OmitPreviousConfigTests.java +++ b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/OmitPreviousConfigTests.java @@ -39,6 +39,8 @@ import org.junit.Assert; import org.junit.Test; +import com.oracle.svm.configure.ConfigurationTypeDescriptor; +import com.oracle.svm.configure.NamedConfigurationTypeDescriptor; import com.oracle.svm.configure.config.ConfigurationFileCollection; import com.oracle.svm.configure.config.ConfigurationMemberInfo; import com.oracle.svm.configure.config.ConfigurationMemberInfo.ConfigurationMemberAccessibility; @@ -53,9 +55,6 @@ import com.oracle.svm.configure.config.SerializationConfiguration; import com.oracle.svm.configure.config.TypeConfiguration; import com.oracle.svm.configure.test.AddExports; -import com.oracle.svm.core.configure.ConfigurationTypeDescriptor; -import com.oracle.svm.core.configure.NamedConfigurationTypeDescriptor; -import com.oracle.svm.core.util.VMError; @AddExports({"org.graalvm.nativeimage/org.graalvm.nativeimage.impl", "jdk.graal.compiler/jdk.graal.compiler.util", "jdk.graal.compiler/jdk.graal.compiler.util.json"}) public class OmitPreviousConfigTests { @@ -72,7 +71,7 @@ private static ConfigurationSet loadTraceProcessorFromResourceDirectory(String r URL resourceURL = OmitPreviousConfigTests.class.getResource(resourceName); return (resourceURL != null) ? resourceURL.toURI() : null; } catch (Exception e) { - throw VMError.shouldNotReachHere("Unexpected error while locating the configuration files.", e); + throw new AssertionError("Unexpected error while locating the configuration files.", e); } }); @@ -88,7 +87,7 @@ private static ConfigurationSet loadTraceProcessorFromResourceDirectory(String r } return configurationFileCollection.loadConfigurationSet(handler, null, shouldExcludeClassesWithHash); } catch (Exception e) { - throw VMError.shouldNotReachHere("Unexpected error while loading the configuration files.", e); + throw new AssertionError("Unexpected error while loading the configuration files.", e); } } diff --git a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java index 3be095f32d42..c8283b86ae98 100644 --- a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java +++ b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java @@ -38,11 +38,10 @@ import org.junit.Assert; import org.junit.Test; +import com.oracle.svm.configure.ResourceConfigurationParser; +import com.oracle.svm.configure.ResourcesRegistry; import com.oracle.svm.configure.config.ResourceConfiguration; -import com.oracle.svm.core.configure.ConfigurationConditionResolver; -import com.oracle.svm.core.configure.ResourceConfigurationParser; -import com.oracle.svm.core.configure.ResourcesRegistry; -import com.oracle.svm.core.util.VMError; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import jdk.graal.compiler.util.json.JsonWriter; @@ -99,12 +98,12 @@ public void addResources(UnresolvedConfigurationCondition condition, String patt @Override public void addGlob(UnresolvedConfigurationCondition condition, String module, String glob, Object origin) { - throw VMError.shouldNotReachHere("Unused function."); + throw new AssertionError("Unused function."); } @Override public void addResourceEntry(Module module, String resourcePath, Object origin) { - throw VMError.shouldNotReachHere("Unused function."); + throw new AssertionError("Unused function."); } @Override diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConditionalConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConditionalConfigurationParser.java new file mode 100644 index 000000000000..99955b356743 --- /dev/null +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConditionalConfigurationParser.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2025, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.svm.configure; + +import static org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition.TYPE_REACHABLE_KEY; +import static org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition.TYPE_REACHED_KEY; + +import java.util.EnumSet; + +import org.graalvm.collections.EconomicMap; +import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; + +public abstract class ConditionalConfigurationParser extends ConfigurationParser { + public static final String CONDITIONAL_KEY = "condition"; + + protected ConditionalConfigurationParser(EnumSet parserOptions) { + super(parserOptions); + } + + @Override + protected EnumSet supportedOptions() { + EnumSet base = super.supportedOptions(); + base.add(ConfigurationParserOption.TREAT_ALL_TYPE_REACHABLE_CONDITIONS_AS_TYPE_REACHED); + return base; + } + + protected UnresolvedConfigurationCondition parseCondition(EconomicMap data, boolean runtimeCondition) { + Object conditionData = data.get(CONDITIONAL_KEY); + if (conditionData != null) { + EconomicMap conditionObject = asMap(conditionData, "Attribute '" + CONDITIONAL_KEY + "' must be an object"); + if (conditionObject.containsKey(TYPE_REACHABLE_KEY) && conditionObject.containsKey(TYPE_REACHED_KEY)) { + failOnSchemaError("condition can not have both '" + TYPE_REACHED_KEY + "' and '" + TYPE_REACHABLE_KEY + "' set."); + } + + if (conditionObject.containsKey(TYPE_REACHED_KEY)) { + if (!runtimeCondition) { + failOnSchemaError("'" + TYPE_REACHED_KEY + "' condition cannot be used in older schemas. Please migrate the file to the latest schema."); + } + Object object = conditionObject.get(TYPE_REACHED_KEY); + var condition = parseTypeContents(object); + if (condition.isPresent()) { + String className = ((NamedConfigurationTypeDescriptor) condition.get()).name(); + return UnresolvedConfigurationCondition.create(className); + } + } else if (conditionObject.containsKey(TYPE_REACHABLE_KEY)) { + if (runtimeCondition && !checkOption(ConfigurationParserOption.TREAT_ALL_TYPE_REACHABLE_CONDITIONS_AS_TYPE_REACHED)) { + failOnSchemaError("'" + TYPE_REACHABLE_KEY + "' condition can not be used with the latest schema. Please use '" + TYPE_REACHED_KEY + "'."); + } + Object object = conditionObject.get(TYPE_REACHABLE_KEY); + var condition = parseTypeContents(object); + if (condition.isPresent()) { + String className = ((NamedConfigurationTypeDescriptor) condition.get()).name(); + return UnresolvedConfigurationCondition.create(className, checkOption(ConfigurationParserOption.TREAT_ALL_TYPE_REACHABLE_CONDITIONS_AS_TYPE_REACHED)); + } + } + } + return UnresolvedConfigurationCondition.alwaysTrue(); + } + +} diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConditionalElement.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConditionalElement.java similarity index 98% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConditionalElement.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConditionalElement.java index e54bc80cf717..4daa1220cdab 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConditionalElement.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConditionalElement.java @@ -23,7 +23,7 @@ * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.util.Comparator; import java.util.function.Function; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationBase.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationBase.java index 22141588667d..970f8643967d 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationBase.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationBase.java @@ -29,8 +29,6 @@ import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; -import com.oracle.svm.core.configure.ConfigurationParser; - import jdk.graal.compiler.util.json.JsonPrintable; import jdk.graal.compiler.util.json.JsonWriter; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationFile.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationFile.java similarity index 92% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationFile.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationFile.java index d3ae09ce0a20..d58fa502ad37 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationFile.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationFile.java @@ -22,12 +22,12 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; -import static com.oracle.svm.core.configure.ConfigurationParser.JNI_KEY; -import static com.oracle.svm.core.configure.ConfigurationParser.REFLECTION_KEY; -import static com.oracle.svm.core.configure.ConfigurationParser.RESOURCES_KEY; -import static com.oracle.svm.core.configure.ConfigurationParser.SERIALIZATION_KEY; +import static com.oracle.svm.configure.ConfigurationParser.JNI_KEY; +import static com.oracle.svm.configure.ConfigurationParser.REFLECTION_KEY; +import static com.oracle.svm.configure.ConfigurationParser.RESOURCES_KEY; +import static com.oracle.svm.configure.ConfigurationParser.SERIALIZATION_KEY; import java.util.Arrays; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParser.java similarity index 94% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationParser.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParser.java index 85911c036ce4..04cfdb924bf7 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParser.java @@ -22,9 +22,8 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; -import static com.oracle.svm.core.configure.ConfigurationFiles.Options.TreatAllTypeReachableConditionsAsTypeReached; import static org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition.TYPE_REACHABLE_KEY; import static org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition.TYPE_REACHED_KEY; @@ -46,11 +45,8 @@ import java.util.Set; import org.graalvm.collections.EconomicMap; -import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; +import org.graalvm.nativeimage.ImageInfo; -import com.oracle.svm.core.SubstrateUtil; -import com.oracle.svm.core.jdk.JavaNetSubstitutions; -import com.oracle.svm.core.util.VMError; import com.oracle.svm.util.LogUtils; import jdk.graal.compiler.util.json.JsonParser; @@ -60,10 +56,10 @@ public abstract class ConfigurationParser { public static InputStream openStream(URI uri) throws IOException { URL url = uri.toURL(); if ("file".equals(url.getProtocol()) || "jar".equalsIgnoreCase(url.getProtocol()) || - (!SubstrateUtil.HOSTED && JavaNetSubstitutions.RESOURCE_PROTOCOL.equals(url.getProtocol()))) { + (ImageInfo.inImageRuntimeCode() && "resource".equals(url.getProtocol()))) { return url.openStream(); } - throw VMError.shouldNotReachHere("For security reasons, reading configurations is not supported from URIs with protocol: " + url.getProtocol()); + throw new IllegalArgumentException("For security reasons, reading configurations is not supported from URIs with protocol: " + url.getProtocol()); } public static final String CONDITIONAL_KEY = "condition"; @@ -244,14 +240,14 @@ protected UnresolvedConfigurationCondition parseCondition(EconomicMap extends ReflectionConfigurationParser { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacyResourceConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacyResourceConfigurationParser.java similarity index 97% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacyResourceConfigurationParser.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacyResourceConfigurationParser.java index 780dfa422d61..2c7d6dbd3f1d 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacyResourceConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacyResourceConfigurationParser.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.net.URI; import java.util.Collections; @@ -33,8 +33,9 @@ import org.graalvm.collections.MapCursor; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; -import com.oracle.svm.core.TypeResult; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import com.oracle.svm.util.GlobUtils; +import com.oracle.svm.util.TypeResult; final class LegacyResourceConfigurationParser extends ResourceConfigurationParser { LegacyResourceConfigurationParser(ConfigurationConditionResolver conditionResolver, ResourcesRegistry registry, boolean strictConfiguration) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacySerializationConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacySerializationConfigurationParser.java similarity index 92% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacySerializationConfigurationParser.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacySerializationConfigurationParser.java index bc4aeba5c112..6cd4df7c1de6 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/LegacySerializationConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacySerializationConfigurationParser.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.net.URI; import java.util.Arrays; @@ -33,6 +33,7 @@ import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import com.oracle.svm.util.LogUtils; import jdk.graal.compiler.util.json.JsonParserException; @@ -70,7 +71,9 @@ private void parseNewConfiguration(EconomicMap listOfSerializati throw new JsonParserException("Second-level of document must be arrays of serialization descriptor objects"); } - parseSerializationTypes(asList(listOfSerializationConfigurationObjects.get(SERIALIZATION_TYPES_KEY), "The types property must be an array of serialization descriptor objects"), false); + parseSerializationTypes( + asList(listOfSerializationConfigurationObjects.get(SERIALIZATION_TYPES_KEY), "The types property must be an array of serialization descriptor objects"), + false); parseSerializationTypes( asList(listOfSerializationConfigurationObjects.get(LAMBDA_CAPTURING_SERIALIZATION_TYPES_KEY), "The lambdaCapturingTypes property must be an array of serialization descriptor objects"), @@ -88,7 +91,8 @@ protected void parseSerializationDescriptorObject(EconomicMap da if (lambdaCapturingType) { checkAttributes(data, "serialization descriptor object", Collections.singleton(NAME_KEY), Collections.singleton(CONDITIONAL_KEY)); } else { - checkAttributes(data, "serialization descriptor object", Collections.singleton(NAME_KEY), Arrays.asList(CUSTOM_TARGET_CONSTRUCTOR_CLASS_KEY, CONDITIONAL_KEY)); + checkAttributes(data, "serialization descriptor object", Collections.singleton(NAME_KEY), + Arrays.asList(CUSTOM_TARGET_CONSTRUCTOR_CLASS_KEY, CONDITIONAL_KEY)); } NamedConfigurationTypeDescriptor targetSerializationClass = new NamedConfigurationTypeDescriptor(asString(data.get(NAME_KEY))); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/NamedConfigurationTypeDescriptor.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/NamedConfigurationTypeDescriptor.java similarity index 98% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/NamedConfigurationTypeDescriptor.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/NamedConfigurationTypeDescriptor.java index 5a4985834819..26e9555f3a9a 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/NamedConfigurationTypeDescriptor.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/NamedConfigurationTypeDescriptor.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.io.IOException; import java.util.Collection; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/PredefinedClassesConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/PredefinedClassesConfigurationParser.java similarity index 99% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/PredefinedClassesConfigurationParser.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/PredefinedClassesConfigurationParser.java index 532db43ab1b5..643cf8946694 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/PredefinedClassesConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/PredefinedClassesConfigurationParser.java @@ -23,7 +23,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.io.IOException; import java.io.InputStream; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/PredefinedClassesRegistry.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/PredefinedClassesRegistry.java similarity index 97% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/PredefinedClassesRegistry.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/PredefinedClassesRegistry.java index a4e42f1af8a3..aac650d1f9db 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/PredefinedClassesRegistry.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/PredefinedClassesRegistry.java @@ -23,7 +23,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.net.URI; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ProxyConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ProxyConfigurationParser.java similarity index 94% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ProxyConfigurationParser.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ProxyConfigurationParser.java index 048db3ef2e0f..5b71baa2684e 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ProxyConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ProxyConfigurationParser.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.net.URI; import java.util.Collections; @@ -33,13 +33,14 @@ import org.graalvm.collections.EconomicMap; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; -import com.oracle.svm.core.TypeResult; -import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; +import com.oracle.svm.util.TypeResult; import jdk.graal.compiler.util.json.JsonParserException; /** - * Parses JSON describing lists of interfaces and register them in the {@link DynamicProxyRegistry}. + * Parses JSON describing lists of interfaces and passes them to the given consumer (e.g., to add + * them to a registry). */ public final class ProxyConfigurationParser extends ConfigurationParser { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ProxyConfigurationTypeDescriptor.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ProxyConfigurationTypeDescriptor.java similarity index 93% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ProxyConfigurationTypeDescriptor.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ProxyConfigurationTypeDescriptor.java index c60f589852c9..2270167bdbad 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ProxyConfigurationTypeDescriptor.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ProxyConfigurationTypeDescriptor.java @@ -22,15 +22,13 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.List; -import com.oracle.svm.core.reflect.proxy.DynamicProxySupport; - import jdk.graal.compiler.util.json.JsonPrinter; import jdk.graal.compiler.util.json.JsonWriter; @@ -47,7 +45,7 @@ public Kind getDescriptorType() { @Override public String toString() { - return DynamicProxySupport.proxyTypeDescriptor(interfaceNames.toArray(String[]::new)); + return "Proxy[" + String.join(", ", interfaceNames) + "]"; } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParser.java similarity index 98% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionConfigurationParser.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParser.java index 349f586ff5f7..f737f55721d8 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParser.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.util.ArrayList; import java.util.Arrays; @@ -32,8 +32,9 @@ import org.graalvm.collections.EconomicMap; -import com.oracle.svm.core.TypeResult; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import com.oracle.svm.util.LogUtils; +import com.oracle.svm.util.TypeResult; import jdk.graal.compiler.util.json.JsonParserException; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionConfigurationParserDelegate.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParserDelegate.java similarity index 97% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionConfigurationParserDelegate.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParserDelegate.java index 73463542d5db..53508990eda0 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionConfigurationParserDelegate.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParserDelegate.java @@ -22,11 +22,11 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.util.List; -import com.oracle.svm.core.TypeResult; +import com.oracle.svm.util.TypeResult; public interface ReflectionConfigurationParserDelegate { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionMetadataParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionMetadataParser.java similarity index 97% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionMetadataParser.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionMetadataParser.java index ffa54d572be1..0061f506ca4a 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionMetadataParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionMetadataParser.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.net.URI; import java.util.Arrays; @@ -33,7 +33,8 @@ import org.graalvm.collections.MapCursor; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; -import com.oracle.svm.core.TypeResult; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; +import com.oracle.svm.util.TypeResult; class ReflectionMetadataParser extends ReflectionConfigurationParser { private static final List OPTIONAL_REFLECT_METADATA_ATTRS = Arrays.asList(CONDITIONAL_KEY, diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ResourceConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceConfigurationParser.java similarity index 94% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ResourceConfigurationParser.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceConfigurationParser.java index 01ec3fae048d..daa4aeb0d9f7 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ResourceConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceConfigurationParser.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.util.Arrays; import java.util.Collections; @@ -33,8 +33,9 @@ import org.graalvm.collections.EconomicMap; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; -import com.oracle.svm.core.TypeResult; -import com.oracle.svm.core.jdk.localization.LocalizationSupport; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; +import com.oracle.svm.util.LocaleUtil; +import com.oracle.svm.util.TypeResult; import jdk.graal.compiler.util.json.JsonParserException; @@ -101,7 +102,7 @@ private void parseBundle(Object bundle) { private static Locale parseLocale(Object input) { String localeTag = asString(input); - Locale locale = LocalizationSupport.parseLocaleFromTag(localeTag); + Locale locale = LocaleUtil.parseLocaleFromTag(localeTag); if (locale == null) { throw new JsonParserException(localeTag + " is not a valid locale tag"); } @@ -121,7 +122,8 @@ protected interface GlobPatternConsumer { private void parseGlobEntry(Object data, GlobPatternConsumer resourceRegistry) { EconomicMap globObject = asMap(data, "Elements of 'globs' list must be a glob descriptor objects"); - checkAttributes(globObject, "glob resource descriptor object", Collections.singletonList(GLOB_KEY), List.of(CONDITIONAL_KEY, MODULE_KEY)); + checkAttributes(globObject, "glob resource descriptor object", Collections.singletonList(GLOB_KEY), + List.of(CONDITIONAL_KEY, MODULE_KEY)); TypeResult resolvedConfigurationCondition = conditionResolver.resolveCondition(parseCondition(globObject)); if (!resolvedConfigurationCondition.isPresent()) { return; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ResourceMetadataParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceMetadataParser.java similarity index 94% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ResourceMetadataParser.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceMetadataParser.java index a5e593f7f469..e67432fae398 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ResourceMetadataParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceMetadataParser.java @@ -22,13 +22,15 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.net.URI; import org.graalvm.collections.EconomicMap; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; + final class ResourceMetadataParser extends ResourceConfigurationParser { ResourceMetadataParser(ConfigurationConditionResolver conditionResolver, ResourcesRegistry registry, boolean strictConfiguration) { super(conditionResolver, registry, strictConfiguration); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ResourcesRegistry.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java similarity index 98% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ResourcesRegistry.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java index 18cec696bc89..5fbdb3418524 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ResourcesRegistry.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.util.Collection; import java.util.Locale; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/SerializationConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationConfigurationParser.java similarity index 97% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/SerializationConfigurationParser.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationConfigurationParser.java index e79b76ed074f..10c6b89a7a31 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/SerializationConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationConfigurationParser.java @@ -23,13 +23,15 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.util.List; import org.graalvm.collections.EconomicMap; import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; + import jdk.graal.compiler.util.json.JsonParserException; public abstract class SerializationConfigurationParser extends ConfigurationParser { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/SerializationMetadataParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationMetadataParser.java similarity index 96% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/SerializationMetadataParser.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationMetadataParser.java index cc20eb92e2da..ea6edec0a7e9 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/SerializationMetadataParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationMetadataParser.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure; import java.net.URI; import java.util.List; @@ -32,6 +32,7 @@ import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import com.oracle.svm.util.LogUtils; final class SerializationMetadataParser extends SerializationConfigurationParser { diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateCommand.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateCommand.java index ef5c4770a54f..37927730cd4e 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateCommand.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateCommand.java @@ -39,6 +39,7 @@ import java.util.function.Predicate; import com.oracle.svm.configure.ConfigurationUsageException; +import com.oracle.svm.configure.PredefinedClassesConfigurationParser; import com.oracle.svm.configure.config.ConfigurationFileCollection; import com.oracle.svm.configure.config.ConfigurationSet; import com.oracle.svm.configure.filters.ComplexFilter; @@ -46,7 +47,6 @@ import com.oracle.svm.configure.filters.HierarchyFilterNode; import com.oracle.svm.configure.trace.AccessAdvisor; import com.oracle.svm.configure.trace.TraceProcessor; -import com.oracle.svm.core.configure.PredefinedClassesConfigurationParser; import com.oracle.svm.util.LogUtils; import jdk.graal.compiler.phases.common.LazyValue; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateConditionalsCommand.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateConditionalsCommand.java index 3342507cc707..43d051d5bca6 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateConditionalsCommand.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateConditionalsCommand.java @@ -43,7 +43,7 @@ import com.oracle.svm.configure.filters.ComplexFilter; import com.oracle.svm.configure.filters.FilterConfigurationParser; import com.oracle.svm.configure.filters.HierarchyFilterNode; -import com.oracle.svm.core.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationFile; public final class ConfigurationGenerateConditionalsCommand extends ConfigurationCommand { @Override diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationConditionPrintable.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationConditionPrintable.java index 0344046c7736..e0a3f2bf5ad1 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationConditionPrintable.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationConditionPrintable.java @@ -24,7 +24,7 @@ */ package com.oracle.svm.configure.config; -import static com.oracle.svm.core.configure.ConfigurationParser.CONDITIONAL_KEY; +import static com.oracle.svm.configure.ConfigurationParser.CONDITIONAL_KEY; import static org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition.TYPE_REACHABLE_KEY; import static org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition.TYPE_REACHED_KEY; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationFileCollection.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationFileCollection.java index a6310afb98db..6f6b9093e12b 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationFileCollection.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationFileCollection.java @@ -24,8 +24,8 @@ */ package com.oracle.svm.configure.config; -import static com.oracle.svm.core.configure.ConfigurationParser.JNI_KEY; -import static com.oracle.svm.core.configure.ConfigurationParser.REFLECTION_KEY; +import static com.oracle.svm.configure.ConfigurationParser.JNI_KEY; +import static com.oracle.svm.configure.ConfigurationParser.REFLECTION_KEY; import java.io.IOException; import java.net.URI; @@ -42,9 +42,9 @@ import java.util.function.Predicate; import java.util.stream.Collectors; -import com.oracle.svm.core.configure.ConfigurationFile; -import com.oracle.svm.core.configure.ConfigurationParser; -import com.oracle.svm.core.util.VMError; +import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationParser; + import jdk.graal.compiler.phases.common.LazyValue; public class ConfigurationFileCollection { @@ -116,7 +116,7 @@ public Set getPaths(ConfigurationFile configurationFile) { case REFLECTION -> uris = getReflectConfigPaths(); case SERIALIZATION -> uris = getSerializationConfigPaths(); case PREDEFINED_CLASSES_NAME -> uris = getPredefinedClassesConfigPaths(); - default -> throw VMError.shouldNotReachHere("Cannot get paths for configuration file " + configurationFile); + default -> throw new IllegalArgumentException("Cannot get paths for configuration file " + configurationFile); } return uris.stream().map(Paths::get).collect(Collectors.toSet()); } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationMethod.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationMethod.java index e66390d2733a..7a390e33617d 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationMethod.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationMethod.java @@ -29,7 +29,7 @@ import java.util.List; import java.util.Objects; -import com.oracle.svm.core.configure.NamedConfigurationTypeDescriptor; +import com.oracle.svm.configure.NamedConfigurationTypeDescriptor; import jdk.graal.compiler.util.json.JsonPrintable; import jdk.graal.compiler.util.json.JsonWriter; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationSet.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationSet.java index 5a58c16b2eed..d9ea2142db33 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationSet.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationSet.java @@ -24,8 +24,8 @@ */ package com.oracle.svm.configure.config; -import static com.oracle.svm.core.configure.ConfigurationParser.JNI_KEY; -import static com.oracle.svm.core.configure.ConfigurationParser.REFLECTION_KEY; +import static com.oracle.svm.configure.ConfigurationParser.JNI_KEY; +import static com.oracle.svm.configure.ConfigurationParser.REFLECTION_KEY; import java.io.IOException; import java.nio.file.Path; @@ -36,9 +36,8 @@ import java.util.function.Function; import com.oracle.svm.configure.ConfigurationBase; +import com.oracle.svm.configure.ConfigurationFile; import com.oracle.svm.configure.config.conditional.ConditionalConfigurationPredicate; -import com.oracle.svm.core.configure.ConfigurationFile; -import com.oracle.svm.core.util.VMError; import jdk.graal.compiler.util.json.JsonPrettyWriter; import jdk.graal.compiler.util.json.JsonPrintable; @@ -150,7 +149,7 @@ public PredefinedClassesConfiguration getPredefinedClassesConfiguration() { case PREDEFINED_CLASSES_NAME: return (T) predefinedClassesConfiguration; default: - throw VMError.shouldNotReachHere("Unsupported configuration in configuration container: " + configurationFile); + throw new IllegalArgumentException("Unsupported configuration in configuration container: " + configurationFile); } } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationType.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationType.java index 9a0153049345..b45b154ef2d6 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationType.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationType.java @@ -37,9 +37,9 @@ import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; +import com.oracle.svm.configure.ConfigurationTypeDescriptor; import com.oracle.svm.configure.config.ConfigurationMemberInfo.ConfigurationMemberAccessibility; import com.oracle.svm.configure.config.ConfigurationMemberInfo.ConfigurationMemberDeclaration; -import com.oracle.svm.core.configure.ConfigurationTypeDescriptor; import jdk.graal.compiler.util.SignatureUtil; import jdk.graal.compiler.util.json.JsonPrintable; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ParserConfigurationAdapter.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ParserConfigurationAdapter.java index 17258e8c07be..38accaf198a7 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ParserConfigurationAdapter.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ParserConfigurationAdapter.java @@ -28,12 +28,11 @@ import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; +import com.oracle.svm.configure.ConfigurationTypeDescriptor; +import com.oracle.svm.configure.ReflectionConfigurationParserDelegate; import com.oracle.svm.configure.config.ConfigurationMemberInfo.ConfigurationMemberAccessibility; import com.oracle.svm.configure.config.ConfigurationMemberInfo.ConfigurationMemberDeclaration; -import com.oracle.svm.core.TypeResult; -import com.oracle.svm.core.configure.ConfigurationTypeDescriptor; -import com.oracle.svm.core.configure.ReflectionConfigurationParserDelegate; -import com.oracle.svm.core.util.VMError; +import com.oracle.svm.util.TypeResult; public class ParserConfigurationAdapter implements ReflectionConfigurationParserDelegate { @@ -56,26 +55,26 @@ public TypeResult resolveType(UnresolvedConfigurationConditio @Override public void registerType(UnresolvedConfigurationCondition condition, ConfigurationType type) { - VMError.guarantee(condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.equals(type.getCondition()), "condition is already a part of the type"); configuration.add(type); } @Override public void registerField(UnresolvedConfigurationCondition condition, ConfigurationType type, String fieldName, boolean finalButWritable) { - VMError.guarantee(condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.equals(type.getCondition()), "condition is already a part of the type"); type.addField(fieldName, ConfigurationMemberDeclaration.PRESENT, finalButWritable); } @Override public boolean registerAllMethodsWithName(UnresolvedConfigurationCondition condition, boolean queriedOnly, ConfigurationType type, String methodName) { - VMError.guarantee(condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.equals(type.getCondition()), "condition is already a part of the type"); type.addMethodsWithName(methodName, ConfigurationMemberDeclaration.PRESENT, queriedOnly ? ConfigurationMemberAccessibility.QUERIED : ConfigurationMemberAccessibility.ACCESSED); return true; } @Override public boolean registerAllConstructors(UnresolvedConfigurationCondition condition, boolean queriedOnly, ConfigurationType type) { - VMError.guarantee(condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.equals(type.getCondition()), "condition is already a part of the type"); type.addMethodsWithName(ConfigurationMethod.CONSTRUCTOR_NAME, ConfigurationMemberDeclaration.PRESENT, queriedOnly ? ConfigurationMemberAccessibility.QUERIED : ConfigurationMemberAccessibility.ACCESSED); return true; @@ -83,99 +82,99 @@ public boolean registerAllConstructors(UnresolvedConfigurationCondition conditio @Override public void registerUnsafeAllocated(UnresolvedConfigurationCondition condition, ConfigurationType type) { - VMError.guarantee(condition.equals(type.getCondition()), "condition is here part of the type"); + checkArguments(condition.equals(type.getCondition()), "condition is already a part of the type"); type.setUnsafeAllocated(); } @Override public void registerMethod(UnresolvedConfigurationCondition condition, boolean queriedOnly, ConfigurationType type, String methodName, List methodParameterTypes) { - VMError.guarantee(condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.equals(type.getCondition()), "condition is already a part of the type"); type.addMethod(methodName, ConfigurationMethod.toInternalParamsSignature(methodParameterTypes), ConfigurationMemberDeclaration.PRESENT, queriedOnly ? ConfigurationMemberAccessibility.QUERIED : ConfigurationMemberAccessibility.ACCESSED); } @Override public void registerConstructor(UnresolvedConfigurationCondition condition, boolean queriedOnly, ConfigurationType type, List methodParameterTypes) { - VMError.guarantee(condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.equals(type.getCondition()), "condition is already a part of the type"); type.addMethod(ConfigurationMethod.CONSTRUCTOR_NAME, ConfigurationMethod.toInternalParamsSignature(methodParameterTypes), ConfigurationMemberDeclaration.PRESENT, queriedOnly ? ConfigurationMemberAccessibility.QUERIED : ConfigurationMemberAccessibility.ACCESSED); } @Override public void registerPublicClasses(UnresolvedConfigurationCondition condition, ConfigurationType type) { - VMError.guarantee(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); type.setAllPublicClasses(); } @Override public void registerDeclaredClasses(UnresolvedConfigurationCondition condition, ConfigurationType type) { - VMError.guarantee(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); type.setAllDeclaredClasses(); } @Override public void registerRecordComponents(UnresolvedConfigurationCondition condition, ConfigurationType type) { - VMError.guarantee(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); type.setAllRecordComponents(); } @Override public void registerPermittedSubclasses(UnresolvedConfigurationCondition condition, ConfigurationType type) { - VMError.guarantee(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); type.setAllPermittedSubclasses(); } @Override public void registerNestMembers(UnresolvedConfigurationCondition condition, ConfigurationType type) { - VMError.guarantee(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); type.setAllNestMembers(); } @Override public void registerSigners(UnresolvedConfigurationCondition condition, ConfigurationType type) { - VMError.guarantee(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); type.setAllSigners(); } @Override public void registerPublicFields(UnresolvedConfigurationCondition condition, boolean queriedOnly, ConfigurationType type) { - VMError.guarantee(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); type.setAllPublicFields(queriedOnly ? ConfigurationMemberAccessibility.QUERIED : ConfigurationMemberAccessibility.ACCESSED); } @Override public void registerDeclaredFields(UnresolvedConfigurationCondition condition, boolean queriedOnly, ConfigurationType type) { - VMError.guarantee(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); type.setAllDeclaredFields(queriedOnly ? ConfigurationMemberAccessibility.QUERIED : ConfigurationMemberAccessibility.ACCESSED); } @Override public void registerPublicMethods(UnresolvedConfigurationCondition condition, boolean queriedOnly, ConfigurationType type) { - VMError.guarantee(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); type.setAllPublicMethods(queriedOnly ? ConfigurationMemberAccessibility.QUERIED : ConfigurationMemberAccessibility.ACCESSED); } @Override public void registerDeclaredMethods(UnresolvedConfigurationCondition condition, boolean queriedOnly, ConfigurationType type) { - VMError.guarantee(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); type.setAllDeclaredMethods(queriedOnly ? ConfigurationMemberAccessibility.QUERIED : ConfigurationMemberAccessibility.ACCESSED); } @Override public void registerPublicConstructors(UnresolvedConfigurationCondition condition, boolean queriedOnly, ConfigurationType type) { - VMError.guarantee(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); type.setAllPublicConstructors(queriedOnly ? ConfigurationMemberAccessibility.QUERIED : ConfigurationMemberAccessibility.ACCESSED); } @Override public void registerDeclaredConstructors(UnresolvedConfigurationCondition condition, boolean queriedOnly, ConfigurationType type) { - VMError.guarantee(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); type.setAllDeclaredConstructors(queriedOnly ? ConfigurationMemberAccessibility.QUERIED : ConfigurationMemberAccessibility.ACCESSED); } @Override public void registerAsSerializable(UnresolvedConfigurationCondition condition, ConfigurationType type) { - VMError.guarantee(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); + checkArguments(condition.isAlwaysTrue() || condition.equals(type.getCondition()), "condition is already a part of the type"); type.setSerializable(); } @@ -188,4 +187,10 @@ public String getTypeName(ConfigurationType type) { public String getSimpleName(ConfigurationType type) { return getTypeName(type); } + + private static void checkArguments(boolean condition, String msg) { + if (!condition) { + throw new IllegalArgumentException(msg); + } + } } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/PredefinedClassesConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/PredefinedClassesConfiguration.java index 2539272cb0c0..4385e9cbfecb 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/PredefinedClassesConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/PredefinedClassesConfiguration.java @@ -35,15 +35,14 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import jdk.graal.compiler.phases.common.LazyValue; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; import com.oracle.svm.configure.ConfigurationBase; -import com.oracle.svm.core.configure.ConfigurationFile; -import com.oracle.svm.core.configure.ConfigurationParser; -import com.oracle.svm.core.configure.PredefinedClassesConfigurationParser; -import com.oracle.svm.core.util.VMError; +import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.PredefinedClassesConfigurationParser; +import jdk.graal.compiler.phases.common.LazyValue; import jdk.graal.compiler.util.Digest; import jdk.graal.compiler.util.json.JsonWriter; @@ -169,7 +168,9 @@ public void printJson(JsonWriter writer) throws IOException { @Override public ConfigurationParser createParser(boolean strictMetadata) { - VMError.guarantee(!strictMetadata, "Predefined classes configuration is not supported with strict metadata"); + if (strictMetadata) { + throw new IllegalArgumentException("Predefined classes configuration is not supported with strict metadata"); + } return new PredefinedClassesConfigurationParser(this::add, true); } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ProxyConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ProxyConfiguration.java index 64296045273d..59b0d0a725e3 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ProxyConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ProxyConfiguration.java @@ -33,12 +33,11 @@ import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; +import com.oracle.svm.configure.ConditionalElement; import com.oracle.svm.configure.ConfigurationBase; -import com.oracle.svm.core.configure.ConditionalElement; -import com.oracle.svm.core.configure.ConfigurationConditionResolver; -import com.oracle.svm.core.configure.ConfigurationParser; -import com.oracle.svm.core.configure.ProxyConfigurationParser; -import com.oracle.svm.core.util.VMError; +import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ProxyConfigurationParser; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import jdk.graal.compiler.util.json.JsonWriter; @@ -138,7 +137,9 @@ public static void printProxyInterfaces(JsonWriter writer, List(ConfigurationConditionResolver.identityResolver(), true, (cond, interfaces) -> interfaceLists.add(new ConditionalElement<>(cond, interfaces))); } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java index 954156f26801..959b302458b1 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java @@ -24,9 +24,9 @@ */ package com.oracle.svm.configure.config; -import static com.oracle.svm.core.configure.ConfigurationParser.BUNDLES_KEY; -import static com.oracle.svm.core.configure.ConfigurationParser.GLOBS_KEY; -import static com.oracle.svm.core.configure.ConfigurationParser.RESOURCES_KEY; +import static com.oracle.svm.configure.ConfigurationParser.BUNDLES_KEY; +import static com.oracle.svm.configure.ConfigurationParser.GLOBS_KEY; +import static com.oracle.svm.configure.ConfigurationParser.RESOURCES_KEY; import java.io.IOException; import java.util.Collection; @@ -42,15 +42,14 @@ import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; +import com.oracle.svm.configure.ConditionalElement; import com.oracle.svm.configure.ConfigurationBase; -import com.oracle.svm.core.configure.ConditionalElement; -import com.oracle.svm.core.configure.ConfigurationConditionResolver; -import com.oracle.svm.core.configure.ConfigurationParser; -import com.oracle.svm.core.configure.ResourceConfigurationParser; -import com.oracle.svm.core.configure.ResourcesRegistry; -import com.oracle.svm.core.jdk.Resources; -import com.oracle.svm.core.util.VMError; +import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ResourceConfigurationParser; +import com.oracle.svm.configure.ResourcesRegistry; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import com.oracle.svm.util.GlobUtils; +import com.oracle.svm.util.NativeImageResourcePathRepresentation; import jdk.graal.compiler.util.json.JsonPrinter; import jdk.graal.compiler.util.json.JsonWriter; @@ -77,17 +76,17 @@ public void addGlob(UnresolvedConfigurationCondition condition, String module, S @Override public void addResourceEntry(Module module, String resourcePath, Object origin) { - throw VMError.shouldNotReachHere("Unused function."); + throw new UnsupportedOperationException("Unused function."); } @Override public void addCondition(ConfigurationCondition condition, Module module, String resourcePath) { - throw VMError.shouldNotReachHere("Unused function."); + throw new UnsupportedOperationException("Unused function."); } @Override public void injectResource(Module module, String resourcePath, byte[] resourceContent, Object origin) { - VMError.shouldNotReachHere("Resource injection is only supported via Feature implementation"); + throw new UnsupportedOperationException("Resource injection is only supported via Feature implementation"); } @Override @@ -215,7 +214,7 @@ public void addGlobPattern(UnresolvedConfigurationCondition condition, String pa * prevent patterns discovered by the agent to be written in the non-canonical form. Example * canonical path: foo/1.txt; non-canonical path: foo/bar/../1.txt */ - String canonicalPattern = Resources.toCanonicalForm(pattern); + String canonicalPattern = NativeImageResourcePathRepresentation.toCanonicalForm(pattern); ResourceEntry element = new ResourceEntry(escapePossibleGlobWildcards(canonicalPattern), module); addedGlobs.add(new ConditionalElement<>(condition, element)); } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfiguration.java index 24df956eae32..5ec35005f8dd 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfiguration.java @@ -35,11 +35,11 @@ import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; +import com.oracle.svm.configure.ConditionalElement; import com.oracle.svm.configure.ConfigurationBase; -import com.oracle.svm.core.configure.ConditionalElement; -import com.oracle.svm.core.configure.ConfigurationConditionResolver; -import com.oracle.svm.core.configure.ConfigurationParser; -import com.oracle.svm.core.configure.SerializationConfigurationParser; +import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.SerializationConfigurationParser; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import jdk.graal.compiler.java.LambdaUtils; import jdk.graal.compiler.util.json.JsonPrinter; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfigurationLambdaCapturingType.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfigurationLambdaCapturingType.java index d797cdd42e58..37a4a4db8e41 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfigurationLambdaCapturingType.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfigurationLambdaCapturingType.java @@ -29,7 +29,7 @@ import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; -import com.oracle.svm.core.configure.SerializationConfigurationParser; +import com.oracle.svm.configure.SerializationConfigurationParser; import jdk.graal.compiler.util.json.JsonPrintable; import jdk.graal.compiler.util.json.JsonWriter; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfigurationType.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfigurationType.java index 99b429f4905b..141aa68d9346 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfigurationType.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfigurationType.java @@ -24,8 +24,8 @@ */ package com.oracle.svm.configure.config; -import static com.oracle.svm.core.configure.ConfigurationParser.NAME_KEY; -import static com.oracle.svm.core.configure.ConfigurationParser.TYPE_KEY; +import static com.oracle.svm.configure.ConfigurationParser.NAME_KEY; +import static com.oracle.svm.configure.ConfigurationParser.TYPE_KEY; import java.io.IOException; import java.util.Objects; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/TypeConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/TypeConfiguration.java index 21c970ab8d4c..193218490d53 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/TypeConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/TypeConfiguration.java @@ -34,14 +34,13 @@ import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; +import com.oracle.svm.configure.ConditionalElement; import com.oracle.svm.configure.ConfigurationBase; -import com.oracle.svm.core.configure.ConditionalElement; -import com.oracle.svm.core.configure.ConfigurationConditionResolver; -import com.oracle.svm.core.configure.ConfigurationParser; -import com.oracle.svm.core.configure.ConfigurationTypeDescriptor; -import com.oracle.svm.core.configure.NamedConfigurationTypeDescriptor; -import com.oracle.svm.core.configure.ReflectionConfigurationParser; -import com.oracle.svm.core.util.VMError; +import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationTypeDescriptor; +import com.oracle.svm.configure.NamedConfigurationTypeDescriptor; +import com.oracle.svm.configure.ReflectionConfigurationParser; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import jdk.graal.compiler.util.json.JsonWriter; @@ -108,7 +107,7 @@ public ConfigurationType get(UnresolvedConfigurationCondition condition, Configu public void add(ConfigurationType type) { ConfigurationType previous = types.putIfAbsent(new ConditionalElement<>(type.getCondition(), type.getTypeDescriptor()), type); if (previous != null && previous != type) { - VMError.shouldNotReachHere("Cannot replace existing type " + previous + " with " + type); + throw new IllegalArgumentException("Cannot replace existing type " + previous + " with " + type); } } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/ConditionalConfigurationComputer.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/ConditionalConfigurationComputer.java index 67ca5c4f4947..c3c703f750c9 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/ConditionalConfigurationComputer.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/ConditionalConfigurationComputer.java @@ -35,10 +35,9 @@ import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; import com.oracle.svm.configure.ConfigurationBase; +import com.oracle.svm.configure.ConfigurationFile; import com.oracle.svm.configure.config.ConfigurationSet; import com.oracle.svm.configure.filters.ComplexFilter; -import com.oracle.svm.core.configure.ConfigurationConditionResolver; -import com.oracle.svm.core.configure.ConfigurationFile; /** * Generates a {@link ConfigurationSet} from a {@link MethodCallNode tree of calling contexts}. This diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/ConditionalConfigurationPredicate.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/ConditionalConfigurationPredicate.java index d77ab9845a17..338a4ffe2af4 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/ConditionalConfigurationPredicate.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/ConditionalConfigurationPredicate.java @@ -28,6 +28,8 @@ import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; +import com.oracle.svm.configure.ConditionalElement; +import com.oracle.svm.configure.ConfigurationTypeDescriptor; import com.oracle.svm.configure.config.ConfigurationPredefinedClass; import com.oracle.svm.configure.config.ConfigurationType; import com.oracle.svm.configure.config.PredefinedClassesConfiguration; @@ -38,8 +40,6 @@ import com.oracle.svm.configure.config.SerializationConfigurationType; import com.oracle.svm.configure.config.TypeConfiguration; import com.oracle.svm.configure.filters.ComplexFilter; -import com.oracle.svm.core.configure.ConditionalElement; -import com.oracle.svm.core.configure.ConfigurationTypeDescriptor; public class ConditionalConfigurationPredicate implements TypeConfiguration.Predicate, ProxyConfiguration.Predicate, ResourceConfiguration.Predicate, SerializationConfiguration.Predicate, PredefinedClassesConfiguration.Predicate { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationConditionResolver.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/ConfigurationConditionResolver.java similarity index 92% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationConditionResolver.java rename to substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/ConfigurationConditionResolver.java index bfbba32b23cc..e4f595b557ed 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationConditionResolver.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/ConfigurationConditionResolver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,11 +22,11 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core.configure; +package com.oracle.svm.configure.config.conditional; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; -import com.oracle.svm.core.TypeResult; +import com.oracle.svm.util.TypeResult; public interface ConfigurationConditionResolver { diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/HumanReadableConfigurationWithOrigins.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/HumanReadableConfigurationWithOrigins.java index 08523fde5570..fc9cfe3a82a4 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/HumanReadableConfigurationWithOrigins.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/HumanReadableConfigurationWithOrigins.java @@ -30,7 +30,7 @@ import java.util.Set; import com.oracle.svm.configure.ConfigurationBase; -import com.oracle.svm.core.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationFile; import jdk.graal.compiler.util.json.JsonPrintable; import jdk.graal.compiler.util.json.JsonWriter; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/MethodCallNode.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/MethodCallNode.java index 169ddfb55c3f..bcb1ec4fd6b6 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/MethodCallNode.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/MethodCallNode.java @@ -32,7 +32,7 @@ import java.util.function.Consumer; import com.oracle.svm.configure.config.ConfigurationSet; -import com.oracle.svm.core.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationFile; /** * Models a call tree. Each node represents a method invocation, and each edge represents a call diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/PartialConfigurationWithOrigins.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/PartialConfigurationWithOrigins.java index 3bca5a3463fc..11ac0f573f7c 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/PartialConfigurationWithOrigins.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/PartialConfigurationWithOrigins.java @@ -33,8 +33,8 @@ import com.oracle.svm.configure.ConfigurationBase; import com.oracle.svm.configure.config.ConfigurationSet; -import com.oracle.svm.core.configure.ConfigurationFile; -import com.oracle.svm.core.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationParser; import jdk.graal.compiler.util.json.JsonParserException; import jdk.graal.compiler.util.json.JsonPrintable; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/FilterConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/FilterConfigurationParser.java index 39d5c1d5624a..4274be77ff4d 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/FilterConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/FilterConfigurationParser.java @@ -31,7 +31,7 @@ import org.graalvm.collections.EconomicMap; import org.graalvm.collections.MapCursor; -import com.oracle.svm.core.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationParser; import jdk.graal.compiler.util.json.JsonParserException; import jdk.graal.compiler.util.json.JsonWriter; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/HierarchyFilterNode.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/HierarchyFilterNode.java index dd89816eb3b2..13a02aefe5a8 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/HierarchyFilterNode.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/HierarchyFilterNode.java @@ -24,7 +24,7 @@ */ package com.oracle.svm.configure.filters; -import static com.oracle.svm.core.configure.ConfigurationParser.asList; +import static com.oracle.svm.configure.ConfigurationParser.asList; import java.io.IOException; import java.util.Arrays; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/RegexFilter.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/RegexFilter.java index 423aaf21a40b..79b69af3695c 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/RegexFilter.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/RegexFilter.java @@ -24,7 +24,7 @@ */ package com.oracle.svm.configure.filters; -import static com.oracle.svm.core.configure.ConfigurationParser.asList; +import static com.oracle.svm.configure.ConfigurationParser.asList; import java.io.IOException; import java.util.ArrayList; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/trace/JsonFileWriter.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/trace/JsonFileWriter.java index 72e238ca9b5a..ad967471d6fa 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/trace/JsonFileWriter.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/trace/JsonFileWriter.java @@ -35,8 +35,6 @@ import org.graalvm.collections.EconomicMap; import org.graalvm.collections.MapCursor; -import com.oracle.svm.core.util.VMError; - import jdk.graal.compiler.util.json.JsonWriter; public class JsonFileWriter implements Closeable { @@ -75,7 +73,7 @@ public void printObject(EconomicMap entry) { } writeEntry(str.toString()); } catch (IOException e) { - throw VMError.shouldNotReachHere(e); + throw new RuntimeException("StringWriter should not throw IOExceptions", e); } } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/trace/ReflectionProcessor.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/trace/ReflectionProcessor.java index d395b443211d..117d4234bfdb 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/trace/ReflectionProcessor.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/trace/ReflectionProcessor.java @@ -33,6 +33,9 @@ import org.graalvm.collections.EconomicMap; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; +import com.oracle.svm.configure.ConfigurationTypeDescriptor; +import com.oracle.svm.configure.NamedConfigurationTypeDescriptor; +import com.oracle.svm.configure.ProxyConfigurationTypeDescriptor; import com.oracle.svm.configure.config.ConfigurationMemberInfo.ConfigurationMemberAccessibility; import com.oracle.svm.configure.config.ConfigurationMemberInfo.ConfigurationMemberDeclaration; import com.oracle.svm.configure.config.ConfigurationMethod; @@ -41,9 +44,6 @@ import com.oracle.svm.configure.config.ResourceConfiguration; import com.oracle.svm.configure.config.SignatureUtil; import com.oracle.svm.configure.config.TypeConfiguration; -import com.oracle.svm.core.configure.ConfigurationTypeDescriptor; -import com.oracle.svm.core.configure.NamedConfigurationTypeDescriptor; -import com.oracle.svm.core.configure.ProxyConfigurationTypeDescriptor; import jdk.graal.compiler.phases.common.LazyValue; import jdk.vm.ci.meta.MetaUtil; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/trace/SerializationProcessor.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/trace/SerializationProcessor.java index d2d88cd72522..2b48e973f745 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/trace/SerializationProcessor.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/trace/SerializationProcessor.java @@ -32,10 +32,10 @@ import org.graalvm.collections.EconomicMap; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; +import com.oracle.svm.configure.NamedConfigurationTypeDescriptor; import com.oracle.svm.configure.config.ConfigurationSet; import com.oracle.svm.configure.config.SerializationConfiguration; import com.oracle.svm.configure.config.TypeConfiguration; -import com.oracle.svm.core.configure.NamedConfigurationTypeDescriptor; import jdk.graal.compiler.java.LambdaUtils; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationFiles.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationFiles.java index de655e4818c0..05e9c261758d 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationFiles.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationFiles.java @@ -37,6 +37,7 @@ import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; +import com.oracle.svm.configure.ConfigurationFile; import com.oracle.svm.core.option.AccumulatingLocatableMultiOptionValue; import com.oracle.svm.core.option.BundleMember; import com.oracle.svm.core.option.HostedOptionKey; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/SubstrateAllocationSnippets.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/SubstrateAllocationSnippets.java index f91f621ebae8..6a0918d8e308 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/SubstrateAllocationSnippets.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/SubstrateAllocationSnippets.java @@ -40,12 +40,12 @@ import org.graalvm.word.LocationIdentity; import org.graalvm.word.UnsignedWord; +import com.oracle.svm.configure.ConfigurationFile; import com.oracle.svm.core.MissingRegistrationUtils; import com.oracle.svm.core.SubstrateOptions; import com.oracle.svm.core.allocationprofile.AllocationCounter; import com.oracle.svm.core.allocationprofile.AllocationSite; import com.oracle.svm.core.config.ConfigurationValues; -import com.oracle.svm.core.configure.ConfigurationFile; import com.oracle.svm.core.graal.meta.KnownOffsets; import com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider; import com.oracle.svm.core.graal.nodes.NewPodInstanceNode; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaNetHttpFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaNetHttpFeature.java index 7691f8d08206..a36b46ba346c 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaNetHttpFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaNetHttpFeature.java @@ -31,7 +31,7 @@ import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; -import com.oracle.svm.core.configure.ResourcesRegistry; +import com.oracle.svm.configure.ResourcesRegistry; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java index 614ab5cb7b6d..55e9ffad8346 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java @@ -29,7 +29,6 @@ import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -62,7 +61,6 @@ import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.jdk.resources.MissingResourceRegistrationError; import com.oracle.svm.core.jdk.resources.MissingResourceRegistrationUtils; -import com.oracle.svm.core.jdk.resources.NativeImageResourcePath; import com.oracle.svm.core.jdk.resources.ResourceExceptionEntry; import com.oracle.svm.core.jdk.resources.ResourceStorageEntry; import com.oracle.svm.core.jdk.resources.ResourceStorageEntryBase; @@ -77,6 +75,7 @@ import com.oracle.svm.core.util.VMError; import com.oracle.svm.util.GlobUtils; import com.oracle.svm.util.LogUtils; +import com.oracle.svm.util.NativeImageResourcePathRepresentation; /** * Support for resources on Substrate VM. All resources that need to be available at run time need @@ -332,15 +331,6 @@ private static String handleEscapedCharacters(String pattern) { return pattern; } - /** - * Avoid pulling native file system by using {@link NativeImageResourcePath} implementation to - * convert resourceName to canonical variant. - */ - public static String toCanonicalForm(String resourceName) { - NativeImageResourcePath path = new NativeImageResourcePath(null, removeTrailingSlash(resourceName).getBytes(StandardCharsets.UTF_8), true); - return new String(NativeImageResourcePath.getResolved(path)); - } - private static boolean hasTrailingSlash(String resourceName) { return resourceName.endsWith("/"); } @@ -365,7 +355,7 @@ public static ResourceStorageEntryBase getAtRuntime(String name, boolean throwOn */ public static ResourceStorageEntryBase getAtRuntime(Module module, String resourceName, boolean throwOnMissing) { VMError.guarantee(ImageInfo.inImageRuntimeCode(), "This function should be used only at runtime."); - String canonicalResourceName = toCanonicalForm(resourceName); + String canonicalResourceName = NativeImageResourcePathRepresentation.toCanonicalForm(resourceName); String moduleName = moduleName(module); ConditionalRuntimeValue entry = getEntry(module, canonicalResourceName); if (entry == null) { @@ -515,7 +505,7 @@ public static Enumeration createURLs(Module module, String resourceName) { boolean missingMetadata = true; List resourcesURLs = new ArrayList<>(); - String canonicalResourceName = toCanonicalForm(resourceName); + String canonicalResourceName = NativeImageResourcePathRepresentation.toCanonicalForm(resourceName); boolean shouldAppendTrailingSlash = hasTrailingSlash(resourceName); /* If moduleName was unspecified we have to consider all modules in the image */ diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationSupport.java index e70cb02214d9..2d31d0567714 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationSupport.java @@ -34,7 +34,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.IllformedLocaleException; import java.util.List; import java.util.Locale; import java.util.Map; @@ -259,29 +258,6 @@ public boolean isNotIncluded(String bundleName) { return false; } - /** - * @return locale for given tag or null for invalid ones - */ - @SuppressWarnings("deprecation") - public static Locale parseLocaleFromTag(String tag) { - try { - return new Locale.Builder().setLanguageTag(tag).build(); - } catch (IllformedLocaleException ex) { - /*- Custom made locales consisting of at most three parts separated by '-' are also supported */ - String[] parts = tag.split("-"); - switch (parts.length) { - case 1: - return new Locale(parts[0]); - case 2: - return new Locale(parts[0], parts[1]); - case 3: - return new Locale(parts[0], parts[1], parts[2]); - default: - return null; - } - } - } - public void prepareClassResourceBundle(@SuppressWarnings("unused") String basename, Class bundleClass) { registerNullaryConstructor(bundleClass); onClassBundlePrepared(bundleClass); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/OptimizedLocalizationSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/OptimizedLocalizationSupport.java index 9d78333a9b85..9ea7c8fec433 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/OptimizedLocalizationSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/OptimizedLocalizationSupport.java @@ -40,6 +40,7 @@ import org.graalvm.nativeimage.Platforms; import com.oracle.svm.core.util.UserError; +import com.oracle.svm.util.LocaleUtil; import com.oracle.svm.util.ReflectionUtil; import sun.util.locale.provider.LocaleProviderAdapter; @@ -118,7 +119,7 @@ private static Locale extractLocale(Class bundleClass) { if (split == -1) { return Locale.ROOT; } - return parseLocaleFromTag(name.substring(split + 1)); + return LocaleUtil.parseLocaleFromTag(name.substring(split + 1)); } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/NativeImageResourcePath.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/NativeImageResourcePath.java index 62329e353946..42000c44f82c 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/NativeImageResourcePath.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/resources/NativeImageResourcePath.java @@ -48,7 +48,6 @@ import java.nio.file.FileAlreadyExistsException; import java.nio.file.FileStore; import java.nio.file.Files; -import java.nio.file.InvalidPathException; import java.nio.file.LinkOption; import java.nio.file.NoSuchFileException; import java.nio.file.OpenOption; @@ -67,67 +66,25 @@ import java.util.NoSuchElementException; import java.util.Set; +import com.oracle.svm.util.NativeImageResourcePathRepresentation; + /** *

* Most of the code from this class is a copy of jdk.nio.zipfs.ZipPath with small tweaks. The main * reason why we cannot reuse this class is that this class is final in its original implementation. *

*/ -public class NativeImageResourcePath implements Path { +public class NativeImageResourcePath extends NativeImageResourcePathRepresentation implements Path { private final NativeImageResourceFileSystem fileSystem; - private final byte[] path; - private volatile int[] offsets; - private byte[] resolved; - private int hashcode = 0; public NativeImageResourcePath(NativeImageResourceFileSystem fileSystem, byte[] resourcePath) { this(fileSystem, resourcePath, false); } public NativeImageResourcePath(NativeImageResourceFileSystem fileSystem, byte[] resourcePath, boolean normalized) { + super(resourcePath, normalized); this.fileSystem = fileSystem; - if (normalized) { - this.path = resourcePath; - } else { - this.path = normalize(resourcePath); - } - } - - private void initOffsets() { - if (this.offsets == null) { - int count = 0; - int index = 0; - while (index < path.length) { - byte c = path[index++]; - if (c != '/') { - count++; - while (index < path.length && path[index] != '/') { - index++; - } - } - } - int[] result = new int[count]; - count = 0; - index = 0; - while (index < path.length) { - int m = path[index]; - if (m == '/') { - index++; - } else { - result[count++] = index++; - while (index < path.length && path[index] != '/') { - index++; - } - } - } - - synchronized (this) { - if (offsets == null) { - offsets = result; - } - } - } } @Override @@ -185,12 +142,6 @@ public NativeImageResourcePath getParent() { return new NativeImageResourcePath(fileSystem, newPath); } - @Override - public int getNameCount() { - initOffsets(); - return offsets.length; - } - @Override public Path getName(int index) { initOffsets(); @@ -477,15 +428,6 @@ public int compareTo(Path other) { return l1 - l2; } - @Override - public int hashCode() { - int h = hashcode; - if (h == 0) { - hashcode = h = Arrays.hashCode(path); - } - return h; - } - @Override public boolean equals(Object obj) { return obj instanceof NativeImageResourcePath && @@ -548,55 +490,6 @@ byte[] getResolvedPath() { return resolved; } - private byte[] normalize(byte[] resourcePath) { - if (resourcePath.length == 0) { - return resourcePath; - } - int i = 0; - for (int j = 0; j < resourcePath.length; j++) { - int k = resourcePath[j]; - if (k == '\\' || (k == '/' && j == resourcePath.length - 1)) { - return normalize(resourcePath, j); - } - if ((k == '/') && (i == '/')) { - return normalize(resourcePath, j - 1); - } - if (k == 0) { - throw new InvalidPathException(fileSystem.getString(resourcePath), "Path: nul character not allowed"); - } - i = k; - } - return resourcePath; - } - - private byte[] normalize(byte[] resourcePath, int index) { - byte[] arrayOfByte = new byte[resourcePath.length]; - int i = 0; - while (i < index) { - arrayOfByte[i] = resourcePath[i]; - i++; - } - int j = i; - int k = 0; - while (i < resourcePath.length) { - int m = resourcePath[i++]; - if (m == '\\') { - m = '/'; - } - if ((m != '/') || (k != '/')) { - if (m == 0) { - throw new InvalidPathException(fileSystem.getString(resourcePath), "Path: nul character not allowed"); - } - arrayOfByte[j++] = (byte) m; - k = m; - } - } - if ((j > 1) && (arrayOfByte[j - 1] == '/')) { - j--; - } - return j == arrayOfByte.length ? arrayOfByte : Arrays.copyOf(arrayOfByte, j); - } - private byte[] getResolved() { if (path.length == 0) { return path; @@ -609,57 +502,6 @@ private byte[] getResolved() { return path; } - public static byte[] getResolved(NativeImageResourcePath p) { - int nc = p.getNameCount(); - byte[] path = p.path; - int[] offsets = p.offsets; - byte[] to = new byte[path.length]; - int[] lastM = new int[nc]; - int lastMOff = -1; - int m = 0; - for (int i = 0; i < nc; i++) { - int n = offsets[i]; - int len = (i == offsets.length - 1) ? (path.length - n) : (offsets[i + 1] - n - 1); - if (len == 1 && path[n] == (byte) '.') { - if (m == 0 && path[0] == '/') { // absolute path - to[m++] = '/'; - } - continue; - } - if (len == 2 && path[n] == '.' && path[n + 1] == '.') { - if (lastMOff >= 0) { - m = lastM[lastMOff--]; // retreat - continue; - } - if (path[0] == '/') { // "/../xyz" skip - if (m == 0) { - to[m++] = '/'; - } - } else { // "../xyz" -> "../xyz" - if (m != 0 && to[m - 1] != '/') { - to[m++] = '/'; - } - while (len-- > 0) { - to[m++] = path[n++]; - } - } - continue; - } - if (m == 0 && path[0] == '/' || // absolute path - m != 0 && to[m - 1] != '/') { // not the first name - to[m++] = '/'; - } - lastM[++lastMOff] = m; - while (len-- > 0) { - to[m++] = path[n++]; - } - } - if (m > 1 && to[m - 1] == '/') { - m--; - } - return (m == to.length) ? to : Arrays.copyOf(to, m); - } - private static boolean equalsNameAt(NativeImageResourcePath p1, NativeImageResourcePath p2, int index) { int beg1 = p1.offsets[index]; int len1; diff --git a/substratevm/src/com.oracle.svm.driver/src/com/oracle/svm/driver/metainf/MetaInfFileType.java b/substratevm/src/com.oracle.svm.driver/src/com/oracle/svm/driver/metainf/MetaInfFileType.java index c1ac9796cb93..22bf910e516e 100644 --- a/substratevm/src/com.oracle.svm.driver/src/com/oracle/svm/driver/metainf/MetaInfFileType.java +++ b/substratevm/src/com.oracle.svm.driver/src/com/oracle/svm/driver/metainf/MetaInfFileType.java @@ -24,11 +24,11 @@ */ package com.oracle.svm.driver.metainf; -import jdk.graal.compiler.options.OptionKey; - -import com.oracle.svm.core.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationFile; import com.oracle.svm.core.configure.ConfigurationFiles; +import jdk.graal.compiler.options.OptionKey; + public enum MetaInfFileType { Properties(null, NativeImageMetaInfWalker.nativeImagePropertiesFilename), ReachabilityMetadata(ConfigurationFiles.Options.ReachabilityMetadataResources, ConfigurationFile.REACHABILITY_METADATA.getFileName()), diff --git a/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/ForeignFunctionsConfigurationParser.java b/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/ForeignFunctionsConfigurationParser.java index 2e54be64d97f..611440f8f360 100644 --- a/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/ForeignFunctionsConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/ForeignFunctionsConfigurationParser.java @@ -44,7 +44,8 @@ import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeForeignAccessSupport; -import com.oracle.svm.core.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationParserOption; import com.oracle.svm.core.util.BasedOnJDKFile; import com.oracle.svm.core.util.UserError; import com.oracle.svm.hosted.ImageClassLoader; diff --git a/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/ForeignFunctionsFeature.java b/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/ForeignFunctionsFeature.java index 876d70268fba..7963f68da239 100644 --- a/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/ForeignFunctionsFeature.java +++ b/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/ForeignFunctionsFeature.java @@ -61,13 +61,13 @@ import com.oracle.graal.pointsto.meta.AnalysisMethod; import com.oracle.graal.pointsto.meta.AnalysisUniverse; +import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationParser; import com.oracle.svm.core.LinkToNativeSupport; import com.oracle.svm.core.OS; import com.oracle.svm.core.SubstrateOptions; import com.oracle.svm.core.SubstrateUtil; -import com.oracle.svm.core.configure.ConfigurationFile; import com.oracle.svm.core.configure.ConfigurationFiles; -import com.oracle.svm.core.configure.ConfigurationParser; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.foreign.AbiUtils; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassPredefinitionFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassPredefinitionFeature.java index ae401c9fd08e..f5cf79135b8d 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassPredefinitionFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassPredefinitionFeature.java @@ -44,10 +44,10 @@ import org.graalvm.nativeimage.hosted.RuntimeClassInitialization; import com.oracle.graal.pointsto.meta.AnalysisType; -import com.oracle.svm.core.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.PredefinedClassesConfigurationParser; +import com.oracle.svm.configure.PredefinedClassesRegistry; import com.oracle.svm.core.configure.ConfigurationFiles; -import com.oracle.svm.core.configure.PredefinedClassesConfigurationParser; -import com.oracle.svm.core.configure.PredefinedClassesRegistry; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.hub.PredefinedClassesSupport; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ConfigurationTypeResolver.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ConfigurationTypeResolver.java index 1d01f8ee8717..bfbabe92d6cb 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ConfigurationTypeResolver.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ConfigurationTypeResolver.java @@ -24,8 +24,8 @@ */ package com.oracle.svm.hosted; -import com.oracle.svm.core.TypeResult; import com.oracle.svm.util.LogUtils; +import com.oracle.svm.util.TypeResult; import jdk.vm.ci.meta.MetaUtil; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ImageClassLoader.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ImageClassLoader.java index d75fbfbd7707..c099c98e886e 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ImageClassLoader.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ImageClassLoader.java @@ -49,10 +49,10 @@ import com.oracle.svm.core.BuildPhaseProvider; import com.oracle.svm.core.SubstrateOptions; -import com.oracle.svm.core.TypeResult; import com.oracle.svm.core.util.VMError; import com.oracle.svm.util.LogUtils; import com.oracle.svm.util.ReflectionUtil; +import com.oracle.svm.util.TypeResult; import jdk.graal.compiler.debug.GraalError; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java index f643775f994d..1b72b757adc2 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java @@ -34,7 +34,6 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; -import java.nio.file.FileSystem; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -61,6 +60,10 @@ import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeResourceSupport; +import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.ResourceConfigurationParser; +import com.oracle.svm.configure.ResourcesRegistry; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import com.oracle.svm.core.BuildArtifacts; import com.oracle.svm.core.ClassLoaderSupport; import com.oracle.svm.core.ClassLoaderSupport.ConditionWithOrigin; @@ -69,11 +72,7 @@ import com.oracle.svm.core.ParsingReason; import com.oracle.svm.core.SubstrateOptions; import com.oracle.svm.core.SubstrateUtil; -import com.oracle.svm.core.configure.ConfigurationConditionResolver; -import com.oracle.svm.core.configure.ConfigurationFile; import com.oracle.svm.core.configure.ConfigurationFiles; -import com.oracle.svm.core.configure.ResourceConfigurationParser; -import com.oracle.svm.core.configure.ResourcesRegistry; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.jdk.Resources; @@ -99,6 +98,7 @@ import com.oracle.svm.util.GlobUtils; import com.oracle.svm.util.LogUtils; import com.oracle.svm.util.ModuleSupport; +import com.oracle.svm.util.NativeImageResourcePathRepresentation; import com.oracle.svm.util.ReflectionUtil; import jdk.graal.compiler.nodes.ValueNode; @@ -125,10 +125,10 @@ * *

* The {@link NativeImageResourceFileSystemProvider} provides most of the functionality of a - * {@link FileSystem}. It is an in-memory file system that upon creation contains a copy of the - * resources included in the native-image. Note that changes to files do not affect actual resources - * returned by resource manipulation methods like `Class.getResource`. Upon being closed, all - * changes are discarded. + * {@link java.nio.file.FileSystem}. It is an in-memory file system that upon creation contains a + * copy of the resources included in the native-image. Note that changes to files do not affect + * actual resources returned by resource manipulation methods like `Class.getResource`. Upon being + * closed, all changes are discarded. *

* *

@@ -193,7 +193,7 @@ public void addResources(ConfigurationCondition condition, String pattern, Objec @Override public void addGlob(ConfigurationCondition condition, String module, String glob, Object origin) { - String canonicalGlob = Resources.toCanonicalForm(glob); + String canonicalGlob = NativeImageResourcePathRepresentation.toCanonicalForm(glob); String resolvedGlob = GlobUtils.transformToTriePath(canonicalGlob, module); globWorkSet.add(new ConditionalPattern(condition, resolvedGlob, origin)); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java index 9ead19adde97..1e97695676ff 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java @@ -92,7 +92,6 @@ import com.oracle.svm.core.BuildPhaseProvider; import com.oracle.svm.core.SubstrateOptions; import com.oracle.svm.core.SubstrateUtil; -import com.oracle.svm.core.TypeResult; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.fieldvaluetransformer.FieldValueTransformerWithAvailability; @@ -109,6 +108,7 @@ import com.oracle.svm.hosted.c.NativeLibraries; import com.oracle.svm.util.ModuleSupport; import com.oracle.svm.util.ReflectionUtil; +import com.oracle.svm.util.TypeResult; import jdk.graal.compiler.debug.Assertions; import jdk.graal.compiler.options.Option; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java index c1af19efa6ff..4953bbff30ef 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java @@ -44,20 +44,20 @@ import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.ReflectionRegistry; +import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; -import com.oracle.svm.core.configure.ConfigurationConditionResolver; -import com.oracle.svm.core.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ReflectionConfigurationParser; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import com.oracle.svm.core.configure.ConfigurationFiles; -import com.oracle.svm.core.configure.ConfigurationParser; -import com.oracle.svm.core.configure.ReflectionConfigurationParser; -import com.oracle.svm.core.option.HostedOptionKey; import com.oracle.svm.core.option.AccumulatingLocatableMultiOptionValue; +import com.oracle.svm.core.option.HostedOptionKey; import com.oracle.svm.core.util.UserError; import com.oracle.svm.hosted.ImageClassLoader; import com.oracle.svm.hosted.reflect.proxy.ProxyRegistry; import jdk.graal.compiler.util.json.JsonParserException; -import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; public final class ConfigurationParserUtils { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ReflectionRegistryAdapter.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ReflectionRegistryAdapter.java index 58b71e955769..f0679425fc82 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ReflectionRegistryAdapter.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ReflectionRegistryAdapter.java @@ -31,12 +31,12 @@ import org.graalvm.nativeimage.impl.RuntimeReflectionSupport; import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; -import com.oracle.svm.core.TypeResult; -import com.oracle.svm.core.configure.ConfigurationTypeDescriptor; -import com.oracle.svm.core.configure.NamedConfigurationTypeDescriptor; +import com.oracle.svm.configure.ConfigurationTypeDescriptor; +import com.oracle.svm.configure.NamedConfigurationTypeDescriptor; import com.oracle.svm.hosted.ImageClassLoader; import com.oracle.svm.hosted.reflect.ReflectionDataBuilder; import com.oracle.svm.hosted.reflect.proxy.ProxyRegistry; +import com.oracle.svm.util.TypeResult; public class ReflectionRegistryAdapter extends RegistryAdapter { private final RuntimeReflectionSupport reflectionSupport; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/RegistryAdapter.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/RegistryAdapter.java index 6766d62d1593..abf03ac5e410 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/RegistryAdapter.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/RegistryAdapter.java @@ -38,16 +38,16 @@ import org.graalvm.nativeimage.impl.RuntimeReflectionSupport; import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; -import com.oracle.svm.core.TypeResult; -import com.oracle.svm.core.configure.ConfigurationTypeDescriptor; -import com.oracle.svm.core.configure.NamedConfigurationTypeDescriptor; -import com.oracle.svm.core.configure.ProxyConfigurationTypeDescriptor; -import com.oracle.svm.core.configure.ReflectionConfigurationParserDelegate; +import com.oracle.svm.configure.ConfigurationTypeDescriptor; +import com.oracle.svm.configure.NamedConfigurationTypeDescriptor; +import com.oracle.svm.configure.ProxyConfigurationTypeDescriptor; +import com.oracle.svm.configure.ReflectionConfigurationParserDelegate; import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry; import com.oracle.svm.core.util.VMError; import com.oracle.svm.hosted.ImageClassLoader; import com.oracle.svm.hosted.reflect.proxy.ProxyRegistry; import com.oracle.svm.util.ClassUtil; +import com.oracle.svm.util.TypeResult; public class RegistryAdapter implements ReflectionConfigurationParserDelegate> { private final ReflectionRegistry registry; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/HostedImageLayerBuildingSupport.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/HostedImageLayerBuildingSupport.java index efd209d08a27..5dfc0b54484b 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/HostedImageLayerBuildingSupport.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/HostedImageLayerBuildingSupport.java @@ -40,7 +40,6 @@ import com.oracle.graal.pointsto.util.AnalysisError; import com.oracle.svm.core.BuildArtifacts; import com.oracle.svm.core.SubstrateOptions; -import com.oracle.svm.core.TypeResult; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.option.AccumulatingLocatableMultiOptionValue; import com.oracle.svm.core.option.HostedOptionKey; @@ -56,6 +55,7 @@ import com.oracle.svm.hosted.c.NativeLibraries; import com.oracle.svm.hosted.driver.IncludeOptionsSupport; import com.oracle.svm.hosted.driver.LayerOptionsSupport.LayerOption; +import com.oracle.svm.util.TypeResult; import jdk.graal.compiler.core.common.SuppressFBWarnings; import jdk.graal.compiler.options.OptionKey; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JDKInitializationFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JDKInitializationFeature.java index a99cc1c0652e..5d0f9a370799 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JDKInitializationFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JDKInitializationFeature.java @@ -31,12 +31,12 @@ import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; import com.oracle.svm.core.ParsingReason; -import com.oracle.svm.core.TypeResult; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.hosted.FeatureImpl.AfterRegistrationAccessImpl; import com.oracle.svm.hosted.ImageClassLoader; import com.oracle.svm.util.ReflectionUtil; +import com.oracle.svm.util.TypeResult; import jdk.graal.compiler.nodes.ValueNode; import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxServerFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxServerFeature.java index da1c3bad6e28..50367d43c976 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxServerFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxServerFeature.java @@ -38,7 +38,7 @@ import org.graalvm.nativeimage.impl.ConfigurationCondition; import com.oracle.svm.core.VMInspectionOptions; -import com.oracle.svm.core.configure.ResourcesRegistry; +import com.oracle.svm.configure.ResourcesRegistry; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.jdk.NativeLibrarySupport; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/localization/LocalizationFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/localization/LocalizationFeature.java index a5f71e2ec257..b9750af8e9bd 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/localization/LocalizationFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/localization/LocalizationFeature.java @@ -84,6 +84,7 @@ import com.oracle.svm.hosted.FeatureImpl.DuringAnalysisAccessImpl; import com.oracle.svm.hosted.FeatureImpl.DuringSetupAccessImpl; import com.oracle.svm.hosted.ImageClassLoader; +import com.oracle.svm.util.LocaleUtil; import com.oracle.svm.util.LogUtils; import jdk.graal.compiler.nodes.ValueNode; @@ -385,7 +386,7 @@ private static Set processLocalesOption() { } List invalid = new ArrayList<>(); for (String tag : Options.IncludeLocales.getValue().values()) { - Locale locale = LocalizationSupport.parseLocaleFromTag(tag); + Locale locale = LocaleUtil.parseLocaleFromTag(tag); if (locale != null) { locales.add(locale); } else { @@ -548,7 +549,7 @@ private void processRequestedBundle(String input) { int splitIndex = input.indexOf('_'); boolean specificLocaleRequested = splitIndex != -1; if (specificLocaleRequested) { - Locale locale = splitIndex + 1 < input.length() ? LocalizationSupport.parseLocaleFromTag(input.substring(splitIndex + 1)) : Locale.ROOT; + Locale locale = splitIndex + 1 < input.length() ? LocaleUtil.parseLocaleFromTag(input.substring(splitIndex + 1)) : Locale.ROOT; if (locale != null) { /* Get rid of locale specific suffix. */ String baseName = input.substring(0, splitIndex); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java index ec4b611b5195..6db907d0b1b6 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java @@ -24,7 +24,7 @@ */ package com.oracle.svm.hosted.jni; -import static com.oracle.svm.core.configure.ConfigurationParser.JNI_KEY; +import static com.oracle.svm.configure.ConfigurationParser.JNI_KEY; import java.lang.reflect.Executable; import java.lang.reflect.Field; @@ -61,13 +61,13 @@ import com.oracle.graal.pointsto.meta.AnalysisMethod; import com.oracle.graal.pointsto.meta.AnalysisType; import com.oracle.graal.pointsto.meta.AnalysisUniverse; +import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.ReflectionConfigurationParser; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import com.oracle.svm.core.StaticFieldsSupport; import com.oracle.svm.core.SubstrateOptions; import com.oracle.svm.core.config.ObjectLayout; -import com.oracle.svm.core.configure.ConfigurationConditionResolver; -import com.oracle.svm.core.configure.ConfigurationFile; import com.oracle.svm.core.configure.ConfigurationFiles; -import com.oracle.svm.core.configure.ReflectionConfigurationParser; import com.oracle.svm.core.graal.meta.KnownOffsets; import com.oracle.svm.core.jni.CallVariant; import com.oracle.svm.core.jni.JNIJavaCallTrampolineHolder; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/NativeImageConditionResolver.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/NativeImageConditionResolver.java index e6950f3be22a..2912bd94558c 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/NativeImageConditionResolver.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/NativeImageConditionResolver.java @@ -27,11 +27,11 @@ import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; -import com.oracle.svm.core.TypeResult; -import com.oracle.svm.core.configure.ConfigurationConditionResolver; -import com.oracle.svm.core.configure.ConfigurationTypeDescriptor; +import com.oracle.svm.configure.ConfigurationTypeDescriptor; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import com.oracle.svm.hosted.ImageClassLoader; import com.oracle.svm.hosted.classinitialization.ClassInitializationSupport; +import com.oracle.svm.util.TypeResult; public class NativeImageConditionResolver implements ConfigurationConditionResolver { private final ImageClassLoader classLoader; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java index cc26f8e8604f..0c2ef3583140 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java @@ -24,7 +24,7 @@ */ package com.oracle.svm.hosted.reflect; -import static com.oracle.svm.core.configure.ConfigurationParser.REFLECTION_KEY; +import static com.oracle.svm.configure.ConfigurationParser.REFLECTION_KEY; import java.lang.invoke.MethodHandle; import java.lang.reflect.Constructor; @@ -56,9 +56,9 @@ import com.oracle.svm.core.ParsingReason; import com.oracle.svm.core.SubstrateOptions; import com.oracle.svm.core.annotate.Delete; -import com.oracle.svm.core.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationFile; import com.oracle.svm.core.configure.ConfigurationFiles; -import com.oracle.svm.core.configure.ReflectionConfigurationParser; +import com.oracle.svm.configure.ReflectionConfigurationParser; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.fieldvaluetransformer.FieldValueTransformerWithAvailability; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/DynamicProxyFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/DynamicProxyFeature.java index 04e96e716b3f..6dfd899cad18 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/DynamicProxyFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/DynamicProxyFeature.java @@ -30,10 +30,10 @@ import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport; -import com.oracle.svm.core.configure.ConfigurationConditionResolver; -import com.oracle.svm.core.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.ProxyConfigurationParser; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import com.oracle.svm.core.configure.ConfigurationFiles; -import com.oracle.svm.core.configure.ProxyConfigurationParser; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java index c2e1c09821e7..5ee70950a532 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java @@ -58,10 +58,10 @@ import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; import com.oracle.graal.pointsto.util.GraalAccess; -import com.oracle.svm.core.configure.ConfigurationConditionResolver; -import com.oracle.svm.core.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.SerializationConfigurationParser; +import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import com.oracle.svm.core.configure.ConfigurationFiles; -import com.oracle.svm.core.configure.SerializationConfigurationParser; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.reflect.SubstrateConstructorAccessor; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/ReflectionPlugins.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/ReflectionPlugins.java index b8c81501d43c..cfc0ee9a8af0 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/ReflectionPlugins.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/ReflectionPlugins.java @@ -56,7 +56,6 @@ import com.oracle.graal.pointsto.meta.AnalysisUniverse; import com.oracle.svm.core.MissingRegistrationUtils; import com.oracle.svm.core.ParsingReason; -import com.oracle.svm.core.TypeResult; import com.oracle.svm.core.annotate.Delete; import com.oracle.svm.core.hub.PredefinedClassesSupport; import com.oracle.svm.core.jdk.StackTraceUtils; @@ -71,6 +70,7 @@ import com.oracle.svm.hosted.substitute.DeletedElementException; import com.oracle.svm.util.ModuleSupport; import com.oracle.svm.util.ReflectionUtil; +import com.oracle.svm.util.TypeResult; import jdk.graal.compiler.debug.GraalError; import jdk.graal.compiler.nodes.ConstantNode; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java index 995db3578688..68ca0b5304c0 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java @@ -35,7 +35,7 @@ import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; -import com.oracle.svm.core.configure.ResourcesRegistry; +import com.oracle.svm.configure.ResourcesRegistry; import com.oracle.svm.core.jdk.JNIRegistrationUtil; import com.oracle.svm.hosted.FeatureImpl; import com.oracle.svm.hosted.classinitialization.ClassInitializationSupport; diff --git a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/AbstractMethodListParser.java b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/AbstractMethodListParser.java index c7f8424cf1e7..f48a6b53ad95 100644 --- a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/AbstractMethodListParser.java +++ b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/AbstractMethodListParser.java @@ -29,7 +29,7 @@ import com.oracle.graal.pointsto.meta.AnalysisMethod; import com.oracle.graal.pointsto.meta.AnalysisType; import com.oracle.graal.pointsto.meta.AnalysisUniverse; -import com.oracle.svm.core.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationParser; import com.oracle.svm.hosted.ImageClassLoader; import com.oracle.svm.truffle.tck.PermissionsFeature.AnalysisMethodNode; import jdk.graal.compiler.util.json.JsonParserException; 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 a7efe99121a1..7c0a21977198 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/LocaleUtil.java b/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/LocaleUtil.java new file mode 100644 index 000000000000..8e49c5dd1237 --- /dev/null +++ b/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/LocaleUtil.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2025, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.svm.util; + +import java.util.IllformedLocaleException; +import java.util.Locale; + +public class LocaleUtil { + + /** + * @return locale for given tag or null for invalid ones + */ + @SuppressWarnings("deprecation") + public static Locale parseLocaleFromTag(String tag) { + try { + return new Locale.Builder().setLanguageTag(tag).build(); + } catch (IllformedLocaleException ex) { + /*- Custom made locales consisting of at most three parts separated by '-' are also supported */ + String[] parts = tag.split("-"); + switch (parts.length) { + case 1: + return new Locale(parts[0]); + case 2: + return new Locale(parts[0], parts[1]); + case 3: + return new Locale(parts[0], parts[1], parts[2]); + default: + return null; + } + } + } +} diff --git a/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/NativeImageResourcePathRepresentation.java b/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/NativeImageResourcePathRepresentation.java new file mode 100644 index 000000000000..d19ea0bbcab0 --- /dev/null +++ b/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/NativeImageResourcePathRepresentation.java @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2025, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.svm.util; + +import java.nio.charset.StandardCharsets; +import java.nio.file.InvalidPathException; +import java.util.Arrays; + +/** + * The representation of a resource path in Native Image. This class is used by SVM core to + * implement a {@link java.nio.file.Path}. The representation is defined here separately so that + * non-core packages can perform path normalization without depending on the implementation in core. + *

+ * Most of the code from this class is a copy of jdk.nio.zipfs.ZipPath with small tweaks. The main + * reason why we cannot reuse this class is that this class is final in its original implementation. + *

+ */ +public class NativeImageResourcePathRepresentation { + protected final byte[] path; + protected volatile int[] offsets; + protected byte[] resolved; + private int hashcode = 0; + + public NativeImageResourcePathRepresentation(byte[] resourcePath, boolean normalized) { + if (normalized) { + this.path = resourcePath; + } else { + this.path = normalize(resourcePath); + } + } + + public static String toCanonicalForm(String resourceName) { + String withoutTrailingSlash = resourceName.endsWith("/") ? resourceName.substring(0, resourceName.length() - 1) : resourceName; + NativeImageResourcePathRepresentation path = new NativeImageResourcePathRepresentation(withoutTrailingSlash.getBytes(StandardCharsets.UTF_8), true); + return new String(getResolved(path)); + } + + private static byte[] normalize(byte[] resourcePath) { + if (resourcePath.length == 0) { + return resourcePath; + } + int i = 0; + for (int j = 0; j < resourcePath.length; j++) { + int k = resourcePath[j]; + if (k == '\\' || (k == '/' && j == resourcePath.length - 1)) { + return normalize(resourcePath, j); + } + if ((k == '/') && (i == '/')) { + return normalize(resourcePath, j - 1); + } + if (k == 0) { + throw new InvalidPathException(new String(resourcePath, StandardCharsets.UTF_8), "Path: nul character not allowed"); + } + i = k; + } + return resourcePath; + } + + private static byte[] normalize(byte[] resourcePath, int index) { + byte[] arrayOfByte = new byte[resourcePath.length]; + int i = 0; + while (i < index) { + arrayOfByte[i] = resourcePath[i]; + i++; + } + int j = i; + int k = 0; + while (i < resourcePath.length) { + int m = resourcePath[i++]; + if (m == '\\') { + m = '/'; + } + if ((m != '/') || (k != '/')) { + if (m == 0) { + throw new InvalidPathException(new String(resourcePath, StandardCharsets.UTF_8), "Path: nul character not allowed"); + } + arrayOfByte[j++] = (byte) m; + k = m; + } + } + if ((j > 1) && (arrayOfByte[j - 1] == '/')) { + j--; + } + return j == arrayOfByte.length ? arrayOfByte : Arrays.copyOf(arrayOfByte, j); + } + + protected void initOffsets() { + if (this.offsets == null) { + int count = 0; + int index = 0; + while (index < path.length) { + byte c = path[index++]; + if (c != '/') { + count++; + while (index < path.length && path[index] != '/') { + index++; + } + } + } + int[] result = new int[count]; + count = 0; + index = 0; + while (index < path.length) { + int m = path[index]; + if (m == '/') { + index++; + } else { + result[count++] = index++; + while (index < path.length && path[index] != '/') { + index++; + } + } + } + + synchronized (this) { + if (offsets == null) { + offsets = result; + } + } + } + } + + protected static byte[] getResolved(NativeImageResourcePathRepresentation p) { + int nc = p.getNameCount(); + byte[] path = p.path; + int[] offsets = p.offsets; + byte[] to = new byte[path.length]; + int[] lastM = new int[nc]; + int lastMOff = -1; + int m = 0; + for (int i = 0; i < nc; i++) { + int n = offsets[i]; + int len = (i == offsets.length - 1) ? (path.length - n) : (offsets[i + 1] - n - 1); + if (len == 1 && path[n] == (byte) '.') { + if (m == 0 && path[0] == '/') { // absolute path + to[m++] = '/'; + } + continue; + } + if (len == 2 && path[n] == '.' && path[n + 1] == '.') { + if (lastMOff >= 0) { + m = lastM[lastMOff--]; // retreat + continue; + } + if (path[0] == '/') { // "/../xyz" skip + if (m == 0) { + to[m++] = '/'; + } + } else { // "../xyz" -> "../xyz" + if (m != 0 && to[m - 1] != '/') { + to[m++] = '/'; + } + while (len-- > 0) { + to[m++] = path[n++]; + } + } + continue; + } + if (m == 0 && path[0] == '/' || // absolute path + m != 0 && to[m - 1] != '/') { // not the first name + to[m++] = '/'; + } + lastM[++lastMOff] = m; + while (len-- > 0) { + to[m++] = path[n++]; + } + } + if (m > 1 && to[m - 1] == '/') { + m--; + } + return (m == to.length) ? to : Arrays.copyOf(to, m); + } + + /** + * NB: implicit implementation of {@link java.nio.file.Path#getNameCount}. + */ + public int getNameCount() { + initOffsets(); + return offsets.length; + } + + @Override + public int hashCode() { + int h = hashcode; + if (h == 0) { + hashcode = h = Arrays.hashCode(path); + } + return h; + } +} diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/TypeResult.java b/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/TypeResult.java similarity index 92% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/TypeResult.java rename to substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/TypeResult.java index ce4271736f8e..2a6be0899621 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/TypeResult.java +++ b/substratevm/src/com.oracle.svm.util/src/com/oracle/svm/util/TypeResult.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,13 +22,11 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package com.oracle.svm.core; +package com.oracle.svm.util; import java.util.function.Consumer; import java.util.function.Function; -import com.oracle.svm.core.util.VMError; - /** * Encode the result of loading a class. It contains either a type object, if the loading is * succesful, or a Throwable object encoding the reason why the loading failed. @@ -92,7 +90,7 @@ public T getOrFail() { if (type != null) { return type; } else { - throw VMError.shouldNotReachHere("Type " + name + " not found", exception); + throw new IllegalStateException("Type " + name + " not found", exception); } } } From 26c059c89ce894e639479cf6115771c9b4fe7d77 Mon Sep 17 00:00:00 2001 From: Matt D'Souza Date: Wed, 12 Mar 2025 17:47:54 -0400 Subject: [PATCH 4/6] Use enum set of ConfigurationParserOption to customize ConfigurationParser behaviour --- .../config/ResourceConfigurationTest.java | 5 +- .../svm/configure/ConfigurationBase.java | 3 +- .../svm/configure/ConfigurationParser.java | 63 +++++++------------ .../configure/ConfigurationParserOption.java | 51 +++++++++++++++ .../LegacyReflectionConfigurationParser.java | 16 +++-- .../LegacyResourceConfigurationParser.java | 5 +- ...egacySerializationConfigurationParser.java | 7 ++- .../PredefinedClassesConfigurationParser.java | 5 +- .../configure/ProxyConfigurationParser.java | 8 +-- .../ReflectionConfigurationParser.java | 25 +++++--- .../configure/ReflectionMetadataParser.java | 7 ++- .../ResourceConfigurationParser.java | 14 +++-- .../svm/configure/ResourceMetadataParser.java | 5 +- .../SerializationConfigurationParser.java | 14 +++-- .../SerializationMetadataParser.java | 5 +- .../ConfigurationConditionPrintable.java | 2 +- .../config/ConfigurationFileCollection.java | 25 +++++--- .../PredefinedClassesConfiguration.java | 6 +- .../configure/config/ProxyConfiguration.java | 7 ++- .../config/ResourceConfiguration.java | 6 +- .../config/SerializationConfiguration.java | 6 +- .../configure/config/TypeConfiguration.java | 6 +- .../PartialConfigurationWithOrigins.java | 11 ++-- .../filters/FilterConfigurationParser.java | 4 +- .../core/configure/ConfigurationFiles.java | 40 ++++++++++++ .../ForeignFunctionsConfigurationParser.java | 3 +- .../svm/hosted/ClassPredefinitionFeature.java | 2 +- .../oracle/svm/hosted/ResourcesFeature.java | 4 +- .../config/ConfigurationParserUtils.java | 4 +- .../reflect/proxy/DynamicProxyFeature.java | 2 +- .../serialize/SerializationFeature.java | 14 ++--- .../truffle/tck/AbstractMethodListParser.java | 28 +++++---- 32 files changed, 261 insertions(+), 142 deletions(-) create mode 100644 substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParserOption.java diff --git a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java index c8283b86ae98..7af57c99b3f6 100644 --- a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java +++ b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java @@ -29,6 +29,7 @@ import java.io.PipedReader; import java.io.PipedWriter; import java.util.Collection; +import java.util.EnumSet; import java.util.LinkedList; import java.util.List; import java.util.Locale; @@ -38,6 +39,7 @@ import org.junit.Assert; import org.junit.Test; +import com.oracle.svm.configure.ConfigurationParserOption; import com.oracle.svm.configure.ResourceConfigurationParser; import com.oracle.svm.configure.ResourcesRegistry; import com.oracle.svm.configure.config.ResourceConfiguration; @@ -135,7 +137,8 @@ public void addClassBasedResourceBundle(UnresolvedConfigurationCondition conditi } }; - ResourceConfigurationParser rcp = ResourceConfigurationParser.create(false, ConfigurationConditionResolver.identityResolver(), registry, true); + ResourceConfigurationParser rcp = ResourceConfigurationParser.create(false, ConfigurationConditionResolver.identityResolver(), registry, + EnumSet.of(ConfigurationParserOption.STRICT_CONFIGURATION)); writerThread.start(); rcp.parseAndRegister(pr); diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationBase.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationBase.java index 970f8643967d..e450ce0412f0 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationBase.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationBase.java @@ -25,6 +25,7 @@ package com.oracle.svm.configure; import java.io.IOException; +import java.util.EnumSet; import java.util.function.Consumer; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; @@ -70,7 +71,7 @@ public T copyAndFilter(P predicate) { return copyAnd(copy -> copy.removeIf(predicate)); } - public abstract ConfigurationParser createParser(boolean strictMetadata); + public abstract ConfigurationParser createParser(boolean strictMetadata, EnumSet parserOptions); public abstract boolean supportsCombinedFile(); diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParser.java index 04cfdb924bf7..f93e5869b93d 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParser.java @@ -24,9 +24,6 @@ */ package com.oracle.svm.configure; -import static org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition.TYPE_REACHABLE_KEY; -import static org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition.TYPE_REACHED_KEY; - import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; @@ -37,6 +34,7 @@ import java.net.URL; import java.util.Collection; import java.util.Collections; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -62,7 +60,6 @@ public static InputStream openStream(URI uri) throws IOException { throw new IllegalArgumentException("For security reasons, reading configurations is not supported from URIs with protocol: " + url.getProtocol()); } - public static final String CONDITIONAL_KEY = "condition"; public static final String NAME_KEY = "name"; public static final String TYPE_KEY = "type"; public static final String PROXY_KEY = "proxy"; @@ -75,10 +72,25 @@ public static InputStream openStream(URI uri) throws IOException { public static final String MODULE_KEY = "module"; public static final String GLOB_KEY = "glob"; private final Map> seenUnknownAttributesByType = new HashMap<>(); - private final boolean strictSchema; + private final EnumSet parserOptions; + + protected ConfigurationParser(EnumSet parserOptions) { + this.parserOptions = parserOptions; + } - protected ConfigurationParser(boolean strictConfiguration) { - this.strictSchema = strictConfiguration; + /** + * Defines the options supported by this parser. A subclass can override this method to declare + * additional supported options. + */ + protected EnumSet supportedOptions() { + return EnumSet.of(ConfigurationParserOption.STRICT_CONFIGURATION); + } + + protected final boolean checkOption(ConfigurationParserOption option) { + if (!supportedOptions().contains(option)) { + throw new IllegalArgumentException(String.format("Tried to check option %s but it was not declared as a supported option", option)); + } + return parserOptions.contains(option); } public void parseAndRegister(URI uri) throws IOException { @@ -175,7 +187,7 @@ public static void checkHasExactlyOneAttribute(EconomicMap map, * @param message message to be displayed. */ protected void warnOrFailOnSchemaError(String message) { - if (strictSchema) { + if (checkOption(ConfigurationParserOption.STRICT_CONFIGURATION)) { failOnSchemaError(message); } else { LogUtils.warning(message); @@ -221,40 +233,7 @@ protected static long asLong(Object value, String propertyName) { throw new JsonParserException("Invalid long value '" + value + "' for element '" + propertyName + "'"); } - protected UnresolvedConfigurationCondition parseCondition(EconomicMap data, boolean runtimeCondition) { - Object conditionData = data.get(CONDITIONAL_KEY); - if (conditionData != null) { - EconomicMap conditionObject = asMap(conditionData, "Attribute 'condition' must be an object"); - if (conditionObject.containsKey(TYPE_REACHABLE_KEY) && conditionObject.containsKey(TYPE_REACHED_KEY)) { - failOnSchemaError("condition can not have both '" + TYPE_REACHED_KEY + "' and '" + TYPE_REACHABLE_KEY + "' set."); - } - - if (conditionObject.containsKey(TYPE_REACHED_KEY)) { - if (!runtimeCondition) { - failOnSchemaError("'" + TYPE_REACHED_KEY + "' condition cannot be used in older schemas. Please migrate the file to the latest schema."); - } - Object object = conditionObject.get(TYPE_REACHED_KEY); - var condition = parseTypeContents(object); - if (condition.isPresent()) { - String className = ((NamedConfigurationTypeDescriptor) condition.get()).name(); - return UnresolvedConfigurationCondition.create(className); - } - } else if (conditionObject.containsKey(TYPE_REACHABLE_KEY)) { - if (runtimeCondition && !Options.TreatAllTypeReachableConditionsAsTypeReached.getValue()) { - failOnSchemaError("'" + TYPE_REACHABLE_KEY + "' condition can not be used with the latest schema. Please use '" + TYPE_REACHED_KEY + "'."); - } - Object object = conditionObject.get(TYPE_REACHABLE_KEY); - var condition = parseTypeContents(object); - if (condition.isPresent()) { - String className = ((NamedConfigurationTypeDescriptor) condition.get()).name(); - return UnresolvedConfigurationCondition.create(className, Options.TreatAllTypeReachableConditionsAsTypeReached.getValue()); - } - } - } - return UnresolvedConfigurationCondition.alwaysTrue(); - } - - private static JsonParserException failOnSchemaError(String message) { + protected static JsonParserException failOnSchemaError(String message) { throw new JsonParserException(message); } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParserOption.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParserOption.java new file mode 100644 index 000000000000..bf746359149a --- /dev/null +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParserOption.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2025, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.svm.configure; + +/** + * {@link ConfigurationParser} options that control parsing behaviour. Options are not necessarily + * supported by all parsers. + */ +public enum ConfigurationParserOption { + /** + * Fail when a configuration file has incorrect schema (e.g., extraneous fields). + */ + STRICT_CONFIGURATION, + + /** + * Log a warning for each reflection element (e.g., class, field) that could not be resolved. + */ + PRINT_MISSING_ELEMENTS, + + /** + * Treat the legacy "typeReachable" condition as a "typeReached" condition checked at run time. + */ + TREAT_ALL_TYPE_REACHABLE_CONDITIONS_AS_TYPE_REACHED, + + /** + * Treat the "name" entry in a legacy reflection configuration as a "type" entry. + */ + TREAT_ALL_NAME_ENTRIES_AS_TYPE +} diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacyReflectionConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacyReflectionConfigurationParser.java index d878d0df3c36..f2e4b76395fa 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacyReflectionConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacyReflectionConfigurationParser.java @@ -26,6 +26,7 @@ import java.net.URI; import java.util.Arrays; +import java.util.EnumSet; import java.util.List; import java.util.Optional; @@ -44,12 +45,15 @@ final class LegacyReflectionConfigurationParser extends ReflectionConfigur "allPublicClasses", "methods", "queriedMethods", "fields", CONDITIONAL_KEY, "queryAllDeclaredConstructors", "queryAllPublicConstructors", "queryAllDeclaredMethods", "queryAllPublicMethods", "unsafeAllocated", "serializable"); - private final boolean treatAllNameEntriesAsType; + LegacyReflectionConfigurationParser(ConfigurationConditionResolver conditionResolver, ReflectionConfigurationParserDelegate delegate, EnumSet parserOptions) { + super(conditionResolver, delegate, parserOptions); + } - LegacyReflectionConfigurationParser(ConfigurationConditionResolver conditionResolver, ReflectionConfigurationParserDelegate delegate, boolean strictConfiguration, - boolean printMissingElements, boolean treatAllNameEntriesAsType) { - super(conditionResolver, delegate, strictConfiguration, printMissingElements); - this.treatAllNameEntriesAsType = treatAllNameEntriesAsType; + @Override + protected EnumSet supportedOptions() { + EnumSet base = super.supportedOptions(); + base.add(ConfigurationParserOption.TREAT_ALL_NAME_ENTRIES_AS_TYPE); + return base; } @Override @@ -61,7 +65,7 @@ public void parseAndRegister(Object json, URI origin) { protected void parseClass(EconomicMap data) { checkAttributes(data, "reflection class descriptor object", List.of(NAME_KEY), OPTIONAL_REFLECT_CONFIG_OBJECT_ATTRS); - Optional type = parseName(data, treatAllNameEntriesAsType); + Optional type = parseName(data, checkOption(ConfigurationParserOption.TREAT_ALL_NAME_ENTRIES_AS_TYPE)); if (type.isEmpty()) { return; } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacyResourceConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacyResourceConfigurationParser.java index 2c7d6dbd3f1d..240cc3febe4d 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacyResourceConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacyResourceConfigurationParser.java @@ -26,6 +26,7 @@ import java.net.URI; import java.util.Collections; +import java.util.EnumSet; import java.util.List; import java.util.function.BiConsumer; @@ -38,8 +39,8 @@ import com.oracle.svm.util.TypeResult; final class LegacyResourceConfigurationParser extends ResourceConfigurationParser { - LegacyResourceConfigurationParser(ConfigurationConditionResolver conditionResolver, ResourcesRegistry registry, boolean strictConfiguration) { - super(conditionResolver, registry, strictConfiguration); + LegacyResourceConfigurationParser(ConfigurationConditionResolver conditionResolver, ResourcesRegistry registry, EnumSet parserOptions) { + super(conditionResolver, registry, parserOptions); } @Override diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacySerializationConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacySerializationConfigurationParser.java index 6cd4df7c1de6..5f4561627df3 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacySerializationConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/LegacySerializationConfigurationParser.java @@ -27,6 +27,7 @@ import java.net.URI; import java.util.Arrays; import java.util.Collections; +import java.util.EnumSet; import java.util.List; import org.graalvm.collections.EconomicMap; @@ -46,9 +47,9 @@ final class LegacySerializationConfigurationParser extends SerializationConfi private final ProxyConfigurationParser proxyConfigurationParser; - LegacySerializationConfigurationParser(ConfigurationConditionResolver conditionResolver, RuntimeSerializationSupport serializationSupport, boolean strictConfiguration) { - super(conditionResolver, serializationSupport, strictConfiguration); - this.proxyConfigurationParser = new ProxyConfigurationParser<>(conditionResolver, strictConfiguration, serializationSupport::registerProxyClass); + LegacySerializationConfigurationParser(ConfigurationConditionResolver conditionResolver, RuntimeSerializationSupport serializationSupport, EnumSet parserOptions) { + super(conditionResolver, serializationSupport, parserOptions); + this.proxyConfigurationParser = new ProxyConfigurationParser<>(conditionResolver, parserOptions, serializationSupport::registerProxyClass); } @Override diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/PredefinedClassesConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/PredefinedClassesConfigurationParser.java index 643cf8946694..605098ebd0e1 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/PredefinedClassesConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/PredefinedClassesConfigurationParser.java @@ -33,6 +33,7 @@ import java.nio.file.Path; import java.util.Arrays; import java.util.Collections; +import java.util.EnumSet; import org.graalvm.collections.EconomicMap; @@ -46,8 +47,8 @@ public static InputStream openClassdataStream(URI baseUri, String providedHash) private final PredefinedClassesRegistry registry; - public PredefinedClassesConfigurationParser(PredefinedClassesRegistry registry, boolean strictConfiguration) { - super(strictConfiguration); + public PredefinedClassesConfigurationParser(PredefinedClassesRegistry registry, EnumSet parserOptions) { + super(parserOptions); this.registry = registry; } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ProxyConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ProxyConfigurationParser.java index 5b71baa2684e..af4b9fa15b8b 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ProxyConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ProxyConfigurationParser.java @@ -26,6 +26,7 @@ import java.net.URI; import java.util.Collections; +import java.util.EnumSet; import java.util.List; import java.util.function.BiConsumer; import java.util.stream.Collectors; @@ -42,15 +43,14 @@ * Parses JSON describing lists of interfaces and passes them to the given consumer (e.g., to add * them to a registry). */ -public final class ProxyConfigurationParser extends ConfigurationParser { +public final class ProxyConfigurationParser extends ConditionalConfigurationParser { private final ConfigurationConditionResolver conditionResolver; private final BiConsumer> proxyConfigConsumer; - public ProxyConfigurationParser(ConfigurationConditionResolver conditionResolver, boolean strictConfiguration, - BiConsumer> proxyConfigConsumer) { - super(strictConfiguration); + public ProxyConfigurationParser(ConfigurationConditionResolver conditionResolver, EnumSet parserOptions, BiConsumer> proxyConfigConsumer) { + super(parserOptions); this.proxyConfigConsumer = proxyConfigConsumer; this.conditionResolver = conditionResolver; } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParser.java index f737f55721d8..0b8271f21164 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParser.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.EnumSet; import java.util.List; import java.util.stream.Collectors; @@ -42,28 +43,32 @@ * Parses JSON describing classes, methods and fields and delegates their registration to a * {@link ReflectionConfigurationParserDelegate}. */ -public abstract class ReflectionConfigurationParser extends ConfigurationParser { +public abstract class ReflectionConfigurationParser extends ConditionalConfigurationParser { private static final String CONSTRUCTOR_NAME = ""; protected final ConfigurationConditionResolver conditionResolver; protected final ReflectionConfigurationParserDelegate delegate; - private final boolean printMissingElements; - public ReflectionConfigurationParser(ConfigurationConditionResolver conditionResolver, ReflectionConfigurationParserDelegate delegate, boolean strictConfiguration, - boolean printMissingElements) { - super(strictConfiguration); + public ReflectionConfigurationParser(ConfigurationConditionResolver conditionResolver, ReflectionConfigurationParserDelegate delegate, EnumSet parserOptions) { + super(parserOptions); this.conditionResolver = conditionResolver; - this.printMissingElements = printMissingElements; this.delegate = delegate; } + @Override + protected EnumSet supportedOptions() { + EnumSet base = super.supportedOptions(); + base.add(ConfigurationParserOption.PRINT_MISSING_ELEMENTS); + return base; + } + public static ReflectionConfigurationParser create(String combinedFileKey, boolean strictMetadata, ConfigurationConditionResolver conditionResolver, ReflectionConfigurationParserDelegate delegate, - boolean strictConfiguration, boolean printMissingElements, boolean treatAllEntriesAsType) { + EnumSet parserOptions) { if (strictMetadata) { - return new ReflectionMetadataParser<>(combinedFileKey, conditionResolver, delegate, strictConfiguration, printMissingElements); + return new ReflectionMetadataParser<>(combinedFileKey, conditionResolver, delegate, parserOptions); } else { - return new LegacyReflectionConfigurationParser<>(conditionResolver, delegate, strictConfiguration, printMissingElements, treatAllEntriesAsType); + return new LegacyReflectionConfigurationParser<>(conditionResolver, delegate, parserOptions); } } @@ -189,7 +194,7 @@ private void handleMissingElement(String message) { } protected void handleMissingElement(String msg, Throwable cause) { - if (printMissingElements) { + if (checkOption(ConfigurationParserOption.PRINT_MISSING_ELEMENTS)) { String message = msg; if (cause != null) { message += " Reason: " + formatError(cause) + '.'; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionMetadataParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionMetadataParser.java index 0061f506ca4a..24452005fa7f 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionMetadataParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionMetadataParser.java @@ -26,6 +26,7 @@ import java.net.URI; import java.util.Arrays; +import java.util.EnumSet; import java.util.List; import java.util.Optional; @@ -43,9 +44,9 @@ class ReflectionMetadataParser extends ReflectionConfigurationParser private final String combinedFileKey; - ReflectionMetadataParser(String combinedFileKey, ConfigurationConditionResolver conditionResolver, ReflectionConfigurationParserDelegate delegate, boolean strictConfiguration, - boolean printMissingElements) { - super(conditionResolver, delegate, strictConfiguration, printMissingElements); + ReflectionMetadataParser(String combinedFileKey, ConfigurationConditionResolver conditionResolver, ReflectionConfigurationParserDelegate delegate, + EnumSet parserOptions) { + super(conditionResolver, delegate, parserOptions); this.combinedFileKey = combinedFileKey; } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceConfigurationParser.java index daa4aeb0d9f7..8f9095d995bd 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceConfigurationParser.java @@ -26,6 +26,7 @@ import java.util.Arrays; import java.util.Collections; +import java.util.EnumSet; import java.util.List; import java.util.Locale; import java.util.stream.Collectors; @@ -39,21 +40,22 @@ import jdk.graal.compiler.util.json.JsonParserException; -public abstract class ResourceConfigurationParser extends ConfigurationParser { +public abstract class ResourceConfigurationParser extends ConditionalConfigurationParser { protected final ResourcesRegistry registry; protected final ConfigurationConditionResolver conditionResolver; - public static ResourceConfigurationParser create(boolean strictMetadata, ConfigurationConditionResolver conditionResolver, ResourcesRegistry registry, boolean strictConfiguration) { + public static ResourceConfigurationParser create(boolean strictMetadata, ConfigurationConditionResolver conditionResolver, ResourcesRegistry registry, + EnumSet parserOptions) { if (strictMetadata) { - return new ResourceMetadataParser<>(conditionResolver, registry, strictConfiguration); + return new ResourceMetadataParser<>(conditionResolver, registry, parserOptions); } else { - return new LegacyResourceConfigurationParser<>(conditionResolver, registry, strictConfiguration); + return new LegacyResourceConfigurationParser<>(conditionResolver, registry, parserOptions); } } - protected ResourceConfigurationParser(ConfigurationConditionResolver conditionResolver, ResourcesRegistry registry, boolean strictConfiguration) { - super(strictConfiguration); + protected ResourceConfigurationParser(ConfigurationConditionResolver conditionResolver, ResourcesRegistry registry, EnumSet parserOptions) { + super(parserOptions); this.registry = registry; this.conditionResolver = conditionResolver; } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceMetadataParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceMetadataParser.java index e67432fae398..d24b246a85de 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceMetadataParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceMetadataParser.java @@ -25,6 +25,7 @@ package com.oracle.svm.configure; import java.net.URI; +import java.util.EnumSet; import org.graalvm.collections.EconomicMap; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; @@ -32,8 +33,8 @@ import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; final class ResourceMetadataParser extends ResourceConfigurationParser { - ResourceMetadataParser(ConfigurationConditionResolver conditionResolver, ResourcesRegistry registry, boolean strictConfiguration) { - super(conditionResolver, registry, strictConfiguration); + ResourceMetadataParser(ConfigurationConditionResolver conditionResolver, ResourcesRegistry registry, EnumSet parserOptions) { + super(conditionResolver, registry, parserOptions); } @Override diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationConfigurationParser.java index 10c6b89a7a31..ca4811c7b185 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationConfigurationParser.java @@ -25,6 +25,7 @@ */ package com.oracle.svm.configure; +import java.util.EnumSet; import java.util.List; import org.graalvm.collections.EconomicMap; @@ -34,7 +35,7 @@ import jdk.graal.compiler.util.json.JsonParserException; -public abstract class SerializationConfigurationParser extends ConfigurationParser { +public abstract class SerializationConfigurationParser extends ConditionalConfigurationParser { public static final String CUSTOM_TARGET_CONSTRUCTOR_CLASS_KEY = "customTargetConstructorClass"; @@ -42,16 +43,17 @@ public abstract class SerializationConfigurationParser extends ConfigurationP protected final RuntimeSerializationSupport serializationSupport; public static SerializationConfigurationParser create(boolean strictMetadata, ConfigurationConditionResolver conditionResolver, RuntimeSerializationSupport serializationSupport, - boolean strictConfiguration) { + EnumSet parserOptions) { if (strictMetadata) { - return new SerializationMetadataParser<>(conditionResolver, serializationSupport, strictConfiguration); + return new SerializationMetadataParser<>(conditionResolver, serializationSupport, parserOptions); } else { - return new LegacySerializationConfigurationParser<>(conditionResolver, serializationSupport, strictConfiguration); + return new LegacySerializationConfigurationParser<>(conditionResolver, serializationSupport, parserOptions); } } - public SerializationConfigurationParser(ConfigurationConditionResolver conditionResolver, RuntimeSerializationSupport serializationSupport, boolean strictConfiguration) { - super(strictConfiguration); + public SerializationConfigurationParser(ConfigurationConditionResolver conditionResolver, RuntimeSerializationSupport serializationSupport, + EnumSet parserOptions) { + super(parserOptions); this.serializationSupport = serializationSupport; this.conditionResolver = conditionResolver; } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationMetadataParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationMetadataParser.java index ea6edec0a7e9..9baaf7d08d68 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationMetadataParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationMetadataParser.java @@ -25,6 +25,7 @@ package com.oracle.svm.configure; import java.net.URI; +import java.util.EnumSet; import java.util.List; import java.util.Optional; @@ -37,8 +38,8 @@ final class SerializationMetadataParser extends SerializationConfigurationParser { - SerializationMetadataParser(ConfigurationConditionResolver conditionResolver, RuntimeSerializationSupport serializationSupport, boolean strictConfiguration) { - super(conditionResolver, serializationSupport, strictConfiguration); + SerializationMetadataParser(ConfigurationConditionResolver conditionResolver, RuntimeSerializationSupport serializationSupport, EnumSet parserOptions) { + super(conditionResolver, serializationSupport, parserOptions); } @Override diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationConditionPrintable.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationConditionPrintable.java index e0a3f2bf5ad1..561caaa71e5b 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationConditionPrintable.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationConditionPrintable.java @@ -24,7 +24,7 @@ */ package com.oracle.svm.configure.config; -import static com.oracle.svm.configure.ConfigurationParser.CONDITIONAL_KEY; +import static com.oracle.svm.configure.ConditionalConfigurationParser.CONDITIONAL_KEY; import static org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition.TYPE_REACHABLE_KEY; import static org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition.TYPE_REACHED_KEY; diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationFileCollection.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationFileCollection.java index 6f6b9093e12b..f2e6d10ccee1 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationFileCollection.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationFileCollection.java @@ -34,6 +34,7 @@ import java.nio.file.Paths; import java.util.Collection; import java.util.Collections; +import java.util.EnumSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; @@ -44,10 +45,18 @@ import com.oracle.svm.configure.ConfigurationFile; import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationParserOption; import jdk.graal.compiler.phases.common.LazyValue; public class ConfigurationFileCollection { + + private final EnumSet parserOptions; + + public ConfigurationFileCollection() { + this.parserOptions = EnumSet.of(ConfigurationParserOption.STRICT_CONFIGURATION, ConfigurationParserOption.TREAT_ALL_TYPE_REACHABLE_CONDITIONS_AS_TYPE_REACHED); + } + public static final Function FAIL_ON_EXCEPTION = e -> e; private final Set reachabilityMetadataPaths = new LinkedHashSet<>(); @@ -159,28 +168,28 @@ public TypeConfiguration loadReflectConfig(Function exce public ProxyConfiguration loadProxyConfig(Function exceptionHandler) throws Exception { ProxyConfiguration proxyConfiguration = new ProxyConfiguration(); - loadConfig(proxyConfigPaths, proxyConfiguration.createParser(false), exceptionHandler); + loadConfig(proxyConfigPaths, proxyConfiguration.createParser(false, parserOptions), exceptionHandler); return proxyConfiguration; } public PredefinedClassesConfiguration loadPredefinedClassesConfig(List> classDestinationDirs, Predicate shouldExcludeClassesWithHash, Function exceptionHandler) throws Exception { PredefinedClassesConfiguration predefinedClassesConfiguration = new PredefinedClassesConfiguration(classDestinationDirs, shouldExcludeClassesWithHash); - loadConfig(predefinedClassesConfigPaths, predefinedClassesConfiguration.createParser(false), exceptionHandler); + loadConfig(predefinedClassesConfigPaths, predefinedClassesConfiguration.createParser(false, parserOptions), exceptionHandler); return predefinedClassesConfiguration; } public ResourceConfiguration loadResourceConfig(Function exceptionHandler) throws Exception { ResourceConfiguration resourceConfiguration = new ResourceConfiguration(); - loadConfig(reachabilityMetadataPaths, resourceConfiguration.createParser(true), exceptionHandler); - loadConfig(resourceConfigPaths, resourceConfiguration.createParser(false), exceptionHandler); + loadConfig(reachabilityMetadataPaths, resourceConfiguration.createParser(true, parserOptions), exceptionHandler); + loadConfig(resourceConfigPaths, resourceConfiguration.createParser(false, parserOptions), exceptionHandler); return resourceConfiguration; } public SerializationConfiguration loadSerializationConfig(Function exceptionHandler) throws Exception { SerializationConfiguration serializationConfiguration = new SerializationConfiguration(); - loadConfig(reachabilityMetadataPaths, serializationConfiguration.createParser(true), exceptionHandler); - loadConfig(serializationConfigPaths, serializationConfiguration.createParser(false), exceptionHandler); + loadConfig(reachabilityMetadataPaths, serializationConfiguration.createParser(true, parserOptions), exceptionHandler); + loadConfig(serializationConfigPaths, serializationConfiguration.createParser(false, parserOptions), exceptionHandler); return serializationConfiguration; } @@ -193,8 +202,8 @@ public ConfigurationSet loadConfigurationSet(Function ex private TypeConfiguration loadTypeConfig(String combinedFileKey, Collection uris, Function exceptionHandler) throws Exception { TypeConfiguration configuration = new TypeConfiguration(combinedFileKey); - loadConfig(reachabilityMetadataPaths, configuration.createParser(true), exceptionHandler); - loadConfig(uris, configuration.createParser(false), exceptionHandler); + loadConfig(reachabilityMetadataPaths, configuration.createParser(true, parserOptions), exceptionHandler); + loadConfig(uris, configuration.createParser(false, parserOptions), exceptionHandler); return configuration; } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/PredefinedClassesConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/PredefinedClassesConfiguration.java index 4385e9cbfecb..191f4c26d7c8 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/PredefinedClassesConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/PredefinedClassesConfiguration.java @@ -31,6 +31,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.util.EnumSet; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -40,6 +41,7 @@ import com.oracle.svm.configure.ConfigurationBase; import com.oracle.svm.configure.ConfigurationFile; import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationParserOption; import com.oracle.svm.configure.PredefinedClassesConfigurationParser; import jdk.graal.compiler.phases.common.LazyValue; @@ -167,11 +169,11 @@ public void printJson(JsonWriter writer) throws IOException { } @Override - public ConfigurationParser createParser(boolean strictMetadata) { + public ConfigurationParser createParser(boolean strictMetadata, EnumSet parserOptions) { if (strictMetadata) { throw new IllegalArgumentException("Predefined classes configuration is not supported with strict metadata"); } - return new PredefinedClassesConfigurationParser(this::add, true); + return new PredefinedClassesConfigurationParser(this::add, parserOptions); } @Override diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ProxyConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ProxyConfiguration.java index 59b0d0a725e3..d4c73c9aa897 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ProxyConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ProxyConfiguration.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.EnumSet; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -36,6 +37,7 @@ import com.oracle.svm.configure.ConditionalElement; import com.oracle.svm.configure.ConfigurationBase; import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationParserOption; import com.oracle.svm.configure.ProxyConfigurationParser; import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; @@ -136,11 +138,12 @@ public static void printProxyInterfaces(JsonWriter writer, List parserOptions) { if (strictMetadata) { throw new IllegalArgumentException("Independent proxy configuration is not supported with strict metadata"); } - return new ProxyConfigurationParser<>(ConfigurationConditionResolver.identityResolver(), true, (cond, interfaces) -> interfaceLists.add(new ConditionalElement<>(cond, interfaces))); + return new ProxyConfigurationParser<>(ConfigurationConditionResolver.identityResolver(), parserOptions, + (cond, interfaces) -> interfaceLists.add(new ConditionalElement<>(cond, interfaces))); } @Override diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java index 959b302458b1..044c304693bb 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java @@ -32,6 +32,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.EnumSet; import java.util.Locale; import java.util.Map; import java.util.Set; @@ -45,6 +46,7 @@ import com.oracle.svm.configure.ConditionalElement; import com.oracle.svm.configure.ConfigurationBase; import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationParserOption; import com.oracle.svm.configure.ResourceConfigurationParser; import com.oracle.svm.configure.ResourcesRegistry; import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; @@ -379,8 +381,8 @@ void printGlobsJson(JsonWriter writer, boolean combinedFile) throws IOException } @Override - public ConfigurationParser createParser(boolean strictMetadata) { - return ResourceConfigurationParser.create(strictMetadata, ConfigurationConditionResolver.identityResolver(), new ResourceConfiguration.ParserAdapter(this), true); + public ConfigurationParser createParser(boolean strictMetadata, EnumSet parserOptions) { + return ResourceConfigurationParser.create(strictMetadata, ConfigurationConditionResolver.identityResolver(), new ParserAdapter(this), parserOptions); } private static void printResourceBundle(BundleConfiguration config, JsonWriter writer, boolean combinedFile) throws IOException { diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfiguration.java index 5ec35005f8dd..998119a857fd 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfiguration.java @@ -28,6 +28,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Comparator; +import java.util.EnumSet; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -38,6 +39,7 @@ import com.oracle.svm.configure.ConditionalElement; import com.oracle.svm.configure.ConfigurationBase; import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationParserOption; import com.oracle.svm.configure.SerializationConfigurationParser; import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; @@ -130,8 +132,8 @@ public void printLegacyJson(JsonWriter writer) throws IOException { } @Override - public ConfigurationParser createParser(boolean strictMetadata) { - return SerializationConfigurationParser.create(strictMetadata, ConfigurationConditionResolver.identityResolver(), this, true); + public ConfigurationParser createParser(boolean strictMetadata, EnumSet parserOptions) { + return SerializationConfigurationParser.create(strictMetadata, ConfigurationConditionResolver.identityResolver(), this, parserOptions); } @Override diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/TypeConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/TypeConfiguration.java index 193218490d53..c6f4410dbed5 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/TypeConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/TypeConfiguration.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Comparator; +import java.util.EnumSet; import java.util.List; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; @@ -37,6 +38,7 @@ import com.oracle.svm.configure.ConditionalElement; import com.oracle.svm.configure.ConfigurationBase; import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationParserOption; import com.oracle.svm.configure.ConfigurationTypeDescriptor; import com.oracle.svm.configure.NamedConfigurationTypeDescriptor; import com.oracle.svm.configure.ReflectionConfigurationParser; @@ -153,8 +155,8 @@ public void printJson(JsonWriter writer) throws IOException { } @Override - public ConfigurationParser createParser(boolean strictMetadata) { - return ReflectionConfigurationParser.create(combinedFileKey, strictMetadata, ConfigurationConditionResolver.identityResolver(), new ParserConfigurationAdapter(this), true, false, false); + public ConfigurationParser createParser(boolean strictMetadata, EnumSet parserOptions) { + return ReflectionConfigurationParser.create(combinedFileKey, strictMetadata, ConfigurationConditionResolver.identityResolver(), new ParserConfigurationAdapter(this), parserOptions); } @Override diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/PartialConfigurationWithOrigins.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/PartialConfigurationWithOrigins.java index 11ac0f573f7c..015944812bf6 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/PartialConfigurationWithOrigins.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/conditional/PartialConfigurationWithOrigins.java @@ -26,15 +26,17 @@ import java.io.IOException; import java.net.URI; +import java.util.EnumSet; import java.util.List; import org.graalvm.collections.EconomicMap; import org.graalvm.collections.MapCursor; import com.oracle.svm.configure.ConfigurationBase; -import com.oracle.svm.configure.config.ConfigurationSet; import com.oracle.svm.configure.ConfigurationFile; import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationParserOption; +import com.oracle.svm.configure.config.ConfigurationSet; import jdk.graal.compiler.util.json.JsonParserException; import jdk.graal.compiler.util.json.JsonPrintable; @@ -47,7 +49,7 @@ public class PartialConfigurationWithOrigins extends ConfigurationParser impleme private final MethodInfoRepository methodInfoRegistry; public PartialConfigurationWithOrigins(MethodCallNode root, MethodInfoRepository methodInfoRegistry) { - super(true); + super(EnumSet.of(ConfigurationParserOption.STRICT_CONFIGURATION)); this.root = root; this.methodInfoRegistry = methodInfoRegistry; } @@ -177,6 +179,7 @@ private static void printConfigurationSet(JsonWriter writer, ConfigurationSet co private static void parseConfigurationSet(EconomicMap configJson, ConfigurationSet configurationSet, URI origin) throws IOException { MapCursor cursor = configJson.getEntries(); + EnumSet parserOptions = EnumSet.of(ConfigurationParserOption.STRICT_CONFIGURATION, ConfigurationParserOption.TREAT_ALL_TYPE_REACHABLE_CONDITIONS_AS_TYPE_REACHED); while (cursor.advance()) { String configName = cursor.getKey(); ConfigurationFile configType = ConfigurationFile.getByName(configName); @@ -185,10 +188,10 @@ private static void parseConfigurationSet(EconomicMap configJson, Con } if (configType == ConfigurationFile.REACHABILITY_METADATA) { for (ConfigurationFile file : ConfigurationFile.combinedFileConfigurations()) { - configurationSet.getConfiguration(file).createParser(true).parseAndRegister(cursor.getValue(), origin); + configurationSet.getConfiguration(file).createParser(true, parserOptions).parseAndRegister(cursor.getValue(), origin); } } else { - configurationSet.getConfiguration(configType).createParser(false).parseAndRegister(cursor.getValue(), origin); + configurationSet.getConfiguration(configType).createParser(false, parserOptions).parseAndRegister(cursor.getValue(), origin); } } } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/FilterConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/FilterConfigurationParser.java index 4274be77ff4d..7ed141d313e5 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/FilterConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/FilterConfigurationParser.java @@ -26,12 +26,14 @@ import java.io.IOException; import java.net.URI; +import java.util.EnumSet; import java.util.function.BiConsumer; import org.graalvm.collections.EconomicMap; import org.graalvm.collections.MapCursor; import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationParserOption; import jdk.graal.compiler.util.json.JsonParserException; import jdk.graal.compiler.util.json.JsonWriter; @@ -40,7 +42,7 @@ public class FilterConfigurationParser extends ConfigurationParser { private final ConfigurationFilter filter; public FilterConfigurationParser(ConfigurationFilter filter) { - super(true); + super(EnumSet.of(ConfigurationParserOption.STRICT_CONFIGURATION)); assert filter != null; this.filter = filter; } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationFiles.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationFiles.java index 05e9c261758d..29c283bc3b89 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationFiles.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationFiles.java @@ -29,6 +29,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumSet; import java.util.Enumeration; import java.util.List; import java.util.stream.Collectors; @@ -38,6 +40,7 @@ import org.graalvm.nativeimage.Platforms; import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationParserOption; import com.oracle.svm.core.option.AccumulatingLocatableMultiOptionValue; import com.oracle.svm.core.option.BundleMember; import com.oracle.svm.core.option.HostedOptionKey; @@ -169,6 +172,43 @@ public static final class Options { @Option(help = "Warn when reflection and JNI configuration files have elements that could not be found on the classpath or modulepath.", type = OptionType.Expert)// public static final HostedOptionKey WarnAboutMissingReflectionOrJNIMetadataElements = new HostedOptionKey<>(false); + + /** + * Converts hosted options to a set of {@link ConfigurationParserOption parser options} used + * by {@link com.oracle.svm.configure.ConfigurationParser}. + */ + public static EnumSet getConfigurationParserOptions() { + EnumSet result = EnumSet.noneOf(ConfigurationParserOption.class); + if (StrictConfiguration.getValue()) { + result.add(ConfigurationParserOption.STRICT_CONFIGURATION); + } + if (WarnAboutMissingReflectionOrJNIMetadataElements.getValue()) { + result.add(ConfigurationParserOption.PRINT_MISSING_ELEMENTS); + } + if (TreatAllTypeReachableConditionsAsTypeReached.getValue()) { + result.add(ConfigurationParserOption.TREAT_ALL_TYPE_REACHABLE_CONDITIONS_AS_TYPE_REACHED); + } + if (TreatAllNameEntriesAsType.getValue()) { + result.add(ConfigurationParserOption.TREAT_ALL_NAME_ENTRIES_AS_TYPE); + } + return result; + } + + /** + * Like {@link #getConfigurationParserOptions()}, but overrides the hosted options with + * specific includes and excludes sets. + */ + public static EnumSet getConfigurationParserOptions(EnumSet includes, EnumSet excludes) { + assert includes == null || excludes == null || Collections.disjoint(includes, excludes); + EnumSet result = getConfigurationParserOptions(); + if (includes != null) { + result.addAll(includes); + } + if (excludes != null) { + result.removeAll(excludes); + } + return result; + } } public static List findConfigurationFiles(String fileName) { diff --git a/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/ForeignFunctionsConfigurationParser.java b/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/ForeignFunctionsConfigurationParser.java index 611440f8f360..3ab0b550598a 100644 --- a/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/ForeignFunctionsConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/ForeignFunctionsConfigurationParser.java @@ -33,6 +33,7 @@ import java.lang.invoke.MethodType; import java.net.URI; import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import java.util.Map; import java.util.function.BiConsumer; @@ -65,7 +66,7 @@ public class ForeignFunctionsConfigurationParser extends ConfigurationParser { private final Map canonicalLayouts; public ForeignFunctionsConfigurationParser(ImageClassLoader imageClassLoader, RuntimeForeignAccessSupport access, Map canonicalLayouts) { - super(true); + super(EnumSet.of(ConfigurationParserOption.STRICT_CONFIGURATION)); this.imageClassLoader = imageClassLoader; this.accessSupport = access; this.canonicalLayouts = canonicalLayouts; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassPredefinitionFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassPredefinitionFeature.java index f5cf79135b8d..3c557d555231 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassPredefinitionFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassPredefinitionFeature.java @@ -92,7 +92,7 @@ public void afterRegistration(AfterRegistrationAccess arg) { AfterRegistrationAccessImpl access = (AfterRegistrationAccessImpl) arg; PredefinedClassesRegistry registry = new PredefinedClassesRegistryImpl(); ImageSingletons.add(PredefinedClassesRegistry.class, registry); - PredefinedClassesConfigurationParser parser = new PredefinedClassesConfigurationParser(registry, ConfigurationFiles.Options.StrictConfiguration.getValue()); + PredefinedClassesConfigurationParser parser = new PredefinedClassesConfigurationParser(registry, ConfigurationFiles.Options.getConfigurationParserOptions()); ConfigurationParserUtils.parseAndRegisterConfigurations(parser, access.getImageClassLoader(), "class predefinition", ConfigurationFiles.Options.PredefinedClassesConfigurationFiles, ConfigurationFiles.Options.PredefinedClassesConfigurationResources, ConfigurationFile.PREDEFINED_CLASSES_NAME.getFileName()); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java index 1b72b757adc2..2f11afd2fc5e 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java @@ -410,11 +410,11 @@ public void beforeAnalysis(BeforeAnalysisAccess a) { ClassInitializationSupport.singleton()); ResourceConfigurationParser parser = ResourceConfigurationParser.create(true, conditionResolver, ResourcesRegistry.singleton(), - ConfigurationFiles.Options.StrictConfiguration.getValue()); + ConfigurationFiles.Options.getConfigurationParserOptions()); loadedConfigurations = ConfigurationParserUtils.parseAndRegisterConfigurationsFromCombinedFile(parser, imageClassLoader, "resource"); ResourceConfigurationParser legacyParser = ResourceConfigurationParser.create(false, conditionResolver, ResourcesRegistry.singleton(), - ConfigurationFiles.Options.StrictConfiguration.getValue()); + ConfigurationFiles.Options.getConfigurationParserOptions()); loadedConfigurations += ConfigurationParserUtils.parseAndRegisterConfigurations(legacyParser, imageClassLoader, "resource", ConfigurationFiles.Options.ResourceConfigurationFiles, ConfigurationFiles.Options.ResourceConfigurationResources, ConfigurationFile.RESOURCES.getFileName()); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java index 4953bbff30ef..b3fa826e6844 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java @@ -25,7 +25,6 @@ package com.oracle.svm.hosted.config; import static com.oracle.svm.core.configure.ConfigurationFiles.Options.ReachabilityMetadataResources; -import static com.oracle.svm.core.configure.ConfigurationFiles.Options.TreatAllNameEntriesAsType; import java.io.IOException; import java.net.URI; @@ -66,8 +65,7 @@ public static ReflectionConfigurationParser> cr RuntimeSerializationSupport serializationSupport, ImageClassLoader imageClassLoader) { return ReflectionConfigurationParser.create(combinedFileKey, strictMetadata, conditionResolver, RegistryAdapter.create(registry, proxyRegistry, serializationSupport, imageClassLoader), - ConfigurationFiles.Options.StrictConfiguration.getValue(), - ConfigurationFiles.Options.WarnAboutMissingReflectionOrJNIMetadataElements.getValue(), TreatAllNameEntriesAsType.getValue()); + ConfigurationFiles.Options.getConfigurationParserOptions()); } /** diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/DynamicProxyFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/DynamicProxyFeature.java index 6dfd899cad18..7262aaff7344 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/DynamicProxyFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/DynamicProxyFeature.java @@ -74,7 +74,7 @@ public void duringSetup(DuringSetupAccess a) { ImageClassLoader imageClassLoader = access.getImageClassLoader(); ConfigurationConditionResolver conditionResolver = new NativeImageConditionResolver(imageClassLoader, ClassInitializationSupport.singleton()); - ProxyConfigurationParser parser = new ProxyConfigurationParser<>(conditionResolver, ConfigurationFiles.Options.StrictConfiguration.getValue(), proxyRegistry); + ProxyConfigurationParser parser = new ProxyConfigurationParser<>(conditionResolver, ConfigurationFiles.Options.getConfigurationParserOptions(), proxyRegistry); loadedConfigurations = ConfigurationParserUtils.parseAndRegisterConfigurations(parser, imageClassLoader, "dynamic proxy", ConfigurationFiles.Options.DynamicProxyConfigurationFiles, ConfigurationFiles.Options.DynamicProxyConfigurationResources, ConfigurationFile.DYNAMIC_PROXY.getFileName()); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java index 5ee70950a532..49e27e17a6e3 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java @@ -42,6 +42,7 @@ import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -59,6 +60,7 @@ import com.oracle.graal.pointsto.util.GraalAccess; import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.ConfigurationParserOption; import com.oracle.svm.configure.SerializationConfigurationParser; import com.oracle.svm.configure.config.conditional.ConfigurationConditionResolver; import com.oracle.svm.core.configure.ConfigurationFiles; @@ -130,20 +132,16 @@ public void duringSetup(DuringSetupAccess a) { FeatureImpl.DuringSetupAccessImpl access = (FeatureImpl.DuringSetupAccessImpl) a; ImageClassLoader imageClassLoader = access.getImageClassLoader(); ConfigurationConditionResolver conditionResolver = new NativeImageConditionResolver(imageClassLoader, ClassInitializationSupport.singleton()); - Boolean strictConfiguration = ConfigurationFiles.Options.StrictConfiguration.getValue(); - - SerializationConfigurationParser parser = SerializationConfigurationParser.create(true, conditionResolver, serializationBuilder, - strictConfiguration); + EnumSet parserOptions = ConfigurationFiles.Options.getConfigurationParserOptions(); + SerializationConfigurationParser parser = SerializationConfigurationParser.create(true, conditionResolver, serializationBuilder, parserOptions); loadedConfigurations = ConfigurationParserUtils.parseAndRegisterConfigurationsFromCombinedFile(parser, imageClassLoader, "serialization"); - SerializationConfigurationParser denyCollectorParser = SerializationConfigurationParser.create(false, conditionResolver, serializationDenyRegistry, - strictConfiguration); + SerializationConfigurationParser denyCollectorParser = SerializationConfigurationParser.create(false, conditionResolver, serializationDenyRegistry, parserOptions); ConfigurationParserUtils.parseAndRegisterConfigurations(denyCollectorParser, imageClassLoader, "serialization", ConfigurationFiles.Options.SerializationDenyConfigurationFiles, ConfigurationFiles.Options.SerializationDenyConfigurationResources, ConfigurationFile.SERIALIZATION_DENY.getFileName()); - SerializationConfigurationParser legacyParser = SerializationConfigurationParser.create(false, conditionResolver, serializationBuilder, - strictConfiguration); + SerializationConfigurationParser legacyParser = SerializationConfigurationParser.create(false, conditionResolver, serializationBuilder, parserOptions); loadedConfigurations += ConfigurationParserUtils.parseAndRegisterConfigurations(legacyParser, imageClassLoader, "serialization", ConfigurationFiles.Options.SerializationConfigurationFiles, ConfigurationFiles.Options.SerializationConfigurationResources, ConfigurationFile.SERIALIZATION.getFileName()); diff --git a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/AbstractMethodListParser.java b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/AbstractMethodListParser.java index f48a6b53ad95..41dd0375f6c5 100644 --- a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/AbstractMethodListParser.java +++ b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/AbstractMethodListParser.java @@ -24,31 +24,35 @@ */ package com.oracle.svm.truffle.tck; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.EnumSet; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.function.Predicate; + +import org.graalvm.collections.EconomicMap; +import org.graalvm.nativeimage.Platforms; + import com.oracle.graal.pointsto.BigBang; import com.oracle.graal.pointsto.infrastructure.OriginalClassProvider; import com.oracle.graal.pointsto.meta.AnalysisMethod; import com.oracle.graal.pointsto.meta.AnalysisType; import com.oracle.graal.pointsto.meta.AnalysisUniverse; import com.oracle.svm.configure.ConfigurationParser; +import com.oracle.svm.configure.ConfigurationParserOption; import com.oracle.svm.hosted.ImageClassLoader; import com.oracle.svm.truffle.tck.PermissionsFeature.AnalysisMethodNode; + import jdk.graal.compiler.util.json.JsonParserException; import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.MetaUtil; import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaType; import jdk.vm.ci.meta.Signature; -import org.graalvm.collections.EconomicMap; -import org.graalvm.nativeimage.Platforms; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.function.Predicate; abstract class AbstractMethodListParser extends ConfigurationParser { @@ -58,7 +62,7 @@ abstract class AbstractMethodListParser extends ConfigurationParser { private final Set collectedMethods; AbstractMethodListParser(ImageClassLoader imageClassLoader, BigBang bb) { - super(true); + super(EnumSet.of(ConfigurationParserOption.STRICT_CONFIGURATION)); this.imageClassLoader = Objects.requireNonNull(imageClassLoader, "ImageClassLoader must be non null"); this.bb = Objects.requireNonNull(bb, "BigBang must be non null"); this.collectedMethods = new HashSet<>(); From 23c6301d19d4d44eef6d22cec8c1514f6561f659 Mon Sep 17 00:00:00 2001 From: Matt D'Souza Date: Wed, 12 Mar 2025 16:59:10 -0400 Subject: [PATCH 5/6] Invert dependency between core and configure in mx configuration --- substratevm/mx.substratevm/mx_substratevm.py | 1 + substratevm/mx.substratevm/suite.py | 33 +++++++++++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/substratevm/mx.substratevm/mx_substratevm.py b/substratevm/mx.substratevm/mx_substratevm.py index 085be48c9a69..636fe20fabfc 100644 --- a/substratevm/mx.substratevm/mx_substratevm.py +++ b/substratevm/mx.substratevm/mx_substratevm.py @@ -1228,6 +1228,7 @@ def native_image_context_run(func, func_args=None, config=None, build_if_missing jar_distributions=['substratevm:LIBRARY_SUPPORT'], builder_jar_distributions=[ 'substratevm:SVM', + 'substratevm:SVM_CONFIGURE', 'substratevm:OBJECTFILE', 'substratevm:POINTSTO', 'substratevm:NATIVE_IMAGE_BASE', diff --git a/substratevm/mx.substratevm/suite.py b/substratevm/mx.substratevm/suite.py index d63dcbb8e85c..4e964ac0338c 100644 --- a/substratevm/mx.substratevm/suite.py +++ b/substratevm/mx.substratevm/suite.py @@ -309,6 +309,7 @@ "dependencies": [ "com.oracle.svm.common", "com.oracle.svm.shaded.org.objectweb.asm", + "SVM_CONFIGURE", ], "requires" : [ "java.compiler", @@ -684,6 +685,7 @@ "com.oracle.objectfile", "com.oracle.graal.reachability", "com.oracle.svm.core.graal.amd64", + "SVM_CONFIGURE", ], "requires" : [ "jdk.jfr", @@ -798,6 +800,9 @@ "com.oracle.svm.hosted", "com.oracle.svm.core.foreign" ], + "distDependencies": [ + "SVM_CONFIGURE" + ], "requiresConcealed": { "java.base": [ "jdk.internal.foreign", @@ -1404,7 +1409,10 @@ "resources", ], "dependencies": [ - "com.oracle.svm.core", + "com.oracle.svm.util", + "compiler:GRAAL", + "sdk:NATIVEIMAGE", + "sdk:COLLECTIONS", ], "requiresConcealed": { "jdk.internal.vm.ci": [ @@ -1497,6 +1505,7 @@ "dependencies": [ "com.oracle.svm.hosted", "truffle:TRUFFLE_RUNTIME", + "sdk:NATIVEIMAGE", ], "requiresConcealed": { "jdk.internal.vm.ci": [ @@ -1674,6 +1683,7 @@ "POINTSTO", "compiler:GRAAL", "NATIVE_IMAGE_BASE", + "SVM_CONFIGURE", ], "moduleInfo" : { "name" : "org.graalvm.nativeimage.builder", @@ -1682,7 +1692,6 @@ """* to org.graalvm.nativeimage.base, jdk.graal.compiler, org.graalvm.nativeimage.driver, - org.graalvm.nativeimage.configure, org.graalvm.nativeimage.librarysupport, org.graalvm.nativeimage.junitsupport, org.graalvm.nativeimage.llvm, @@ -1724,6 +1733,7 @@ "transitive org.graalvm.nativeimage.pointsto", "org.graalvm.collections", "org.graalvm.truffle.compiler", + "org.graalvm.nativeimage.configure", "org.graalvm.nativeimage.libgraal" ], "uses" : [ @@ -2068,13 +2078,16 @@ "description" : "SubstrateVM native-image-agent library", "dependencies": [ "com.oracle.svm.agent", - "com.oracle.svm.configure", ], "distDependencies": [ "JVMTI_AGENT_BASE", "LIBRARY_SUPPORT", "SVM_DRIVER", - "SVM_CONFIGURE" + "SVM_CONFIGURE", + "NATIVE_IMAGE_BASE", + "compiler:GRAAL", + "sdk:NATIVEIMAGE", + "sdk:COLLECTIONS", ], "moduleInfo" : { "name" : "org.graalvm.nativeimage.agent.tracing", @@ -2090,6 +2103,7 @@ "jdk.graal.compiler", "org.graalvm.collections", "org.graalvm.nativeimage.builder", + "org.graalvm.nativeimage.configure", ], }, # vm: included as binary, tool descriptor intentionally not copied @@ -2126,22 +2140,25 @@ "com.oracle.svm.configure", ], "distDependencies": [ - "LIBRARY_SUPPORT", + "NATIVE_IMAGE_BASE" ], "moduleInfo" : { "name" : "org.graalvm.nativeimage.configure", "exports" : [ "* to org.graalvm.nativeimage.agent.tracing", "com.oracle.svm.configure", + "com.oracle.svm.configure.config", + "com.oracle.svm.configure.config.conditional", "com.oracle.svm.configure.command", ], "requires": [ "jdk.graal.compiler", "org.graalvm.collections", - "org.graalvm.nativeimage.builder", ], }, - "maven": False, + "maven": { + "tag": ["default", "public"], + }, }, "NATIVE_IMAGE_BASE": { @@ -2167,7 +2184,7 @@ "org.graalvm.collections", ], "exports" : [ - "com.oracle.svm.util to org.graalvm.nativeimage.pointsto,org.graalvm.nativeimage.builder,org.graalvm.nativeimage.librarysupport,org.graalvm.nativeimage.driver,org.graalvm.nativeimage.llvm,org.graalvm.nativeimage.agent.jvmtibase,org.graalvm.nativeimage.agent.tracing,org.graalvm.nativeimage.agent.diagnostics,org.graalvm.nativeimage.junitsupport,com.oracle.svm.svm_enterprise,com.oracle.svm_enterprise.ml_dataset,org.graalvm.extraimage.builder,com.oracle.svm.extraimage_enterprise,org.graalvm.extraimage.librarysupport,org.graalvm.nativeimage.foreign,org.graalvm.truffle.runtime.svm,com.oracle.truffle.enterprise.svm", + "com.oracle.svm.util to org.graalvm.nativeimage.pointsto,org.graalvm.nativeimage.builder,org.graalvm.nativeimage.configure,org.graalvm.nativeimage.librarysupport,org.graalvm.nativeimage.driver,org.graalvm.nativeimage.llvm,org.graalvm.nativeimage.agent.jvmtibase,org.graalvm.nativeimage.agent.tracing,org.graalvm.nativeimage.agent.diagnostics,org.graalvm.nativeimage.junitsupport,com.oracle.svm.svm_enterprise,com.oracle.svm_enterprise.ml_dataset,org.graalvm.extraimage.builder,com.oracle.svm.extraimage_enterprise,org.graalvm.extraimage.librarysupport,org.graalvm.nativeimage.foreign,org.graalvm.truffle.runtime.svm,com.oracle.truffle.enterprise.svm", "com.oracle.svm.common.meta to org.graalvm.nativeimage.pointsto,org.graalvm.nativeimage.builder,org.graalvm.nativeimage.llvm,org.graalvm.extraimage.builder,org.graalvm.nativeimage.foreign,org.graalvm.truffle.runtime.svm,com.oracle.truffle.enterprise.svm", "com.oracle.svm.common.option to org.graalvm.nativeimage.pointsto,org.graalvm.nativeimage.builder,org.graalvm.nativeimage.driver,org.graalvm.nativeimage.foreign,org.graalvm.truffle.runtime.svm,com.oracle.truffle.enterprise.svm", ], From 4a19667dc456093625a7ec45be18178df9d066e5 Mon Sep 17 00:00:00 2001 From: Matt D'Souza Date: Wed, 19 Mar 2025 10:09:35 -0400 Subject: [PATCH 6/6] Rename strictMetadata to combinedFileSchema --- .../src/com/oracle/svm/configure/ConfigurationBase.java | 9 ++++++++- .../svm/configure/ReflectionConfigurationParser.java | 4 ++-- .../svm/configure/ResourceConfigurationParser.java | 4 ++-- .../svm/configure/SerializationConfigurationParser.java | 4 ++-- .../configure/config/PredefinedClassesConfiguration.java | 6 +++--- .../oracle/svm/configure/config/ProxyConfiguration.java | 6 +++--- .../svm/configure/config/ResourceConfiguration.java | 4 ++-- .../svm/configure/config/SerializationConfiguration.java | 4 ++-- .../oracle/svm/configure/config/TypeConfiguration.java | 4 ++-- .../svm/hosted/config/ConfigurationParserUtils.java | 4 ++-- 10 files changed, 28 insertions(+), 21 deletions(-) diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationBase.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationBase.java index e450ce0412f0..35342fe6927a 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationBase.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationBase.java @@ -71,7 +71,14 @@ public T copyAndFilter(P predicate) { return copyAnd(copy -> copy.removeIf(predicate)); } - public abstract ConfigurationParser createParser(boolean strictMetadata, EnumSet parserOptions); + /** + * Creates a JSON parser used to parse and register configuration. + * + * @param combinedFileSchema whether the parser should support the combined + * reachability-metadata.json schema (if false, uses the legacy schema). + * @param parserOptions parser-specific options to enable different parsing features. + */ + public abstract ConfigurationParser createParser(boolean combinedFileSchema, EnumSet parserOptions); public abstract boolean supportsCombinedFile(); diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParser.java index 0b8271f21164..b64a960f4d18 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ReflectionConfigurationParser.java @@ -62,10 +62,10 @@ protected EnumSet supportedOptions() { return base; } - public static ReflectionConfigurationParser create(String combinedFileKey, boolean strictMetadata, + public static ReflectionConfigurationParser create(String combinedFileKey, boolean combinedFileSchema, ConfigurationConditionResolver conditionResolver, ReflectionConfigurationParserDelegate delegate, EnumSet parserOptions) { - if (strictMetadata) { + if (combinedFileSchema) { return new ReflectionMetadataParser<>(combinedFileKey, conditionResolver, delegate, parserOptions); } else { return new LegacyReflectionConfigurationParser<>(conditionResolver, delegate, parserOptions); diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceConfigurationParser.java index 8f9095d995bd..d5e8e7f9d954 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourceConfigurationParser.java @@ -45,9 +45,9 @@ public abstract class ResourceConfigurationParser extends ConditionalConfigur protected final ConfigurationConditionResolver conditionResolver; - public static ResourceConfigurationParser create(boolean strictMetadata, ConfigurationConditionResolver conditionResolver, ResourcesRegistry registry, + public static ResourceConfigurationParser create(boolean combinedFileSchema, ConfigurationConditionResolver conditionResolver, ResourcesRegistry registry, EnumSet parserOptions) { - if (strictMetadata) { + if (combinedFileSchema) { return new ResourceMetadataParser<>(conditionResolver, registry, parserOptions); } else { return new LegacyResourceConfigurationParser<>(conditionResolver, registry, parserOptions); diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationConfigurationParser.java index ca4811c7b185..11bfb62b878f 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/SerializationConfigurationParser.java @@ -42,9 +42,9 @@ public abstract class SerializationConfigurationParser extends ConditionalCon protected final ConfigurationConditionResolver conditionResolver; protected final RuntimeSerializationSupport serializationSupport; - public static SerializationConfigurationParser create(boolean strictMetadata, ConfigurationConditionResolver conditionResolver, RuntimeSerializationSupport serializationSupport, + public static SerializationConfigurationParser create(boolean combinedFileSchema, ConfigurationConditionResolver conditionResolver, RuntimeSerializationSupport serializationSupport, EnumSet parserOptions) { - if (strictMetadata) { + if (combinedFileSchema) { return new SerializationMetadataParser<>(conditionResolver, serializationSupport, parserOptions); } else { return new LegacySerializationConfigurationParser<>(conditionResolver, serializationSupport, parserOptions); diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/PredefinedClassesConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/PredefinedClassesConfiguration.java index 191f4c26d7c8..cbc36829cd9b 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/PredefinedClassesConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/PredefinedClassesConfiguration.java @@ -169,9 +169,9 @@ public void printJson(JsonWriter writer) throws IOException { } @Override - public ConfigurationParser createParser(boolean strictMetadata, EnumSet parserOptions) { - if (strictMetadata) { - throw new IllegalArgumentException("Predefined classes configuration is not supported with strict metadata"); + public ConfigurationParser createParser(boolean combinedFileSchema, EnumSet parserOptions) { + if (combinedFileSchema) { + throw new IllegalArgumentException("Predefined classes configuration is only supported with the legacy metadata schema"); } return new PredefinedClassesConfigurationParser(this::add, parserOptions); } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ProxyConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ProxyConfiguration.java index d4c73c9aa897..3780ad9fe8ab 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ProxyConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ProxyConfiguration.java @@ -138,9 +138,9 @@ public static void printProxyInterfaces(JsonWriter writer, List parserOptions) { - if (strictMetadata) { - throw new IllegalArgumentException("Independent proxy configuration is not supported with strict metadata"); + public ConfigurationParser createParser(boolean combinedFileSchema, EnumSet parserOptions) { + if (combinedFileSchema) { + throw new IllegalArgumentException("Independent proxy configuration is only supported with the legacy metadata schema"); } return new ProxyConfigurationParser<>(ConfigurationConditionResolver.identityResolver(), parserOptions, (cond, interfaces) -> interfaceLists.add(new ConditionalElement<>(cond, interfaces))); diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java index 044c304693bb..61c884918041 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java @@ -381,8 +381,8 @@ void printGlobsJson(JsonWriter writer, boolean combinedFile) throws IOException } @Override - public ConfigurationParser createParser(boolean strictMetadata, EnumSet parserOptions) { - return ResourceConfigurationParser.create(strictMetadata, ConfigurationConditionResolver.identityResolver(), new ParserAdapter(this), parserOptions); + public ConfigurationParser createParser(boolean combinedFileSchema, EnumSet parserOptions) { + return ResourceConfigurationParser.create(combinedFileSchema, ConfigurationConditionResolver.identityResolver(), new ParserAdapter(this), parserOptions); } private static void printResourceBundle(BundleConfiguration config, JsonWriter writer, boolean combinedFile) throws IOException { diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfiguration.java index 998119a857fd..79186a3ed3cc 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SerializationConfiguration.java @@ -132,8 +132,8 @@ public void printLegacyJson(JsonWriter writer) throws IOException { } @Override - public ConfigurationParser createParser(boolean strictMetadata, EnumSet parserOptions) { - return SerializationConfigurationParser.create(strictMetadata, ConfigurationConditionResolver.identityResolver(), this, parserOptions); + public ConfigurationParser createParser(boolean combinedFileSchema, EnumSet parserOptions) { + return SerializationConfigurationParser.create(combinedFileSchema, ConfigurationConditionResolver.identityResolver(), this, parserOptions); } @Override diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/TypeConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/TypeConfiguration.java index c6f4410dbed5..d95ab41f07d8 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/TypeConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/TypeConfiguration.java @@ -155,8 +155,8 @@ public void printJson(JsonWriter writer) throws IOException { } @Override - public ConfigurationParser createParser(boolean strictMetadata, EnumSet parserOptions) { - return ReflectionConfigurationParser.create(combinedFileKey, strictMetadata, ConfigurationConditionResolver.identityResolver(), new ParserConfigurationAdapter(this), parserOptions); + public ConfigurationParser createParser(boolean combinedFileSchema, EnumSet parserOptions) { + return ReflectionConfigurationParser.create(combinedFileKey, combinedFileSchema, ConfigurationConditionResolver.identityResolver(), new ParserConfigurationAdapter(this), parserOptions); } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java index b3fa826e6844..bd9801dfbba5 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java @@ -60,10 +60,10 @@ public final class ConfigurationParserUtils { - public static ReflectionConfigurationParser> create(String combinedFileKey, boolean strictMetadata, + public static ReflectionConfigurationParser> create(String combinedFileKey, boolean combinedFileSchema, ConfigurationConditionResolver conditionResolver, ReflectionRegistry registry, ProxyRegistry proxyRegistry, RuntimeSerializationSupport serializationSupport, ImageClassLoader imageClassLoader) { - return ReflectionConfigurationParser.create(combinedFileKey, strictMetadata, conditionResolver, + return ReflectionConfigurationParser.create(combinedFileKey, combinedFileSchema, conditionResolver, RegistryAdapter.create(registry, proxyRegistry, serializationSupport, imageClassLoader), ConfigurationFiles.Options.getConfigurationParserOptions()); }