Move SessionProperties#fromJson from openvidu-server to openvidu-java-client

pull/739/head
pabloFuente 2022-06-09 17:38:40 +02:00
parent caa9accf02
commit a49e1818c0
5 changed files with 222 additions and 81 deletions

View File

@ -489,8 +489,10 @@ public class RecordingProperties {
}
if (json.has("outputMode")) {
outputModeAux = OutputMode.valueOf(json.get("outputMode").getAsString());
builder.outputMode(outputModeAux);
} else {
outputModeAux = DefaultValues.outputMode;
}
builder.outputMode(outputModeAux);
if ((OutputMode.COMPOSED.equals(outputModeAux) || OutputMode.COMPOSED_QUICK_START.equals(outputModeAux))
&& hasVideoAux) {
if (json.has("recordingLayout")) {

View File

@ -17,7 +17,11 @@
package io.openvidu.java.client;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
/**
* See {@link io.openvidu.java.client.OpenVidu#createSession(SessionProperties)}
@ -290,4 +294,139 @@ public class SessionProperties {
return json;
}
/**
* Obtain a {@link SessionProperties.Builder} directly from a JSON object in the
* form of a Map
*
* @return A {@link SessionProperties.Builder}
* @throws IllegalArgumentException If some parameter has a wrong type or an
* invalid value
*/
public static SessionProperties.Builder fromJson(Map<String, ?> params) throws IllegalArgumentException {
SessionProperties.Builder builder = new SessionProperties.Builder();
String customSessionId = null;
if (params != null) {
// Obtain primitive values from the params map
String mediaModeString;
String recordingModeString;
String forcedVideoCodecStr;
Boolean allowTranscoding;
try {
mediaModeString = (String) params.get("mediaMode");
recordingModeString = (String) params.get("recordingMode");
customSessionId = (String) params.get("customSessionId");
forcedVideoCodecStr = (String) params.get("forcedVideoCodec");
allowTranscoding = (Boolean) params.get("allowTranscoding");
} catch (ClassCastException e) {
throw new IllegalArgumentException("Type error in some parameter: " + e.getMessage());
}
// Parse obtained values into actual types
VideoCodec forcedVideoCodec = null;
try {
forcedVideoCodec = VideoCodec.valueOf(forcedVideoCodecStr);
} catch (NullPointerException e) {
// Not an error: "forcedVideoCodec" was not provided in params.
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Invalid value for parameter 'forcedVideoCodec': " + e.getMessage());
}
try {
// Safe parameter retrieval. Default values if not defined
if (recordingModeString != null) {
RecordingMode recordingMode = RecordingMode.valueOf(recordingModeString);
builder = builder.recordingMode(recordingMode);
} else {
builder = builder.recordingMode(RecordingMode.MANUAL);
}
if (mediaModeString != null) {
MediaMode mediaMode = MediaMode.valueOf(mediaModeString);
builder = builder.mediaMode(mediaMode);
} else {
builder = builder.mediaMode(MediaMode.ROUTED);
}
if (customSessionId != null && !customSessionId.isEmpty()) {
if (!isValidCustomSessionId(customSessionId)) {
throw new IllegalArgumentException(
"Parameter 'customSessionId' is wrong. Must be an alphanumeric string [a-zA-Z0-9_-]");
}
builder = builder.customSessionId(customSessionId);
}
if (forcedVideoCodec != null) {
builder = builder.forcedVideoCodec(forcedVideoCodec);
builder = builder.forcedVideoCodecResolved(forcedVideoCodec);
}
if (allowTranscoding != null) {
builder = builder.allowTranscoding(allowTranscoding);
}
JsonObject defaultRecordingPropertiesJson = null;
if (params.get("defaultRecordingProperties") != null) {
try {
defaultRecordingPropertiesJson = new Gson()
.toJsonTree(params.get("defaultRecordingProperties"), Map.class).getAsJsonObject();
} catch (Exception e) {
throw new IllegalArgumentException(
"Error in parameter 'defaultRecordingProperties'. It is not a valid JSON object");
}
}
if (defaultRecordingPropertiesJson != null) {
try {
RecordingProperties defaultRecordingProperties = RecordingProperties
.fromJson(defaultRecordingPropertiesJson);
builder = builder.defaultRecordingProperties(defaultRecordingProperties);
} catch (Exception e) {
throw new IllegalArgumentException(
"Parameter 'defaultRecordingProperties' is not valid: " + e.getMessage());
}
} else {
builder.defaultRecordingProperties(new RecordingProperties.Builder().build());
}
String mediaNode = getMediaNodeProperty(params);
if (mediaNode != null) {
builder = builder.mediaNode(mediaNode);
}
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Some parameter is not valid. " + e.getMessage());
}
}
return builder;
}
/**
* @hidden
*/
public static String getMediaNodeProperty(Map<?, ?> params) throws IllegalArgumentException {
if (params.containsKey("mediaNode") && params.get("mediaNode") != null) {
JsonObject mediaNodeJson;
try {
mediaNodeJson = JsonParser.parseString(params.get("mediaNode").toString()).getAsJsonObject();
} catch (Exception e) {
throw new IllegalArgumentException("Error in parameter 'mediaNode'. It is not a valid JSON object");
}
if (!mediaNodeJson.has("id")) {
throw new IllegalArgumentException("Error in parameter 'mediaNode'. Property 'id' not found");
}
String mediaNode;
try {
mediaNode = mediaNodeJson.get("id").getAsString();
} catch (ClassCastException e) {
throw new IllegalArgumentException("Type error in parameter 'mediaNode.id': " + e.getMessage());
}
return mediaNode;
}
return null;
}
private static boolean isValidCustomSessionId(String customSessionId) {
return customSessionId.matches("[a-zA-Z0-9_-]+");
}
}

View File

@ -7,32 +7,27 @@ import junit.framework.TestSuite;
/**
* Unit test for simple App.
*/
public class OpenViduTest
extends TestCase
{
/**
* Create the test case
*
* @param testName name of the test case
*/
public OpenViduTest( String testName )
{
super( testName );
}
public class OpenViduTest extends TestCase {
/**
* Create the test case
*
* @param testName name of the test case
*/
public OpenViduTest(String testName) {
super(testName);
}
/**
* @return the suite of tests being tested
*/
public static Test suite()
{
return new TestSuite( OpenViduTest.class );
}
/**
* @return the suite of tests being tested
*/
public static Test suite() {
return new TestSuite(OpenViduTest.class);
}
/**
* Rigourous Test :-)
*/
public void testApp()
{
assertTrue( true );
}
/**
* Rigourous Test :-)
*/
public void testApp() {
assertTrue(true);
}
}

View File

@ -0,0 +1,55 @@
package io.openvidu.java.client.test;
import static org.junit.Assert.assertThrows;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import io.openvidu.java.client.SessionProperties;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
public class SessionPropertiesTest extends TestCase {
public SessionPropertiesTest(String testName) {
super(testName);
}
public static Test suite() {
return new TestSuite(SessionPropertiesTest.class);
}
public void testFromJsonSuccess() {
String jsonString = "{'customSessionId':'MY_CUSTOM_STRING','mediaMode':'ROUTED','recordingMode':'ALWAYS','defaultRecordingProperties':{'name':'MY_CUSTOM_STRING','hasAudio':false,'hasVideo':true,'outputMode':'COMPOSED_QUICK_START','recordingLayout':'BEST_FIT','resolution':'1920x1000','frameRate':25,'shmSize':536870911},'forcedVideoCodec':'VP8','allowTranscoding':true,'mediaNode':{'id':'MY_CUSTOM_STRING'}}";
JsonObject originalJson = new Gson().fromJson(jsonString, JsonObject.class);
Map<String, ?> map = mapFromJsonString(jsonString);
SessionProperties.Builder builder = SessionProperties.fromJson(map);
SessionProperties props = builder.build();
JsonObject finalJson = props.toJson();
assertEquals(originalJson, finalJson);
}
public void testFromJsonError() {
Map<String, ?> map = mapFromJsonString("{'mediaNode':'MY_CUSTOM_STRING'}");
assertException(map, "Error in parameter 'mediaNode'");
map = mapFromJsonString("{'customSessionId':'WRONG_CUSTOM_SESSION_ID?'}");
assertException(map, "Parameter 'customSessionId' is wrong");
// map = mapFromJsonString("{'defaultRecordingProperties':{'resolution':'2000x1000'}}");
// assertException(map, "Parameter 'customSessionId' is wrong");
}
private Map<String, ?> mapFromJsonString(String json) {
return new Gson().fromJson(json, Map.class);
}
private void assertException(Map<String, ?> params, String containsError) {
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
() -> SessionProperties.fromJson(params));
assertTrue(exception.getMessage().contains(containsError));
}
}

View File

@ -61,7 +61,6 @@ import io.openvidu.java.client.MediaMode;
import io.openvidu.java.client.OpenViduRole;
import io.openvidu.java.client.Recording.OutputMode;
import io.openvidu.java.client.RecordingLayout;
import io.openvidu.java.client.RecordingMode;
import io.openvidu.java.client.RecordingProperties;
import io.openvidu.java.client.SessionProperties;
import io.openvidu.java.client.VideoCodec;
@ -106,7 +105,7 @@ public class SessionRestController {
SessionProperties sessionProperties;
try {
sessionProperties = getSessionPropertiesFromParams(params).build();
sessionProperties = getSessionPropertiesFromParams((Map<String, ?>) params).build();
} catch (Exception e) {
return this.generateErrorResponse(e.getMessage(), "/sessions", HttpStatus.BAD_REQUEST);
}
@ -780,22 +779,15 @@ public class SessionRestController {
}
}
protected SessionProperties.Builder getSessionPropertiesFromParams(Map<?, ?> params) throws Exception {
protected SessionProperties.Builder getSessionPropertiesFromParams(Map<String, ?> params) throws Exception {
SessionProperties.Builder builder = new SessionProperties.Builder();
String customSessionId = null;
SessionProperties.Builder builder = SessionProperties.fromJson(params);
if (params != null) {
// Obtain primitive values from the params map
String mediaModeString;
String recordingModeString;
String forcedVideoCodecStr;
Boolean allowTranscoding;
try {
mediaModeString = (String) params.get("mediaMode");
recordingModeString = (String) params.get("recordingMode");
customSessionId = (String) params.get("customSessionId");
forcedVideoCodecStr = (String) params.get("forcedVideoCodec");
allowTranscoding = (Boolean) params.get("allowTranscoding");
} catch (ClassCastException e) {
@ -807,32 +799,12 @@ public class SessionRestController {
try {
forcedVideoCodec = VideoCodec.valueOf(forcedVideoCodecStr);
} catch (NullPointerException e) {
// Not an error: "forcedVideoCodec" was not provided in params.
// Not an error: "forcedVideoCodec" was not provided in params
} catch (IllegalArgumentException e) {
throw new Exception("Invalid value for parameter 'forcedVideoCodec': " + e.getMessage());
}
try {
// Safe parameter retrieval. Default values if not defined
if (recordingModeString != null) {
RecordingMode recordingMode = RecordingMode.valueOf(recordingModeString);
builder = builder.recordingMode(recordingMode);
} else {
builder = builder.recordingMode(RecordingMode.MANUAL);
}
if (mediaModeString != null) {
MediaMode mediaMode = MediaMode.valueOf(mediaModeString);
builder = builder.mediaMode(mediaMode);
} else {
builder = builder.mediaMode(MediaMode.ROUTED);
}
if (customSessionId != null && !customSessionId.isEmpty()) {
if (!sessionManager.formatChecker.isValidCustomSessionId(customSessionId)) {
throw new Exception(
"Parameter 'customSessionId' is wrong. Must be an alphanumeric string [a-zA-Z0-9_-]");
}
builder = builder.customSessionId(customSessionId);
}
if (forcedVideoCodec == null) {
forcedVideoCodec = openviduConfig.getOpenviduForcedCodec();
@ -858,28 +830,6 @@ public class SessionRestController {
builder = builder.allowTranscoding(openviduConfig.isOpenviduAllowingTranscoding());
}
JsonObject defaultRecordingPropertiesJson = null;
if (params.get("defaultRecordingProperties") != null) {
try {
defaultRecordingPropertiesJson = new Gson()
.toJsonTree(params.get("defaultRecordingProperties"), Map.class).getAsJsonObject();
} catch (Exception e) {
throw new Exception(
"Error in parameter 'defaultRecordingProperties'. It is not a valid JSON object");
}
}
if (defaultRecordingPropertiesJson != null) {
try {
RecordingProperties defaultRecordingProperties = RecordingProperties
.fromJson(defaultRecordingPropertiesJson);
builder = builder.defaultRecordingProperties(defaultRecordingProperties);
} catch (Exception e) {
throw new Exception("Parameter 'defaultRecordingProperties' is not valid: " + e.getMessage());
}
} else {
builder.defaultRecordingProperties(new RecordingProperties.Builder().build());
}
} catch (IllegalArgumentException e) {
throw new Exception("Some parameter is not valid. " + e.getMessage());
}