protected void encode(ChannelHandlerContext ctx, ResourceResponse response, ChannelPromise promise) {
final ClientResourceResponse.ResponseType responseType = ClientResourceResponse.ResponseType.OK;
if (response.resource() == null) {
ctx.writeAndFlush(new ClientResourceResponseImpl(response.inReplyTo(), responseType, response.inReplyTo().resourcePath().toString(), null));
ctx.fireUserEventTriggered(new RequestCompleteEvent(response.requestId()));
return;
}
final ResourceStateEncoder encoder = new ResourceStateEncoder();
RootEncodingDriver driver = new RootEncodingDriver(response.inReplyTo().requestContext(), encoder, response.resource(), () -> {
ResourceState state = encoder.root();
response.setState(state);
ctx.writeAndFlush(response, promise).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE).addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
}, t -> handleError(ctx, response.inReplyTo(), t));
try {
driver.encode();
} catch (Throwable e) {
handleError(ctx, response.inReplyTo(), e);
}
}