package com.pugh.sockso.cache; import com.pugh.sockso.Utils; import com.pugh.sockso.music.CoverArt; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import com.google.inject.Singleton; @Singleton public class CoverArtCache extends TimedCache { public static final String[] CACHE_IMAGE_EXTENSIONS = {"jpg", "gif", "png"}; public static final String DEFAULT_IMAGE_TYPE = "jpg"; /** * Indicates if the item is cached * * @param itemName * @param extension * * @return * */ private boolean isCached(final String itemName, final String extension) { final File coverFile = getCoverCacheFile(itemName, extension); return (coverFile.isFile() && coverFile.exists()); } /** * Indicates if the item is cached * * @param itemName * * @return * */ @Override public boolean isCached(final String itemName) { final String ext = getCachedImageExtension(itemName); if (ext != null) { return true; } return false; } /** * Any image extension could exist in the cache. * Return the first one found, otherwise null * * @param itemName * * @return * */ protected String getCachedImageExtension(final String itemName) { for ( final String ext : CACHE_IMAGE_EXTENSIONS ) { if ( isCached(itemName,ext) ) { return ext; } } return null; } /** * Convenience method to add some cover art to the cache * * @param cover * * @throws CacheException * */ public void addToCache(final CoverArt cover) throws CacheException { final CachedObject obj = new CachedObject(cover, -1); writeRaw(cover.getItemName(), obj); } /** * Convenience method to fetch cover art from cache * * @param itemName * * @return * * @throws CacheException * */ public CoverArt getCoverArt(String itemName) throws CacheException { final CachedObject obj = readRaw(itemName); final CoverArt cover = (CoverArt) obj.getValue(); return cover; } /** * returns the absolute path of the cache file * * @param name * @param ext * * @return the cache file path * */ protected File getCoverCacheFile(final String itemName, final String extension) { return new File(Utils.getCoversDirectory() + File.separator + itemName + "." + extension); } /** * Implements raw reading of image cache files * * @param key * * @return * * @throws CacheException * */ @Override protected CachedObject readRaw( String key ) throws CacheException { final String ext = getCachedImageExtension(key); if (ext != null) { final File coverFile = getCoverCacheFile(key, ext); try { final BufferedImage image = ImageIO.read(coverFile); final CoverArt cover = new CoverArt(key, image); return new CachedObject(cover, -1); } catch(IOException e) { throw new CacheException("Error reading image: " + coverFile.toString(), e ); } } return null; } /** * Implements raw writing of data to cache * * @param key * * @param object * * @throws CacheException * */ @Override protected void writeRaw( String key, CachedObject object ) throws CacheException { final CoverArt cover = (CoverArt) object.getValue(); final BufferedImage image = cover.getImage(); final String extension = DEFAULT_IMAGE_TYPE; final File imageFile = getCoverCacheFile(key, extension); try { ImageIO.write(image, extension, imageFile); } catch ( final IOException e ) { throw new CacheException("Error w\riting image to file: " + imageFile.toString(), e); } } }