Skip to content

Commit ba0017c

Browse files
committed
Adding knownTypes static to enum generation to filter out the unknown SDK enums.
1 parent 756f490 commit ba0017c

3 files changed

Lines changed: 44 additions & 1 deletion

File tree

codegen/src/main/java/software/amazon/awssdk/codegen/poet/common/EnumClass.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,22 @@
2222

2323
import com.squareup.javapoet.ClassName;
2424
import com.squareup.javapoet.MethodSpec;
25+
import com.squareup.javapoet.ParameterizedTypeName;
2526
import com.squareup.javapoet.TypeSpec;
2627
import com.squareup.javapoet.TypeSpec.Builder;
28+
import java.util.Collections;
29+
import java.util.Set;
30+
import java.util.stream.Collectors;
2731
import java.util.stream.Stream;
2832
import javax.lang.model.element.Modifier;
2933
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
3034
import software.amazon.awssdk.codegen.poet.ClassSpec;
35+
import software.amazon.awssdk.codegen.poet.StaticImport;
3136

3237
public final class EnumClass implements ClassSpec {
3338

3439
private static final String VALUE = "value";
40+
private static final String UNKNOWN_TO_SDK_VERSION = "UNKNOWN_TO_SDK_VERSION";
3541
private final ShapeModel shape;
3642
private final ClassName className;
3743

@@ -46,6 +52,7 @@ public TypeSpec poetSpec() {
4652
.addField(String.class, VALUE, Modifier.PRIVATE, Modifier.FINAL)
4753
.addMethod(toStringBuilder().addStatement("return $T.valueOf($N)", String.class, VALUE).build())
4854
.addMethod(fromValueSpec())
55+
.addMethod(knownValuesSpec())
4956
.addMethod(createConstructor());
5057

5158
addDeprecated(enumBuilder::addAnnotation, shape);
@@ -54,7 +61,7 @@ public TypeSpec poetSpec() {
5461
shape.getEnums().forEach(
5562
e -> enumBuilder.addEnumConstant(e.getName(), TypeSpec.anonymousClassBuilder("$S", e.getValue()).build())
5663
);
57-
enumBuilder.addEnumConstant("UNKNOWN_TO_SDK_VERSION", TypeSpec.anonymousClassBuilder("null").build());
64+
enumBuilder.addEnumConstant(UNKNOWN_TO_SDK_VERSION, TypeSpec.anonymousClassBuilder("null").build());
5865

5966
return enumBuilder.build();
6067
}
@@ -64,6 +71,11 @@ public ClassName className() {
6471
return className;
6572
}
6673

74+
@Override
75+
public Iterable<StaticImport> staticImports() {
76+
return Collections.singleton(StaticImport.staticMethodImport(Collectors.class, "toSet"));
77+
}
78+
6779
private MethodSpec createConstructor() {
6880
return MethodSpec.constructorBuilder()
6981
.addModifiers(Modifier.PRIVATE)
@@ -93,4 +105,18 @@ private MethodSpec fromValueSpec() {
93105
VALUE)
94106
.build();
95107
}
108+
109+
private MethodSpec knownValuesSpec() {
110+
return MethodSpec.methodBuilder("knownValues")
111+
.returns(ParameterizedTypeName.get(ClassName.get(Set.class), className))
112+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
113+
.addJavadoc("Use this in place of {@link #values()} to return a {@link Set} of all values known to the "
114+
+ "SDK.\n"
115+
+ "This will return all known enum values except {@link #$N}.\n\n"
116+
+ "@return a {@link $T} of known {@link $T}s", UNKNOWN_TO_SDK_VERSION, Set.class, className)
117+
.addStatement("return $T.of(values()).filter(v -> v != $N).collect(toSet())",
118+
Stream.class,
119+
UNKNOWN_TO_SDK_VERSION)
120+
.build();
121+
}
96122
}

codegen/src/main/resources/templates/common/enum-class.ftl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,8 @@ public enum ${shape.shapeName} {
4949

5050
throw new IllegalArgumentException("Cannot create enum from " + value + " value!");
5151
}
52+
53+
public static Set<${shape.shapeName}> knownValues() {
54+
return Stream.of(values()).filter(v -> v != UNKNOWN_TO_SDK_VERSION).collect(toSet());
55+
}
5256
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/common/test-enum-class.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package software.amazon.awssdk.codegen.poet.common.model;
22

3+
import static java.util.stream.Collectors.toSet;
4+
5+
import java.util.Set;
36
import java.util.stream.Stream;
47
import javax.annotation.Generated;
58

@@ -38,4 +41,14 @@ public static TestEnumClass fromValue(String value) {
3841
}
3942
return Stream.of(TestEnumClass.values()).filter(e -> e.toString().equals(value)).findFirst().orElse(UNKNOWN_TO_SDK_VERSION);
4043
}
44+
45+
/**
46+
* Use this in place of {@link #values()} to return a {@link Set} of all values known to the SDK.
47+
* This will return all known enum values except {@link #UNKNOWN_TO_SDK_VERSION}.
48+
*
49+
* @return a {@link Set} of known {@link TestEnumClass}s
50+
*/
51+
public static Set<TestEnumClass> knownValues() {
52+
return Stream.of(values()).filter(v -> v != UNKNOWN_TO_SDK_VERSION).collect(toSet());
53+
}
4154
}

0 commit comments

Comments
 (0)