package com.github.davidmoten.rx;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import com.github.davidmoten.rx.exceptions.IORuntimeException;
import com.github.davidmoten.rx.internal.operators.ObservableServerSocket;
import rx.Observable;
import rx.functions.Action0;
import rx.functions.Action1;
import rx.functions.Func0;
import rx.functions.Func1;
public final class IO {
private IO() {
// prevent instantiation
}
public static ServerSocketBuilder serverSocket(final int port) {
return new ServerSocketBuilder(new Func0<ServerSocket>() {
@Override
public ServerSocket call() {
try {
return new ServerSocket(port);
} catch (IOException e) {
throw new IORuntimeException(e);
}
}
});
}
public static ServerSocketBuilder serverSocketAutoAllocatePort(final Action1<Integer> onAllocated) {
return serverSocket(new Func0<ServerSocket>() {
@Override
public ServerSocket call() {
try {
ServerSocket ss = new ServerSocket(0);
onAllocated.call(ss.getLocalPort());
return ss;
} catch (IOException e) {
throw new IORuntimeException(e);
}
}
});
}
public static ServerSocketBuilder serverSocket(Func0<? extends ServerSocket> serverSocketFactory) {
return new ServerSocketBuilder(serverSocketFactory);
}
public static final class ServerSocketBuilder {
private final Func0<? extends ServerSocket> serverSocketFactory;
private int readTimeoutMs = Integer.MAX_VALUE;
private int bufferSize = 8192;
private Action0 preAcceptAction = Actions.doNothing0();
private int acceptTimeoutMs = Integer.MAX_VALUE;
private Func1<? super Socket, Boolean> acceptSocket = Functions.alwaysTrue();
public ServerSocketBuilder(final Func0<? extends ServerSocket> serverSocketFactory) {
this.serverSocketFactory = serverSocketFactory;
}
public ServerSocketBuilder readTimeoutMs(int readTimeoutMs) {
this.readTimeoutMs = readTimeoutMs;
return this;
}
public ServerSocketBuilder bufferSize(int bufferSize) {
this.bufferSize = bufferSize;
return this;
}
public ServerSocketBuilder preAcceptAction(Action0 action) {
this.preAcceptAction = action;
return this;
}
public ServerSocketBuilder acceptTimeoutMs(int acceptTimeoutMs) {
this.acceptTimeoutMs = acceptTimeoutMs;
return this;
}
public ServerSocketBuilder acceptSocketIf(Func1<? super Socket, Boolean> acceptSocket) {
this.acceptSocket = acceptSocket;
return this;
}
public Observable<Observable<byte[]>> create() {
return ObservableServerSocket.create(serverSocketFactory, readTimeoutMs, bufferSize, preAcceptAction,
acceptTimeoutMs, acceptSocket);
}
}
}