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.openstreetmap.josm.data.cache.CacheEntry; 012import org.openstreetmap.josm.data.cache.CacheEntryAttributes; 013import org.openstreetmap.josm.data.cache.ICachedLoaderListener; 014import org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage; 015import org.openstreetmap.josm.plugins.streetside.StreetsideImage; 016import org.openstreetmap.josm.plugins.streetside.cache.CacheUtils; 017import org.openstreetmap.josm.plugins.streetside.cache.StreetsideCache; 018import org.openstreetmap.josm.tools.Logging; 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 private final ArrayBlockingQueue<BufferedImage> queue; 032 private final ArrayBlockingQueue<StreetsideAbstractImage> queueImages; 033 034 private final StreetsideImage image; 035 036 /** 037 * Main constructor. 038 * 039 * @param image 040 * Image to be downloaded. 041 * @param queue 042 * Queue of {@link BufferedImage} objects for the 043 * {@link StreetsideExportWriterThread}. 044 * @param queueImages 045 * Queue of {@link StreetsideAbstractImage} objects for the 046 * {@link StreetsideExportWriterThread}. 047 */ 048 public StreetsideExportDownloadThread(StreetsideImage image, 049 ArrayBlockingQueue<BufferedImage> queue, 050 ArrayBlockingQueue<StreetsideAbstractImage> queueImages) { 051 this.queue = queue; 052 this.image = image; 053 this.queueImages = queueImages; 054 } 055 056 @Override 057 public void run() { 058 CacheUtils.submit(this.image.getId(), StreetsideCache.Type.FULL_IMAGE, this); 059 } 060 061 @Override 062 public synchronized void loadingFinished(CacheEntry data, 063 CacheEntryAttributes attributes, LoadResult result) { 064 try { 065 synchronized (StreetsideExportDownloadThread.class) { 066 this.queue 067 .put(ImageIO.read(new ByteArrayInputStream(data.getContent()))); 068 this.queueImages.put(this.image); 069 } 070 } catch (InterruptedException | IOException e) { 071 Logging.error(e); 072 } 073 } 074}