Skip to content

Commit 3e6d977

Browse files
v-pivamshiVinothini Dharmarajv-dharmarajv
authored
Added call connection id for recording and live test and unit test code. (Azure#43584)
* Added call connection id for recording and live test and unit test code. * Added start recording failed event * made minner change. * added call connection id constructor. * resolved build issues * Re recorded the live test * udpating * fixing the analze issue * Rename `PolicyKeyResource` to `PolicykeyResource` merge issue renamed the file * Add newline at end of PolicykeyResource.java file * adding space --------- Co-authored-by: Vinothini Dharmaraj <[email protected]> Co-authored-by: Vinothini Dharmaraj <[email protected]>
1 parent e2c33bf commit 3e6d977

File tree

9 files changed

+238
-51
lines changed

9 files changed

+238
-51
lines changed

sdk/communication/azure-communication-callautomation/assets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"AssetsRepo": "Azure/azure-sdk-assets",
33
"AssetsRepoPrefixPath": "java",
44
"TagPrefix": "java/communication/azure-communication-callautomation",
5-
"Tag": "java/communication/azure-communication-callautomation_cf67d9f149"
5+
"Tag": "java/communication/azure-communication-callautomation_0356c7a692"
66
}

sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallAutomationEventParser.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33

44
package com.azure.communication.callautomation;
55

6+
import java.io.IOException;
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
import java.util.Objects;
10+
611
import com.azure.communication.callautomation.models.events.AddParticipantFailed;
712
import com.azure.communication.callautomation.models.events.AddParticipantSucceeded;
813
import com.azure.communication.callautomation.models.events.AnswerFailed;
@@ -31,6 +36,9 @@
3136
import com.azure.communication.callautomation.models.events.HoldAudioResumed;
3237
import com.azure.communication.callautomation.models.events.HoldAudioStarted;
3338
import com.azure.communication.callautomation.models.events.HoldFailed;
39+
import com.azure.communication.callautomation.models.events.MediaStreamingFailed;
40+
import com.azure.communication.callautomation.models.events.MediaStreamingStarted;
41+
import com.azure.communication.callautomation.models.events.MediaStreamingStopped;
3442
import com.azure.communication.callautomation.models.events.ParticipantsUpdated;
3543
import com.azure.communication.callautomation.models.events.PlayCanceled;
3644
import com.azure.communication.callautomation.models.events.PlayCompleted;
@@ -44,26 +52,19 @@
4452
import com.azure.communication.callautomation.models.events.RecordingStateChanged;
4553
import com.azure.communication.callautomation.models.events.RemoveParticipantFailed;
4654
import com.azure.communication.callautomation.models.events.RemoveParticipantSucceeded;
55+
import com.azure.communication.callautomation.models.events.SendDtmfTonesCompleted;
56+
import com.azure.communication.callautomation.models.events.SendDtmfTonesFailed;
57+
import com.azure.communication.callautomation.models.events.StartRecordingFailed;
4758
import com.azure.communication.callautomation.models.events.TranscriptionFailed;
4859
import com.azure.communication.callautomation.models.events.TranscriptionResumed;
4960
import com.azure.communication.callautomation.models.events.TranscriptionStarted;
5061
import com.azure.communication.callautomation.models.events.TranscriptionStopped;
51-
import com.azure.communication.callautomation.models.events.SendDtmfTonesCompleted;
52-
import com.azure.communication.callautomation.models.events.SendDtmfTonesFailed;
5362
import com.azure.communication.callautomation.models.events.TranscriptionUpdated;
54-
import com.azure.communication.callautomation.models.events.MediaStreamingStarted;
55-
import com.azure.communication.callautomation.models.events.MediaStreamingStopped;
56-
import com.azure.communication.callautomation.models.events.MediaStreamingFailed;
5763
import com.azure.core.models.CloudEvent;
5864
import com.azure.core.util.logging.ClientLogger;
5965
import com.azure.json.JsonProviders;
6066
import com.azure.json.JsonReader;
6167

