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

package org.bson.internal;

import org.bson.codecs.configuration.CodecConfigurationException;
import java.util.concurrent.ConcurrentHashMap;
import org.bson.codecs.Codec;
import java.util.Optional;
import java.util.concurrent.ConcurrentMap;

final class CodecCache
{
    private final ConcurrentMap<Class<?>, Optional<Codec<?>>> codecCache;
    
    CodecCache() {
        this.codecCache = new ConcurrentHashMap<Class<?>, Optional<Codec<?>>>();
    }
    
    public boolean containsKey(final Class<?> clazz) {
        return this.codecCache.containsKey(clazz);
    }
    
    public void put(final Class<?> clazz, final Codec<?> codec) {
        this.codecCache.put(clazz, Optional.ofNullable(codec));
    }
    
    public synchronized <T> Codec<T> putIfMissing(final Class<T> clazz, final Codec<T> codec) {
        final Optional<Codec<?>> cachedCodec = this.codecCache.computeIfAbsent((Class<?>)clazz, clz -> Optional.of(codec));
        if (cachedCodec.isPresent()) {
            return (Codec)cachedCodec.get();
        }
        this.codecCache.put(clazz, (Optional<Codec<?>>)Optional.of(codec));
        return codec;
    }
    
    public <T> Codec<T> getOrThrow(final Class<T> clazz) {
        return (Codec)this.codecCache.getOrDefault(clazz, Optional.empty()).orElseThrow(() -> {
            new CodecConfigurationException(String.format("Can't find a codec for %s.", clazz));
            return;
        });
    }
}
