All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.kurento.jsonrpc.client.JsonRpcClientLocal Maven / Gradle / Ivy

/*
 * (C) Copyright 2013 Kurento (http://kurento.org/)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package org.kurento.jsonrpc.client;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import org.kurento.jsonrpc.JsonRpcHandler;
import org.kurento.jsonrpc.JsonUtils;
import org.kurento.jsonrpc.internal.JsonRpcHandlerManager;
import org.kurento.jsonrpc.internal.JsonRpcRequestSenderHelper;
import org.kurento.jsonrpc.internal.client.ClientSession;
import org.kurento.jsonrpc.internal.client.TransactionImpl;
import org.kurento.jsonrpc.internal.client.TransactionImpl.ResponseSender;
import org.kurento.jsonrpc.message.Message;
import org.kurento.jsonrpc.message.Request;
import org.kurento.jsonrpc.message.Response;
import org.kurento.jsonrpc.message.ResponseError;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

public class JsonRpcClientLocal extends JsonRpcClient {

  private static Logger log = LoggerFactory.getLogger(JsonRpcClientLocal.class);

  private JsonRpcHandler remoteHandler;
  private final JsonRpcHandlerManager remoteHandlerManager = new JsonRpcHandlerManager();

  public  JsonRpcClientLocal(JsonRpcHandler handler) {

    this.remoteHandler = handler;
    this.remoteHandlerManager.setJsonRpcHandler(remoteHandler);

    session = new ClientSession("XXX", null, this);

    rsHelper = new JsonRpcRequestSenderHelper() {
      @Override
      public  Response internalSendRequest(Request

request, Class resultClass) throws IOException { return localSendRequest(request, resultClass); } @Override protected void internalSendRequest(Request request, Class resultClass, Continuation> continuation) { Response result = localSendRequest(request, resultClass); if (result != null) { continuation.onSuccess(result); } } }; } @SuppressWarnings({ "unchecked", "rawtypes" }) private Response localSendRequest(Request

request, Class resultClass) { // Simulate sending json string for net String jsonRequest = request.toString(); log.debug("--> {}", jsonRequest); Request newRequest = JsonUtils.fromJsonRequest(jsonRequest, JsonObject.class); final Response[] response = new Response[1]; ClientSession clientSession = new ClientSession(session.getSessionId(), null, new JsonRpcRequestSenderHelper() { @Override protected void internalSendRequest(Request request, Class clazz, final Continuation> continuation) { handlerManager.handleRequest(session, (Request) request, new ResponseSender() { @Override public void sendResponse(Message message) throws IOException { continuation.onSuccess((Response) message); } @Override public void sendPingResponse(Message message) throws IOException { sendResponse(message); } }); } @Override protected Response internalSendRequest(Request request, Class resultClass) throws IOException { final Object[] response = new Object[1]; final CountDownLatch responseLatch = new CountDownLatch(1); handlerManager.handleRequest(session, (Request) request, new ResponseSender() { @Override public void sendResponse(Message message) throws IOException { response[0] = message; responseLatch.countDown(); } @Override public void sendPingResponse(Message message) throws IOException { sendResponse(message); } }); Response response2 = (Response) response[0]; try { responseLatch.await(10, TimeUnit.SECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); } log.debug("<-- {}", response2); Object result = response2.getResult(); if (result == null || resultClass.isAssignableFrom(result.getClass())) { return response2; } else if (resultClass == JsonElement.class) { response2.setResult((R2) JsonUtils.toJsonElement(result)); return response2; } else { throw new ClassCastException("Class " + result + " cannot be converted to " + resultClass); } } }); TransactionImpl t = new TransactionImpl(clientSession, newRequest, new ResponseSender() { @Override public void sendResponse(Message message) throws IOException { response[0] = (Response) message; } @Override public void sendPingResponse(Message message) throws IOException { sendResponse(message); } }); try { remoteHandler.handleRequest(t, (Request) request); } catch (Exception e) { ResponseError error = ResponseError.newFromException(e); return new Response<>(request.getId(), error); } if (response[0] != null) { // Simulate receiving json string from net Response responseObj = (Response) response[0]; if (responseObj.getId() == null) { responseObj.setId(request.getId()); } String jsonResponse = responseObj.toString(); // log.debug("< {}", jsonResponse); Response newResponse = JsonUtils.fromJsonResponse(jsonResponse, resultClass); newResponse.setId(request.getId()); return newResponse; } return new Response<>(request.getId()); } @Override public void close() throws IOException { handlerManager.afterConnectionClosed(session, "Client close"); super.close(); } @Override public void setServerRequestHandler(org.kurento.jsonrpc.JsonRpcHandler handler) { super.setServerRequestHandler(handler); handlerManager.afterConnectionEstablished(session); remoteHandlerManager.afterConnectionEstablished(session); } @Override public void connect() throws IOException { } @Override public void setRequestTimeout(long requesTimeout) { log.warn("setRequestTimeout(...) method will be ignored"); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy