package com.scraper;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.concurrent.CountDownLatch;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.event.IIOReadProgressListener;
import javax.imageio.stream.ImageInputStream;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import com.scraper.model.Image;
public class ImageJob extends SwingWorker<Void, String> {
private CountDownLatch current, next;
private Image image;
private String saveLocation;
private JProgressBar progress;
private String fileName;
private String text;
public ImageJob(Image image, String saveLocation, JProgressBar progress) {
this.image = image;
this.progress = progress;
this.fileName = progress.getString();
this.saveLocation = saveLocation + '/' + fileName;
this.text = fileName + " - ##%";
}
@Override
protected Void doInBackground() throws Exception
{
InputStream is = null;
ImageReader reader = null;
URL url = null;
try
{
if(current != null)
{
current.await();
}
url = new URL(image.getUrl());
is = url.openStream();
ImageInputStream iis = ImageIO.createImageInputStream(is);
Iterator<ImageReader> it = ImageIO.getImageReadersBySuffix(image
.getExtension().toUpperCase());
reader = it.next();
reader.addIIOReadProgressListener(new ImageProgressListener());
reader.setInput(iis);
ImageIO.write(reader.read(0), image.getExtension(), new File(saveLocation));
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
progress.setString(fileName + " - " + e.getMessage());
e.printStackTrace();
}
finally
{
reader.removeAllIIOReadProgressListeners();
}
return null;
}
public class ImageProgressListener implements IIOReadProgressListener {
@Override
public void imageStarted(ImageReader source, int imageIndex)
{
progress.setValue(progress.getMinimum());
}
@Override
public void imageProgress(ImageReader source, float percentageDone)
{
int percent = (int) percentageDone;
progress.setString(text.replace("##", String.valueOf(percent)));
progress.setValue(percent);
}
@Override
public void readAborted(ImageReader source)
{
progress.setString(fileName + " - Aborted");
}
@Override
public void imageComplete(ImageReader source)
{
progress.setString(fileName + " - Complete");
progress.setValue(progress.getMaximum());
next.countDown();
}
@Override
public void sequenceStarted(ImageReader source, int minIndex)
{
// TODO Auto-generated method stub
}
@Override
public void sequenceComplete(ImageReader source)
{
// TODO Auto-generated method stub
}
@Override
public void thumbnailStarted(ImageReader source, int imageIndex,
int thumbnailIndex)
{
// TODO Auto-generated method stub
}
@Override
public void thumbnailProgress(ImageReader source, float percentageDone)
{
// TODO Auto-generated method stub
}
@Override
public void thumbnailComplete(ImageReader source)
{
// TODO Auto-generated method stub
}
}
public CountDownLatch nextLatch(CountDownLatch current)
{
this.current = current;
this.next = new CountDownLatch(1);
return next;
}
}