Changeset 30849 in osm for applications/viewer


Ignore:
Timestamp:
2014-12-14T23:20:23+01:00 (10 years ago)
Author:
bastik
Message:

see #josm10849 - improve TMS imagery caching

Location:
applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.java

    r30847 r30849  
    4343public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileLoader {
    4444
    45     private static final Logger log = Logger.getLogger(OsmFileCacheTileLoader.class.getName());
    46 
    47     private static final String ETAG_FILE_EXT = ".etag";
     45    private static final Logger log = FeatureAdapter.getLogger(OsmFileCacheTileLoader.class.getName());
     46
    4847    private static final String TAGS_FILE_EXT = ".tags";
    4948
     
    5756    protected final Map<TileSource, File> sourceCacheDirMap;
    5857
    59     protected long maxCacheFileAge = FILE_AGE_ONE_WEEK;
    60     protected long recheckAfter = FILE_AGE_ONE_DAY;
     58    protected long maxCacheFileAge = Long.MAX_VALUE;  // max. age not limited
     59    protected long recheckAfter = FILE_AGE_ONE_WEEK;
    6160
    6261    public static File getDefaultCacheDir() throws SecurityException {
     
    134133        File tileCacheDir;
    135134        File tileFile = null;
    136         long fileAge = 0;
    137         boolean fileTilePainted = false;
     135        Long fileAge = null;
    138136
    139137        public FileLoadJob(Tile tile) {
     
    156154            }
    157155            tileCacheDir = getSourceCacheDir(tile.getSource());
    158             if (loadTileFromFile()) {
     156           
     157            if (loadTileFromFile(recheckAfter)) {
     158                log.log(Level.FINEST, "TMS - found in tile cache: {0}", tile);
     159                tile.setLoaded(true);
     160                listener.tileLoadingFinished(tile, true);
    159161                return;
    160162            }
    161             if (fileTilePainted) {
    162                 TileJob job = new TileJob() {
    163 
    164                     @Override
    165                     public void run() {
    166                         loadOrUpdateTile();
    167                     }
    168                     @Override
    169                     public Tile getTile() {
    170                         return tile;
    171                     }
    172                 };
    173                 JobDispatcher.getInstance().addJob(job);
    174             } else {
    175                 loadOrUpdateTile();
    176             }
    177         }
    178 
    179         protected void loadOrUpdateTile() {
     163            TileJob job = new TileJob() {
     164
     165                @Override
     166                public void run() {
     167                    if (loadOrUpdateTile()) {
     168                        tile.setLoaded(true);
     169                        listener.tileLoadingFinished(tile, true);
     170                    } else {
     171                        // failed to download - use old cache file if available
     172                        if (loadTileFromFile(maxCacheFileAge)) {
     173                            tile.setLoaded(true);
     174                            tile.error = false;
     175                            listener.tileLoadingFinished(tile, true);
     176                            log.log(Level.FINEST, "TMS - found stale tile in cache: {0}", tile);
     177                        } else {
     178                            // failed completely
     179                            tile.setLoaded(true);
     180                            listener.tileLoadingFinished(tile, false);
     181                        }
     182                    }
     183                }
     184                @Override
     185                public Tile getTile() {
     186                    return tile;
     187                }
     188            };
     189            JobDispatcher.getInstance().addJob(job);
     190        }
     191
     192        protected boolean loadOrUpdateTile() {
    180193            try {
    181194                URLConnection urlConn = loadTileFromOsm(tile);
    182                 if (tileFile != null) {
     195                if (fileAge != null) {
    183196                    switch (tile.getSource().getTileUpdate()) {
    184197                    case IfModifiedSince:
     
    187200                    case LastModified:
    188201                        if (!isOsmTileNewer(fileAge)) {
    189                             log.finest("LastModified test: local version is up to date: " + tile);
    190                             tile.setLoaded(true);
    191                             tileFile.setLastModified(System.currentTimeMillis() - maxCacheFileAge + recheckAfter);
    192                             return;
     202                            log.log(Level.FINEST, "TMS - LastModified test: local version is up to date: {0}", tile);
     203                            tileFile.setLastModified(System.currentTimeMillis());
     204                            return true;
    193205                        }
    194206                        break;
     
    204216                        case ETag:
    205217                            if (hasOsmTileETag(fileETag)) {
    206                                 tile.setLoaded(true);
    207                                 tileFile.setLastModified(System.currentTimeMillis() - maxCacheFileAge
    208                                         + recheckAfter);
    209                                 return;
     218                                log.log(Level.FINEST, "TMS - ETag test: local version is up to date: {0}", tile);
     219                                tileFile.setLastModified(System.currentTimeMillis());
     220                                return true;
    210221                            }
    211222                        }
     
    216227                    // If we are isModifiedSince or If-None-Match has been set
    217228                    // and the server answers with a HTTP 304 = "Not Modified"
    218                     log.finest("ETag test: local version is up to date: " + tile);
    219                     tile.setLoaded(true);
    220                     tileFile.setLastModified(System.currentTimeMillis() - maxCacheFileAge + recheckAfter);
    221                     return;
     229                    switch (tile.getSource().getTileUpdate()) {
     230                    case IfModifiedSince:
     231                        log.log(Level.FINEST, "TMS - IfModifiedSince test: local version is up to date: {0}", tile);
     232                        break;
     233                    case IfNoneMatch:
     234                        log.log(Level.FINEST, "TMS - IfNoneMatch test: local version is up to date: {0}", tile);
     235                        break;
     236                    }
     237                    if (loadTileFromFile(maxCacheFileAge)) {
     238                        tileFile.setLastModified(System.currentTimeMillis());
     239                        return true;
     240                    }
    222241                }
    223242
     
    227246                if ("no-tile".equals(tile.getValue("tile-info")))
    228247                {
     248                    log.log(Level.FINEST, "TMS - No tile: tile-info=no-tile: {0}", tile);
    229249                    tile.setError("No tile at this zoom level");
    230                     listener.tileLoadingFinished(tile, true);
     250                    return true;
    231251                } else {
    232                     for(int i = 0; i < 5; ++i) {
     252                    for (int i = 0; i < 5; ++i) {
    233253                        if (urlConn instanceof HttpURLConnection && ((HttpURLConnection)urlConn).getResponseCode() == 503) {
    234254                            Thread.sleep(5000+(new Random()).nextInt(5000));
     
    238258                        if (buffer != null) {
    239259                            tile.loadImage(new ByteArrayInputStream(buffer));
    240                             tile.setLoaded(true);
    241                             listener.tileLoadingFinished(tile, true);
    242260                            saveTileToFile(buffer);
    243                             break;
     261                            log.log(Level.FINEST, "TMS - downloaded tile from server: {0}", tile.getUrl());
     262                            return true;
    244263                        }
    245264                    }
     
    247266            } catch (Exception e) {
    248267                tile.setError(e.getMessage());
    249                 listener.tileLoadingFinished(tile, false);
    250268                if (input == null) {
    251269                    try {
    252                         System.err.println("Failed loading " + tile.getUrl() +": " + e.getMessage());
     270                        log.log(Level.WARNING, "TMS - Failed downloading {0}: {1}", new Object[]{tile.getUrl(), e.getMessage()});
     271                        return false;
    253272                    } catch(IOException i) {
    254273                    }
    255274                }
    256             } finally {
    257                 tile.loading = false;
    258                 tile.setLoaded(true);
    259             }
    260         }
    261 
    262         protected boolean loadTileFromFile() {
     275            }
     276            log.log(Level.WARNING, "TMS - Failed downloading tile: {0}", tile);
     277            return false;
     278        }
     279
     280        protected boolean loadTileFromFile(long maxAge) {
    263281            try {
    264282                tileFile = getTileFile();
    265283                if (!tileFile.exists())
    266284                    return false;
    267 
    268285                loadTagsFromFile();
     286
     287                fileAge = tileFile.lastModified();
     288                if (System.currentTimeMillis() - fileAge > maxAge)
     289                    return false;
     290
    269291                if ("no-tile".equals(tile.getValue("tile-info"))) {
    270292                    tile.setError("No tile at this zoom level");
     
    272294                        tileFile.delete();
    273295                    }
    274                     tileFile = getTagsFile();
     296                    tileFile = null;
    275297                } else {
    276298                    try (FileInputStream fin = new FileInputStream(tileFile)) {
     
    280302                    }
    281303                }
    282 
    283                 fileAge = tileFile.lastModified();
    284                 boolean oldTile = System.currentTimeMillis() - fileAge > maxCacheFileAge;
    285                 if (!oldTile) {
    286                     tile.setLoaded(true);
    287                     listener.tileLoadingFinished(tile, true);
    288                     fileTilePainted = true;
    289                     return true;
    290                 }
    291                 listener.tileLoadingFinished(tile, true);
    292                 fileTilePainted = true;
     304                return true;
     305
    293306            } catch (Exception e) {
     307                log.log(Level.WARNING, "TMS - Error while loading image from tile cache: {0}; {1}", new Object[]{e.getMessage(), tile});
    294308                tileFile.delete();
    295309                tileFile = null;
    296                 fileAge = 0;
     310                fileAge = null;
    297311            }
    298312            return false;
  • applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/tilesources/TMSTileSource.java

    r30223 r30849  
    2828    }
    2929
     30    @Override
    3031    public TileUpdate getTileUpdate() {
    3132        return TileUpdate.IfNoneMatch;
Note: See TracChangeset for help on using the changeset viewer.