package org.rr.commons.net.imagefetcher;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.UUID;
import java.util.logging.Level;
import org.rr.commons.log.LoggerFactory;
import org.rr.commons.mufs.IResourceHandler;
import org.rr.mobi4java.MobiDocument;
import org.rr.mobi4java.MobiReader;
public class ImageMobiFileFetcherFactory implements IImageFetcherFactory {
private IResourceHandler mobiFile;
public ImageMobiFileFetcherFactory(final IResourceHandler mobiFile) {
this.mobiFile = mobiFile;
}
@Override
public IImageFetcher getImageFetcher(String fetcherName) {
return getImageFetcher(fetcherName, null);
}
@Override
public IImageFetcher getImageFetcher(String fetcherName, String searchTerm) {
return new MobiFileImageFetcher();
}
@Override
public List<String> getFetcherNames() {
return Collections.singletonList("MOBI");
}
@Override
public boolean searchTermSupport() {
return false;
}
private class MobiFileImageFetcher 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<byte[]> images;
{
try (InputStream in = mobiFile.getContentInputStream()) {
MobiDocument mobiDoc = new MobiReader().read(in);
images = mobiDoc.getImages().iterator();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean hasNext() {
return images.hasNext();
}
@Override
public IImageFetcherEntry next() {
try {
final byte[] imageBytes = images.next();
return new IImageFetcherEntry() {
private String title = UUID.randomUUID().toString();
private int width = -1;
private int height = -1;
@Override
public URL getThumbnailURL() {
return getImageURL();
}
@Override
public URL getImageURL() {
try {
return new URL("file://" + title);
} 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 title;
}
@Override
public byte[] getThumbnailImageBytes() throws IOException {
return getImageBytes();
}
@Override
public byte[] getImageBytes() throws IOException {
return imageBytes;
}
};
} catch(NoSuchElementException e1) {
throw new ArrayIndexOutOfBoundsException();
} catch(Exception e) {
LoggerFactory.getLogger().log(Level.INFO, "Could not read zip file " + mobiFile, e);
}
return null;
}
@Override
public void remove() {
}
};
}
}
}