package edu.uw.zookeeper.net.intravm; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.UnknownHostException; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicInteger; import com.google.common.base.Supplier; import com.google.common.util.concurrent.MoreExecutors; import edu.uw.zookeeper.common.Actors.ActorExecutor; import edu.uw.zookeeper.common.Factory; public abstract class AbstractIntraVmEndpointFactory<T extends AbstractIntraVmEndpoint<?,?,?,?>> implements Factory<T> { public static final InetAddress LOOPBACK; static { try { LOOPBACK = InetAddress.getByName(null); } catch (UnknownHostException e) { throw new AssertionError(e); } } public static Factory<? extends Executor> sameThreadExecutors() { return actorExecutors(MoreExecutors.directExecutor()); } public static Factory<? extends Executor> actorExecutors( final Executor executor) { return new Factory<Executor>() { @Override public Executor get() { return ActorExecutor.newInstance(executor); } }; } public static Factory<InetSocketAddress> loopbackAddresses(final int startPort) { final InetAddress host = LOOPBACK; return new Factory<InetSocketAddress>() { private final AtomicInteger nextPort = new AtomicInteger(startPort); @Override public InetSocketAddress get() { int port = nextPort.getAndIncrement(); return new InetSocketAddress(host, port); } }; } protected final Supplier<? extends SocketAddress> addresses; protected final Supplier<? extends Executor> executors; public AbstractIntraVmEndpointFactory( Supplier<? extends SocketAddress> addresses, Supplier<? extends Executor> executors) { this.addresses = addresses; this.executors = executors; } public Supplier<? extends SocketAddress> addresses() { return addresses; } public Supplier<? extends Executor> executors() { return executors; } }