Skip to content

Commit e7ea508

Browse files
committed
Adding tests, region generation and renaming service metadata classes
1 parent 72c5a5c commit e7ea508

File tree

20 files changed

+3828
-123
lines changed

20 files changed

+3828
-123
lines changed

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

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,22 @@
1818
import java.io.File;
1919
import java.nio.file.Path;
2020
import java.nio.file.Paths;
21-
import java.util.ArrayList;
22-
import java.util.Collection;
2321
import java.util.HashSet;
24-
import java.util.List;
2522
import java.util.Set;
26-
import java.util.stream.Collectors;
2723
import org.apache.maven.plugin.AbstractMojo;
2824
import org.apache.maven.plugin.MojoExecutionException;
2925
import org.apache.maven.plugins.annotations.Mojo;
3026
import org.apache.maven.plugins.annotations.Parameter;
3127
import org.apache.maven.project.MavenProject;
3228
import software.amazon.awssdk.codegen.lite.CodeGenerator;
29+
import software.amazon.awssdk.codegen.lite.regions.RegionGenerator;
3330
import software.amazon.awssdk.codegen.lite.regions.RegionMetadataGenerator;
3431
import software.amazon.awssdk.codegen.lite.regions.RegionMetadataLoader;
3532
import software.amazon.awssdk.codegen.lite.regions.RegionMetadataProviderGenerator;
3633
import software.amazon.awssdk.codegen.lite.regions.ServiceMetadataGenerator;
3734
import software.amazon.awssdk.codegen.lite.regions.ServiceMetadataProviderGenerator;
3835
import software.amazon.awssdk.codegen.lite.regions.model.Partitions;
36+
3937
/**
4038
* The Maven mojo to generate Java client code using software.amazon.awssdk:codegen module.
4139
*/
@@ -52,14 +50,16 @@ public class RegionGenerationMojo extends AbstractMojo {
5250
@Parameter(defaultValue = "${project}", readonly = true)
5351
private MavenProject project;
5452

55-
@Parameter(property = "endpoints", defaultValue = "${basedir}/src/main/resources/software/amazon/awssdk/regions/internal/region/endpoints.json")
53+
@Parameter(property = "endpoints", defaultValue =
54+
"${basedir}/src/main/resources/software/amazon/awssdk/regions/internal/region/endpoints.json")
5655
private File endpoints;
5756

5857
public void execute() throws MojoExecutionException {
5958
Path baseSourcesDirectory = Paths.get(outputDirectory).resolve("generated-sources").resolve("sdk");
6059

6160
Partitions partitions = RegionMetadataLoader.build(endpoints);
6261

62+
generateRegionClass(baseSourcesDirectory, partitions);
6363
generateServiceMetadata(baseSourcesDirectory, partitions);
6464
generateRegions(baseSourcesDirectory, partitions);
6565
generateRegionProvider(baseSourcesDirectory, partitions);
@@ -68,12 +68,21 @@ public void execute() throws MojoExecutionException {
6868
project.addCompileSourceRoot(baseSourcesDirectory.toFile().getAbsolutePath());
6969
}
7070

71+
public void generateRegionClass(Path baseSourcesDirectory, Partitions partitions) {
72+
Path sourcesDirectory = baseSourcesDirectory.resolve(REGION_BASE.replace(".", "/"));
73+
new CodeGenerator(sourcesDirectory.toString(), new RegionGenerator(partitions, REGION_BASE)).generate();
74+
}
75+
7176
public void generateServiceMetadata(Path baseSourcesDirectory, Partitions partitions) {
7277
Path sourcesDirectory = baseSourcesDirectory.resolve(SERVICE_METADATA_BASE.replace(".", "/"));
7378
Set<String> services = new HashSet<>();
7479
partitions.getPartitions().stream().forEach(p -> services.addAll(p.getServices().keySet()));
7580

76-
services.forEach(s -> new CodeGenerator(sourcesDirectory.toString(), new ServiceMetadataGenerator(partitions, s, SERVICE_METADATA_BASE, REGION_BASE)).generate());
81+
services.forEach(s -> new CodeGenerator(sourcesDirectory.toString(), new ServiceMetadataGenerator(partitions,
82+
s,
83+
SERVICE_METADATA_BASE,
84+
REGION_BASE))
85+
.generate());
7786
}
7887

7988
public void generateRegions(Path baseSourcesDirectory, Partitions partitions) {
@@ -91,14 +100,18 @@ public void generateRegions(Path baseSourcesDirectory, Partitions partitions) {
91100
}
92101

93102
public void generateRegionProvider(Path baseSourcesDirectory, Partitions partitions) {
94-
Path sourcesDirectory = baseSourcesDirectory.resolve(REGION_METADATA_BASE.replace(".", "/"));
95-
new CodeGenerator(sourcesDirectory.toString(), new RegionMetadataProviderGenerator(partitions, REGION_METADATA_BASE, REGION_BASE))
103+
Path sourcesDirectory = baseSourcesDirectory.resolve(REGION_BASE.replace(".", "/"));
104+
new CodeGenerator(sourcesDirectory.toString(), new RegionMetadataProviderGenerator(partitions,
105+
REGION_METADATA_BASE,
106+
REGION_BASE))
96107
.generate();
97108
}
98109

99110
public void generateServiceProvider(Path baseSourcesDirectory, Partitions partitions) {
100-
Path sourcesDirectory = baseSourcesDirectory.resolve(SERVICE_METADATA_BASE.replace(".", "/"));
101-
new CodeGenerator(sourcesDirectory.toString(), new ServiceMetadataProviderGenerator(partitions, SERVICE_METADATA_BASE, REGION_BASE))
111+
Path sourcesDirectory = baseSourcesDirectory.resolve(REGION_BASE.replace(".", "/"));
112+
new CodeGenerator(sourcesDirectory.toString(), new ServiceMetadataProviderGenerator(partitions,
113+
SERVICE_METADATA_BASE,
114+
REGION_BASE))
102115
.generate();
103116
}
104117
}

codegen-lite/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@
4949
<artifactId>mockito-core</artifactId>
5050
<scope>test</scope>
5151
</dependency>
52+
<dependency>
53+
<groupId>junit</groupId>
54+
<artifactId>junit</artifactId>
55+
<scope>test</scope>
56+
</dependency>
5257
<dependency>
5358
<groupId>software.amazon.awssdk</groupId>
5459
<artifactId>annotations</artifactId>

codegen-lite/src/main/java/software/amazon/awssdk/codegen/lite/CodeGenerator.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import software.amazon.awssdk.codegen.lite.emitters.CodeWriter;
2626
import software.amazon.awssdk.utils.IoUtils;
2727

28-
public class CodeGenerator {
28+
public final class CodeGenerator {
2929

3030
private final Writer writer;
3131
private final PoetClass poetClass;
@@ -37,7 +37,7 @@ public CodeGenerator(String outputDirectory, PoetClass poetClass) {
3737

3838
public void generate() {
3939
try {
40-
writer.write("" + "\n");
40+
writer.write(loadDefaultFileHeader() + "\n");
4141
JavaFile.builder(poetClass.className().packageName(), poetClass.poetClass())
4242
.skipJavaLangImports(true)
4343
.build()
@@ -50,17 +50,17 @@ public void generate() {
5050
}
5151
}
5252

53-
// private String loadDefaultFileHeader() throws IOException {
54-
// try (InputStream inputStream = getClass()
55-
// .getResourceAsStream("/software/amazon/awssdk/codegen/DefaultFileHeader.txt")) {
56-
// return IoUtils.toUtf8String(inputStream)
57-
// .replaceFirst("%COPYRIGHT_DATE_RANGE%", getCopyrightDateRange());
58-
// }
59-
// }
60-
//
61-
// private String getCopyrightDateRange() {
62-
// final int currentYear = ZonedDateTime.now().getYear();
63-
// final int copyrightStartYear = currentYear - 5;
64-
// return String.format("%d-%d", copyrightStartYear, currentYear);
65-
// }
53+
private String loadDefaultFileHeader() throws IOException {
54+
try (InputStream inputStream = getClass()
55+
.getResourceAsStream("/software/amazon/awssdk/codegen/lite/DefaultFileHeader.txt")) {
56+
return IoUtils.toUtf8String(inputStream)
57+
.replaceFirst("%COPYRIGHT_DATE_RANGE%", getCopyrightDateRange());
58+
}
59+
}
60+
61+
private String getCopyrightDateRange() {
62+
final int currentYear = ZonedDateTime.now().getYear();
63+
final int copyrightStartYear = currentYear - 5;
64+
return String.format("%d-%d", copyrightStartYear, currentYear);
65+
}
6666
}
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
/*
2+
* Copyright 2010-2018 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 static javax.lang.model.element.Modifier.FINAL;
19+
import static javax.lang.model.element.Modifier.PRIVATE;
20+
import static javax.lang.model.element.Modifier.PUBLIC;
21+
import static javax.lang.model.element.Modifier.STATIC;
22+
23+
import com.squareup.javapoet.AnnotationSpec;
24+
import com.squareup.javapoet.ClassName;
25+
import com.squareup.javapoet.CodeBlock;
26+
import com.squareup.javapoet.FieldSpec;
27+
import com.squareup.javapoet.MethodSpec;
28+
import com.squareup.javapoet.ParameterizedTypeName;
29+
import com.squareup.javapoet.TypeName;
30+
import com.squareup.javapoet.TypeSpec;
31+
import java.util.Arrays;
32+
import java.util.Collections;
33+
import java.util.List;
34+
import java.util.Locale;
35+
import java.util.Set;
36+
import java.util.concurrent.ConcurrentHashMap;
37+
import java.util.stream.Collectors;
38+
import software.amazon.awssdk.annotations.Generated;
39+
import software.amazon.awssdk.annotations.SdkPublicApi;
40+
import software.amazon.awssdk.codegen.lite.PoetClass;
41+
import software.amazon.awssdk.codegen.lite.regions.model.Partitions;
42+
import software.amazon.awssdk.utils.Validate;
43+
44+
public class RegionGenerator implements PoetClass {
45+
46+
private final Partitions partitions;
47+
private final String basePackage;
48+
49+
public RegionGenerator(Partitions partitions,
50+
String basePackage) {
51+
this.partitions = partitions;
52+
this.basePackage = basePackage;
53+
}
54+
55+
@Override
56+
public TypeSpec poetClass() {
57+
TypeSpec.Builder builder = TypeSpec.classBuilder(className())
58+
.addModifiers(FINAL, PUBLIC)
59+
.addAnnotation(SdkPublicApi.class)
60+
.addAnnotation(AnnotationSpec.builder(Generated.class)
61+
.addMember("value",
62+
"$S",
63+
"software.amazon.awssdk:codegen")
64+
.build())
65+
.addMethod(MethodSpec.constructorBuilder()
66+
.addModifiers(PRIVATE)
67+
.addParameter(String.class, "id")
68+
.addParameter(boolean.class, "isGlobalRegion")
69+
.addStatement("this.id = id")
70+
.addStatement("this.isGlobalRegion = isGlobalRegion")
71+
.build());
72+
regions(builder);
73+
74+
builder.addField(FieldSpec.builder(boolean.class, "isGlobalRegion")
75+
.addModifiers(FINAL, PRIVATE)
76+
.build())
77+
.addField(FieldSpec.builder(String.class, "id")
78+
.addModifiers(FINAL, PRIVATE)
79+
.build())
80+
.addMethod(regionOf())
81+
.addMethod(regionOfGlobal())
82+
.addMethod(id())
83+
.addMethod(regionsGetter())
84+
.addMethod(isGlobalRegion())
85+
.addMethod(regionToString());
86+
87+
return builder.addType(cache()).build();
88+
}
89+
90+
private void regions(TypeSpec.Builder builder) {
91+
Set<String> regions = partitions.getPartitions()
92+
.stream()
93+
.flatMap(p -> p.getRegions().keySet().stream())
94+
.collect(Collectors.toSet());
95+
96+
CodeBlock.Builder regionsArray = CodeBlock.builder()
97+
.add("$T.unmodifiableList($T.asList(", Collections.class, Arrays.class);
98+
99+
String regionsCodeBlock = regions.stream().map(r -> {
100+
builder.addField(FieldSpec.builder(className(), regionName(r))
101+
.addModifiers(PUBLIC, STATIC, FINAL)
102+
.initializer("$T.of($S)", className(), r)
103+
.build());
104+
return regionName(r);
105+
}).collect(Collectors.joining(", "));
106+
107+
addGlobalRegions(builder);
108+
109+
regionsArray.add(regionsCodeBlock + ", ").add("AWS_GLOBAL, ").add("AWS_CN_GLOBAL, ").add("AWS_US_GOV_GLOBAL");
110+
regionsArray.add("))");
111+
112+
TypeName listOfRegions = ParameterizedTypeName.get(ClassName.get(List.class), className());
113+
builder.addField(FieldSpec.builder(listOfRegions, "REGIONS")
114+
.addModifiers(PRIVATE, STATIC, FINAL)
115+
.initializer(regionsArray.build()).build());
116+
}
117+
118+
private void addGlobalRegions(TypeSpec.Builder builder) {
119+
builder.addField(FieldSpec.builder(className(), "AWS_GLOBAL")
120+
.addModifiers(PUBLIC, STATIC, FINAL)
121+
.initializer("$T.of($S, true)", className(), "aws-global")
122+
.build())
123+
.addField(FieldSpec.builder(className(), "AWS_CN_GLOBAL")
124+
.addModifiers(PUBLIC, STATIC, FINAL)
125+
.initializer("$T.of($S, true)", className(), "aws-cn-global")
126+
.build())
127+
.addField(FieldSpec.builder(className(), "AWS_US_GOV_GLOBAL")
128+
.addModifiers(PUBLIC, STATIC, FINAL)
129+
.initializer("$T.of($S, true)", className(), "aws-us-gov-global")
130+
.build());
131+
}
132+
133+
private String regionName(String region) {
134+
return region.replace("-", "_").toUpperCase(Locale.US);
135+
}
136+
137+
private MethodSpec regionOf() {
138+
return MethodSpec.methodBuilder("of")
139+
.addModifiers(PUBLIC, STATIC)
140+
.addParameter(String.class, "value")
141+
.returns(className())
142+
.addStatement("return of($L, false)", "value")
143+
.build();
144+
145+
}
146+
147+
private MethodSpec regionOfGlobal() {
148+
return MethodSpec.methodBuilder("of")
149+
.addModifiers(PRIVATE, STATIC)
150+
.addParameter(String.class, "value")
151+
.addParameter(boolean.class, "isGlobalRegion")
152+
.returns(className())
153+
.addStatement("$T.paramNotBlank($L, $S)", Validate.class, "value", "region")
154+
.addStatement("return $L.put($L, $L)", "RegionCache", "value", "isGlobalRegion")
155+
.build();
156+
157+
}
158+
159+
private MethodSpec id() {
160+
return MethodSpec.methodBuilder("id")
161+
.addModifiers(PUBLIC)
162+
.returns(String.class)
163+
.addStatement("return this.id")
164+
.build();
165+
}
166+
167+
private MethodSpec regionsGetter() {
168+
return MethodSpec.methodBuilder("regions")
169+
.addModifiers(PUBLIC, STATIC)
170+
.returns(ParameterizedTypeName.get(ClassName.get(List.class),
171+
className()))
172+
.addStatement("return $L", "REGIONS")
173+
.build();
174+
}
175+
176+
private MethodSpec isGlobalRegion() {
177+
return MethodSpec.methodBuilder("isGlobalRegion")
178+
.addModifiers(PUBLIC)
179+
.returns(boolean.class)
180+
.addStatement("return $L", "isGlobalRegion")
181+
.build();
182+
}
183+
184+
private MethodSpec regionToString() {
185+
return MethodSpec.methodBuilder("toString")
186+
.addAnnotation(Override.class)
187+
.addModifiers(PUBLIC)
188+
.returns(String.class)
189+
.addStatement("return $L", "id")
190+
.build();
191+
}
192+
193+
private TypeSpec cache() {
194+
ParameterizedTypeName mapOfStringRegion = ParameterizedTypeName.get(ClassName.get(ConcurrentHashMap.class),
195+
ClassName.get(String.class),
196+
className());
197+
198+
return TypeSpec.classBuilder("RegionCache")
199+
.addModifiers(PRIVATE, STATIC)
200+
.addField(FieldSpec.builder(mapOfStringRegion, "VALUES")
201+
.addModifiers(PRIVATE, STATIC, FINAL)
202+
.initializer("new $T<>()", ConcurrentHashMap.class)
203+
.build())
204+
205+
.addMethod(MethodSpec.constructorBuilder().addModifiers(PRIVATE).build())
206+
.addMethod(MethodSpec.methodBuilder("put")
207+
.addModifiers(PRIVATE, STATIC)
208+
.addParameter(String.class, "value")
209+
.addParameter(boolean.class, "isGlobalRegion")
210+
.returns(className())
211+
.addStatement("return $L.computeIfAbsent(value, v -> new $T(value, isGlobalRegion))",
212+
"VALUES",
213+
className())
214+
.build())
215+
.build();
216+
}
217+
218+
@Override
219+
public ClassName className() {
220+
return ClassName.get(basePackage, "Region");
221+
}
222+
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ public ClassName className() {
9393
}
9494

9595
private MethodSpec getter(String field) {
96-
return MethodSpec.methodBuilder(field).addModifiers(Modifier.PUBLIC).returns(String.class).addStatement("return $L", field.toUpperCase(Locale.US)).build();
96+
return MethodSpec.methodBuilder(field)
97+
.addModifiers(Modifier.PUBLIC)
98+
.returns(String.class)
99+
.addStatement("return $L", field.toUpperCase(Locale.US))
100+
.build();
97101
}
98102
}

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,8 @@
1818
import com.fasterxml.jackson.jr.ob.JSON;
1919
import java.io.File;
2020
import java.io.IOException;
21-
import java.io.InputStream;
22-
import java.nio.file.Path;
2321
import software.amazon.awssdk.annotations.SdkInternalApi;
2422
import software.amazon.awssdk.codegen.lite.regions.model.Partitions;
25-
import software.amazon.awssdk.utils.IoUtils;
2623

2724
/**
2825
* Loads all the partition files into memory.

0 commit comments

Comments
 (0)