/** * Verify that this message contains data. * * @param dataClass the expected class of the dara * @return true if the data is instance of the dataClass */ public boolean hasData(Class<?> dataClass) { if (dataClass == null) { return false; } if (dataClass.isPrimitive()) { return hasData(); } else { return dataClass.isInstance(data); } }
private Function<ServiceMessage, Object> msgToResp() { return sm -> sm.hasData() ? sm.data() : UNEXPECTED_EMPTY_RESPONSE; }
private Function<ServiceMessage, Object> msgToResp() { return sm -> sm.hasData() ? sm.data() : UNEXPECTED_EMPTY_RESPONSE; }
private ServiceMessage throwIfError(ServiceMessage message) { if (message.isError() && message.hasData(ErrorData.class)) { throw Exceptions.propagate(errorMapper.toError(message)); } return message; }
private ServiceMessage throwIfError(ServiceMessage message) { if (message.isError() && message.hasData(ErrorData.class)) { throw Exceptions.propagate(errorMapper.toError(message)); } return message; }
private Object toRequest( ServiceMessage message, BiFunction<ServiceMessage, Class<?>, ServiceMessage> dataDecoder) { ServiceMessage request = dataDecoder.apply(message, methodInfo.requestType()); if (!methodInfo.isRequestTypeVoid() && !methodInfo.isRequestTypeServiceMessage() && !request.hasData(methodInfo.requestType())) { Optional<?> dataOptional = Optional.ofNullable(request.data()); Class<?> clazz = dataOptional.map(Object::getClass).orElse(null); throw new BadRequestException( String.format( "Expected service request data of type: %s, but received: %s", methodInfo.requestType(), clazz)); } return methodInfo.isRequestTypeServiceMessage() ? request : request.data(); }
private Mono<Void> ok(HttpServerResponse httpResponse, ServiceMessage response) { ByteBuf content = response.hasData(ByteBuf.class) ? response.data() : encodeData(response.data(), response.dataFormatOrDefault()); return httpResponse.status(OK).sendObject(content).then(); }
private Mono<Void> error(HttpServerResponse httpResponse, ServiceMessage response) { int code = Integer.parseInt(Qualifier.getQualifierAction(response.qualifier())); HttpResponseStatus status = HttpResponseStatus.valueOf(code); ByteBuf content = response.hasData(ErrorData.class) ? encodeData(response.data(), response.dataFormatOrDefault()) : response.data(); return httpResponse.status(status).sendObject(content).then(); }
private Mono<Void> ok(HttpServerResponse httpResponse, ServiceMessage response) { ByteBuf content = response.hasData(ByteBuf.class) ? response.data() : encodeData(response.data(), response.dataFormatOrDefault()); return httpResponse.status(OK).sendObject(content).then(); }
private Mono<Void> error(HttpServerResponse httpResponse, ServiceMessage response) { int code = response.errorType(); HttpResponseStatus status = HttpResponseStatus.valueOf(code); ByteBuf content = response.hasData(ErrorData.class) ? encodeData(response.data(), response.dataFormatOrDefault()) : response.data(); return httpResponse.status(status).sendObject(content).then(); }
private Mono<Void> handleRequest( ByteBuf content, HttpServerRequest httpRequest, HttpServerResponse httpResponse) { String qualifier = httpRequest.uri(); Builder builder = ServiceMessage.builder().qualifier(qualifier).data(content); enrichRequest(httpRequest.requestHeaders(), builder); return serviceCall .requestOne(builder.build()) .doOnNext(message -> metrics.markServiceResponse()) .switchIfEmpty( Mono.defer(() -> Mono.just(ServiceMessage.builder().qualifier(qualifier).build()))) .flatMap( response -> { enrichResponse(httpResponse, response); return Mono.defer( () -> ExceptionProcessor.isError(response) // check error ? error(httpResponse, response) : response.hasData() // check data ? ok(httpResponse, response) : noContent(httpResponse)); }); }
private Mono<Void> handleRequest( ByteBuf content, HttpServerRequest httpRequest, HttpServerResponse httpResponse) { String qualifier = httpRequest.uri(); Builder builder = ServiceMessage.builder().qualifier(qualifier).data(content); enrichRequest(httpRequest.requestHeaders(), builder); return serviceCall .requestOne(builder.build()) .doOnNext(message -> metrics.markServiceResponse()) .switchIfEmpty( Mono.defer(() -> Mono.just(ServiceMessage.builder().qualifier(qualifier).build()))) .flatMap( response -> { enrichResponse(httpResponse, response); return Mono.defer( () -> response.isError() // check error ? error(httpResponse, response) : response.hasData() // check data ? ok(httpResponse, response) : noContent(httpResponse)); }); }
/** * Decode message. * * @param message the original message (with {@link ByteBuf} data) * @param dataType the type of the data. * @return a new Service message that upon {@link ServiceMessage#data()} returns the actual data * (of type data type) * @throws MessageCodecException when decode fails */ public static ServiceMessage decodeData(ServiceMessage message, Class<?> dataType) throws MessageCodecException { if (!message.hasData(ByteBuf.class) || dataType == null) { return message; } Object data; Class<?> targetType = message.isError() ? ErrorData.class : dataType; ByteBuf dataBuffer = message.data(); try (ByteBufInputStream inputStream = new ByteBufInputStream(dataBuffer, true)) { DataCodec dataCodec = DataCodec.getInstance(message.dataFormatOrDefault()); data = dataCodec.decode(inputStream, targetType); } catch (Throwable ex) { throw new MessageCodecException( "Failed to decode data on message q=" + message.qualifier(), ex); } return ServiceMessage.from(message).data(data).build(); } }