From bc1cd9e0cf9148838ac68f3caf409962f5961496 Mon Sep 17 00:00:00 2001 From: ckoegel Date: Fri, 7 Nov 2025 10:19:52 -0500 Subject: [PATCH 1/8] SWI-9027 BXML Fixes for Java 25 --- .../sdk/model/bxml/OutboundDestination.java | 99 +++++++++++++++---- .../bandwidth/sdk/model/bxml/PhoneNumber.java | 54 ++-------- .../bandwidth/sdk/model/bxml/PlayAudio.java | 2 - .../com/bandwidth/sdk/model/bxml/SipUri.java | 54 ++-------- .../sdk/model/bxml/StartTranscription.java | 2 +- .../unit/models/bxml/TransferVerbTest.java | 2 +- 6 files changed, 98 insertions(+), 115 deletions(-) diff --git a/src/main/java/com/bandwidth/sdk/model/bxml/OutboundDestination.java b/src/main/java/com/bandwidth/sdk/model/bxml/OutboundDestination.java index 701d061b..f958809c 100644 --- a/src/main/java/com/bandwidth/sdk/model/bxml/OutboundDestination.java +++ b/src/main/java/com/bandwidth/sdk/model/bxml/OutboundDestination.java @@ -4,32 +4,97 @@ package com.bandwidth.sdk.model.bxml; -import jakarta.xml.bind.annotation.XmlAccessType; -import jakarta.xml.bind.annotation.XmlAccessorType; -import jakarta.xml.bind.annotation.XmlType; +import static com.bandwidth.sdk.model.bxml.utils.BxmlConstants.DEFAULT_CALLBACK_METHOD; -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType -public interface OutboundDestination { - String getUsername(); +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlTransient; +import lombok.AllArgsConstructor; +import lombok.Builder.Default; +import lombok.experimental.SuperBuilder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; - String getPassword(); +@NoArgsConstructor +@AllArgsConstructor +@SuperBuilder +@Getter +@EqualsAndHashCode(callSuper = false) - String getTransferAnswerUrl(); +@XmlTransient +abstract public class OutboundDestination { + @XmlAttribute + protected String uui; + public String getUui() { + return uui; + } - String getTransferAnswerMethod(); + @XmlAttribute + protected String username; + public String getUsername() { + return username; + } - String getTransferDisconnectUrl(); + @XmlAttribute + protected String password; + public String getPassword() { + return password; + } - String getTransferDisconnectMethod(); + @XmlAttribute + protected String fallbackUsername; + public String getFallbackUsername() { + return fallbackUsername; + } - String getFallbackUsername(); + @XmlAttribute + protected String fallbackPassword; + public String getFallbackPassword() { + return fallbackPassword; + } - String getFallbackPassword(); + @XmlAttribute + protected String transferAnswerUrl; + public String getTransferAnswerUrl() { + return transferAnswerUrl; + } - String getTransferAnswerFallbackUrl(); + @XmlAttribute + @Default + protected String transferAnswerMethod = DEFAULT_CALLBACK_METHOD; + public String getTransferAnswerMethod() { + return transferAnswerMethod; + } - String getTransferAnswerFallbackMethod(); + @XmlAttribute + protected String transferAnswerFallbackUrl; + public String getTransferAnswerFallbackUrl() { + return transferAnswerFallbackUrl; + } - String getTag(); + @XmlAttribute + @Default + protected String transferAnswerFallbackMethod = DEFAULT_CALLBACK_METHOD; + public String getTransferAnswerFallbackMethod() { + return transferAnswerFallbackMethod; + } + + @XmlAttribute + protected String transferDisconnectUrl; + public String getTransferDisconnectUrl() { + return transferDisconnectUrl; + } + + @XmlAttribute + @Default + protected String transferDisconnectMethod = DEFAULT_CALLBACK_METHOD; + public String getTransferDisconnectMethod() { + return transferDisconnectMethod; + } + + @XmlAttribute + protected String tag; + public String getTag() { + return tag; + } } diff --git a/src/main/java/com/bandwidth/sdk/model/bxml/PhoneNumber.java b/src/main/java/com/bandwidth/sdk/model/bxml/PhoneNumber.java index 643c9157..14441b22 100644 --- a/src/main/java/com/bandwidth/sdk/model/bxml/PhoneNumber.java +++ b/src/main/java/com/bandwidth/sdk/model/bxml/PhoneNumber.java @@ -4,18 +4,14 @@ */ package com.bandwidth.sdk.model.bxml; -import static com.bandwidth.sdk.model.bxml.utils.BxmlConstants.DEFAULT_CALLBACK_METHOD; - import jakarta.xml.bind.annotation.XmlAccessType; import jakarta.xml.bind.annotation.XmlAccessorType; -import jakarta.xml.bind.annotation.XmlAttribute; import jakarta.xml.bind.annotation.XmlType; import jakarta.xml.bind.annotation.XmlValue; import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Builder.Default; +import lombok.experimental.SuperBuilder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @@ -24,9 +20,9 @@ @XmlType(name = PhoneNumber.TYPE_NAME) @NoArgsConstructor @AllArgsConstructor -@Builder +@SuperBuilder @Getter -@EqualsAndHashCode +@EqualsAndHashCode(callSuper = false) /** * * @param number (str): A phone number to transfer the call to. Value must be in E.164 format (e.g. +15555555555). @@ -44,50 +40,14 @@ * @param uui (str, optional): The value of the User-To-User header to send within the initial INVITE. Must include the encoding parameter as specified in RFC 7433. Only base64, jwt and hex encoding are currently allowed. This value, including the encoding specifier, may not exceed 256 characters. * */ -public class PhoneNumber implements OutboundDestination { +public class PhoneNumber extends OutboundDestination { public static final String TYPE_NAME = "PhoneNumber"; @XmlValue @XmlJavaTypeAdapter(CollapsedStringAdapter.class) protected String number; - - @XmlAttribute - protected String username; - - @XmlAttribute - protected String password; - - @XmlAttribute - protected String fallbackUsername; - - @XmlAttribute - protected String fallbackPassword; - - @XmlAttribute - protected String transferAnswerUrl; - - @XmlAttribute - @Default - protected String transferAnswerMethod = DEFAULT_CALLBACK_METHOD; - - @XmlAttribute - protected String transferAnswerFallbackUrl; - - @XmlAttribute - @Default - protected String transferAnswerFallbackMethod = DEFAULT_CALLBACK_METHOD; - - @XmlAttribute - protected String transferDisconnectUrl; - - @XmlAttribute - @Default - protected String transferDisconnectMethod = DEFAULT_CALLBACK_METHOD; - - @XmlAttribute - protected String tag; - - @XmlAttribute - protected String uui; + public String getNumber() { + return number; + } } diff --git a/src/main/java/com/bandwidth/sdk/model/bxml/PlayAudio.java b/src/main/java/com/bandwidth/sdk/model/bxml/PlayAudio.java index 5214d852..7937a23a 100644 --- a/src/main/java/com/bandwidth/sdk/model/bxml/PlayAudio.java +++ b/src/main/java/com/bandwidth/sdk/model/bxml/PlayAudio.java @@ -9,8 +9,6 @@ import jakarta.xml.bind.annotation.XmlAttribute; import jakarta.xml.bind.annotation.XmlType; import jakarta.xml.bind.annotation.XmlValue; -import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; -import java.net.URI; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/bandwidth/sdk/model/bxml/SipUri.java b/src/main/java/com/bandwidth/sdk/model/bxml/SipUri.java index c611f4af..79603ede 100644 --- a/src/main/java/com/bandwidth/sdk/model/bxml/SipUri.java +++ b/src/main/java/com/bandwidth/sdk/model/bxml/SipUri.java @@ -5,18 +5,14 @@ package com.bandwidth.sdk.model.bxml; -import static com.bandwidth.sdk.model.bxml.utils.BxmlConstants.DEFAULT_CALLBACK_METHOD; - import jakarta.xml.bind.annotation.XmlAccessType; import jakarta.xml.bind.annotation.XmlAccessorType; -import jakarta.xml.bind.annotation.XmlAttribute; import jakarta.xml.bind.annotation.XmlType; import jakarta.xml.bind.annotation.XmlValue; import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Builder.Default; +import lombok.experimental.SuperBuilder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @@ -25,9 +21,9 @@ @XmlType(name = SipUri.TYPE_NAME) @NoArgsConstructor @AllArgsConstructor -@Builder +@SuperBuilder @Getter -@EqualsAndHashCode +@EqualsAndHashCode(callSuper = false) /** * * @param uri (str): A SIP URI to transfer the call to (e.g. sip:user@server.com) @@ -47,50 +43,14 @@ * @param tag (str, optional): A custom string that will be sent with these and all future callbacks unless overwritten by a future tag attribute or cleared. May be cleared by setting tag="" Max length 256 characters. Defaults to None. * */ -public class SipUri implements OutboundDestination { +public class SipUri extends OutboundDestination { public static final String TYPE_NAME = "SipUri"; @XmlValue @XmlJavaTypeAdapter(CollapsedStringAdapter.class) protected String uri; - - @XmlAttribute - protected String uui; - - @XmlAttribute - protected String username; - - @XmlAttribute - protected String password; - - @XmlAttribute - protected String fallbackUsername; - - @XmlAttribute - protected String fallbackPassword; - - @XmlAttribute - protected String transferAnswerUrl; - - @XmlAttribute - @Default - protected String transferAnswerMethod = DEFAULT_CALLBACK_METHOD; - - @XmlAttribute - protected String transferAnswerFallbackUrl; - - @XmlAttribute - @Default - protected String transferAnswerFallbackMethod = DEFAULT_CALLBACK_METHOD; - - @XmlAttribute - protected String transferDisconnectUrl; - - @XmlAttribute - @Default - protected String transferDisconnectMethod = DEFAULT_CALLBACK_METHOD; - - @XmlAttribute - protected String tag; + public String getUri() { + return uri; + } } diff --git a/src/main/java/com/bandwidth/sdk/model/bxml/StartTranscription.java b/src/main/java/com/bandwidth/sdk/model/bxml/StartTranscription.java index 024223ef..7cb576ec 100644 --- a/src/main/java/com/bandwidth/sdk/model/bxml/StartTranscription.java +++ b/src/main/java/com/bandwidth/sdk/model/bxml/StartTranscription.java @@ -13,7 +13,6 @@ import jakarta.xml.bind.annotation.XmlElements; import jakarta.xml.bind.annotation.XmlType; import java.util.List; -import java.util.UUID; import com.bandwidth.sdk.model.CallDirectionEnum; @@ -76,6 +75,7 @@ public class StartTranscription implements Verb { protected String password; @XmlAttribute + @Default protected Boolean stabilized = true; @XmlElements({ diff --git a/src/test/java/com/bandwidth/sdk/unit/models/bxml/TransferVerbTest.java b/src/test/java/com/bandwidth/sdk/unit/models/bxml/TransferVerbTest.java index 6eec1c86..3fa30d82 100644 --- a/src/test/java/com/bandwidth/sdk/unit/models/bxml/TransferVerbTest.java +++ b/src/test/java/com/bandwidth/sdk/unit/models/bxml/TransferVerbTest.java @@ -59,7 +59,7 @@ public class TransferVerbTest { public void transferVerbWorks() throws JAXBException { JAXBContext jaxbContext = JAXBContext.newInstance(Bxml.class); String expectedSipUriBxml = "sip@bw.com"; - String expectedPhoneNumberBxml = "+19195551234"; + String expectedPhoneNumberBxml = "+19195551234"; assertThat(new Bxml().with(transfer1).toBxml(jaxbContext), is(expectedSipUriBxml)); assertThat(new Bxml().with(transfer2).toBxml(jaxbContext), is(expectedPhoneNumberBxml)); From 513ee90ead9c2bd187f30a0def92da68e7c6a309 Mon Sep 17 00:00:00 2001 From: ckoegel Date: Fri, 7 Nov 2025 10:20:13 -0500 Subject: [PATCH 2/8] add 25 to text matrix --- .github/workflows/test-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-pr.yml b/.github/workflows/test-pr.yml index 7ff8da6b..760512b5 100644 --- a/.github/workflows/test-pr.yml +++ b/.github/workflows/test-pr.yml @@ -36,7 +36,7 @@ jobs: strategy: matrix: os: [windows-2022, windows-2025, ubuntu-22.04, ubuntu-24.04] - java-version: ["11", "17", "21"] + java-version: ["11", "17", "21", "25"] distribution: ["zulu", "temurin"] fail-fast: false steps: From 6155bafac194e1019d888423b8856954053d7ebb Mon Sep 17 00:00:00 2001 From: ckoegel Date: Fri, 7 Nov 2025 10:42:31 -0500 Subject: [PATCH 3/8] run smoke tests --- src/test/java/com/bandwidth/sdk/smoke/MediaApiTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/com/bandwidth/sdk/smoke/MediaApiTest.java b/src/test/java/com/bandwidth/sdk/smoke/MediaApiTest.java index b429c6a8..8d3c5d92 100644 --- a/src/test/java/com/bandwidth/sdk/smoke/MediaApiTest.java +++ b/src/test/java/com/bandwidth/sdk/smoke/MediaApiTest.java @@ -22,6 +22,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; + import static com.bandwidth.sdk.utils.TestingEnvironmentVariables.*; @TestMethodOrder(OrderAnnotation.class) From edb0acd4d5b6f7f39bdb748777ad4e3c9062938f Mon Sep 17 00:00:00 2001 From: ckoegel Date: Fri, 7 Nov 2025 10:47:56 -0500 Subject: [PATCH 4/8] fix transcription test --- .../sdk/unit/models/bxml/StartTranscriptionVerbTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/bandwidth/sdk/unit/models/bxml/StartTranscriptionVerbTest.java b/src/test/java/com/bandwidth/sdk/unit/models/bxml/StartTranscriptionVerbTest.java index 150cb387..21a99fe0 100644 --- a/src/test/java/com/bandwidth/sdk/unit/models/bxml/StartTranscriptionVerbTest.java +++ b/src/test/java/com/bandwidth/sdk/unit/models/bxml/StartTranscriptionVerbTest.java @@ -49,7 +49,7 @@ public class StartTranscriptionVerbTest { @Test public void startTranscriptionVerbWorks() throws JAXBException { JAXBContext jaxbContext = JAXBContext.newInstance(Bxml.class); - String expectedBxml = ""; + String expectedBxml = ""; assertThat(new Bxml().with(startTranscription).toBxml(jaxbContext), is(expectedBxml)); } From d148f79c33068c4e4e3040dd95c107b8bbcce217 Mon Sep 17 00:00:00 2001 From: ckoegel Date: Fri, 7 Nov 2025 10:52:06 -0500 Subject: [PATCH 5/8] remove newline for smoke test --- src/test/java/com/bandwidth/sdk/smoke/MediaApiTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/bandwidth/sdk/smoke/MediaApiTest.java b/src/test/java/com/bandwidth/sdk/smoke/MediaApiTest.java index 8d3c5d92..b429c6a8 100644 --- a/src/test/java/com/bandwidth/sdk/smoke/MediaApiTest.java +++ b/src/test/java/com/bandwidth/sdk/smoke/MediaApiTest.java @@ -22,7 +22,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; - import static com.bandwidth.sdk.utils.TestingEnvironmentVariables.*; @TestMethodOrder(OrderAnnotation.class) From 5bf342111d0dbaa7a66f7437d3048e9d5f182c48 Mon Sep 17 00:00:00 2001 From: ckoegel Date: Fri, 7 Nov 2025 11:05:48 -0500 Subject: [PATCH 6/8] fix recording verbs --- .../java/com/bandwidth/sdk/model/bxml/Record.java | 11 ++++++++++- .../bandwidth/sdk/model/bxml/StartRecording.java | 11 ++++++++++- .../sdk/model/bxml/TranscriptionProducer.java | 15 --------------- 3 files changed, 20 insertions(+), 17 deletions(-) delete mode 100644 src/main/java/com/bandwidth/sdk/model/bxml/TranscriptionProducer.java diff --git a/src/main/java/com/bandwidth/sdk/model/bxml/Record.java b/src/main/java/com/bandwidth/sdk/model/bxml/Record.java index 7ee6bc93..02fcb54c 100644 --- a/src/main/java/com/bandwidth/sdk/model/bxml/Record.java +++ b/src/main/java/com/bandwidth/sdk/model/bxml/Record.java @@ -51,7 +51,7 @@ * @param fileFormat (str, optional): The audio format that the recording will be saved as: mp3 or wav. Default value is wav. Defaults to None. * */ -public class Record implements TranscriptionProducer { +public class Record implements Verb { public static final String TYPE_NAME = "Record"; @@ -93,6 +93,9 @@ public class Record implements TranscriptionProducer { @XmlAttribute protected Boolean transcribe; + public Boolean getTranscribe() { + return transcribe; + } @XmlAttribute @Default @@ -100,9 +103,15 @@ public class Record implements TranscriptionProducer { @XmlAttribute protected String transcriptionAvailableUrl; + String getTranscriptionAvailableUrl() { + return transcriptionAvailableUrl; + } @XmlAttribute protected String transcriptionAvailableMethod; + String getTranscriptionAvailableMethod() { + return transcriptionAvailableMethod; + } @XmlAttribute protected String username; diff --git a/src/main/java/com/bandwidth/sdk/model/bxml/StartRecording.java b/src/main/java/com/bandwidth/sdk/model/bxml/StartRecording.java index e026f6ad..925fa67a 100644 --- a/src/main/java/com/bandwidth/sdk/model/bxml/StartRecording.java +++ b/src/main/java/com/bandwidth/sdk/model/bxml/StartRecording.java @@ -39,7 +39,7 @@ * @param multiChannel (str, optional): A boolean value indicating whether or not the recording file should separate each side of the call into its own audio channel. Default value is false. * */ -public class StartRecording implements TranscriptionProducer { +public class StartRecording implements Verb { public static final String TYPE_NAME = "StartRecording"; @@ -52,12 +52,21 @@ public class StartRecording implements TranscriptionProducer { @XmlAttribute protected Boolean transcribe; + public Boolean getTranscribe() { + return transcribe; + } @XmlAttribute protected String transcriptionAvailableUrl; + String getTranscriptionAvailableUrl() { + return transcriptionAvailableUrl; + } @XmlAttribute protected String transcriptionAvailableMethod; + String getTranscriptionAvailableMethod() { + return transcriptionAvailableMethod; + } @XmlAttribute protected String username; diff --git a/src/main/java/com/bandwidth/sdk/model/bxml/TranscriptionProducer.java b/src/main/java/com/bandwidth/sdk/model/bxml/TranscriptionProducer.java deleted file mode 100644 index ced404eb..00000000 --- a/src/main/java/com/bandwidth/sdk/model/bxml/TranscriptionProducer.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.bandwidth.sdk.model.bxml; - -import com.fasterxml.jackson.annotation.JsonSubTypes; - -@JsonSubTypes({ - @JsonSubTypes.Type(value = Record.class, name = Record.TYPE_NAME), - @JsonSubTypes.Type(value = StartRecording.class, name = StartRecording.TYPE_NAME), -}) -public interface TranscriptionProducer extends Verb { - Boolean getTranscribe(); - - String getTranscriptionAvailableUrl(); - - String getTranscriptionAvailableMethod(); -} From 8b5b16541dc6f7deb98c3dad253d16155d1221ce Mon Sep 17 00:00:00 2001 From: ckoegel Date: Fri, 7 Nov 2025 11:33:16 -0500 Subject: [PATCH 7/8] remove newline --- src/main/java/com/bandwidth/sdk/model/bxml/Bxml.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/bandwidth/sdk/model/bxml/Bxml.java b/src/main/java/com/bandwidth/sdk/model/bxml/Bxml.java index 877952f8..328dae0d 100644 --- a/src/main/java/com/bandwidth/sdk/model/bxml/Bxml.java +++ b/src/main/java/com/bandwidth/sdk/model/bxml/Bxml.java @@ -56,7 +56,6 @@ public class Bxml { @XmlElement(name = StopStream.TYPE_NAME, type = StopStream.class), @XmlElement(name = StartTranscription.TYPE_NAME, type = StartTranscription.class), @XmlElement(name = StopTranscription.TYPE_NAME, type = StopTranscription.class), - }) private List verbs = new ArrayList<>(); From b62cabe73ece7c69613b9cfb7da705aeded7905d Mon Sep 17 00:00:00 2001 From: ckoegel Date: Fri, 7 Nov 2025 11:36:48 -0500 Subject: [PATCH 8/8] add getVerbs --- src/main/java/com/bandwidth/sdk/model/bxml/Bxml.java | 4 ++++ src/main/java/com/bandwidth/sdk/model/bxml/Response.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/com/bandwidth/sdk/model/bxml/Bxml.java b/src/main/java/com/bandwidth/sdk/model/bxml/Bxml.java index 328dae0d..539fe460 100644 --- a/src/main/java/com/bandwidth/sdk/model/bxml/Bxml.java +++ b/src/main/java/com/bandwidth/sdk/model/bxml/Bxml.java @@ -60,6 +60,10 @@ public class Bxml { private List verbs = new ArrayList<>(); + public List getVerbs() { + return verbs; + } + public Bxml with(Verb verb) { this.verbs.add(verb); return this; diff --git a/src/main/java/com/bandwidth/sdk/model/bxml/Response.java b/src/main/java/com/bandwidth/sdk/model/bxml/Response.java index 39d82904..34bad04d 100644 --- a/src/main/java/com/bandwidth/sdk/model/bxml/Response.java +++ b/src/main/java/com/bandwidth/sdk/model/bxml/Response.java @@ -58,6 +58,10 @@ public class Response { private List verbs = new ArrayList<>(); + public List getVerbs() { + return verbs; + } + public Response with(Verb verb) { this.verbs.add(verb); return this;