Changeset 31052 in osm for applications/viewer/jmapviewer
- Timestamp:
- 2015-03-06T02:27:00+01:00 (9 years ago)
- 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
r30900 r31052 49 49 private static final Charset TAGS_CHARSET = Charset.forName("UTF-8"); 50 50 51 p ublic static final long FILE_AGE_ONE_DAY = 1000 * 60 * 60 * 24;52 public static final long FILE_AGE_ONE_WEEK = FILE_AGE_ONE_DAY * 7; 51 private static final long DEFAULT_EXPIRES_TIME = 1000 * 60 * 60 * 24 * 7; 52 53 53 54 54 protected String cacheDirBase; … … 57 57 58 58 protected long maxCacheFileAge = Long.MAX_VALUE; // max. age not limited 59 protected long recheckAfter = FILE_AGE_ONE_WEEK;60 59 61 60 public static File getDefaultCacheDir() throws SecurityException { … … 67 66 log.log(Level.WARNING, 68 67 "Failed to access system property ''java.io.tmpdir'' for security reasons. Exception was: " 69 + e.toString());68 + e.toString()); 70 69 throw e; // rethrow 71 70 } … … 157 156 tileCacheDir = getSourceCacheDir(tile.getSource()); 158 157 159 if (loadTileFromFile(recheckAfter)) { 158 loadTagsFromFile(); 159 160 if (isTileFileValid() && (isNoTileAtZoom() || loadTileFromFile())) { 160 161 log.log(Level.FINE, "TMS - found in tile cache: {0}", tile); 161 162 tile.setLoaded(true); … … 163 164 return; 164 165 } 166 165 167 TileJob job = new TileJob() { 166 168 … … 172 174 } else { 173 175 // failed to download - use old cache file if available 174 if ( loadTileFromFile(maxCacheFileAge)) {176 if (isNoTileAtZoom() || loadTileFromFile()) { 175 177 tile.setLoaded(true); 176 178 tile.error = false; … … 243 245 break; 244 246 } 245 if (loadTileFromFile(maxCacheFileAge)) { 246 tileFile.setLastModified(now); 247 return true; 248 } 247 loadTileFromFile(); 248 tileFile.setLastModified(now); 249 return true; 249 250 } 250 251 … … 286 287 } 287 288 288 protected boolean loadTileFromFile(long maxAge) { 289 protected boolean isTileFileValid() { 290 Long expires = null; 289 291 try { 290 tileFile = getTileFile(); 291 if (!tileFile.exists()) 292 expires = Long.parseLong(tile.getValue("expires")); 293 } catch (NumberFormatException e) {} 294 295 if(expires != null && !expires.equals(0L)) { 296 // check by expire date set by server 297 if (now > expires) { 298 log.log(Level.FINE, "TMS - Tile has expired -> not valid {0}", tile); 292 299 return false; 293 loadTagsFromFile(); 294 295 fileMtime = tileFile.lastModified(); 296 if (now - fileMtime > maxAge) 297 return false; 298 299 if ("no-tile".equals(tile.getValue("tile-info"))) { 300 tile.setError("No tile at this zoom level"); 301 if (tileFile.exists()) { 302 tileFile.delete(); 303 } 304 tileFile = null; 305 } else { 306 try (FileInputStream fin = new FileInputStream(tileFile)) { 307 if (fin.available() == 0) 308 throw new IOException("File empty"); 309 tile.loadImage(fin); 310 } 311 } 300 } 301 } else { 302 // check by file modification date 303 if (tileFile.exists()) { 304 // check for modification date only when tile file exists 305 // so handle properly the case, when only tags file exists 306 fileMtime = tileFile.lastModified(); 307 if (now - fileMtime > DEFAULT_EXPIRES_TIME) { 308 log.log(Level.FINE, "TMS - Tile has expired, maximum file age reached {0}", tile); 309 return false; 310 } 311 } 312 } 313 return true; 314 } 315 316 protected boolean isNoTileAtZoom() { 317 if ("no-tile".equals(tile.getValue("tile-info"))) { 318 // do not remove file - keep the information, that there is no tile, for further requests 319 // the code above will check, if this information is still valid 320 log.log(Level.FINE, "TMS - Tile valid, but no file, as no tiles at this level {0}", tile); 321 tile.setError("No tile at this zoom level"); 312 322 return true; 313 323 } 324 return false; 325 } 326 327 protected boolean loadTileFromFile() { 328 if (!tileFile.exists()) 329 return false; 330 331 try (FileInputStream fin = new FileInputStream(tileFile)) { 332 if (fin.available() == 0) 333 throw new IOException("File empty"); 334 tile.loadImage(fin); 335 return true; 314 336 } catch (Exception e) { 315 337 log.log(Level.WARNING, "TMS - Error while loading image from tile cache: {0}; {1}", new Object[]{e.getMessage(), tile}); 316 338 tileFile.delete(); 339 File tileMetaData = getTagsFile(); 340 if (tileMetaData.exists()) 341 tileMetaData.delete(); 317 342 tileFile = null; 318 343 fileMtime = null; … … 405 430 File file = getTileFile(); 406 431 file.getParentFile().mkdirs(); 407 try ( 408 FileOutputStream f = new FileOutputStream(file) 409 ) { 432 try (FileOutputStream f = new FileOutputStream(file)) { 410 433 f.write(rawData); 411 434 } catch (Exception e) { … … 430 453 } 431 454 432 protected void loadTagsFromFile() { 455 protected boolean loadTagsFromFile() { 456 tileFile = getTileFile(); 433 457 File tagsFile = getTagsFile(); 434 458 try (BufferedReader f = new BufferedReader(new InputStreamReader(new FileInputStream(tagsFile), TAGS_CHARSET))) { … … 445 469 System.err.println("Failed to load tile tags: " + e.getLocalizedMessage()); 446 470 } 471 472 return true; 447 473 } 448 474 } -
applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java
r30900 r31052 109 109 tile.putValue("tile-info", str); 110 110 } 111 112 Long lng = urlConn.getExpiration(); 113 if (lng.equals(0L)) { 114 try { 115 str = urlConn.getHeaderField("Cache-Control"); 116 if (str != null) { 117 for (String token: str.split(",")) { 118 if (token.startsWith("max-age=")) { 119 lng = Math.min( 120 Long.parseLong(token.substring(8)), 121 86400 * 31 // cap max-age at one month 122 ) * 1000 + 123 System.currentTimeMillis(); 124 } 125 } 126 } 127 } catch (NumberFormatException e) {} //ignore malformed Cache-Control headers 128 } 129 if (!lng.equals(0L)) { 130 tile.putValue("expires", lng.toString()); 131 } 111 132 } 112 133
Note:
See TracChangeset
for help on using the changeset viewer.