All Downloads are FREE. Search and download functionalities are using the official Maven repository.

au.gov.amsa.ais.router.model.Connection Maven / Gradle / Ivy

There is a newer version: 0.6.19
Show newest version
package au.gov.amsa.ais.router.model;

import java.nio.charset.StandardCharsets;
import java.util.Optional;

import com.github.davidmoten.guavamini.Preconditions;
import com.github.davidmoten.rx.Transformers;

import au.gov.amsa.streams.StringSockets;
import rx.Observable;

public final class Connection implements GroupMember {

    private final String id;
    private final String host;
    private final int port;
    private final boolean ssl;
    private final Optional authentication;
    private final int readTimeoutMs;
    private final long retryIntervalMs;
    private final boolean enabled;
    private final Optional proxy;
    private final Observable lines;

    private Connection(String id, String host, int port, boolean ssl,
            Optional authentication, int readTimeoutMs, long retryIntervalMs,
            boolean enabled, Optional proxy) {
        Util.verifyId(id);
        Preconditions.checkNotNull(host);
        Preconditions.checkArgument(port > 0 && port <= 65535, "port must be between 0 and 65535");
        Preconditions.checkNotNull(authentication);
        Preconditions.checkArgument(readTimeoutMs >= 0, "readTimeMs must be >=0");
        Preconditions.checkArgument(retryIntervalMs >= 0, "retryIntervalMs must be >=0");
        Preconditions.checkNotNull(proxy);
        this.id = id;
        this.host = host;
        this.port = port;
        this.ssl = ssl;
        this.authentication = authentication;
        this.readTimeoutMs = readTimeoutMs;
        this.retryIntervalMs = retryIntervalMs;
        this.enabled = enabled;
        this.proxy = proxy;
        // multiple parent groups share the same stream
        this.lines = StringSockets.from(host).charset(StandardCharsets.UTF_8).port(port)
                .quietTimeoutMs(readTimeoutMs).reconnectDelayMs(retryIntervalMs).create()
                .compose(Transformers.split("\n")).map(s -> s.trim()).share();
    }

    public String id() {
        return id;
    }

    public String host() {
        return host;
    }

    public int port() {
        return port;
    }

    public boolean ssl() {
        return ssl;
    }

    public Optional authentication() {
        return authentication;
    }

    public int readTimeoutMs() {
        return readTimeoutMs;
    }

    public long retryIntervalMs() {
        return retryIntervalMs;
    }

    public boolean enabled() {
        return enabled;
    }

    public static Builder builder() {
        return new Builder();
    }

    public static class Builder {

        private String id;
        private String host;
        private int port;
        private boolean ssl;
        private Optional authentication = Optional.empty();
        private int readTimeoutMs;
        private long retryIntervalMs;
        private boolean enabled = true;
        private Optional proxy = Optional.empty();

        private Builder() {
        }

        public Builder id(String id) {
            this.id = id;
            return this;
        }

        public Builder host(String host) {
            this.host = host;
            return this;
        }

        public Builder port(int port) {
            this.port = port;
            return this;
        }

        public Builder ssl(boolean ssl) {
            this.ssl = ssl;
            return this;
        }

        public Builder proxy(Proxy proxy) {
            this.proxy = Optional.of(proxy);
            return this;
        }

        public Builder authentication(Optional authentication) {
            this.authentication = authentication;
            return this;
        }

        public Builder authentication(Authentication authentication) {
            return authentication(Optional.of(authentication));
        }

        public Builder readTimeoutMs(int readTimeoutMs) {
            this.readTimeoutMs = readTimeoutMs;
            return this;
        }

        public Builder readTimeoutSeconds(double val) {
            return readTimeoutMs((int) Math.round(val * 1000));
        }

        public Builder retryIntervalMs(long retryIntervalMs) {
            this.retryIntervalMs = retryIntervalMs;
            return this;
        }

        public Builder retryIntervalSeconds(double val) {
            return retryIntervalMs(Math.round(val * 1000));
        }

        public Builder enabled(boolean enabled) {
            this.enabled = enabled;
            return this;
        }

        public Connection build() {
            return new Connection(id, host, port, ssl, authentication, readTimeoutMs,
                    retryIntervalMs, enabled, proxy);
        }
    }

    @Override
    public Observable lines() {
        return lines;
    }

    @Override
    public String toString() {
        StringBuilder b = new StringBuilder();
        b.append("Connection [id=");
        b.append(id);
        b.append(", host=");
        b.append(host);
        b.append(", port=");
        b.append(port);
        b.append(", ssl=");
        b.append(ssl);
        b.append(", authentication=");
        b.append(authentication);
        b.append(", readTimeoutMs=");
        b.append(readTimeoutMs);
        b.append(", retryIntervalMs=");
        b.append(retryIntervalMs);
        b.append(", enabled=");
        b.append(enabled);
        b.append(", proxy=");
        b.append(proxy);
        b.append("]");
        return b.toString();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy