package io.muoncore.protocol.defaultproto; import io.muoncore.Discovery; import io.muoncore.channel.ChannelConnection; import io.muoncore.codec.Codecs; import io.muoncore.config.AutoConfiguration; import io.muoncore.descriptors.ProtocolDescriptor; import io.muoncore.descriptors.SchemaDescriptor; import io.muoncore.message.MuonInboundMessage; import io.muoncore.message.MuonMessage; import io.muoncore.message.MuonMessageBuilder; import io.muoncore.message.MuonOutboundMessage; import io.muoncore.protocol.ServerProtocolStack; import io.muoncore.transport.TransportEvents; import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * A default protocol intended to be the fallback if not other protocol is capable of processing an incoming message * <p> * Responds back with a 404 message. */ public class DefaultServerProtocol implements ServerProtocolStack { private Codecs codecs; private AutoConfiguration config; private Discovery discovery; public DefaultServerProtocol(Codecs codecs, AutoConfiguration config, Discovery discovery) { this.codecs = codecs; this.config = config; this.discovery = discovery; } @Override public ChannelConnection<MuonInboundMessage, MuonOutboundMessage> createChannel() { return new DefaultServerChannelConnection(); } private class DefaultServerChannelConnection implements ChannelConnection<MuonInboundMessage, MuonOutboundMessage> { private ChannelFunction<MuonOutboundMessage> func; @Override public void receive(ChannelFunction<MuonOutboundMessage> function) { func = function; } @Override public void send(MuonInboundMessage message) { if (func != null) { Map<String, String> metadata = new HashMap<>(); metadata.put("status", "404"); metadata.put("message", "Protocol unknown :" + message.getProtocol()); Codecs.EncodingResult result = codecs.encode(metadata, discovery.getCodecsForService(message.getSourceServiceName())); func.apply(MuonMessageBuilder .fromService(config.getServiceName()) .step(TransportEvents.PROTOCOL_NOT_FOUND) .protocol(message.getProtocol()) .toService(message.getSourceServiceName()) .payload(result.getPayload()) .contentType(result.getContentType()) .status(MuonMessage.Status.error) .build() ); shutdown(); } } @Override public void shutdown() { func.apply(null); } } @Override public ProtocolDescriptor getProtocolDescriptor() { return new ProtocolDescriptor("default", "Default Protocol", "Returns 404 for all messages that match no other protocol", Collections.emptyList()); } @Override public Map<String, SchemaDescriptor> getSchemasFor(String endpoint) { return Collections.emptyMap(); } }