package org.rr.commons.net.imagefetcher; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import java.util.logging.Level; import org.rr.commons.log.LoggerFactory; import org.rr.commons.mufs.IResourceHandler; import org.rr.commons.utils.compression.CompressedDataEntry; import org.rr.commons.utils.compression.FileEntryFilter; import org.rr.commons.utils.compression.truezip.TrueZipUtils; public class ImageZipFileFetcherFactory implements IImageFetcherFactory { private IResourceHandler zipFile; public ImageZipFileFetcherFactory(final IResourceHandler zipFile) { this.zipFile = zipFile; } @Override public IImageFetcher getImageFetcher(String fetcherName) { return getImageFetcher(fetcherName, null); } @Override public IImageFetcher getImageFetcher(String fetcherName, String searchTerm) { return new ZipFileImageFetcher(); } @Override public List<String> getFetcherNames() { return Collections.singletonList("ZIP"); } private class ZipFileImageFetcher implements IImageFetcher { @Override public void setSearchTerm(String searchTerm) { } @Override public List<IImageFetcherEntry> getNextEntries() throws IOException { return null; //all entries will be delivered with the getEntriesIterator method. } @Override public Iterator<IImageFetcherEntry> getEntriesIterator() { return new Iterator<IImageFetcherEntry>() { Iterator<String> entries; { try { entries = TrueZipUtils.list(zipFile, new FileEntryFilter() { @Override public boolean accept(String entry, byte[] rawEntry) { entry = entry. toLowerCase(); if(entry.endsWith(".jpg") || entry.endsWith(".jpeg") || entry.endsWith(".png") || entry.endsWith(".gif")) { return true; } return false; } }).iterator(); } catch(Exception e) { LoggerFactory.getLogger().log(Level.INFO, "Could not read zip file " + zipFile, e); } } @Override public boolean hasNext() { return entries.hasNext(); } @Override public IImageFetcherEntry next() { try { final String entry = entries.next(); return new IImageFetcherEntry() { private int width = -1; private int height = -1; @Override public URL getThumbnailURL() { return getImageURL(); } @Override public URL getImageURL() { try { return new URL("file://" + entry); } catch (Exception e) { LoggerFactory.getLogger().log(Level.INFO, "Invalid URL", e); } return null; } @Override public int getImageWidth() { return this.width; } @Override public int getImageHeight() { return this.height; } @Override public String getTitle() { return new File(entry).getName(); } @Override public byte[] getThumbnailImageBytes() throws IOException { return getImageBytes(); } @Override public byte[] getImageBytes() throws IOException { CompressedDataEntry extractZipEntry = TrueZipUtils.extract(zipFile, entry); return extractZipEntry.getBytes(); } }; } catch(NoSuchElementException e1) { throw new ArrayIndexOutOfBoundsException(); } catch(Exception e) { LoggerFactory.getLogger().log(Level.INFO, "Could not read zip file " + zipFile, e); } return null; } @Override public void remove() { } }; } } @Override public boolean searchTermSupport() { return false; } }