@@ -138,7 +138,7 @@ private void writePartitionHash() {
138
138
}
139
139
});
140
140
writer .write ("regionRegex: $S," , partition .regionRegex );
141
- writer .write ("variants: $L," , ArrayNode .prettyPrintJson (partition .getVariants () ));
141
+ writer .write ("variants: $L," , ArrayNode .prettyPrintJson (partition .variants ));
142
142
partition .getPartitionEndpoint ().ifPresent (
143
143
endpoint -> writer .write ("endpoint: $S," , endpoint ));
144
144
});
@@ -199,7 +199,7 @@ private String getResolvedHostname(String hostnameTemplate, String dnsSuffix, St
199
199
}
200
200
201
201
private final class Partition {
202
- final ObjectNode defaults ;
202
+ final ArrayNode variants ;
203
203
final String dnsSuffix ;
204
204
final String identifier ;
205
205
final String regionRegex ;
@@ -210,7 +210,8 @@ private Partition(ObjectNode config, String partition) {
210
210
this .config = config ;
211
211
// Resolve the partition defaults + the service defaults.
212
212
ObjectNode partitionDefaults = config .expectObjectMember ("defaults" );
213
- defaults = partitionDefaults .merge (getService ().getObjectMember ("defaults" ).orElse (Node .objectNode ()));
213
+ ObjectNode serviceDefaults = getService ().getObjectMember ("defaults" ).orElse (Node .objectNode ());
214
+ ObjectNode defaults = partitionDefaults .merge (serviceDefaults );
214
215
215
216
dnsSuffix = config .expectStringMember ("dnsSuffix" ).getValue ();
216
217
identifier = partition ;
@@ -219,10 +220,12 @@ private Partition(ObjectNode config, String partition) {
219
220
// Resolve the template to use for this service in this partition.
220
221
String hostname = defaults .expectStringMember ("hostname" ).getValue ();
221
222
hostnameTemplate = getResolvedHostname (hostname , dnsSuffix , endpointPrefix );
222
- }
223
223
224
- ObjectNode getDefaults () {
225
- return defaults ;
224
+ ArrayNode mergedVariants = getMergedVariants (
225
+ partitionDefaults .getArrayMember ("variants" ).orElse (Node .arrayNode ()),
226
+ serviceDefaults .getArrayMember ("variants" ).orElse (Node .arrayNode ())
227
+ );
228
+ variants = getVariants (mergedVariants );
226
229
}
227
230
228
231
ObjectNode getService () {
@@ -243,24 +246,39 @@ Set<String> getAllRegions() {
243
246
return regions ;
244
247
}
245
248
246
- ArrayNode getVariants () {
249
+ private ArrayNode getVariants (ArrayNode mergedVariants ) {
247
250
List <Node > allVariants = new ArrayList <Node >();
248
251
249
252
allVariants .add (getDefaultVariant (hostnameTemplate ));
250
- if (defaults .containsMember ("variants" )) {
251
- ArrayNode variants = defaults .expectArrayMember ("variants" );
252
- variants .forEach (variant -> {
253
- ObjectNode variantNode = variant .expectObjectNode ();
254
- String hostname = variantNode .expectStringMember ("hostname" ).getValue ();
255
- String dnsSuffix = variantNode .getStringMemberOrDefault ("dnsSuffix" , this .dnsSuffix );
256
- String resolvedHostname = getResolvedHostname (hostname , dnsSuffix , endpointPrefix );
257
- allVariants .add (variantNode .withMember ("hostname" , resolvedHostname ).withoutMember ("dnsSuffix" ));
258
- });
259
- }
253
+ mergedVariants .forEach (mergedVariant -> {
254
+ ObjectNode variantNode = mergedVariant .expectObjectNode ();
255
+ String hostname = variantNode .expectStringMember ("hostname" ).getValue ();
256
+ String dnsSuffix = variantNode .getStringMemberOrDefault ("dnsSuffix" , this .dnsSuffix );
257
+ String resolvedHostname = getResolvedHostname (hostname , dnsSuffix , endpointPrefix );
258
+ allVariants .add (variantNode .withMember ("hostname" , resolvedHostname ).withoutMember ("dnsSuffix" ));
259
+ });
260
260
261
261
return ArrayNode .fromNodes (allVariants );
262
262
}
263
263
264
+ private ArrayNode getMergedVariants (ArrayNode partitionVariants , ArrayNode serviceVariants ) {
265
+ List <Node > mergedVariants = new ArrayList <Node >();
266
+
267
+ partitionVariants .forEach (partitionVariant -> {
268
+ ObjectNode partitionVariantNode = partitionVariant .expectObjectNode ();
269
+ ArrayNode tags = partitionVariantNode .expectArrayMember ("tags" );
270
+ Node equivalentServiceVariantNode = serviceVariants .getElements ().stream ()
271
+ .filter (serviceVariantNode -> tags .equals (
272
+ serviceVariantNode .expectObjectNode ().expectArrayMember ("tags" )))
273
+ .findFirst ()
274
+ .orElse (null );
275
+ mergedVariants .add ((equivalentServiceVariantNode == null )
276
+ ? partitionVariantNode : equivalentServiceVariantNode );
277
+ });
278
+
279
+ return ArrayNode .fromNodes (mergedVariants );
280
+ }
281
+
264
282
Optional <String > getPartitionEndpoint () {
265
283
ObjectNode service = getService ();
266
284
// Note: regionalized services always use regionalized endpoints.
0 commit comments