class AbstractContentDigestHistory {
    /**
     * Looks up the history by key {@code persistKeyFor(curi)} and loads it into
     * {@code curi.getContentDigestHistory()}.
     * 
     * @param curi
     */
    public abstract void load(CrawlURI curi);
    
    /**
     * Stores {@code curi.getContentDigestHistory()} for the key
     * {@code persistKeyFor(curi)}.
     * 
     * @param curi
     */
    public abstract void store(CrawlURI curi);

    /**
     * 
     * @param curi
     * @return {@code curi.getContentDigestSchemeString()}
     * @throws IllegalStateException if {@code curi.getContentDigestSchemeString()} is null
     */
    protected String persistKeyFor(CrawlURI curi) {<FILL_FUNCTION_BODY>}
}

        String key = curi.getContentDigestSchemeString();
        if (key == null) {
            throw new IllegalStateException("cannot load content digest history, CrawlURI does not have content digest value for " + curi);
        }
        return key;
    
<no_super_class>