package com.kurento.kmf.media.factory; import static com.kurento.kmf.media.factory.KmfMediaApiProperties.KMF_TRANSPORT_PROP; import static com.kurento.kmf.media.factory.KmfMediaApiProperties.KMF_TRANSPORT_RABBITMQ_VALUE; import static com.kurento.kmf.media.factory.KmfMediaApiProperties.KMF_TRANSPORT_THRIFT_VALUE; import static com.kurento.kmf.media.factory.KmfMediaApiProperties.KMF_TRANSPORT_WS_VALUE; import static com.kurento.kmf.media.factory.KmfMediaApiProperties.getKmfTransport; import static com.kurento.kmf.media.factory.KmfMediaApiProperties.getRabbitMqAddress; import static com.kurento.kmf.media.factory.KmfMediaApiProperties.getThriftKmfAddress; import static com.kurento.kmf.media.factory.KmfMediaApiProperties.getThriftKmsAddress; import static com.kurento.kmf.media.factory.KmfMediaApiProperties.getWsUri; import java.lang.reflect.Constructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.kurento.kmf.common.Address; import com.kurento.kmf.jsonrpcconnector.client.JsonRpcClient; import com.kurento.kmf.jsonrpcconnector.client.JsonRpcClientWebSocket; import com.kurento.kmf.thrift.jsonrpcconnector.JsonRpcClientThrift; public class KmfMediaApi { private static final Logger log = LoggerFactory .getLogger(KmfMediaApi.class); public static MediaPipelineFactory createMediaPipelineFactoryFromSystemProps() { return createMediaPipelineFactoryFromSystemProps(null); } public static MediaPipelineFactory createMediaPipelineFactoryFromSystemProps( String prefix) { return new MediaPipelineFactory( createJsonRpcClientFromSystemProperties(prefix)); } public static JsonRpcClient createJsonRpcClientFromSystemProperties() { return createJsonRpcClientFromSystemProperties(null); } @SuppressWarnings("resource") public static JsonRpcClient createJsonRpcClientFromSystemProperties( String prefix) { JsonRpcClient client; String kmfTransport = getKmfTransport(prefix); switch (kmfTransport) { case KMF_TRANSPORT_THRIFT_VALUE: log.info( "Creating JsonRpcClient with Thrift transport. Prefix: {}", prefix); Address kmsAddress = getThriftKmsAddress(prefix); Address kmfAddress = getThriftKmfAddress(prefix); log.info("kmsThriftAddress: {} and kmfThriftAddress: {}", kmsAddress, kmfAddress); client = new JsonRpcClientThrift(kmsAddress.getHost(), kmsAddress.getPort(), kmfAddress.getHost(), kmfAddress.getPort()); break; case KMF_TRANSPORT_WS_VALUE: log.info( "Creating JsonRpcClient with WebSocket transport. Prefix: {}", prefix); client = new JsonRpcClientWebSocket(getWsUri(prefix)); break; case KMF_TRANSPORT_RABBITMQ_VALUE: log.info( "Creating JsonRpcClient with RabbitMQ transport. Prefix: {}", prefix); client = newJsonRpcClientRabbitMq(getRabbitMqAddress(prefix)); break; default: throw new RuntimeException("Invalid transport value in property '" + KMF_TRANSPORT_PROP + "': " + kmfTransport + ". Valid values are: " + KMF_TRANSPORT_THRIFT_VALUE + ", " + KMF_TRANSPORT_RABBITMQ_VALUE + " or " + KMF_TRANSPORT_WS_VALUE); } return client; } private static JsonRpcClient newJsonRpcClientRabbitMq( Address rabbitMqAddress) { try { @SuppressWarnings("unchecked") Class<? extends JsonRpcClient> clazz = (Class<? extends JsonRpcClient>) Class .forName("com.kurento.kmf.rabbitmq.client.JsonRpcClientRabbitMq"); Constructor<? extends JsonRpcClient> constructor = clazz .getConstructor(Address.class); return constructor.newInstance(rabbitMqAddress); } catch (ClassNotFoundException e) { throw new RuntimeException( "MediaPipelineFactory is configured to use RabbitMQ but class " + "JsonRpcClientRabbitMq is not in the classpath. Plase review " + "you have correctly configured the dependency with kmf-rabbitmq project.", e); } catch (Exception e) { throw new RuntimeException( "Exception creating JsonRpcClientRabbitMq", e); } } }