88import com .github .javaparser .ast .Modifier ;
99import com .github .javaparser .ast .Node ;
1010import com .github .javaparser .ast .NodeList ;
11+ import com .github .javaparser .ast .body .MethodDeclaration ;
12+ import com .github .javaparser .ast .body .Parameter ;
1113import com .github .javaparser .ast .stmt .BlockStmt ;
1214import com .github .javaparser .ast .type .ClassOrInterfaceType ;
1315import com .github .javaparser .javadoc .Javadoc ;
1416import com .github .javaparser .javadoc .description .JavadocDescription ;
1517import com .github .javaparser .javadoc .description .JavadocSnippet ;
1618import org .slf4j .Logger ;
1719
20+ import java .util .ArrayList ;
21+ import java .util .List ;
22+ import java .util .stream .Collectors ;
23+
1824public class MessagesSdkCustomization extends Customization {
1925
2026 @ Override
@@ -32,13 +38,24 @@ public void customize(LibraryCustomization libraryCustomization, Logger logger)
3238 customizeMessageTemplateLocation (modelsPackage );
3339 customizeMessageTemplateItemModel (modelsPackage );
3440
41+ //Handle Interactive message content models
42+ updateModelClassModifierToAbstract (modelsPackage , "MessageContent" );
43+ updateModelClassModifierToAbstract (modelsPackage , "ActionBindings" );
44+ updateJavaDocForMethodFromJson (modelsPackage , "ActionBindings" );
45+ updateJavaDocForMethodFromJson (modelsPackage , "MessageContent" );
46+ customizeInteractiveMessage (modelsPackage );
47+
3548 PackageCustomization channelsModelsPackage = libraryCustomization .getPackage (
3649 "com.azure.communication.messages.models.channels" );
3750 updateWhatsAppMessageTemplateItemWithBinaryDataContent (channelsModelsPackage );
3851
39- AddDeprecateAnnotationToMediaNotificationContent (modelsPackage );
52+ addDeprecateAnnotationToMediaNotificationContent (modelsPackage );
53+
54+ addDeprecateAnnotationForImageV0CommunicationKind (modelsPackage );
4055
41- AddDeprecateAnnotationForImageV0CommunicationKind (modelsPackage );
56+ customizeActionGroup (modelsPackage );
57+ customizeActionGroupContent (modelsPackage );
58+ customizeButtonSetContent (modelsPackage );
4259 }
4360
4461 private void updateModelClassModifierToAbstract (PackageCustomization modelsPackage , String className ) {
@@ -174,6 +191,45 @@ private void customizeMessageTemplateLocation(PackageCustomization modelsPackage
174191 });
175192 }
176193
194+ private void customizeInteractiveMessage (PackageCustomization modelsPackage ) {
195+ modelsPackage .getClass ("InteractiveMessage" ).customizeAst (ast -> {
196+ ast .getClassByName ("InteractiveMessage" ).ifPresent (clazz -> {
197+ clazz .addMethod ("getHeader" , Modifier .Keyword .PUBLIC )
198+ .setType (clazz .getMethodsByName ("getHeaderProperty" ).get (0 ).getType ())
199+ .setBody (clazz .getMethodsByName ("getHeaderProperty" ).get (0 ).getBody ().get ())
200+ .setJavadocComment (clazz .getMethodsByName ("getHeaderProperty" ).get (0 ).getJavadocComment ().get ());
201+
202+ clazz .getMethodsByName ("getHeaderProperty" ).forEach (Node ::remove );
203+
204+ MethodDeclaration setHeaderMethodDeclaration = clazz .getMethodsByName ("setHeaderProperty" ).get (0 );
205+ List <Parameter > parameters = setHeaderMethodDeclaration
206+ .getParameters ()
207+ .stream ()
208+ .map (p -> p .setName ("header" ))
209+ .collect (Collectors .toList ());
210+ String methodBodyContent = setHeaderMethodDeclaration
211+ .getBody ()
212+ .get ()
213+ .toString ()
214+ .replace ("headerProperty;" , "header;" );
215+
216+ String docComment = setHeaderMethodDeclaration
217+ .getJavadocComment ()
218+ .get ()
219+ .getContent ()
220+ .replace ("headerProperty" , "header" );
221+
222+ clazz .addMethod ("setHeader" , Modifier .Keyword .PUBLIC )
223+ .setParameters (new NodeList <Parameter >(parameters ))
224+ .setType (setHeaderMethodDeclaration .getType ())
225+ .setBody (StaticJavaParser .parseBlock (methodBodyContent ))
226+ .setJavadocComment (new Javadoc (JavadocDescription .parseText (docComment )));
227+
228+ clazz .getMethodsByName ("setHeaderProperty" ).forEach (Node ::remove );
229+ });
230+ });
231+ }
232+
177233 private void updateWhatsAppMessageTemplateItemWithBinaryDataContent (PackageCustomization channelsModelsPackage ) {
178234 channelsModelsPackage .getClass ("WhatsAppMessageTemplateItem" ).customizeAst (ast -> {
179235 // ast.addImport("com.azure.core.util.BinaryData");
@@ -206,7 +262,7 @@ private void removeJsonKnownDiscriminatorMethod(PackageCustomization modelPackag
206262 });
207263 }
208264
209- private void AddDeprecateAnnotationToMediaNotificationContent (PackageCustomization modelsPackage ) {
265+ private void addDeprecateAnnotationToMediaNotificationContent (PackageCustomization modelsPackage ) {
210266 modelsPackage .getClass ("MediaNotificationContent" ).customizeAst (ast -> {
211267 ast .getClassByName ("MediaNotificationContent" ).ifPresent (clazz -> {
212268 clazz .addAnnotation (Deprecated .class );
@@ -222,7 +278,7 @@ private void AddDeprecateAnnotationToMediaNotificationContent(PackageCustomizati
222278 });
223279 }
224280
225- private void AddDeprecateAnnotationForImageV0CommunicationKind (PackageCustomization modelsPackage ) {
281+ private void addDeprecateAnnotationForImageV0CommunicationKind (PackageCustomization modelsPackage ) {
226282 modelsPackage .getClass ("CommunicationMessageKind" ).customizeAst (ast -> {
227283 ast .getClassByName ("CommunicationMessageKind" )
228284 .flatMap (clazz -> clazz .getFieldByName ("IMAGE_V0" ))
@@ -240,4 +296,72 @@ private void AddDeprecateAnnotationForImageV0CommunicationKind(PackageCustomiza
240296 });
241297 });
242298 }
299+
300+ private void updateJavaDocForMethodFromJson (PackageCustomization modelPackage , String className ) {
301+ String originalDocText = String .format ("@throws IOException If an error occurs while reading the %s." , className );
302+ modelPackage .getClass (className ).customizeAst (ast -> {
303+ ast .getClassByName (className ).ifPresent ( clazz -> {
304+ String fromJsonDoc = clazz .getMethodsByName ("fromJson" )
305+ .get (0 ).getJavadoc ().get ().toText ()
306+ .replace (originalDocText ,
307+ "@throws IllegalStateException If the deserialized JSON object was missing any required properties.\n " +
308+ originalDocText );
309+ clazz .getMethodsByName ("fromJson" ).get (0 ).setJavadocComment (fromJsonDoc );
310+ });
311+ });
312+ }
313+
314+ private void customizeActionGroup (PackageCustomization modelsPackage ) {
315+ modelsPackage .getClass ("ActionGroup" ).customizeAst (ast -> {
316+ ast .getClassByName ("ActionGroup" )
317+ .flatMap (clazz -> clazz .getConstructorByParameterTypes (String .class , List .class ))
318+ .ifPresent (c -> {
319+ String body = c .getBody ().toString ().replace ("this.items = items;" ,
320+ "this.items = new ArrayList<>(items);" );
321+ c .setBody (StaticJavaParser .parseBlock (body ));
322+ });
323+
324+ ast .getClassByName ("ActionGroup" ).ifPresent (clazz -> {
325+ String getItemsBody = clazz .getMethodsByName ("getItems" ).get (0 ).getBody ().get ().toString ()
326+ .replace ("return this.items;" , "return new ArrayList<>(this.items);" );
327+ clazz .getMethodsByName ("getItems" ).get (0 ).setBody (StaticJavaParser .parseBlock (getItemsBody ));
328+ });
329+ });
330+ }
331+
332+ private void customizeActionGroupContent (PackageCustomization modelsPackage ) {
333+ modelsPackage .getClass ("ActionGroupContent" ).customizeAst (ast -> {
334+ ast .getClassByName ("ActionGroupContent" )
335+ .flatMap (clazz -> clazz .getConstructorByParameterTypes (String .class , List .class ))
336+ .ifPresent (c -> {
337+ String body = c .getBody ().toString ().replace ("this.groups = groups;" ,
338+ "this.groups = new ArrayList<>(groups);" );
339+ c .setBody (StaticJavaParser .parseBlock (body ));
340+ });
341+
342+ ast .getClassByName ("ActionGroupContent" ).ifPresent (clazz -> {
343+ String getItemsBody = clazz .getMethodsByName ("getGroups" ).get (0 ).getBody ().get ().toString ()
344+ .replace ("return this.groups;" , "return new ArrayList<>(this.groups);" );
345+ clazz .getMethodsByName ("getGroups" ).get (0 ).setBody (StaticJavaParser .parseBlock (getItemsBody ));
346+ });
347+ });
348+ }
349+
350+ private void customizeButtonSetContent (PackageCustomization modelsPackage ) {
351+ modelsPackage .getClass ("ButtonSetContent" ).customizeAst (ast -> {
352+ ast .getClassByName ("ButtonSetContent" )
353+ .flatMap (clazz -> clazz .getConstructorByParameterTypes (List .class ))
354+ .ifPresent (c -> {
355+ String body = c .getBody ().toString ().replace ("this.buttons = buttons;" ,
356+ "this.buttons = new ArrayList<>(buttons);" );
357+ c .setBody (StaticJavaParser .parseBlock (body ));
358+ });
359+
360+ ast .getClassByName ("ButtonSetContent" ).ifPresent (clazz -> {
361+ String getItemsBody = clazz .getMethodsByName ("getButtons" ).get (0 ).getBody ().get ().toString ()
362+ .replace ("return this.buttons;" , "return new ArrayList<>(this.buttons);" );
363+ clazz .getMethodsByName ("getButtons" ).get (0 ).setBody (StaticJavaParser .parseBlock (getItemsBody ));
364+ });
365+ });
366+ }
243367}
0 commit comments