Ignore:
Timestamp:
2010-12-23T15:04:09+01:00 (14 years ago)
Author:
upliner
Message:

jmapviewer: replace .etag files with .tags ones to store tile metadata

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

    r24840 r24847  
    33//License: GPL. Copyright 2008 by Jan Peter Stotz
    44
     5import java.io.BufferedReader;
    56import java.io.ByteArrayInputStream;
    67import java.io.ByteArrayOutputStream;
    78import java.io.File;
    89import java.io.FileInputStream;
     10import java.io.FileNotFoundException;
    911import java.io.FileOutputStream;
    1012import java.io.IOException;
    1113import java.io.InputStream;
     14import java.io.InputStreamReader;
     15import java.io.OutputStreamWriter;
     16import java.io.PrintWriter;
    1217import java.net.HttpURLConnection;
    1318import java.net.URL;
    1419import java.net.URLConnection;
    1520import java.nio.charset.Charset;
     21import java.util.Map.Entry;
    1622import java.util.logging.Level;
    1723import java.util.logging.Logger;
     
    3642
    3743    private static final String ETAG_FILE_EXT = ".etag";
    38 
    39     private static final Charset ETAG_CHARSET = Charset.forName("UTF-8");
     44    private static final String TAGS_FILE_EXT = ".tags";
     45
     46    private static final Charset TAGS_CHARSET = Charset.forName("UTF-8");
    4047
    4148    public static final long FILE_AGE_ONE_DAY = 1000 * 60 * 60 * 24;
     
    167174                }
    168175                if (source.getTileUpdate() == TileUpdate.ETag || source.getTileUpdate() == TileUpdate.IfNoneMatch) {
    169                     if (tileFile != null) {
    170                         String fileETag = loadETagfromFile();
    171                         if (fileETag != null) {
    172                             switch (source.getTileUpdate()) {
    173                             case IfNoneMatch:
    174                                 urlConn.addRequestProperty("If-None-Match", fileETag);
    175                                 break;
    176                             case ETag:
    177                                 if (hasOsmTileETag(fileETag)) {
    178                                     tile.setLoaded(true);
    179                                     tileFile.setLastModified(System.currentTimeMillis() - maxCacheFileAge
    180                                             + recheckAfter);
    181                                     return;
    182                                 }
     176                    String fileETag = tile.getValue("etag");
     177                    if (fileETag != null) {
     178                        switch (source.getTileUpdate()) {
     179                        case IfNoneMatch:
     180                            urlConn.addRequestProperty("If-None-Match", fileETag);
     181                            break;
     182                        case ETag:
     183                            if (hasOsmTileETag(fileETag)) {
     184                                tile.setLoaded(true);
     185                                tileFile.setLastModified(System.currentTimeMillis() - maxCacheFileAge
     186                                        + recheckAfter);
     187                                return;
    183188                            }
    184189                        }
    185190                    }
    186 
    187                     String eTag = urlConn.getHeaderField("ETag");
    188                     saveETagToFile(eTag);
    189                 }
    190                 loadTileMetadata(tile, urlConn);
     191                    tile.putValue("etag", urlConn.getHeaderField("ETag"));
     192                }
    191193                if (urlConn instanceof HttpURLConnection && ((HttpURLConnection)urlConn).getResponseCode() == 304) {
    192194                    // If we are isModifiedSince or If-None-Match has been set
     
    197199                    return;
    198200                }
     201
     202                loadTileMetadata(tile, urlConn);
     203                saveTagsToFile();
    199204
    200205                byte[] buffer = loadTileInBuffer(urlConn);
     
    229234                tile.loadImage(fin);
    230235                fin.close();
     236
     237                loadTagsFromFile();
     238
    231239                fileAge = tileFile.lastModified();
    232240                boolean oldTile = System.currentTimeMillis() - fileAge > maxCacheFileAge;
     
    337345        }
    338346
    339         protected void saveETagToFile(String eTag) {
    340             try {
    341                 FileOutputStream f = new FileOutputStream(tileCacheDir + "/" + tile.getZoom() + "_" + tile.getXtile()
    342                         + "_" + tile.getYtile() + ETAG_FILE_EXT);
    343                 f.write(eTag.getBytes(ETAG_CHARSET.name()));
     347        protected void saveTagsToFile() {
     348            File tagsFile = new File(tileCacheDir, tile.getZoom() + "_"
     349                    + tile.getXtile() + "_" + tile.getYtile() + TAGS_FILE_EXT);
     350            if (tile.getMetadata() == null) {
     351                tagsFile.delete();
     352                return;
     353            }
     354            try {
     355                final PrintWriter f = new PrintWriter(new OutputStreamWriter(new FileOutputStream(tagsFile)));
     356                for (Entry<String, String> entry : tile.getMetadata().entrySet()) {
     357                    f.println(entry.getKey() + "=" + entry.getValue());
     358                }
    344359                f.close();
    345360            } catch (Exception e) {
    346                 System.err.println("Failed to save ETag: " + e.getLocalizedMessage());
    347             }
    348         }
    349 
    350         protected String loadETagfromFile() {
    351             try {
    352                 FileInputStream f = new FileInputStream(tileCacheDir + "/" + tile.getZoom() + "_" + tile.getXtile()
    353                         + "_" + tile.getYtile() + ETAG_FILE_EXT);
     361                System.err.println("Failed to save tile tags: " + e.getLocalizedMessage());
     362            }
     363        }
     364
     365        /** Load backward-compatiblity .etag file and if it exists move it to new .tags file*/
     366        private void loadOldETagfromFile() {
     367            File etagFile = new File(tileCacheDir, tile.getZoom() + "_"
     368                    + tile.getXtile() + "_" + tile.getYtile() + ETAG_FILE_EXT);
     369            if (!etagFile.exists()) return;
     370            try {
     371                FileInputStream f = new FileInputStream(etagFile);
    354372                byte[] buf = new byte[f.available()];
    355373                f.read(buf);
    356374                f.close();
    357                 return new String(buf, ETAG_CHARSET.name());
     375                String etag = new String(buf, TAGS_CHARSET.name());
     376                tile.putValue("etag", etag);
     377                if (etagFile.delete()) {
     378                    saveTagsToFile();
     379                }
     380            } catch (IOException e) {
     381                System.err.println("Failed to load compatiblity etag: " + e.getLocalizedMessage());
     382            }
     383        }
     384
     385        protected void loadTagsFromFile() {
     386            loadOldETagfromFile();
     387            File tagsFile = new File(tileCacheDir, tile.getZoom() + "_"
     388                    + tile.getXtile() + "_" + tile.getYtile() + TAGS_FILE_EXT);
     389            try {
     390                final BufferedReader f = new BufferedReader(new InputStreamReader(new FileInputStream(tagsFile)));
     391                for (String line = f.readLine(); line != null; line = f.readLine()) {
     392                    final int i = line.indexOf('=');
     393                    if (i == -1 || i == 0) {
     394                        System.err.println("Malformed tile tag in file '" + tagsFile.getName() + "':" + line);
     395                        continue;
     396                    }
     397                    tile.putValue(line.substring(0,i),line.substring(i+1));
     398                }
     399                f.close();
     400            } catch (FileNotFoundException e) {
    358401            } catch (Exception e) {
    359                 return null;
     402                System.err.println("Failed to load tile tags: " + e.getLocalizedMessage());
    360403            }
    361404        }
  • applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/Tile.java

    r24840 r24847  
    5151    protected boolean error = false;
    5252
    53     /** TileSource-specific tile metadata */
     53    /** TileLoader-specific tile metadata */
    5454    protected Map<String, String> metadata;
    5555
     
    272272
    273273    public void putValue(String key, String value) {
     274        if (value == null || "".equals(value)) {
     275            if (metadata != null) {
     276                metadata.remove(key);
     277            }
     278            return;
     279        }
    274280        if (metadata == null) {
    275281            metadata = new HashMap<String,String>();
Note: See TracChangeset for help on using the changeset viewer.