package io.muoncore.protocol.requestresponse;
import io.muoncore.codec.Codecs;
import io.muoncore.message.MuonInboundMessage;
import io.muoncore.message.MuonMessage;
import io.muoncore.message.MuonMessageBuilder;
import io.muoncore.message.MuonOutboundMessage;
import io.muoncore.protocol.requestresponse.server.ServerRequest;
import io.muoncore.protocol.requestresponse.server.ServerResponse;
import java.util.HashMap;
import java.util.Map;
public class RRPTransformers {
public final static String REQUEST_RESPONSE_PROTOCOL = "rpc";
public static ServerRequest toRequest(MuonInboundMessage msg, Codecs codecs) {
ServerRequest request = codecs.decode(msg.getPayload(), msg.getContentType(), ServerRequest.class);
request.setCodecs(codecs);
return request;
}
public static Response toResponse(MuonInboundMessage msg, Codecs codecs) {
Response resp = codecs.decode(msg.getPayload(), msg.getContentType(), Response.class);
resp.setCodecs(codecs);
return resp;
}
@SuppressWarnings("unchecked")
public static MuonOutboundMessage toOutbound(String thisService, Request request, Codecs codecs, String[] acceptEncodings) {
Codecs.EncodingResult encodedPayload = codecs.encode(request.getPayload(), acceptEncodings);
Map req = new HashMap<>();
req.put("body", encodedPayload.getPayload());
req.put("content_type", encodedPayload.getContentType());
req.put("url", request.getUrl());
Codecs.EncodingResult payload = codecs.encode(req, acceptEncodings);
return MuonMessageBuilder
.fromService(thisService)
.step(RRPEvents.REQUEST)
.protocol(REQUEST_RESPONSE_PROTOCOL)
.toService(request.getUrl().getHost())
.payload(payload.getPayload())
.contentType(payload.getContentType())
.status(MuonMessage.Status.success)
.build();
}
@SuppressWarnings("unchecked")
public static MuonOutboundMessage toOutbound(String thisService, String targetService, ServerResponse response, Codecs codecs, String[] acceptEncodings) {
Codecs.EncodingResult content = codecs.encode(response.getPayload(), acceptEncodings);
Map outSchema = new HashMap<>();
outSchema.put("status", response.getStatus());
outSchema.put("body", content.getPayload());
outSchema.put("content_type", content.getContentType());
Codecs.EncodingResult payload = codecs.encode(outSchema, acceptEncodings);
return MuonMessageBuilder
.fromService(thisService)
.toService(targetService)
.protocol(REQUEST_RESPONSE_PROTOCOL)
.step(RRPEvents.RESPONSE)
.contentType(payload.getContentType())
.payload(payload.getPayload())
.status(MuonMessage.Status.success)
// .operation(MuonMessage.ChannelOperation.closed)
.build();
}
}