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

package com.nimbusds.jose.jwk.gen;

import com.nimbusds.jose.JOSEException;
import java.security.SecureRandom;
import java.security.Provider;
import java.security.KeyStore;
import java.util.Date;
import com.nimbusds.jose.Algorithm;
import com.nimbusds.jose.jwk.KeyOperation;
import java.util.Set;
import com.nimbusds.jose.jwk.KeyUse;
import com.nimbusds.jose.jwk.JWK;

public abstract class JWKGenerator<T extends JWK>
{
    protected KeyUse use;
    protected Set<KeyOperation> ops;
    protected Algorithm alg;
    protected String kid;
    protected boolean tprKid;
    protected Date exp;
    protected Date nbf;
    protected Date iat;
    protected KeyStore keyStore;
    protected Provider provider;
    protected SecureRandom secureRandom;
    
    public JWKGenerator<T> keyUse(final KeyUse use) {
        this.use = use;
        return this;
    }
    
    public JWKGenerator<T> keyOperations(final Set<KeyOperation> ops) {
        this.ops = ops;
        return this;
    }
    
    public JWKGenerator<T> algorithm(final Algorithm alg) {
        this.alg = alg;
        return this;
    }
    
    public JWKGenerator<T> keyID(final String kid) {
        this.kid = kid;
        return this;
    }
    
    public JWKGenerator<T> keyIDFromThumbprint(final boolean tprKid) {
        this.tprKid = tprKid;
        return this;
    }
    
    public JWKGenerator<T> expirationTime(final Date exp) {
        this.exp = exp;
        return this;
    }
    
    public JWKGenerator<T> notBeforeTime(final Date nbf) {
        this.nbf = nbf;
        return this;
    }
    
    public JWKGenerator<T> issueTime(final Date iat) {
        this.iat = iat;
        return this;
    }
    
    public JWKGenerator<T> keyStore(final KeyStore keyStore) {
        this.keyStore = keyStore;
        return this;
    }
    
    public JWKGenerator<T> provider(final Provider provider) {
        this.provider = provider;
        return this;
    }
    
    public JWKGenerator<T> secureRandom(final SecureRandom secureRandom) {
        this.secureRandom = secureRandom;
        return this;
    }
    
    public abstract T generate() throws JOSEException;
}
