
au.gov.amsa.ais.router.model.Port Maven / Gradle / Ivy
package au.gov.amsa.ais.router.model;
import java.io.Closeable;
import java.io.IOException;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import au.gov.amsa.streams.StringServer;
import rx.Observable;
public final class Port implements Closeable {
private static final Logger log = LoggerFactory.getLogger(Port.class);
private final int port;
private final Optional group;
private final boolean enabled;
private final Optional userGroup;
private final Observable lines;
private Port(int port, Optional group, boolean enabled,
Optional userGroup) {
this.port = port;
this.group = group;
this.enabled = enabled;
this.userGroup = userGroup;
this.lines = createLines();
}
private Observable createLines() {
if (group.isPresent()) {
return group.get().lines();
} else {
return Observable.empty();
}
}
public int port() {
return port;
}
public Optional group() {
return group;
}
public Optional userGroup() {
return userGroup;
}
public boolean enabled() {
return enabled;
}
public static Builder builder() {
return new Builder();
}
private Optional server = Optional.empty();
private final Object serverLock = new Object();
public void start() {
log.info("starting " + this);
synchronized (serverLock) {
if (server.isPresent()) {
throw new RuntimeException("server already started");
} else if (enabled && group.isPresent()) {
server = Optional.of(StringServer.create(lines.map(line -> line + "\n"), port));
server.get().start();
}
}
}
public void stop() {
synchronized (serverLock) {
if (server.isPresent()) {
server.get().stop();
}
}
}
public static class Builder {
private int port;
private Optional group = Optional.empty();
private final Optional userGroup = Optional.empty();
private boolean enabled = true;
private Builder() {
}
public Builder port(int port) {
this.port = port;
return this;
}
public Builder group(GroupMember group) {
this.group = Optional.of(group);
return this;
}
public Builder enabled(boolean enabled) {
this.enabled = enabled;
return this;
}
public Port build() {
return new Port(port, group, enabled, userGroup);
}
}
@Override
public void close() throws IOException {
stop();
}
@Override
public String toString() {
StringBuilder b = new StringBuilder();
b.append("Port [port=");
b.append(port);
b.append(", group=");
b.append(group);
b.append(", enabled=");
b.append(enabled);
b.append(", userGroup=");
b.append(userGroup);
b.append("]");
return b.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy