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

yandex.cloud.sdk.auth.provider.AuthUpdater Maven / Gradle / Ivy

package yandex.cloud.sdk.auth.provider;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

/**
 * Encapsulates background update settings for credential providers
 */
public class AuthUpdater {
    private final CancellableContext cancellableContext;
    private final boolean stopOnRuntimeShutdown;
    private final ScheduledExecutorService updateScheduler;
    private final long delay;
    private final double jitter;

    private AuthUpdater(CancellableContext cancellableContext, boolean stopOnRuntimeShutdown, ScheduledExecutorService updateScheduler, long delay, double jitter) {
        this.cancellableContext = cancellableContext;
        this.stopOnRuntimeShutdown = stopOnRuntimeShutdown;
        this.updateScheduler = updateScheduler;
        this.delay = delay;
        this.jitter = jitter;
    }

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

    BackgroundUpdatingCredentialProvider wrapProvider(CredentialProvider delegate) {
        if (cancellableContext != null) {
            cancellableContext.setRunnable(updateScheduler::shutdownNow);
        }
        if (stopOnRuntimeShutdown) {
            Runtime.getRuntime().addShutdownHook(new Thread(updateScheduler::shutdownNow));
        }
        return new BackgroundUpdatingCredentialProvider(delegate, delay, jitter, updateScheduler);
    }

    public static class Builder {
        private ScheduledExecutorService updateScheduler;
        private boolean stopOnRuntimeShutdown;
        private CancellableContext cancellableContext;
        private long delay = 100;
        private double jitter = 0.2;

        private Builder() {
        }

        public Builder scheduledExecutorService(ScheduledExecutorService updateScheduler) {
            this.updateScheduler = updateScheduler;
            return this;
        }

        public Builder stopOnRuntimeShutdown() {
            this.stopOnRuntimeShutdown = true;
            return this;
        }

        public Builder cancellableContext(CancellableContext context) {
            this.cancellableContext = context;
            return this;
        }

        public Builder retryImmediately() {
            this.delay = 0L;
            this.jitter = 0.0;
            return this;
        }

        public Builder retryDelay(long delay, double jitter) {
            this.delay = delay;
            this.jitter = jitter;
            return this;
        }

        public AuthUpdater build() {
            if (updateScheduler == null && cancellableContext == null && !stopOnRuntimeShutdown) {
                throw new IllegalStateException("Trying to build background updating credential provider without stopping policy");
            }

            if (updateScheduler == null) {
                updateScheduler = Executors.newSingleThreadScheduledExecutor();
            }
            return new AuthUpdater(cancellableContext, stopOnRuntimeShutdown, updateScheduler, delay, jitter);
        }
    }

    public static class CancellableContext {
        Runnable runnable;

        public void cancel() {
            if (runnable != null) {
                runnable.run();
            }
        }

        private void setRunnable(Runnable runnable) {
            this.runnable = runnable;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy