001package org.consensusj.jsonrpc.daemon; 002 003import com.fasterxml.jackson.databind.PropertyNamingStrategies; 004import io.micronaut.core.annotation.TypeHint; 005import io.micronaut.http.MediaType; 006import io.micronaut.http.annotation.Body; 007import io.micronaut.http.annotation.Controller; 008import io.micronaut.http.annotation.Post; 009import org.consensusj.jsonrpc.JsonRpcRequest; 010import org.consensusj.jsonrpc.JsonRpcResponse; 011import org.consensusj.jsonrpc.JsonRpcService; 012import org.slf4j.Logger; 013import org.slf4j.LoggerFactory; 014 015import java.util.ArrayList; 016import java.util.HashSet; 017import java.util.LinkedHashMap; 018import java.util.concurrent.CompletableFuture; 019 020/** 021 * Create a REST endpoint from a JsonRpcService 022 * Here we're using Micronaut annotations to wrap the JsonRpcService 023 * in an HTTP environment and to serialize JSON to and from Java POJOs. 024 */ 025@TypeHint( 026 value = { 027 PropertyNamingStrategies.UpperCamelCaseStrategy.class, 028 ArrayList.class, 029 LinkedHashMap.class, 030 HashSet.class, 031 JsonRpcRequest.class, 032 JsonRpcResponse.class, 033 EchoJsonRpcService.class 034 }, 035 accessType = {TypeHint.AccessType.ALL_DECLARED_CONSTRUCTORS, TypeHint.AccessType.ALL_DECLARED_METHODS} 036) 037@Controller("/") 038public class JsonRpcController { 039 private static final Logger log = LoggerFactory.getLogger(JsonRpcController.class); 040 private final JsonRpcService jsonRpcService; 041 042 public JsonRpcController(JsonRpcService jsonRpcService) { 043 log.info("Constructing JsonRpcController using {}", jsonRpcService); 044 this.jsonRpcService = jsonRpcService; 045 } 046 047 @Post(produces = MediaType.APPLICATION_JSON) 048 public CompletableFuture<JsonRpcResponse<Object>> index(@Body JsonRpcRequest request) { 049 log.debug("JSON-RPC call: {}", request.getMethod()); 050 return jsonRpcService.call(request); 051 } 052}