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

io.dropwizard.discovery.DiscoveryFactory Maven / Gradle / Ivy

package io.dropwizard.discovery;

import static com.google.common.base.Preconditions.checkNotNull;
import io.dropwizard.util.Duration;
import io.dropwizard.validation.MinDuration;
import io.dropwizard.validation.PortRange;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nonnull;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.api.CompressionProvider;
import org.apache.curator.framework.imps.GzipCompressionProvider;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.hibernate.validator.constraints.NotEmpty;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.Joiner;

public class DiscoveryFactory {

    /**
     * An enumeration of the available compression codecs available for
     * compressed entries.
     * 
     * @see #getCompressionProvider()
     * @see CompressionProvider
     */
    enum CompressionCodec {

        /**
         * GZIP compression.
         * 
         * @see GzipCompressionProvider
         */
        GZIP(new GzipCompressionProvider());

        final private CompressionProvider provider;

        CompressionCodec(@Nonnull final CompressionProvider provider) {
            this.provider = provider;
        }

        /**
         * Gets the {@link CompressionProvider} for this codec.
         * 
         * @return the provider for this codec.
         */
        public CompressionProvider getProvider() {
            return provider;
        }
    }

    @NotEmpty
    private String[] hosts = new String[] { "localhost" };

    @PortRange
    private int port = 2181;

    @NotEmpty
    private String serviceName;

    @NotNull
    private String listenAddress = "";

    @NotEmpty
    private String namespace = "dropwizard";

    @NotEmpty
    private String basePath = "service";

    @NotNull
    @MinDuration(value = 1, unit = TimeUnit.MILLISECONDS)
    private Duration connectionTimeout = Duration.seconds(6);

    @NotNull
    @MinDuration(value = 1, unit = TimeUnit.MILLISECONDS)
    private Duration sessionTimeout = Duration.seconds(6);

    @NotNull
    @MinDuration(value = 1, unit = TimeUnit.MILLISECONDS)
    private Duration baseSleepTime = Duration.seconds(1);

    @Min(0)
    @Max(29)
    private int maxRetries = 5;

    @NotNull
    private CompressionCodec compression = CompressionCodec.GZIP;

    @NotNull
    private Boolean isReadOnly = false;

    @NotNull
    private Boolean isDisabled = false;

    @JsonProperty
    public String[] getHosts() {
        return hosts;
    }

    @JsonProperty
    public int getPort() {
        return port;
    }

    /**
     * Retrieves a formatted specification of the ZooKeeper quorum..
     * 
     * The specification is formatted as: host1:port,host2:port[,hostN:port]
     * 
     * @return a specification of the ZooKeeper quorum, formatted as a String
     */
    @JsonIgnore
    public String getQuorumSpec() {
        return Joiner.on(":" + getPort() + ",").skipNulls()
                .appendTo(new StringBuilder(), getHosts()).append(':')
                .append(getPort()).toString();
    }

    @JsonProperty
    public String getServiceName() {
        return serviceName;
    }

    @JsonProperty
    public void setServiceName(@Nonnull final String serviceName) {
        this.serviceName = checkNotNull(serviceName);
    }

    @JsonProperty
    public String getNamespace() {
        return namespace;
    }

    @JsonProperty
    public void setNamespace(@Nonnull final String namespace) {
        this.namespace = checkNotNull(namespace);
    }

    @JsonProperty
    public String getBasePath() {
        return basePath;
    }

    @JsonProperty
    public void setBasePath(@Nonnull final String basePath) {
        this.basePath = checkNotNull(basePath);
    }

    @JsonProperty
    public String getListenAddress() {
        return listenAddress;
    }

    @JsonProperty
    public void setListenAddress(@Nonnull final String listenAddress) {
        this.listenAddress = checkNotNull(listenAddress);
    }

    @JsonProperty
    public Duration getConnectionTimeout() {
        return connectionTimeout;
    }

    @JsonProperty
    public void setConnectionTimeout(@Nonnull final Duration connectionTimeout) {
        this.connectionTimeout = checkNotNull(connectionTimeout);
    }

    @JsonProperty
    public Duration getSessionTimeout() {
        return sessionTimeout;
    }

    @JsonProperty
    public void setSessionTimeout(@Nonnull final Duration sessionTimeout) {
        this.sessionTimeout = checkNotNull(sessionTimeout);
    }

    @JsonProperty
    public boolean isDisabled() {
        return isDisabled;
    }

    @JsonProperty("isDisabled")
    public void setIsDisabled(final boolean isDisabled) {
        this.isDisabled = isDisabled;
    }

    @JsonProperty
    public boolean isReadOnly() {
        return isReadOnly;
    }

    @JsonProperty("isReadOnly")
    public void setIsReadOnly(final boolean isReadOnly) {
        this.isReadOnly = isReadOnly;
    }

    @JsonProperty
    public int getMaxRetries() {
        return maxRetries;
    }

    @JsonProperty
    public void setMaxRetries(final int maxRetries) {
        this.maxRetries = maxRetries;
    }

    @JsonProperty
    public Duration getBaseSleepTime() {
        return baseSleepTime;
    }

    @JsonProperty
    public void setBaseSleepTime(@Nonnull final Duration baseSleepTime) {
        this.baseSleepTime = checkNotNull(baseSleepTime);
    }

    /**
     * Returns a {@link RetryPolicy} for handling failed connection attempts.
     * 
     * Always configures an {@link ExponentialBackoffRetry} based on the
     * {@link #getMaxRetries() maximum retries} and {@link #getBaseSleepTime()
     * initial back-off} configured.
     * 
     * @return a {@link RetryPolicy} for handling failed connection attempts.
     * 
     * @see #getMaxRetries()
     * @see #getBaseSleepTime()
     */
    @JsonIgnore
    public RetryPolicy getRetryPolicy() {
        return new ExponentialBackoffRetry((int) getBaseSleepTime()
                .toMilliseconds(), getMaxRetries());
    }

    /**
     * Returns a {@link CompressionProvider} to compress values with.
     * 
     * @return the compression provider used to compress values.
     * 
     * @see #CompressionCodec
     */
    @JsonIgnore
    public CompressionProvider getCompressionProvider() {
        return compression.getProvider();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy