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

package com.google.crypto.tink.internal;

import java.security.GeneralSecurityException;
import javax.annotation.Nullable;
import com.google.crypto.tink.SecretKeyAccess;
import com.google.crypto.tink.Key;

public abstract class KeySerializer<KeyT extends Key, SerializationT extends Serialization>
{
    private final Class<KeyT> keyClass;
    private final Class<SerializationT> serializationClass;
    
    private KeySerializer(final Class<KeyT> keyClass, final Class<SerializationT> serializationClass) {
        this.keyClass = keyClass;
        this.serializationClass = serializationClass;
    }
    
    public abstract SerializationT serializeKey(final KeyT key, @Nullable final SecretKeyAccess access) throws GeneralSecurityException;
    
    public Class<KeyT> getKeyClass() {
        return this.keyClass;
    }
    
    public Class<SerializationT> getSerializationClass() {
        return this.serializationClass;
    }
    
    public static <KeyT extends Key, SerializationT extends Serialization> KeySerializer<KeyT, SerializationT> create(final KeySerializationFunction<KeyT, SerializationT> function, final Class<KeyT> keyClass, final Class<SerializationT> serializationClass) {
        return new KeySerializer<KeyT, SerializationT>(keyClass, serializationClass) {
            @Override
            public SerializationT serializeKey(final KeyT key, @Nullable final SecretKeyAccess access) throws GeneralSecurityException {
                return function.serializeKey(key, access);
            }
        };
    }
    
    public interface KeySerializationFunction<KeyT extends Key, SerializationT extends Serialization>
    {
        SerializationT serializeKey(final KeyT key, @Nullable final SecretKeyAccess access) throws GeneralSecurityException;
    }
}
