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

package org.bson.codecs;

import java.util.Map;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.assertions.Assertions;
import org.bson.Transformer;
import org.bson.codecs.configuration.CodecProvider;

public class MapCodecProvider implements CodecProvider
{
    private final BsonTypeClassMap bsonTypeClassMap;
    private final Transformer valueTransformer;
    
    public MapCodecProvider() {
        this(BsonTypeClassMap.DEFAULT_BSON_TYPE_CLASS_MAP);
    }
    
    public MapCodecProvider(final BsonTypeClassMap bsonTypeClassMap) {
        this(bsonTypeClassMap, null);
    }
    
    public MapCodecProvider(final Transformer valueTransformer) {
        this(BsonTypeClassMap.DEFAULT_BSON_TYPE_CLASS_MAP, valueTransformer);
    }
    
    public MapCodecProvider(final BsonTypeClassMap bsonTypeClassMap, final Transformer valueTransformer) {
        this.bsonTypeClassMap = Assertions.notNull("bsonTypeClassMap", bsonTypeClassMap);
        this.valueTransformer = valueTransformer;
    }
    
    @Override
    public <T> Codec<T> get(final Class<T> clazz, final CodecRegistry registry) {
        if (Map.class.isAssignableFrom(clazz)) {
            return (Codec<T>)new MapCodec(registry, this.bsonTypeClassMap, this.valueTransformer);
        }
        return null;
    }
    
    @Override
    public boolean equals(final Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || this.getClass() != o.getClass()) {
            return false;
        }
        final MapCodecProvider that = (MapCodecProvider)o;
        if (!this.bsonTypeClassMap.equals(that.bsonTypeClassMap)) {
            return false;
        }
        if (this.valueTransformer != null) {
            if (this.valueTransformer.equals(that.valueTransformer)) {
                return true;
            }
        }
        else if (that.valueTransformer == null) {
            return true;
        }
        return false;
    }
    
    @Override
    public int hashCode() {
        int result = this.bsonTypeClassMap.hashCode();
        result = 31 * result + ((this.valueTransformer != null) ? this.valueTransformer.hashCode() : 0);
        return result;
    }
}
