001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.plugins.streetside.cubemap; 003 004import java.awt.image.BufferedImage; 005import java.util.HashMap; 006import java.util.List; 007import java.util.Objects; 008import java.util.concurrent.Callable; 009import java.util.concurrent.CopyOnWriteArrayList; 010 011import javax.imageio.ImageIO; 012 013import org.openstreetmap.josm.plugins.streetside.cache.StreetsideCache; 014import org.openstreetmap.josm.plugins.streetside.utils.StreetsideURL; 015import org.openstreetmap.josm.tools.I18n; 016import org.openstreetmap.josm.tools.Logging; 017 018import us.monoid.web.Resty; 019 020public class TileDownloadingTask implements Callable<String> { 021 022 private String tileId; 023 private final long startTime = System.currentTimeMillis(); 024 private StreetsideCache cache; 025 protected CubemapBuilder cb; 026 027 /** 028 * Listeners of the class. 029 */ 030 private final List<ITileDownloadingTaskListener> listeners = new CopyOnWriteArrayList<>(); 031 032 boolean cancelled = false; 033 034 public TileDownloadingTask(String id) { 035 tileId = id; 036 cb = CubemapBuilder.getInstance(); 037 addListener(CubemapBuilder.getInstance()); 038 } 039 040 /** 041 * Adds a new listener. 042 * 043 * @param lis Listener to be added. 044 */ 045 public final void addListener(final ITileDownloadingTaskListener lis) { 046 listeners.add(lis); 047 } 048 049 /** 050 * @return the tileId 051 */ 052 public String getId() { 053 return tileId; 054 } 055 056 /** 057 * @param id the tileId to set 058 */ 059 public void setId(String id) { 060 tileId = id; 061 } 062 063 /** 064 * @return the cache 065 */ 066 public StreetsideCache getCache() { 067 return cache; 068 } 069 070 /** 071 * @param cache the cache to set 072 */ 073 public void setCache(StreetsideCache cache) { 074 this.cache = cache; 075 } 076 077 /** 078 * @return the cb 079 */ 080 public CubemapBuilder getCb() { 081 return cb; 082 } 083 084 /** 085 * @param cb the cb to set 086 */ 087 public void setCb(CubemapBuilder cb) { 088 this.cb = cb; 089 } 090 091 /** 092 * @param cancelled the cancelled to set 093 */ 094 public void setCancelled(boolean cancelled) { 095 this.cancelled = cancelled; 096 } 097 098 @Override 099 public String call() throws Exception { 100 101 BufferedImage img = ImageIO.read(new Resty().bytes( 102 StreetsideURL.VirtualEarth.streetsideTile(tileId, false).toExternalForm()) 103 .stream()); 104 105 if (img == null) { 106 Logging.error(I18n.tr("Download of BufferedImage {0} is null!", tileId)); 107 } 108 109 //String faceId = CubemapUtils.getFaceIdFromTileId(tileId); 110 111 /*Map<String, Map<String, BufferedImage>> faces2TilesMap = CubemapBuilder 112 .getInstance().getCubemap().getFace2TilesMap();*/ 113 114 /*if(CubemapBuilder.getInstance().getTileImages().get(tileId)==null) { 115 CubemapBuilder.getInstance().getTileImages().put(tileId, new HashMap<String,BufferedImage>()); 116 }*/ 117 CubemapBuilder.getInstance().getTileImages().put(tileId, img); 118 119 fireTileAdded(tileId); 120 121 long endTime = System.currentTimeMillis(); 122 long runTime = (endTime-startTime)/1000; 123 Logging.debug("Loaded image for tile {0} in {1} seconds", tileId, runTime); 124 125 return tileId; 126 } 127 128 private void fireTileAdded(String id) { 129 listeners.stream().filter(Objects::nonNull).forEach(lis -> lis.tileAdded(id)); 130 } 131}