@@ -37,7 +37,17 @@ private void loadRequirements() {
3737 if (element .getAsJsonObject ().has ("path" ) && element .getAsJsonObject ().has ("overlays" )) {
3838 PathMatcher pathMatcher = FileSystems .getDefault ().getPathMatcher (element .getAsJsonObject ().get ("path" ).getAsString ());
3939 List <String > overlays = element .getAsJsonObject ().getAsJsonArray ("overlays" ).asList ().stream ().map (JsonElement ::getAsString ).toList ();
40- requirements .add (new Requirement (pathMatcher , overlays ));
40+ List <ReplacementRule > replacementRules = new ArrayList <>();
41+ if (element .getAsJsonObject ().has ("replacements" ) && element .getAsJsonObject ().get ("replacements" ).isJsonArray ()) {
42+ for (JsonElement ruleElement : element .getAsJsonObject ().getAsJsonArray ("replacements" )) {
43+ if (!ruleElement .isJsonObject ()) continue ;
44+ JsonObject ruleObject = ruleElement .getAsJsonObject ();
45+ if (!ruleObject .has ("path" ) || !ruleObject .get ("path" ).isJsonPrimitive ()) continue ;
46+ if (!ruleObject .has ("replacement" ) || !ruleObject .get ("replacement" ).isJsonPrimitive ()) continue ;
47+ replacementRules .add (new ReplacementRule (ruleObject .get ("path" ).getAsString (), ruleObject .get ("replacement" ).getAsString ()));
48+ }
49+ }
50+ requirements .add (new Requirement (pathMatcher , overlays , replacementRules ));
4151 }
4252 });
4353 }
@@ -49,7 +59,6 @@ protected boolean defaultEnabled() {
4959
5060 @ Override
5161 protected ValidationResult <JsonObject > isValid (ValidationJob job , FileContext context , JsonObject data ) {
52- if (context .namespace ().getOverlay () != null ) return skip ();
5362 boolean failed = false ;
5463 for (Requirement requirement : requirements ) {
5564 if (requirement .path .matches (context .value ().toPath ())) {
@@ -62,7 +71,8 @@ protected ValidationResult<JsonObject> isValid(ValidationJob job, FileContext co
6271 if (optNamespace .isEmpty ())
6372 return failedError ("Could not find overlay {} although it is required" , requiredOverlay );
6473 OverlayNamespace namespace = optNamespace .get ();
65- File requiredFile = FileUtils .getFileInOverlay (namespace , context .value ());
74+ File updatedFile = new File (requirement .applyRules (context .value ()));
75+ File requiredFile = FileUtils .getFileInOverlay (namespace , updatedFile );
6676 if (requiredFile == null || !requiredFile .exists ()) {
6777 failed = true ;
6878 String path = requiredFile != null ? requiredFile .getPath () : "some unresolved location" ;
@@ -79,5 +89,22 @@ protected ValidationResult<JsonObject> isValid(ValidationJob job, FileContext co
7989 class Requirement {
8090 public final PathMatcher path ;
8191 public final List <String > overlays ;
92+ public final List <ReplacementRule > replacementRules ;
93+
94+ public String applyRules (File file ) {
95+ if (replacementRules == null ) return file .getPath ();
96+ String path = file .getPath ();
97+ for (ReplacementRule replacementRule : replacementRules ) {
98+ path = path .replace (replacementRule .path , replacementRule .replacement );
99+ }
100+ return path ;
101+ }
102+ }
103+
104+ @ RequiredArgsConstructor
105+ @ ToString
106+ class ReplacementRule {
107+ public final String path ;
108+ public final String replacement ;
82109 }
83110}
0 commit comments