Skip to content

Commit 110041b

Browse files
authored
Use partitions.json to generate Region class (#6120)
* Use partitions.json to generate Region class * Updating the test files * Fixing errors * Fixing test failures * Additional changes - Creating a new PartitionsMetadata for partisions.json * Fixing Checkstyle issues * Fixing Checkstyle issues * Fixing Checkstyle issues * Updating file names to resolve conflicts * Fixing Checkstyle issues * Updating file names * Updating file names
1 parent 34a6beb commit 110041b

File tree

14 files changed

+715
-95
lines changed

14 files changed

+715
-95
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "feature",
3+
"category": "AWS SDK for Java v2",
4+
"contributor": "",
5+
"description": "Updated Region class generation to use Partitions.json instead of the Endpoints.json and removed the hardcoded global regions."
6+
}

codegen-lite-maven-plugin/src/main/java/software/amazon/awssdk/codegen/lite/maven/plugin/RegionGenerationMojo.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,15 @@
2929
import software.amazon.awssdk.codegen.lite.regions.EndpointTagGenerator;
3030
import software.amazon.awssdk.codegen.lite.regions.PartitionMetadataGenerator;
3131
import software.amazon.awssdk.codegen.lite.regions.PartitionMetadataProviderGenerator;
32+
import software.amazon.awssdk.codegen.lite.regions.PartitionsRegionsMetadataLoader;
3233
import software.amazon.awssdk.codegen.lite.regions.RegionGenerator;
3334
import software.amazon.awssdk.codegen.lite.regions.RegionMetadataGenerator;
3435
import software.amazon.awssdk.codegen.lite.regions.RegionMetadataLoader;
3536
import software.amazon.awssdk.codegen.lite.regions.RegionMetadataProviderGenerator;
3637
import software.amazon.awssdk.codegen.lite.regions.ServiceMetadataGenerator;
3738
import software.amazon.awssdk.codegen.lite.regions.ServiceMetadataProviderGenerator;
3839
import software.amazon.awssdk.codegen.lite.regions.model.Partitions;
40+
import software.amazon.awssdk.codegen.lite.regions.model.PartitionsRegionsMetadata;
3941
import software.amazon.awssdk.utils.StringUtils;
4042

