
hudson.model.FingerprintMap Maven / Gradle / Ivy
package hudson.model;
import hudson.Util;
import hudson.util.KeyedDataStorage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
/**
* Cache of {@link Fingerprint}s.
*
*
* This implementation makes sure that no two {@link Fingerprint} objects
* lie around for the same hash code, and that unused {@link Fingerprint}
* will be adequately GC-ed to prevent memory leak.
*
* @author Kohsuke Kawaguchi
*/
public final class FingerprintMap extends KeyedDataStorage {
/**
* @deprecated
* Some old version of Hudson incorrectly serialized this information to the disk.
* So we need this field to be here for such configuration to be read correctly.
* This field is otherwise no longer in use.
*/
private transient ConcurrentHashMap core = new ConcurrentHashMap();
/**
* Returns true if there's some data in the fingerprint database.
*/
public boolean isReady() {
return new File( Hudson.getInstance().getRootDir(),"fingerprints").exists();
}
/**
* @param build
* set to non-null if {@link Fingerprint} to be created (if so)
* will have this build as the owner. Otherwise null, to indicate
* an owner-less build.
*/
public Fingerprint getOrCreate(AbstractBuild build, String fileName, byte[] md5sum) throws IOException {
return getOrCreate(build,fileName, Util.toHexString(md5sum));
}
public Fingerprint getOrCreate(AbstractBuild build, String fileName, String md5sum) throws IOException {
return super.getOrCreate(md5sum, new FingerprintParams(build,fileName));
}
protected Fingerprint get(String md5sum, boolean createIfNotExist, FingerprintParams createParams) throws IOException {
// sanity check
if(md5sum.length()!=32)
return null; // illegal input
md5sum = md5sum.toLowerCase();
return super.get(md5sum,createIfNotExist,createParams);
}
private byte[] toByteArray(String md5sum) {
byte[] data = new byte[16];
for( int i=0; i