package edu.uw.zookeeper.net.intravm; import java.net.SocketAddress; import java.util.concurrent.ConcurrentMap; import com.google.common.base.Functions; import com.google.common.base.Supplier; import com.google.common.collect.MapMaker; import edu.uw.zookeeper.common.Factory; import edu.uw.zookeeper.common.Pair; import edu.uw.zookeeper.common.ParameterizedFactory; import edu.uw.zookeeper.net.Connection; public class IntraVmFactory<U,V> { public static <U,V> IntraVmFactory<U,V> defaults() { return newInstance( IntraVmEndpointFactory.loopbackAddresses(1)); } public static <U,V> IntraVmFactory<U,V> newInstance( Supplier<? extends SocketAddress> addresses) { return new IntraVmFactory<U,V>(addresses); } protected final ConcurrentMap<SocketAddress, IntraVmServerConnectionFactory<?,?,V,U,?,?>> servers; protected final Supplier<? extends SocketAddress> addresses; public IntraVmFactory( Supplier<? extends SocketAddress> addresses) { this.addresses = addresses; this.servers = new MapMaker().makeMap(); } public Supplier<? extends SocketAddress> addresses() { return addresses; } public <I,O, T extends AbstractIntraVmEndpoint<I,O,V,U>, C extends Connection<?,?,?>> IntraVmServerConnectionFactory<I,O,V,U,T,C> newServer( SocketAddress listenAddress, Factory<? extends T> endpointFactory, ParameterizedFactory<Pair<? extends T, ? extends AbstractIntraVmEndpoint<?,?,?,? super V>>, ? extends C> connectionFactory) { IntraVmServerConnectionFactory<I,O,V,U,T,C> server = IntraVmServerConnectionFactory.weakListeners( listenAddress, endpointFactory, connectionFactory); IntraVmServerConnectionFactory<?,?,V,U,?,?> prev = servers.putIfAbsent(listenAddress, server); if (prev != null) { throw new IllegalArgumentException(String.valueOf(listenAddress)); } return server; } public <I,O, T extends AbstractIntraVmEndpoint<I,O,U,V>, C extends Connection<?,?,?>> IntraVmClientConnectionFactory<I,O,U,V,T,C> newClient( Factory<? extends T> endpointFactory, ParameterizedFactory<Pair<? extends T, ? extends AbstractIntraVmEndpoint<?,?,?,? super U>>, ? extends C> connectionFactory) { IntraVmClientConnectionFactory<I,O,U,V,T,C> client = IntraVmClientConnectionFactory.<I,O,U,V,T,C>weakListeners( Functions.forMap(servers), endpointFactory, connectionFactory); return client; } }