package eu.europeana.creative.dataset.culturecam.observer;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Observable;
import java.util.Observer;
import eu.europeana.api.client.exception.TechnicalRuntimeException;
import eu.europeana.api.client.thumbnails.download.ThumbnailDownloader;
import eu.europeana.api.client.thumbnails.processing.LargeThumbnailsetProcessing;
public class FileSizeFilteringObserver extends ThumbnailDownloader implements
Observer {
private int minSize, placeholderSize;
File filteredImages;
public FileSizeFilteringObserver(File localImageFolder,
File filteredImages, int minSize, int placeholderSize) {
super(localImageFolder);
this.minSize = minSize;
this.placeholderSize = placeholderSize;
this.filteredImages = filteredImages;
}
@Override
public void update(Observable o, Object arg) {
if (!(arg instanceof Map))
throw new TechnicalRuntimeException(
"Wrong argument type. Expected map but invoked with "
+ arg.getClass());
@SuppressWarnings("unchecked")
Map<String, String> thumbnailMap = (Map<String, String>) arg;
Map<String, String> fillteredThumbnails = new HashMap<String, String>();
// File datasetFile = getConfig().getDatasetFile(getDataset());
File imageFile;
long fileSize;
int failureCount = 0;
for (String thumbnailId : thumbnailMap.keySet()) {
imageFile = getImageFile(getDownloadFolder(), thumbnailId);
fileSize = imageFile.length();
if (!imageFile.exists())
failureCount++;
else if (fileSize < minSize
|| imageFile.length() == placeholderSize)
fillteredThumbnails.put(thumbnailId, String.valueOf(fileSize));
}
((LargeThumbnailsetProcessing) o).increaseFailureCount(failureCount);
if (!fillteredThumbnails.isEmpty())
writeThumbnailsToCsvFile(fillteredThumbnails, filteredImages);
}
protected void writeThumbnailsToCsvFile(Map<String, String> thumbnails,
File file) {
try {
// create parent dirs
boolean append = true;
if (!file.exists()){
//file.getParentFile().mkdirs();
append = false;
}
BufferedWriter writer = new BufferedWriter(new FileWriter(file,
append));
for (Entry<String, String> thumbnail : thumbnails.entrySet()) {
writer.write(thumbnail.getKey());
writer.write(";");
writer.write(thumbnail.getValue());
writer.write("\n");
}
writer.flush();
writer.close();
} catch (IOException e) {
throw new RuntimeException("cannot write filteredThumbnailsFile", e);
}
}
}