package eu.europeana.creative.dataset.pt.classification;
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.Observable;
import java.util.Observer;
import org.apache.log4j.Logger;
import eu.europeana.api.client.exception.TechnicalRuntimeException;
public class ThumbnailSelector implements
Observer {
Logger log = Logger.getLogger(this.getClass());
File outputFile;
Map<String, String> selectedThumbnailsMap;
final int percentage;
int itemCounter;
int selectedItemsCount;
public int getItemCounter() {
return itemCounter;
}
public int getSelectedItemsCount() {
return selectedItemsCount;
}
/**
*
* @param percentage integre between 1 and 99
*/
public ThumbnailSelector(int percentage){
super();
if(percentage < 1 || percentage > 99)
throw new IllegalArgumentException("pecentage must be in range 1...99. Provided Value :" + percentage);
this.percentage = percentage;
}
@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;
if(selectedThumbnailsMap == null){
selectedThumbnailsMap = new HashMap<String, String>(thumbnailMap.size());
}else{
selectedThumbnailsMap.clear();
}
for (Map.Entry<String, String> thumbnail : thumbnailMap.entrySet()) {
itemCounter++;
//keep the first <percentage> items from each 100
if( (itemCounter % 100) <= percentage){
selectedThumbnailsMap.put(thumbnail.getKey(), thumbnail.getValue());
selectedItemsCount++;
}
}
writeFilteredItemsToFile();
//((LargeThumbnailsetProcessing) o).increaseFailureCount(failureCount);
}
private void writeFilteredItemsToFile() {
//skip execution if no data to write
if(selectedThumbnailsMap.isEmpty()){
log.info("No data available for writing to outputfile!");
return;
}
if(!outputFile.exists())
outputFile.getParentFile().mkdirs();
BufferedWriter writer = null;
try{
writer= new BufferedWriter(new FileWriter(outputFile, true));
for (Map.Entry<String, String> thumbnail : selectedThumbnailsMap.entrySet()) {
writer.write(thumbnail.getKey());
writer.write(";");
writer.write(thumbnail.getValue());
writer.write("\n");
}
writer.flush();
}catch(Exception e){
log.info("Failed to write thumbnail category to file", e);
}finally{
try {
if(writer != null)
writer.close();
} catch (IOException e) {
log.warn("cannot close file writer:", e);
}
}
}
public Map<String, String> getselectedThumbnailsMap() {
return selectedThumbnailsMap;
}
public File getOutputFile() {
return outputFile;
}
public void setOutputFile(File outputFile) {
this.outputFile = outputFile;
}
}