package io.muoncore.protocol; import io.muoncore.channel.Channel; import io.muoncore.channel.ChannelConnection; import io.muoncore.channel.Channels; import io.muoncore.descriptors.ProtocolDescriptor; import io.muoncore.descriptors.SchemasDescriptor; import io.muoncore.message.MuonInboundMessage; import io.muoncore.message.MuonOutboundMessage; import io.muoncore.transport.client.TransportMessageDispatcher; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class DynamicRegistrationServerStacks implements ServerStacks, ServerRegistrar { private Map<String, ServerProtocolStack> protocols = new HashMap<>(); private final ServerProtocolStack defaultProtocol; private final TransportMessageDispatcher wiretapDispatch; public DynamicRegistrationServerStacks( ServerProtocolStack defaultProtocol, TransportMessageDispatcher wiretapDispatch) { this.defaultProtocol = defaultProtocol; this.wiretapDispatch = wiretapDispatch; } @Override public ChannelConnection<MuonInboundMessage, MuonOutboundMessage> openServerChannel(String protocol) { ServerProtocolStack proto = protocols.get(protocol); if (proto == null) { proto = defaultProtocol; } Channel<MuonInboundMessage, MuonOutboundMessage> tap = Channels.wiretapChannel(wiretapDispatch); Channels.connect(tap.right(), proto.createChannel()); return tap.left(); } @Override public List<ProtocolDescriptor> getProtocolDescriptors() { return protocols.values().stream().map(ServerProtocolStack::getProtocolDescriptor).collect(Collectors.toList()); } @Override public void registerServerProtocol(ServerProtocolStack serverProtocolStack) { protocols.put(serverProtocolStack.getProtocolDescriptor().getProtocolScheme(), serverProtocolStack); } @Override public SchemasDescriptor getSchemasDescriptor(String protocol, String resource) { ServerProtocolStack stack = protocols.get(protocol); if (stack == null) { return new SchemasDescriptor(protocol, resource, Collections.emptyMap()); } return new SchemasDescriptor(protocol, resource, stack.getSchemasFor(resource)); } }