// 
// Decompiled by Procyon v0.6.0
// 

package com.google.crypto.tink;

import java.util.Collections;
import java.util.ServiceLoader;
import java.util.ArrayList;
import java.util.Iterator;
import java.security.GeneralSecurityException;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.List;

public final class KmsClients
{
    private static List<KmsClient> autoClients;
    private static final CopyOnWriteArrayList<KmsClient> clients;
    
    public static void add(final KmsClient client) {
        KmsClients.clients.add(client);
    }
    
    public static KmsClient get(final String keyUri) throws GeneralSecurityException {
        for (final KmsClient client : KmsClients.clients) {
            if (client.doesSupport(keyUri)) {
                return client;
            }
        }
        throw new GeneralSecurityException("No KMS client does support: " + keyUri);
    }
    
    @Deprecated
    public static synchronized KmsClient getAutoLoaded(final String keyUri) throws GeneralSecurityException {
        if (KmsClients.autoClients == null) {
            KmsClients.autoClients = loadAutoKmsClients();
        }
        for (final KmsClient client : KmsClients.autoClients) {
            if (client.doesSupport(keyUri)) {
                return client;
            }
        }
        throw new GeneralSecurityException("No KMS client does support: " + keyUri);
    }
    
    static void reset() {
        KmsClients.clients.clear();
    }
    
    private static List<KmsClient> loadAutoKmsClients() {
        final List<KmsClient> clients = new ArrayList<KmsClient>();
        final ServiceLoader<KmsClient> clientLoader = ServiceLoader.load(KmsClient.class);
        for (final KmsClient element : clientLoader) {
            clients.add(element);
        }
        return Collections.unmodifiableList((List<? extends KmsClient>)clients);
    }
    
    private KmsClients() {
    }
    
    static {
        clients = new CopyOnWriteArrayList<KmsClient>();
    }
}