62-
import java.io.IOException;
63-
import java.util.ArrayList;
64-
import java.util.List;
65-
import java.util.Objects;
66-
6768
/**
6869
* Event handler for taking care of event related tasks.
6970
*/
@@ -133,6 +134,8 @@ private static CallAutomationEventBase parseSingleCloudEvent(String data, String
133134
ret = ParticipantsUpdated.fromJson(jsonReader);
134135
} else if (Objects.equals(eventType, "Microsoft.Communication.RecordingStateChanged")) {
135136
ret = RecordingStateChanged.fromJson(jsonReader);
137+
} else if (Objects.equals(eventType, "Microsoft.Communication.StartRecordingFailed")) {
138+
ret = StartRecordingFailed.fromJson(jsonReader);
136139
} else if (Objects.equals(eventType, "Microsoft.Communication.PlayCompleted")) {
137140
ret = PlayCompleted.fromJson(jsonReader);
138141
} else if (Objects.equals(eventType, "Microsoft.Communication.PlayFailed")) {

sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallRecordingAsync.java

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,22 @@
33

44
package com.azure.communication.callautomation;
55

6+
import java.io.IOException;
7+
import java.io.OutputStream;
8+
import java.net.MalformedURLException;
9+
import java.net.URL;
10+
import java.nio.ByteBuffer;
11+
import java.nio.channels.AsynchronousFileChannel;
12+
import java.nio.file.OpenOption;
13+
import java.nio.file.Path;
14+
import java.nio.file.StandardOpenOption;
15+
import java.security.InvalidParameterException;
16+
import java.util.HashSet;
17+
import java.util.List;
18+
import java.util.Objects;
19+
import java.util.Set;
20+
import java.util.stream.Collectors;
21+
622
import com.azure.communication.callautomation.implementation.CallRecordingsImpl;
723
import com.azure.communication.callautomation.implementation.accesshelpers.RecordingStateResponseConstructorProxy;
824
import com.azure.communication.callautomation.implementation.converters.CommunicationIdentifierConverter;
@@ -24,8 +40,8 @@
2440
import com.azure.communication.callautomation.models.GroupCallLocator;
2541
import com.azure.communication.callautomation.models.ParallelDownloadOptions;
2642
import com.azure.communication.callautomation.models.RecordingStateResult;
27-
import com.azure.communication.callautomation.models.ServerCallLocator;
2843
import com.azure.communication.callautomation.models.RoomCallLocator;
44+
import com.azure.communication.callautomation.models.ServerCallLocator;
2945
import com.azure.communication.callautomation.models.StartRecordingOptions;
3046
import com.azure.core.annotation.ReturnType;
3147
import com.azure.core.annotation.ServiceMethod;
@@ -38,29 +54,13 @@
3854
import com.azure.core.http.rest.SimpleResponse;
3955
import com.azure.core.util.BinaryData;
4056
import com.azure.core.util.Context;
57+
import static com.azure.core.util.FluxUtil.monoError;
58+
import static com.azure.core.util.FluxUtil.withContext;
4159
import com.azure.core.util.logging.ClientLogger;
60+
4261
import reactor.core.publisher.Flux;
4362
import reactor.core.publisher.Mono;
4463

45-
import java.io.IOException;
46-
import java.io.OutputStream;
47-
import java.net.MalformedURLException;
48-
import java.net.URL;
49-
import java.nio.ByteBuffer;
50-
import java.nio.channels.AsynchronousFileChannel;
51-
import java.nio.file.OpenOption;
52-
import java.nio.file.Path;
53-
import java.nio.file.StandardOpenOption;
54-
import java.security.InvalidParameterException;
55-
import java.util.HashSet;
56-
import java.util.List;
57-
import java.util.Objects;
58-
import java.util.Set;
59-
import java.util.stream.Collectors;
60-
61-
import static com.azure.core.util.FluxUtil.monoError;
62-
import static com.azure.core.util.FluxUtil.withContext;
63-
6464
/**
6565
* CallRecordingAsync.
6666
*/
@@ -126,23 +126,24 @@ Mono<Response<RecordingStateResult>> startWithResponseInternal(StartRecordingOpt
126126
}
127127

128128
private StartCallRecordingRequestInternal getStartCallRecordingRequest(StartRecordingOptions options) {
129-
CallLocator callLocator = options.getCallLocator();
130-
CallLocatorInternal callLocatorInternal
131-
= new CallLocatorInternal().setKind(CallLocatorKindInternal.fromString(callLocator.getKind().toString()));
132-
133-
if (callLocator.getKind() == CallLocatorKind.GROUP_CALL_LOCATOR) {
134-
callLocatorInternal.setGroupCallId(((GroupCallLocator) callLocator).getGroupCallId());
135-
} else if (callLocator.getKind() == CallLocatorKind.SERVER_CALL_LOCATOR) {
136-
callLocatorInternal.setServerCallId(((ServerCallLocator) callLocator).getServerCallId());
137-
} else if (callLocator.getKind() == CallLocatorKind.ROOM_CALL_LOCATOR) {
138-
callLocatorInternal.setRoomId(((RoomCallLocator) callLocator).getRoomId());
139-
} else {
140-
throw logger.logExceptionAsError(new InvalidParameterException("callLocator has invalid kind."));
129+
StartCallRecordingRequestInternal request = new StartCallRecordingRequestInternal();
130+
if (options.getCallLocator() != null) {
131+
CallLocator callLocator = options.getCallLocator();
132+
CallLocatorInternal callLocatorInternal = new CallLocatorInternal()
133+
.setKind(CallLocatorKindInternal.fromString(callLocator.getKind().toString()));
134+
135+
if (callLocator.getKind() == CallLocatorKind.GROUP_CALL_LOCATOR) {
136+
callLocatorInternal.setGroupCallId(((GroupCallLocator) callLocator).getGroupCallId());
137+
} else if (callLocator.getKind() == CallLocatorKind.SERVER_CALL_LOCATOR) {
138+
callLocatorInternal.setServerCallId(((ServerCallLocator) callLocator).getServerCallId());
139+
} else if (callLocator.getKind() == CallLocatorKind.ROOM_CALL_LOCATOR) {
140+
callLocatorInternal.setRoomId(((RoomCallLocator) callLocator).getRoomId());
141+
} else {
142+
throw logger.logExceptionAsError(new InvalidParameterException("callLocator has invalid kind."));
143+
}
144+
request.setCallLocator(callLocatorInternal);
141145
}
142146

143-
StartCallRecordingRequestInternal request
144-
= new StartCallRecordingRequestInternal().setCallLocator(callLocatorInternal);
145-
146147
if (options.getRecordingContent() != null) {
147148
request
148149
.setRecordingContentType(RecordingContentInternal.fromString(options.getRecordingContent().toString()));
@@ -185,7 +186,9 @@ private StartCallRecordingRequestInternal getStartCallRecordingRequest(StartReco
185186
if (options.isPauseOnStart() != null) {
186187
request.setPauseOnStart(options.isPauseOnStart());
187188
}
188-
189+
if (options.getCallConnectionId() != null) {
190+
request.setCallConnectionId(options.getCallConnectionId());
191+
}
189192
return request;
190193
}
191194

sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/StartRecordingOptions.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33

44
package com.azure.communication.callautomation.models;
55

6+
import java.util.List;
7+
68
import com.azure.communication.common.CommunicationIdentifier;
79
import com.azure.core.annotation.Fluent;
810

9-
import java.util.List;
10-
import java.util.Objects;
11-
1211
/**
1312
* The options for creating a call.
1413
*/
@@ -19,6 +18,8 @@ public final class StartRecordingOptions {
1918
*/
2019
private final CallLocator callLocator;
2120

21+
private final String callConnectionId;
22+
2223
private String recordingStateCallbackUrl;
2324

2425
private RecordingChannel recordingChannel;
@@ -41,8 +42,18 @@ public final class StartRecordingOptions {
4142
* @param callLocator Either a {@link GroupCallLocator} or {@link ServerCallLocator} for locating the call.
4243
*/
4344
public StartRecordingOptions(CallLocator callLocator) {
44-
Objects.requireNonNull(callLocator, "'callLocator' cannot be null.");
4545
this.callLocator = callLocator;
46+
this.callConnectionId = null;
47+
}
48+
49+
/**
50+
* Constructor
51+
*
52+
* @param callConnectionId the ID of the call connection.
53+
*/
54+
public StartRecordingOptions(String callConnectionId) {
55+
this.callConnectionId = callConnectionId;
56+
this.callLocator = null;
4657
}
4758

4859
/**
@@ -54,6 +65,15 @@ public CallLocator getCallLocator() {
5465
return this.callLocator;
5566
}
5667

68+
/**
69+
* Get callConnectionId for the call
70+
*
71+
* @return callConnectionId for the call
72+
*/
73+
public String getCallConnectionId() {
74+
return callConnectionId;
75+
}
76+
5777
/**
5878
* Uri to send state change callbacks.
5979
*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
package com.azure.communication.callautomation.models.events;
4+
5+
import java.io.IOException;
6+
7+
import com.azure.core.annotation.Immutable;
8+
import com.azure.json.JsonReader;
9+
import com.azure.json.JsonToken;
10+
import com.azure.json.JsonWriter;
11+
12+
/**
13+
* The StartRecordingFailed model.
14+
*/
15+
@Immutable
16+
public final class StartRecordingFailed extends CallAutomationEventBase {
17+
18+
private StartRecordingFailed() {
19+
20+
}
21+
22+
/**
23+
* {@inheritDoc}
24+
*/
25+
@Override
26+
public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
27+
jsonWriter.writeStartObject();
28+
super.writeFields(jsonWriter);
29+
return jsonWriter.writeEndObject();
30+
}
31+
32+
/**
33+
* Reads an instance of StartRecordingFailed from the JsonReader.
34+
*
35+
* @param jsonReader The JsonReader being read.
36+
* @return An instance of StartRecordingFailed if the JsonReader was pointing to an
37+
* instance of it, or null if it was pointing to JSON null.
38+
* @throws IOException If an error occurs while reading the StartRecordingFailed.
39+
*/
40+
public static StartRecordingFailed fromJson(JsonReader jsonReader) throws IOException {
41+
return jsonReader.readObject(reader -> {
42+
final StartRecordingFailed event = new StartRecordingFailed();
43+
while (jsonReader.nextToken() != JsonToken.END_OBJECT) {
44+
String fieldName = reader.getFieldName();
45+
reader.nextToken();
46+
if (!event.readField(fieldName, reader)) {
47+
reader.skipChildren();
48+
}
49+
}
50+
return event;
51+
});
52+
}
53+
}

sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallRecordingAsyncUnitTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,25 @@ public void recordingOperationsTest() {
4545
assertThrows(HttpResponseException.class, () -> callRecording.getState(RECORDING_ID).block());
4646
}
4747

48+
@Test
49+
public void recordingOperationsWithCallConnectionIdTest() {
50+
CallAutomationAsyncClient callingServerClient
51+
= CallAutomationUnitTestBase.getCallAutomationAsyncClient(recordingOperationsResponses);
52+
callRecording = callingServerClient.getCallRecordingAsync();
53+
54+
validateRecordingState(
55+
callRecording.start(
56+
new StartRecordingOptions(CALL_CONNECTION_ID).setRecordingStateCallbackUrl("https://localhost/")),
57+
RecordingState.ACTIVE);
58+
59+
validateOperationWithRecordingState(callRecording.pause(RECORDING_ID), RecordingState.INACTIVE);
60+
61+
validateOperationWithRecordingState(callRecording.resume(RECORDING_ID), RecordingState.ACTIVE);
62+
63+
validateOperation(callRecording.stop(RECORDING_ID));
64+
assertThrows(HttpResponseException.class, () -> callRecording.getState(RECORDING_ID).block());
65+
}
66+
4867
private void validateRecordingState(Publisher<RecordingStateResult> publisher, RecordingState status) {
4968
StepVerifier.create(publisher)
5069
.consumeNextWith(recordingStateResponse -> validateRecording(recordingStateResponse, status))

0 commit comments

Comments
 (0)