2222
2323import com .squareup .javapoet .ClassName ;
2424import com .squareup .javapoet .MethodSpec ;
25+ import com .squareup .javapoet .ParameterizedTypeName ;
2526import com .squareup .javapoet .TypeSpec ;
2627import com .squareup .javapoet .TypeSpec .Builder ;
28+ import java .util .Collections ;
29+ import java .util .Set ;
30+ import java .util .stream .Collectors ;
2731import java .util .stream .Stream ;
2832import javax .lang .model .element .Modifier ;
2933import software .amazon .awssdk .codegen .model .intermediate .ShapeModel ;
3034import software .amazon .awssdk .codegen .poet .ClassSpec ;
35+ import software .amazon .awssdk .codegen .poet .StaticImport ;
3136
3237public 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}
0 commit comments