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

package org.bouncycastle.tsp.ers;

import org.bouncycastle.util.Arrays;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.operator.DigestCalculator;
import java.util.HashMap;
import java.util.Map;

public abstract class ERSCachingData implements ERSData
{
    private Map<CacheIndex, byte[]> preCalcs;
    
    public ERSCachingData() {
        this.preCalcs = new HashMap<CacheIndex, byte[]>();
    }
    
    @Override
    public byte[] getHash(final DigestCalculator digestCalculator, final byte[] array) {
        final CacheIndex cacheIndex = new CacheIndex(digestCalculator.getAlgorithmIdentifier(), array);
        if (this.preCalcs.containsKey(cacheIndex)) {
            return this.preCalcs.get(cacheIndex);
        }
        final byte[] calculateHash = this.calculateHash(digestCalculator, array);
        this.preCalcs.put(cacheIndex, calculateHash);
        return calculateHash;
    }
    
    protected abstract byte[] calculateHash(final DigestCalculator p0, final byte[] p1);
    
    private static class CacheIndex
    {
        final AlgorithmIdentifier algId;
        final byte[] chainHash;
        
        private CacheIndex(final AlgorithmIdentifier algId, final byte[] chainHash) {
            this.algId = algId;
            this.chainHash = chainHash;
        }
        
        @Override
        public boolean equals(final Object o) {
            if (this == o) {
                return true;
            }
            if (!(o instanceof CacheIndex)) {
                return false;
            }
            final CacheIndex cacheIndex = (CacheIndex)o;
            return this.algId.equals(cacheIndex.algId) && Arrays.areEqual(this.chainHash, cacheIndex.chainHash);
        }
        
        @Override
        public int hashCode() {
            return 31 * this.algId.hashCode() + Arrays.hashCode(this.chainHash);
        }
    }
}
