001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.plugins.streetside.io.export;
003
004import java.awt.image.BufferedImage;
005import java.io.ByteArrayInputStream;
006import java.io.IOException;
007import java.util.concurrent.ArrayBlockingQueue;
008
009import javax.imageio.ImageIO;
010
011import org.apache.log4j.Logger;
012import org.openstreetmap.josm.data.cache.CacheEntry;
013import org.openstreetmap.josm.data.cache.CacheEntryAttributes;
014import org.openstreetmap.josm.data.cache.ICachedLoaderListener;
015import org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage;
016import org.openstreetmap.josm.plugins.streetside.StreetsideImage;
017import org.openstreetmap.josm.plugins.streetside.cache.CacheUtils;
018import org.openstreetmap.josm.plugins.streetside.cache.StreetsideCache;
019
020/**
021 * This is the thread that downloads one of the images that are going to be
022 * exported and writes them in a {@link ArrayBlockingQueue}.
023 *
024 * @author nokutu
025 * @see StreetsideExportManager
026 * @see StreetsideExportWriterThread
027 */
028public class StreetsideExportDownloadThread extends Thread implements
029    ICachedLoaderListener {
030
031  final static Logger logger = Logger.getLogger(StreetsideExportDownloadThread.class);
032
033  private final ArrayBlockingQueue<BufferedImage> queue;
034  private final ArrayBlockingQueue<StreetsideAbstractImage> queueImages;
035
036  private final StreetsideImage image;
037
038  /**
039   * Main constructor.
040   *
041   * @param image
042   *          Image to be downloaded.
043   * @param queue
044   *          Queue of {@link BufferedImage} objects for the
045   *          {@link StreetsideExportWriterThread}.
046   * @param queueImages
047   *          Queue of {@link StreetsideAbstractImage} objects for the
048   *          {@link StreetsideExportWriterThread}.
049   */
050  public StreetsideExportDownloadThread(StreetsideImage image,
051      ArrayBlockingQueue<BufferedImage> queue,
052      ArrayBlockingQueue<StreetsideAbstractImage> queueImages) {
053    this.queue = queue;
054    this.image = image;
055    this.queueImages = queueImages;
056  }
057
058  @Override
059  public void run() {
060    //CacheUtils.submit(image.getId(), StreetsideCache.Type.FULL_IMAGE, this);
061    CacheUtils.submit(image.getId(), StreetsideCache.Type.THUMBNAIL, this);
062  }
063
064  @Override
065  public synchronized void loadingFinished(CacheEntry data,
066      CacheEntryAttributes attributes, LoadResult result) {
067    try {
068      synchronized (StreetsideExportDownloadThread.class) {
069        queue
070            .put(ImageIO.read(new ByteArrayInputStream(data.getContent())));
071        queueImages.put(image);
072      }
073    } catch (InterruptedException | IOException e) {
074      logger.error(e);
075    }
076  }
077}