/*
You may freely copy, distribute, modify and use this class as long
as the original author attribution remains intact. See message
below.
Copyright (C) 2003 Christian Pesch. All Rights Reserved.
*/
package slash.metamusic.freedb;
import slash.metamusic.discid.DiscId;
import slash.metamusic.util.FileCache;
import slash.metamusic.util.StringHelper;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.logging.Logger;
/**
* Caches queries to FreeDB.
*
* @author Christian Pesch
* @version $Id: FreeDBCache.java 926 2006-12-29 15:02:22Z cpesch $
*/
public class FreeDBCache {
/**
* Logging output
*/
protected static final Logger log = Logger.getLogger(FreeDBCache.class.getName());
/**
* The name of the cache directory
*/
public static final String CACHE_DIRECTORY_NAME = ".freedb";
private FileCache fileCache = new FileCache();
public void setCacheDirectoryName(String cacheDirectoryName) {
fileCache.setCacheDirectoryName(cacheDirectoryName);
}
protected String createCacheKey(String freeDBQueryString) {
return StringHelper.replaceWhitespaces(freeDBQueryString);
}
protected String peekResult(String key) throws IOException {
return fileCache.getFileAsString(createCacheKey(key));
}
public String peekResult(DiscId discId) throws IOException {
return peekResult(discId.getFreeDBQueryString());
}
public String peekResult(CDDBRecord record) throws IOException {
return peekResult(record.getDiscId());
}
protected void storeResult(String key, String result) throws IOException {
fileCache.putAsString(createCacheKey(key), result);
}
public void storeResult(DiscId discId, String result) throws IOException {
storeResult(discId.getFreeDBQueryString(), result);
}
public void storeResult(CDDBRecord record, String result) throws IOException {
storeResult(record.getDiscId(), result);
}
protected List<File> collectCacheFiles() {
log.fine("Collecting files from FreeDB cache");
File cacheDirectory = fileCache.getCacheDirectory();
File[] files = cacheDirectory.listFiles();
log.fine("Found " + files.length + " files in FreeDB cache");
return Arrays.asList(files);
}
protected DiscId createDiscIdFor(String name) {
StringTokenizer tokenizer = new StringTokenizer(name, "_");
if (!tokenizer.hasMoreTokens())
return null;
String discId = tokenizer.nextToken();
if (!tokenizer.hasMoreTokens())
return null;
List<Integer> numbers = new ArrayList<Integer>();
while (tokenizer.hasMoreTokens()) {
try {
numbers.add(new Integer(tokenizer.nextToken()));
} catch (NumberFormatException e) {
return null;
}
}
if (numbers.size() < 3)
return null;
int trackCount = numbers.get(0);
int[] trackOffsets = new int[trackCount];
for (int i = 0; i < trackOffsets.length; i++) {
trackOffsets[i] = numbers.get(i + 1);
}
int discLength = numbers.get(numbers.size() - 1);
return new DiscId(discId, trackCount, trackOffsets, discLength, true);
}
public Collection<DiscId> getCachedDiscIds() {
List<File> files = collectCacheFiles();
Set<DiscId> discIds = new HashSet<DiscId>(1);
for (File file : files) {
DiscId discId = createDiscIdFor(file.getName());
if (discId != null)
discIds.add(discId);
}
log.info("Found " + discIds.size() + " disc ids in FreeDB cache");
return discIds;
}
}