4143
/**
@@ -59,19 +61,24 @@ public class RegionGenerationMojo extends AbstractMojo {
5961
"${basedir}/src/main/resources/software/amazon/awssdk/regions/internal/region/endpoints.json")
6062
private File endpoints;
6163

64+
@Parameter(property = "partitionsJson", defaultValue =
65+
"${basedir}/../../codegen/src/main/resources/software/amazon/awssdk/codegen/rules/partitions.json.resource")
66+
private File partitionsJson;
67+
6268
@Override
6369
public void execute() throws MojoExecutionException {
6470
Path baseSourcesDirectory = Paths.get(outputDirectory).resolve("generated-sources").resolve("sdk");
6571
Path testsDirectory = Paths.get(outputDirectory).resolve("generated-test-sources").resolve("sdk-tests");
6672

6773
Partitions partitions = RegionMetadataLoader.build(endpoints);
74+
PartitionsRegionsMetadata regionPartitions = PartitionsRegionsMetadataLoader.build(partitionsJson);
6875

6976
generatePartitionMetadataClass(baseSourcesDirectory, partitions);
70-
generateRegionClass(baseSourcesDirectory, partitions);
77+
generateRegionClass(baseSourcesDirectory, regionPartitions);
7178
generateServiceMetadata(baseSourcesDirectory, partitions);
72-
generateRegions(baseSourcesDirectory, partitions);
79+
generateRegions(baseSourcesDirectory, regionPartitions);
7380
generatePartitionProvider(baseSourcesDirectory, partitions);
74-
generateRegionProvider(baseSourcesDirectory, partitions);
81+
generateRegionProvider(baseSourcesDirectory, regionPartitions);
7582
generateServiceProvider(baseSourcesDirectory, partitions);
7683
generateEndpointTags(baseSourcesDirectory, partitions);
7784

@@ -88,7 +95,7 @@ public void generatePartitionMetadataClass(Path baseSourcesDirectory, Partitions
8895
REGION_BASE)).generate());
8996
}
9097

91-
public void generateRegionClass(Path baseSourcesDirectory, Partitions partitions) {
98+
public void generateRegionClass(Path baseSourcesDirectory, PartitionsRegionsMetadata partitions) {
9299
Path sourcesDirectory = baseSourcesDirectory.resolve(StringUtils.replace(REGION_BASE, ".", "/"));
93100
new CodeGenerator(sourcesDirectory.toString(), new RegionGenerator(partitions, REGION_BASE)).generate();
94101
}
@@ -105,7 +112,7 @@ public void generateServiceMetadata(Path baseSourcesDirectory, Partitions partit
105112
.generate());
106113
}
107114

108-
public void generateRegions(Path baseSourcesDirectory, Partitions partitions) {
115+
public void generateRegions(Path baseSourcesDirectory, PartitionsRegionsMetadata partitions) {
109116
Path sourcesDirectory = baseSourcesDirectory.resolve(StringUtils.replace(REGION_METADATA_BASE, ".", "/"));
110117
partitions.getPartitions()
111118
.forEach(p -> p.getRegions().forEach((k, v) ->
@@ -126,7 +133,7 @@ public void generatePartitionProvider(Path baseSourcesDirectory, Partitions part
126133
.generate();
127134
}
128135

129-
public void generateRegionProvider(Path baseSourcesDirectory, Partitions partitions) {
136+
public void generateRegionProvider(Path baseSourcesDirectory, PartitionsRegionsMetadata partitions) {
130137
Path sourcesDirectory = baseSourcesDirectory.resolve(StringUtils.replace(REGION_BASE, ".", "/"));
131138
new CodeGenerator(sourcesDirectory.toString(), new RegionMetadataProviderGenerator(partitions,
132139
REGION_METADATA_BASE,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.awssdk.codegen.lite.regions;
17+
18+
import com.fasterxml.jackson.jr.ob.JSON;
19+
import java.io.File;
20+
import java.io.IOException;
21+
import software.amazon.awssdk.annotations.SdkInternalApi;
22+
import software.amazon.awssdk.codegen.lite.regions.model.PartitionsRegionsMetadata;
23+
24+
/**
25+
* Loads and parses the partitions.json file into {@link PartitionsRegionsMetadata}.
26+
*/
27+
@SdkInternalApi
28+
public final class PartitionsRegionsMetadataLoader {
29+
30+
private PartitionsRegionsMetadataLoader() {
31+
}
32+
33+
public static PartitionsRegionsMetadata build(File path) {
34+
return loadPartitionFromStream(path, path.toString());
35+
}
36+
37+
private static PartitionsRegionsMetadata loadPartitionFromStream(File stream, String location) {
38+
39+
try {
40+
return JSON.std.with(JSON.Feature.USE_IS_GETTERS)
41+
.beanFrom(PartitionsRegionsMetadata.class, stream);
42+
43+
} catch (IOException | RuntimeException e) {
44+
throw new RuntimeException("Error while loading partitions file from " + location, e);
45+
}
46+
}
47+
}

codegen-lite/src/main/java/software/amazon/awssdk/codegen/lite/regions/RegionGenerator.java

Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,16 @@
3838
import software.amazon.awssdk.annotations.Generated;
3939
import software.amazon.awssdk.annotations.SdkPublicApi;
4040
import software.amazon.awssdk.codegen.lite.PoetClass;
41-
import software.amazon.awssdk.codegen.lite.regions.model.Partitions;
41+
import software.amazon.awssdk.codegen.lite.regions.model.PartitionsRegionsMetadata;
4242
import software.amazon.awssdk.utils.Validate;
4343
import software.amazon.awssdk.utils.http.SdkHttpUtils;
4444

