15
15
16
16
package software .amazon .awssdk .codegen .poet .model ;
17
17
18
+ import static software .amazon .awssdk .codegen .poet .model .TypeProvider .ShapeTransformation .USE_BUILDER ;
19
+
18
20
import com .squareup .javapoet .ClassName ;
19
21
import com .squareup .javapoet .CodeBlock ;
20
22
import com .squareup .javapoet .MethodSpec ;
21
23
import com .squareup .javapoet .ParameterizedTypeName ;
22
24
import com .squareup .javapoet .TypeName ;
23
25
import java .nio .ByteBuffer ;
24
- import java .util .Collection ;
25
26
import java .util .List ;
26
27
import java .util .Map ;
27
28
import java .util .stream .Collectors ;
28
29
import javax .lang .model .element .Modifier ;
29
- import software .amazon .awssdk .codegen .model .intermediate .MapModel ;
30
30
import software .amazon .awssdk .codegen .model .intermediate .MemberModel ;
31
31
import software .amazon .awssdk .codegen .poet .PoetExtensions ;
32
32
import software .amazon .awssdk .codegen .poet .PoetUtils ;
33
+ import software .amazon .awssdk .codegen .poet .model .TypeProvider .TypeNameOptions ;
33
34
import software .amazon .awssdk .core .SdkBytes ;
34
- import software .amazon .awssdk .utils .CollectionUtils ;
35
+ import software .amazon .awssdk .core .util .SdkAutoConstructList ;
36
+ import software .amazon .awssdk .core .util .SdkAutoConstructMap ;
35
37
36
38
public final class BeanGetterHelper {
37
39
private final PoetExtensions poetExtensions ;
40
+ private final ServiceModelCopiers copiers ;
38
41
private final TypeProvider typeProvider ;
39
42
40
- public BeanGetterHelper (PoetExtensions poetExtensions , TypeProvider typeProvider ) {
43
+ public BeanGetterHelper (PoetExtensions poetExtensions , ServiceModelCopiers copiers , TypeProvider typeProvider ) {
41
44
this .poetExtensions = poetExtensions ;
45
+ this .copiers = copiers ;
42
46
this .typeProvider = typeProvider ;
43
47
}
44
48
45
49
public MethodSpec beanStyleGetter (MemberModel memberModel ) {
46
50
if (memberModel .hasBuilder ()) {
47
51
return builderGetter (memberModel );
48
52
}
49
- if (memberModel .isCollectionWithBuilderMember ()) {
50
- return memberModel .isList () ? listOfBuildersGetter (memberModel ) : mapOfBuildersGetter (memberModel );
51
- }
52
- if (memberModel .isCollectionWithNestedBuilderMember ()) {
53
- return listOfMapOfBuilderGetter (memberModel );
53
+ if (memberModel .containsBuildable ()) {
54
+ return buildableContainerGetter (memberModel );
54
55
}
55
56
if (memberModel .isSdkBytesType ()) {
56
57
return byteBufferGetter (memberModel );
@@ -64,6 +65,40 @@ public MethodSpec beanStyleGetter(MemberModel memberModel) {
64
65
return regularGetter (memberModel );
65
66
}
66
67
68
+ private MethodSpec buildableContainerGetter (MemberModel memberModel ) {
69
+ TypeName returnType = typeProvider .typeName (memberModel , new TypeNameOptions ().shapeTransformation (USE_BUILDER )
70
+ .useByteBufferTypes (true ));
71
+
72
+ ClassName copierClass = copiers .copierClassFor (memberModel )
73
+ .orElseThrow (() -> new IllegalStateException ("Copier class not found for " + memberModel ));
74
+
75
+ String variableName = memberModel .getVariable ().getVariableName ();
76
+
77
+ CodeBlock .Builder code = CodeBlock .builder ();
78
+
79
+ code .add ("$T result = $T.$N(this.$N);" , returnType , copierClass , copiers .copyToBuilderMethodName (), variableName );
80
+
81
+ if (memberModel .isList ()) {
82
+ code .add ("if (result instanceof $T) {" , SdkAutoConstructList .class )
83
+ .add ("return null;" )
84
+ .add ("}" );
85
+ }
86
+
87
+ if (memberModel .isMap ()) {
88
+ code .add ("if (result instanceof $T) {" , SdkAutoConstructMap .class )
89
+ .add ("return null;" )
90
+ .add ("}" );
91
+ }
92
+
93
+ code .add ("return result;" );
94
+
95
+ return MethodSpec .methodBuilder (memberModel .getBeanStyleGetterMethodName ())
96
+ .addModifiers (Modifier .PUBLIC , Modifier .FINAL )
97
+ .returns (returnType )
98
+ .addCode (code .build ())
99
+ .build ();
100
+ }
101
+
67
102
private MethodSpec byteBufferGetter (MemberModel memberModel ) {
68
103
return basicGetter (memberModel ,
69
104
ClassName .get (ByteBuffer .class ),
@@ -100,54 +135,6 @@ private MethodSpec builderGetter(MemberModel memberModel) {
100
135
memberModel .getVariable ().getVariableName ()));
101
136
}
102
137
103
- private MethodSpec listOfMapOfBuilderGetter (MemberModel memberModel ) {
104
- MapModel nestedMapModel = memberModel .getListModel ().getListMemberModel ().getMapModel ();
105
- TypeName nestedMapKeyType = typeProvider .getTypeNameForSimpleType (nestedMapModel .getKeyModel ()
106
- .getVariable ().getVariableType ());
107
- ClassName nestedMapValueType = poetExtensions .getModelClass (nestedMapModel .getValueModel ().getC2jShape ());
108
- TypeName nestedMapReturnType = ParameterizedTypeName .get (ClassName .get (Map .class ),
109
- nestedMapKeyType ,
110
- nestedMapValueType .nestedClass ("Builder" ));
111
-
112
- TypeName returnType = ParameterizedTypeName .get (ClassName .get (Collection .class ), nestedMapReturnType );
113
-
114
- CodeBlock mapReturnStatement =
115
- CodeBlock .of ("Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue().toBuilder())" );
116
-
117
- CodeBlock returnStatement = CodeBlock .of ("return $1N != null ? $1N.stream().map(m -> m.entrySet().stream().collect("
118
- + mapReturnStatement + ")).collect($2T.toList()) : null;" ,
119
- memberModel .getVariable ().getVariableName (),
120
- Collectors .class );
121
-
122
- return basicGetter (memberModel , returnType , returnStatement );
123
- }
124
-
125
- private MethodSpec mapOfBuildersGetter (MemberModel memberModel ) {
126
- TypeName keyType = typeProvider .getTypeNameForSimpleType (memberModel .getMapModel ().getKeyModel ()
127
- .getVariable ().getVariableType ());
128
- ClassName valueType = poetExtensions .getModelClass (memberModel .getMapModel ().getValueModel ().getC2jShape ());
129
- TypeName returnType = ParameterizedTypeName .get (ClassName .get (Map .class ), keyType , valueType .nestedClass ("Builder" ));
130
-
131
- return basicGetter (memberModel ,
132
- returnType ,
133
- CodeBlock .of ("return $1N != null ? $2T.mapValues($1N, $3T::toBuilder) : null;" ,
134
- memberModel .getVariable ().getVariableName (),
135
- CollectionUtils .class ,
136
- valueType ));
137
- }
138
-
139
- private MethodSpec listOfBuildersGetter (MemberModel memberModel ) {
140
- ClassName memberType = poetExtensions .getModelClass (memberModel .getListModel ().getListMemberModel ().getC2jShape ());
141
- TypeName returnType = ParameterizedTypeName .get (ClassName .get (Collection .class ), memberType .nestedClass ("Builder" ));
142
-
143
- return basicGetter (memberModel ,
144
- returnType ,
145
- CodeBlock .of ("return $1N != null ? $1N.stream().map($2T::toBuilder).collect($3T.toList()) : null;" ,
146
- memberModel .getVariable ().getVariableName (),
147
- memberType ,
148
- Collectors .class ));
149
- }
150
-
151
138
private MethodSpec basicGetter (MemberModel memberModel , TypeName returnType , CodeBlock body ) {
152
139
CodeBlock .Builder getterBody = CodeBlock .builder ();
153
140
0 commit comments