25
25
import software .amazon .smithy .model .shapes .MapShape ;
26
26
import software .amazon .smithy .model .shapes .MemberShape ;
27
27
import software .amazon .smithy .model .shapes .Shape ;
28
+ import software .amazon .smithy .model .shapes .SimpleShape ;
28
29
import software .amazon .smithy .model .shapes .StructureShape ;
29
30
import software .amazon .smithy .model .traits .IdempotencyTokenTrait ;
30
31
import software .amazon .smithy .model .traits .SensitiveTrait ;
32
+ import software .amazon .smithy .model .traits .StreamingTrait ;
31
33
32
34
/**
33
35
* Generates objects, interfaces, enums, etc.
@@ -74,27 +76,37 @@ void writeFilterSensitiveLog(TypeScriptWriter writer, String objectParam) {
74
76
writer .write ("...$L," , objectParam );
75
77
for (MemberShape member : members ) {
76
78
if (isMemberOverwriteRequired (member , new HashSet <String >())) {
77
- Shape memberTarget = model .expectShape (member .getTarget ());
78
79
String memberName = getSanitizedMemberName (member );
79
- String memberParam = String .format ("%s.%s" , objectParam , memberName );
80
80
writer .openBlock ("...($1L.$2L && { $2L: " , "})," , objectParam , memberName , () -> {
81
- if (member .getMemberTrait (model , SensitiveTrait .class ).isPresent ()) {
82
- // member is Sensitive, hide the value.
83
- writer .write ("SENSITIVE_STRING" );
84
- } else if (memberTarget instanceof StructureShape ) {
85
- writeStructureFilterSensitiveLog (writer , memberTarget , memberParam );
86
- } else if (memberTarget instanceof CollectionShape ) {
87
- MemberShape collectionMember = ((CollectionShape ) memberTarget ).getMember ();
88
- writeCollectionFilterSensitiveLog (writer , collectionMember , memberParam );
89
- } else if (memberTarget instanceof MapShape ) {
90
- MemberShape mapMember = ((MapShape ) memberTarget ).getValue ();
91
- writeMapFilterSensitiveLog (writer , mapMember , memberParam );
92
- }
81
+ String memberParam = String .format ("%s.%s" , objectParam , memberName );
82
+ writeMemberFilterSensitiveLog (writer , member , memberParam );
93
83
});
94
84
}
95
85
}
96
86
}
97
87
88
+ void writeMemberFilterSensitiveLog (TypeScriptWriter writer , MemberShape member , String memberParam ) {
89
+ Shape memberTarget = model .expectShape (member .getTarget ());
90
+ if (member .getMemberTrait (model , SensitiveTrait .class ).isPresent ()) {
91
+ // member is Sensitive, hide the value.
92
+ writer .write ("SENSITIVE_STRING" );
93
+ } else if (memberTarget instanceof SimpleShape ) {
94
+ writer .write (memberParam );
95
+ } else if (memberTarget .isStructureShape () || memberTarget .isUnionShape ()) {
96
+ writeStructureFilterSensitiveLog (writer , memberTarget , memberParam );
97
+ } else if (memberTarget instanceof CollectionShape ) {
98
+ MemberShape collectionMember = ((CollectionShape ) memberTarget ).getMember ();
99
+ writeCollectionFilterSensitiveLog (writer , collectionMember , memberParam );
100
+ } else if (memberTarget instanceof MapShape ) {
101
+ MemberShape mapMember = ((MapShape ) memberTarget ).getValue ();
102
+ writeMapFilterSensitiveLog (writer , mapMember , memberParam );
103
+ } else {
104
+ throw new CodegenException (String .format (
105
+ "MemberFilterSensitiveLog attempted for %s" , memberTarget .getType ()
106
+ ));
107
+ }
108
+ }
109
+
98
110
/**
99
111
* Recursively writes filterSensitiveLog for StructureShape.
100
112
*/
@@ -106,10 +118,13 @@ private void writeStructureFilterSensitiveLog(
106
118
if (structureTarget .hasTrait (SensitiveTrait .class )) {
107
119
// member is Sensitive, hide the value.
108
120
writer .write ("SENSITIVE_STRING" );
109
- return ;
121
+ } else if (structureTarget .hasTrait (StreamingTrait .class ) && structureTarget .isUnionShape ()) {
122
+ // disable logging for StreamingTrait
123
+ writer .write ("'STREAMING_CONTENT'" );
124
+ } else {
125
+ // Call filterSensitiveLog on Structure.
126
+ writer .write ("$T.filterSensitiveLog($L)" , symbolProvider .toSymbol (structureTarget ), structureParam );
110
127
}
111
- // Call filterSensitiveLog on Structure.
112
- writer .write ("$T.filterSensitiveLog($L)" , symbolProvider .toSymbol (structureTarget ), structureParam );
113
128
}
114
129
115
130
/**
@@ -123,32 +138,15 @@ private void writeCollectionFilterSensitiveLog(
123
138
if (collectionMember .getMemberTrait (model , SensitiveTrait .class ).isPresent ()) {
124
139
// member is Sensitive, hide the value.
125
140
writer .write ("SENSITIVE_STRING" );
126
- return ;
141
+ } else if (model .expectShape (collectionMember .getTarget ()) instanceof SimpleShape ) {
142
+ writer .write (collectionParam );
143
+ } else {
144
+ writer .openBlock ("$L.map(" , ")" , collectionParam , () -> {
145
+ String itemParam = "item" ;
146
+ writer .write ("$L => " , itemParam );
147
+ writeMemberFilterSensitiveLog (writer , collectionMember , itemParam );
148
+ });
127
149
}
128
-
129
- writer .openBlock ("$L.map(" , ")" , collectionParam , () -> {
130
- String itemParam = "item" ;
131
- Shape collectionMemberTarget = model .expectShape (collectionMember .getTarget ());
132
- writer .write ("$L => " , itemParam );
133
- if (collectionMemberTarget instanceof StructureShape ) {
134
- writeStructureFilterSensitiveLog (writer , collectionMemberTarget , itemParam );
135
- } else if (collectionMemberTarget instanceof CollectionShape ) {
136
- MemberShape nestedCollectionMember = ((CollectionShape ) collectionMemberTarget ).getMember ();
137
- writeCollectionFilterSensitiveLog (writer , nestedCollectionMember , itemParam );
138
- } else if (collectionMemberTarget instanceof MapShape ) {
139
- MemberShape mapMember = ((MapShape ) collectionMemberTarget ).getValue ();
140
- writeMapFilterSensitiveLog (writer , mapMember , itemParam );
141
- } else {
142
- // This path should not reach because of recursive isMemberOverwriteRequired.
143
- throw new CodegenException (String .format (
144
- "CollectionFilterSensitiveLog attempted for %s while it was not required" ,
145
- collectionMemberTarget .getType ()
146
- ));
147
- // For quick-fix in case of high severity issue:
148
- // comment out the exception above and uncomment the line below.
149
- // writer.write("$1L => $1L", itemParam);
150
- }
151
- });
152
150
}
153
151
154
152
/**
@@ -158,41 +156,23 @@ private void writeMapFilterSensitiveLog(TypeScriptWriter writer, MemberShape map
158
156
if (mapMember .getMemberTrait (model , SensitiveTrait .class ).isPresent ()) {
159
157
// member is Sensitive, hide the value.
160
158
writer .write ("SENSITIVE_STRING" );
161
- return ;
159
+ } else if (model .expectShape (mapMember .getTarget ()) instanceof SimpleShape ) {
160
+ writer .write (mapParam );
161
+ } else {
162
+ String accParam = "acc" ; // accumulator for the reducer
163
+ String keyParam = "key" ; // key of the Object.entries() key-value pair
164
+ String valueParam = "value" ; // value of the Object.entries() key-value pair
165
+
166
+ // Reducer is common to all shapes.
167
+ writer .openBlock ("Object.entries($L).reduce(($L: any, [$L, $L]: [string, $T]) => ({" , "}), {})" ,
168
+ mapParam , accParam , keyParam , valueParam , symbolProvider .toSymbol (mapMember ), () -> {
169
+ writer .write ("...$L," , accParam );
170
+ writer .openBlock ("[$L]: " , "," , keyParam , () -> {
171
+ writeMemberFilterSensitiveLog (writer , mapMember , valueParam );
172
+ });
173
+ }
174
+ );
162
175
}
163
-
164
- String accParam = "acc" ; // accumulator for the reducer
165
- String keyParam = "key" ; // key of the Object.entries() key-value pair
166
- String valueParam = "value" ; // value of the Object.entries() key-value pair
167
-
168
- // Reducer is common to all shapes.
169
- writer .openBlock ("Object.entries($L).reduce(($L: any, [$L, $L]: [string, $T]) => ({" , "}), {})" ,
170
- mapParam , accParam , keyParam , valueParam , symbolProvider .toSymbol (mapMember ), () -> {
171
- writer .write ("...$L," , accParam );
172
- Shape mapMemberTarget = model .expectShape (mapMember .getTarget ());
173
- writer .openBlock ("[$L]: " , "," , keyParam , () -> {
174
- if (mapMemberTarget instanceof StructureShape ) {
175
- writeStructureFilterSensitiveLog (writer , mapMemberTarget , valueParam );
176
- } else if (mapMemberTarget instanceof CollectionShape ) {
177
- MemberShape collectionMember = ((CollectionShape ) mapMemberTarget ).getMember ();
178
- writeCollectionFilterSensitiveLog (writer , collectionMember , valueParam );
179
- } else if (mapMemberTarget instanceof MapShape ) {
180
- MemberShape nestedMapMember = ((MapShape ) mapMemberTarget ).getValue ();
181
- writeMapFilterSensitiveLog (writer , nestedMapMember , valueParam );
182
- } else {
183
- // This path should not reach because of recursive isMemberOverwriteRequired.
184
- throw new CodegenException (String .format (
185
- "MapFilterSensitiveLog attempted for %s while it was not required" ,
186
- mapMemberTarget .getType ()
187
- ));
188
- // For quick-fix in case of high severity issue:
189
- // comment out the exception above and uncomment the line below.
190
- // writer.write("$L", valueParam);
191
- }
192
-
193
- });
194
- }
195
- );
196
176
}
197
177
198
178
/**
@@ -209,7 +189,10 @@ private boolean isMemberOverwriteRequired(MemberShape member, Set<String> parent
209
189
210
190
Shape memberTarget = model .expectShape (member .getTarget ());
211
191
parents .add (symbolProvider .toMemberName (member ));
212
- if (memberTarget instanceof StructureShape ) {
192
+ if (memberTarget .isUnionShape ()) {
193
+ // always call filterSensitiveLog for UnionShape
194
+ return true ;
195
+ } else if (memberTarget .isStructureShape ()) {
213
196
Collection <MemberShape > structureMemberList = ((StructureShape ) memberTarget ).getAllMembers ().values ();
214
197
for (MemberShape structureMember : structureMemberList ) {
215
198
if (!parents .contains (symbolProvider .toMemberName (structureMember ))
0 commit comments