4545
public class RegionGenerator implements PoetClass {
4646

47-
private final Partitions partitions;
47+
private final PartitionsRegionsMetadata partitions;
4848
private final String basePackage;
4949

50-
public RegionGenerator(Partitions partitions,
50+
public RegionGenerator(PartitionsRegionsMetadata partitions,
5151
String basePackage) {
5252
this.partitions = partitions;
5353
this.basePackage = basePackage;
@@ -100,21 +100,15 @@ private void regions(TypeSpec.Builder builder) {
100100
.add("$T.unmodifiableList($T.asList(", Collections.class, Arrays.class);
101101

102102
String regionsCodeBlock = regions.stream().map(r -> {
103+
boolean isGlobal = r.contains("global");
103104
builder.addField(FieldSpec.builder(className(), regionName(r))
104105
.addModifiers(PUBLIC, STATIC, FINAL)
105-
.initializer("$T.of($S)", className(), r)
106+
.initializer(isGlobal ? "$T.of($S, true)" : "$T.of($S)", className(), r)
106107
.build());
107108
return regionName(r);
108109
}).collect(Collectors.joining(", "));
109110

110-
addGlobalRegions(builder);
111-
112-
regionsArray.add(regionsCodeBlock + ", ")
113-
.add("AWS_GLOBAL, ")
114-
.add("AWS_CN_GLOBAL, ")
115-
.add("AWS_US_GOV_GLOBAL, ")
116-
.add("AWS_ISO_GLOBAL, ")
117-
.add("AWS_ISO_B_GLOBAL");
111+
regionsArray.add(regionsCodeBlock);
118112
regionsArray.add("))");
119113

120114
TypeName listOfRegions = ParameterizedTypeName.get(ClassName.get(List.class), className());
@@ -123,29 +117,6 @@ private void regions(TypeSpec.Builder builder) {
123117
.initializer(regionsArray.build()).build());
124118
}
125119

126-
private void addGlobalRegions(TypeSpec.Builder builder) {
127-
builder.addField(FieldSpec.builder(className(), "AWS_GLOBAL")
128-
.addModifiers(PUBLIC, STATIC, FINAL)
129-
.initializer("$T.of($S, true)", className(), "aws-global")
130-
.build())
131-
.addField(FieldSpec.builder(className(), "AWS_CN_GLOBAL")
132-
.addModifiers(PUBLIC, STATIC, FINAL)
133-
.initializer("$T.of($S, true)", className(), "aws-cn-global")
134-
.build())
135-
.addField(FieldSpec.builder(className(), "AWS_US_GOV_GLOBAL")
136-
.addModifiers(PUBLIC, STATIC, FINAL)
137-
.initializer("$T.of($S, true)", className(), "aws-us-gov-global")
138-
.build())
139-
.addField(FieldSpec.builder(className(), "AWS_ISO_GLOBAL")
140-
.addModifiers(PUBLIC, STATIC, FINAL)
141-
.initializer("$T.of($S, true)", className(), "aws-iso-global")
142-
.build())
143-
.addField(FieldSpec.builder(className(), "AWS_ISO_B_GLOBAL")
144-
.addModifiers(PUBLIC, STATIC, FINAL)
145-
.initializer("$T.of($S, true)", className(), "aws-iso-b-global")
146-
.build());
147-
}
148-
149120
private String regionName(String region) {
150121
return region.replace("-", "_").toUpperCase(Locale.US);
151122
}

codegen-lite/src/main/java/software/amazon/awssdk/codegen/lite/regions/RegionMetadataGenerator.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,17 @@
3232
import software.amazon.awssdk.annotations.SdkPublicApi;
3333
import software.amazon.awssdk.codegen.lite.PoetClass;
3434
import software.amazon.awssdk.codegen.lite.Utils;
35-
import software.amazon.awssdk.codegen.lite.regions.model.Partition;
35+
import software.amazon.awssdk.codegen.lite.regions.model.PartitionRegionsMetadata;
3636

3737
public class RegionMetadataGenerator implements PoetClass {
3838

39-
private final Partition partition;
39+
private final PartitionRegionsMetadata partition;
4040
private final String region;
4141
private final String regionDescription;
4242
private final String basePackage;
4343
private final String regionBasePackage;
4444

45-
public RegionMetadataGenerator(Partition partition,
45+
public RegionMetadataGenerator(PartitionRegionsMetadata partition,
4646
String region,
4747
String regionDescription,
4848
String basePackage,
@@ -65,9 +65,9 @@ public TypeSpec poetClass() {
6565
.addModifiers(FINAL)
6666
.addSuperinterface(ClassName.get(regionBasePackage, "RegionMetadata"))
6767
.addField(staticFinalField("ID", region))
68-
.addField(staticFinalField("DOMAIN", partition.getDnsSuffix()))
68+
.addField(staticFinalField("DOMAIN", partition.getOutputs().getDnsSuffix()))
6969
.addField(staticFinalField("DESCRIPTION", regionDescription))
70-
.addField(staticFinalField("PARTITION_ID", partition.getPartition()))
70+
.addField(staticFinalField("PARTITION_ID", partition.getId()))
7171
.addMethod(getter("id", "ID"))
7272
.addMethod(getter("domain", "DOMAIN"))
7373
.addMethod(getter("description", "DESCRIPTION"))

codegen-lite/src/main/java/software/amazon/awssdk/codegen/lite/regions/RegionMetadataProviderGenerator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,16 @@
3636
import software.amazon.awssdk.annotations.SdkPublicApi;
3737
import software.amazon.awssdk.codegen.lite.PoetClass;
3838
import software.amazon.awssdk.codegen.lite.Utils;
39-
import software.amazon.awssdk.codegen.lite.regions.model.Partitions;
39+
import software.amazon.awssdk.codegen.lite.regions.model.PartitionsRegionsMetadata;
4040
import software.amazon.awssdk.utils.ImmutableMap;
4141

4242
public class RegionMetadataProviderGenerator implements PoetClass {
4343

44-
private final Partitions partitions;
44+
private final PartitionsRegionsMetadata partitions;
4545
private final String basePackage;
4646
private final String regionBasePackage;
4747

48-
public RegionMetadataProviderGenerator(Partitions partitions,
48+
public RegionMetadataProviderGenerator(PartitionsRegionsMetadata partitions,
4949
String basePackage,
5050
String regionBasePackage) {
5151
this.partitions = partitions;
@@ -79,7 +79,7 @@ public ClassName className() {
7979
return ClassName.get(regionBasePackage, "GeneratedRegionMetadataProvider");
8080
}
8181

82-
private CodeBlock regions(Partitions partitions) {
82+
private CodeBlock regions(PartitionsRegionsMetadata partitions) {
8383
CodeBlock.Builder builder = CodeBlock.builder().add("$T.<Region, RegionMetadata>builder()", ImmutableMap.class);
8484

8585
partitions.getPartitions()

codegen-lite/src/main/java/software/amazon/awssdk/codegen/lite/regions/model/Partition.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ public Partition() {
6767

6868
public Partition(@JsonProperty(value = "partition") String partition,
6969
@JsonProperty(value = "regions") Map<String, PartitionRegion>
70-
regions,
70+
regions,
7171
@JsonProperty(value = "services") Map<String,
72-
Service> services) {
72+
Service> services) {
7373
this.partition = Validate.paramNotNull(partition, "Partition");
7474
this.regions = regions;
7575
this.services = services;
@@ -186,4 +186,4 @@ private boolean hasServiceEndpoint(String endpoint) {
186186
}
187187
return false;
188188
}
189-
}
189+
}

0 commit comments

Comments
 (0)