package io.muoncore.memory.transport; import com.google.common.eventbus.EventBus; import io.muoncore.Discovery; import io.muoncore.ServiceDescriptor; import io.muoncore.channel.ChannelConnection; import io.muoncore.channel.support.Scheduler; import io.muoncore.codec.Codecs; import io.muoncore.config.AutoConfiguration; import io.muoncore.exception.MuonTransportFailureException; import io.muoncore.protocol.ServerStacks; import io.muoncore.transport.MuonTransport; import io.muoncore.message.MuonInboundMessage; import io.muoncore.message.MuonOutboundMessage; import java.net.URI; import java.net.URISyntaxException; import java.util.Optional; public class InMemTransport implements MuonTransport { private EventBus bus; private AutoConfiguration configuration; private InMemServer inMemServer; private Discovery discovery; public InMemTransport( AutoConfiguration configuration, EventBus bus) { this.bus = bus; this.configuration = configuration; } @Override public boolean canConnectToService(String name) { Optional<ServiceDescriptor> descriptor = discovery .getKnownServices() .stream() .filter(svc -> svc.getIdentifier() .equals(name)) .findFirst(); if (!descriptor.isPresent()) return false; return descriptor.get().getSchemes().stream().anyMatch( url -> url.equals(getUrlScheme())); } @Override public void shutdown() { bus.unregister(inMemServer); } @Override public void start(Discovery discovery, ServerStacks serverStacks, Codecs codecs, Scheduler scheduler) throws MuonTransportFailureException { this.discovery = discovery; this.inMemServer = new InMemServer(configuration.getServiceName(), bus, serverStacks); } @Override public String getUrlScheme() { return "inmem"; } @Override public URI getLocalConnectionURI() { try { return new URI("inmem://" + configuration.getServiceName()); } catch (URISyntaxException e) { throw new MuonTransportFailureException("Incorrect URI for inmem", e); } } @Override public ChannelConnection<MuonOutboundMessage, MuonInboundMessage> openClientChannel(String serviceName, String protocol) { return new DefaultInMemClientChannelConnection(serviceName, protocol, bus); } }