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

package com.google.crypto.tink.internal;

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

public abstract class KeyParser<SerializationT extends Serialization>
{
    private final Bytes objectIdentifier;
    private final Class<SerializationT> serializationClass;
    
    private KeyParser(final Bytes objectIdentifier, final Class<SerializationT> serializationClass) {
        this.objectIdentifier = objectIdentifier;
        this.serializationClass = serializationClass;
    }
    
    public abstract Key parseKey(final SerializationT serialization, @Nullable final SecretKeyAccess access) throws GeneralSecurityException;
    
    public final Bytes getObjectIdentifier() {
        return this.objectIdentifier;
    }
    
    public final Class<SerializationT> getSerializationClass() {
        return this.serializationClass;
    }
    
    public static <SerializationT extends Serialization> KeyParser<SerializationT> create(final KeyParsingFunction<SerializationT> function, final Bytes objectIdentifier, final Class<SerializationT> serializationClass) {
        return new KeyParser<SerializationT>(objectIdentifier, serializationClass) {
            @Override
            public Key parseKey(final SerializationT serialization, @Nullable final SecretKeyAccess access) throws GeneralSecurityException {
                return function.parseKey(serialization, access);
            }
        };
    }
    
    public interface KeyParsingFunction<SerializationT extends Serialization>
    {
        Key parseKey(final SerializationT serialization, @Nullable final SecretKeyAccess access) throws GeneralSecurityException;
    }
}
