|
15 | 15 |
|
16 | 16 | package software.amazon.awssdk.codegen.poet.common;
|
17 | 17 |
|
18 |
| -import static software.amazon.awssdk.codegen.poet.PoetUtils.addDeprecated; |
19 |
| -import static software.amazon.awssdk.codegen.poet.PoetUtils.addJavadoc; |
20 |
| -import static software.amazon.awssdk.codegen.poet.PoetUtils.createEnumBuilder; |
21 |
| -import static software.amazon.awssdk.codegen.poet.PoetUtils.toStringBuilder; |
22 |
| - |
23 | 18 | import com.squareup.javapoet.ClassName;
|
24 |
| -import com.squareup.javapoet.MethodSpec; |
25 |
| -import com.squareup.javapoet.ParameterizedTypeName; |
26 | 19 | import com.squareup.javapoet.TypeSpec;
|
27 | 20 | import com.squareup.javapoet.TypeSpec.Builder;
|
28 |
| -import java.util.Collections; |
29 |
| -import java.util.Set; |
30 |
| -import java.util.stream.Collectors; |
31 |
| -import java.util.stream.Stream; |
32 |
| -import javax.lang.model.element.Modifier; |
33 | 21 | import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
|
34 |
| -import software.amazon.awssdk.codegen.poet.ClassSpec; |
35 |
| -import software.amazon.awssdk.codegen.poet.StaticImport; |
36 |
| - |
37 |
| -public final class EnumClass implements ClassSpec { |
| 22 | +import software.amazon.awssdk.codegen.poet.PoetUtils; |
38 | 23 |
|
39 |
| - private static final String VALUE = "value"; |
40 |
| - private static final String UNKNOWN_TO_SDK_VERSION = "UNKNOWN_TO_SDK_VERSION"; |
41 |
| - private final ShapeModel shape; |
42 |
| - private final ClassName className; |
| 24 | +public final class EnumClass extends AbstractEnumClass { |
| 25 | + private final String enumPackageName; |
43 | 26 |
|
44 | 27 | public EnumClass(String enumPackage, ShapeModel shape) {
|
45 |
| - this.shape = shape; |
46 |
| - this.className = ClassName.get(enumPackage, shape.getShapeName()); |
| 28 | + super(shape); |
| 29 | + this.enumPackageName = enumPackage; |
47 | 30 | }
|
48 | 31 |
|
49 | 32 | @Override
|
50 |
| - public TypeSpec poetSpec() { |
51 |
| - Builder enumBuilder = createEnumBuilder(className) |
52 |
| - .addField(String.class, VALUE, Modifier.PRIVATE, Modifier.FINAL) |
53 |
| - .addMethod(toStringBuilder().addStatement("return $T.valueOf($N)", String.class, VALUE).build()) |
54 |
| - .addMethod(fromValueSpec()) |
55 |
| - .addMethod(knownValuesSpec()) |
56 |
| - .addMethod(createConstructor()); |
57 |
| - |
58 |
| - addDeprecated(enumBuilder::addAnnotation, shape); |
59 |
| - addJavadoc(enumBuilder::addJavadoc, shape); |
60 |
| - |
61 |
| - shape.getEnums().forEach( |
62 |
| - e -> enumBuilder.addEnumConstant(e.getName(), TypeSpec.anonymousClassBuilder("$S", e.getValue()).build()) |
63 |
| - ); |
64 |
| - enumBuilder.addEnumConstant(UNKNOWN_TO_SDK_VERSION, TypeSpec.anonymousClassBuilder("null").build()); |
65 |
| - |
66 |
| - return enumBuilder.build(); |
| 33 | + protected void addDeprecated(Builder enumBuilder) { |
| 34 | + PoetUtils.addDeprecated(enumBuilder::addAnnotation, getShape()); |
67 | 35 | }
|
68 | 36 |
|
69 | 37 | @Override
|
70 |
| - public ClassName className() { |
71 |
| - return className; |
| 38 | + protected void addJavadoc(Builder enumBuilder) { |
| 39 | + PoetUtils.addJavadoc(enumBuilder::addJavadoc, getShape()); |
72 | 40 | }
|
73 | 41 |
|
74 | 42 | @Override
|
75 |
| - public Iterable<StaticImport> staticImports() { |
76 |
| - return Collections.singleton(StaticImport.staticMethodImport(Collectors.class, "toSet")); |
77 |
| - } |
78 |
| - |
79 |
| - private MethodSpec createConstructor() { |
80 |
| - return MethodSpec.constructorBuilder() |
81 |
| - .addModifiers(Modifier.PRIVATE) |
82 |
| - .addParameter(String.class, VALUE) |
83 |
| - .addStatement("this.$1N = $1N", VALUE) |
84 |
| - .build(); |
85 |
| - } |
86 |
| - |
87 |
| - private MethodSpec fromValueSpec() { |
88 |
| - return MethodSpec.methodBuilder("fromValue") |
89 |
| - .returns(className) |
90 |
| - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) |
91 |
| - .addJavadoc("Use this in place of valueOf to convert the raw string returned by the service into the " + |
92 |
| - "enum value.\n\n" + |
93 |
| - "@param $N real value\n" + |
94 |
| - "@return $T corresponding to the value\n", VALUE, className) |
95 |
| - .addParameter(String.class, VALUE) |
96 |
| - .beginControlFlow("if ($N == null)", VALUE) |
97 |
| - .addStatement("return null") |
98 |
| - .endControlFlow() |
99 |
| - .addStatement("return $1T.of($2T.values())\n" + |
100 |
| - ".filter(e -> e.toString().equals($3N))\n" + |
101 |
| - ".findFirst()\n" + |
102 |
| - ".orElse(UNKNOWN_TO_SDK_VERSION)", |
103 |
| - Stream.class, |
104 |
| - className, |
105 |
| - VALUE) |
106 |
| - .build(); |
| 43 | + protected void addEnumConstants(Builder enumBuilder) { |
| 44 | + getShape().getEnums().forEach( |
| 45 | + e -> enumBuilder.addEnumConstant(e.getName(), TypeSpec.anonymousClassBuilder("$S", e.getValue()).build()) |
| 46 | + ); |
107 | 47 | }
|
108 | 48 |
|
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(); |
| 49 | + @Override |
| 50 | + public ClassName className() { |
| 51 | + return ClassName.get(enumPackageName, getShape().getShapeName()); |
121 | 52 | }
|
122 | 53 | }
|
0 commit comments