/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.core.jsonrpc.commons.transmission;
import org.eclipse.che.api.core.jsonrpc.commons.JsonRpcErrorTransmitter;
import org.eclipse.che.api.core.jsonrpc.commons.JsonRpcMarshaller;
import org.eclipse.che.api.core.jsonrpc.commons.JsonRpcPromise;
import org.eclipse.che.api.core.jsonrpc.commons.JsonRpcRequest;
import org.eclipse.che.api.core.jsonrpc.commons.ResponseDispatcher;
import org.eclipse.che.api.core.websocket.commons.WebSocketMessageTransmitter;
import org.slf4j.Logger;
import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
/**
* Configurator defines the type of a result (if present) and send a request.
* Result types that are supported: {@link String}, {@link Boolean},
* {@link Double}, {@link Void} and DTO. This configurator is used when we
* have not set request params.
*/
public class SendConfiguratorFromNone {
private final static Logger LOGGER = getLogger(SendConfiguratorFromNone.class);
private final ResponseDispatcher dispatcher;
private final WebSocketMessageTransmitter transmitter;
private final JsonRpcMarshaller marshaller;
private final String method;
private final String endpointId;
SendConfiguratorFromNone(JsonRpcMarshaller marshaller, ResponseDispatcher dispatcher, WebSocketMessageTransmitter transmitter,
String method, String endpointId) {
this.marshaller = marshaller;
this.dispatcher = dispatcher;
this.transmitter = transmitter;
this.method = method;
this.endpointId = endpointId;
}
public void sendAndSkipResult() {
LOGGER.debug("Transmitting request: " +
"endpoint ID: " + endpointId + ", " +
"method: " + method);
transmitNotification();
}
public <R> JsonRpcPromise<R> sendAndReceiveResultAsDto(final Class<R> rClass) {
checkNotNull(rClass, "Result class value must not be null");
final String requestId = transmitRequest();
LOGGER.debug("Transmitting request: " +
"endpoint ID: " + endpointId + ", " +
"request ID: " + requestId + ", " +
"method: " + method + ", " +
"result object class: " + rClass);
return dispatcher.registerPromiseOfOne(endpointId, requestId, rClass);
}
public JsonRpcPromise<String> sendAndReceiveResultAsString() {
final String requestId = transmitRequest();
LOGGER.debug("Transmitting request: " +
"endpoint ID: " + endpointId + ", " +
"request ID: " + requestId + ", " +
"method: " + method + ", " +
"result object class: " + String.class);
return dispatcher.registerPromiseOfOne(endpointId, requestId, String.class);
}
public JsonRpcPromise<Double> sendAndReceiveResultAsDouble() {
final String requestId = transmitRequest();
LOGGER.debug("Transmitting request: " +
"endpoint ID: " + endpointId + ", " +
"request ID: " + requestId + ", " +
"method: " + method + ", " +
"result object class: " + Double.class);
return dispatcher.registerPromiseOfOne(endpointId, requestId, Double.class);
}
public JsonRpcPromise<Boolean> sendAndReceiveResultAsBoolean() {
final String requestId = transmitRequest();
LOGGER.debug("Transmitting request: " +
"endpoint ID: " + endpointId + ", " +
"request ID: " + requestId + ", " +
"method: " + method + ", " +
"result object class: " + Boolean.class);
return dispatcher.registerPromiseOfOne(endpointId, requestId, Boolean.class);
}
public <R> JsonRpcPromise<List<R>> sendAndReceiveResultAsListOfDto(final Class<R> rClass) {
checkNotNull(rClass, "Result class value must not be null");
final String requestId = transmitRequest();
LOGGER.debug("Transmitting request: " +
"endpoint ID: " + endpointId + ", " +
"request ID: " + requestId + ", " +
"method: " + method + ", " +
"result list items class: " + rClass);
return dispatcher.registerPromiseOfMany(endpointId, requestId, rClass);
}
public JsonRpcPromise<List<String>> sendAndReceiveResultAsListOfString() {
final String requestId = transmitRequest();
LOGGER.debug("Transmitting request: " +
"endpoint ID: " + endpointId + ", " +
"request ID: " + requestId + ", " +
"method: " + method + ", " +
"result list items class: " + String.class);
return dispatcher.registerPromiseOfMany(endpointId, requestId, String.class);
}
public JsonRpcPromise<List<Boolean>> sendAndReceiveResultAsListOfBoolean() {
final String requestId = transmitRequest();
LOGGER.debug("Transmitting request: " +
"endpoint ID: " + endpointId + ", " +
"request ID: " + requestId + ", " +
"method: " + method + ", " +
"result list items class: " + Boolean.class);
return dispatcher.registerPromiseOfMany(endpointId, requestId, Boolean.class);
}
public JsonRpcPromise<Void> sendAndReceiveResultAsEmpty() {
final String requestId = transmitRequest();
LOGGER.debug("Transmitting request: " +
"endpoint ID: " + endpointId + ", " +
"request ID: " + requestId + ", " +
"method: " + method + ", " +
"result list items class: " + Void.class);
return dispatcher.registerPromiseOfOne(endpointId, requestId, Void.class);
}
private void transmitNotification() {
JsonRpcRequest request = new JsonRpcRequest(null, method, null);
String message = marshaller.marshall(request);
transmitter.transmit(endpointId, message);
}
private String transmitRequest() {
Integer id = MethodNameConfigurator.id.incrementAndGet();
String requestId = id.toString();
JsonRpcRequest request = new JsonRpcRequest(requestId, method, null);
String message = marshaller.marshall(request);
transmitter.transmit(endpointId, message);
return requestId;
}
}