package io.muoncore.protocol.introspection.server;
import io.muoncore.channel.ChannelConnection;
import io.muoncore.codec.Codecs;
import io.muoncore.descriptors.SchemasDescriptor;
import io.muoncore.descriptors.ServiceExtendedDescriptor;
import io.muoncore.message.MuonInboundMessage;
import io.muoncore.message.MuonMessage;
import io.muoncore.message.MuonMessageBuilder;
import io.muoncore.message.MuonOutboundMessage;
import io.muoncore.protocol.introspection.SchemaIntrospectionRequest;
import io.muoncore.protocol.introspection.client.IntrospectClientProtocol;
import static io.muoncore.protocol.introspection.client.IntrospectSchemasClientProtocol.SCHEMA_INTROSPECTION_REQUESTED;
class IntrospectionServerChannelConnection implements ChannelConnection<MuonInboundMessage, MuonOutboundMessage> {
private IntrospectionServerProtocolStack introspectionServerProtocolStack;
private ChannelFunction<MuonOutboundMessage> func;
public IntrospectionServerChannelConnection(IntrospectionServerProtocolStack introspectionServerProtocolStack) {
this.introspectionServerProtocolStack = introspectionServerProtocolStack;
}
@Override
public void receive(ChannelFunction<MuonOutboundMessage> function) {
func = function;
}
@Override
public void send(MuonInboundMessage message) {
if (message == null) {
if (func != null) func.apply(null);
return;
}
Codecs.EncodingResult result;
if (message.getStep().equals(SCHEMA_INTROSPECTION_REQUESTED)) {
SchemaIntrospectionRequest introspection = introspectionServerProtocolStack.getCodecs().decode(message.getPayload(), message.getContentType(), SchemaIntrospectionRequest.class);
SchemasDescriptor descriptor = introspectionServerProtocolStack.getDescriptorSource().getSchemasDescriptor(introspection);
result = introspectionServerProtocolStack.getCodecs().encode(descriptor,
introspectionServerProtocolStack.getDiscovery().getCodecsForService(message.getSourceServiceName()));
} else {
ServiceExtendedDescriptor descriptor = introspectionServerProtocolStack.getDescriptorSource().getServiceExtendedDescriptor();
result = introspectionServerProtocolStack.getCodecs().encode(descriptor,
introspectionServerProtocolStack.getDiscovery().getCodecsForService(message.getSourceServiceName()));
}
func.apply(MuonMessageBuilder
.fromService(message.getTargetServiceName())
.step("introspectionReport")
.protocol(IntrospectionServerProtocolStack.PROTOCOL)
.toService(message.getSourceServiceName())
.payload(result.getPayload())
.contentType(result.getContentType())
.status(MuonMessage.Status.success)
// .operation(MuonMessage.ChannelOperation.closed)
.build()
);
shutdown();
}
@Override
public void shutdown() {
if (func != null) {
func.apply(null);
func = null;
}
}
}