Ticket #9813: osm-ondisktile.diff

File osm-ondisktile.diff, 4.2 KB (added by wavexx, 11 years ago)
  • src/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.java

     
    300300                    if (fin != null) {
    301301                        fin.close();
    302302                        tileFile.delete();
     303                        pruneTileDirectory(tileFile);
    303304                    }
    304305                } catch (Exception e1) {
    305306                }
     
    381382        }
    382383
    383384        protected File getTileFile() {
    384             return new File(tileCacheDir + "/" + tile.getZoom() + "_" + tile.getXtile() + "_" + tile.getYtile() + "."
     385            return new File(tileCacheDir + "/" + tile.getZoom() + "/" + tile.getXtile() + "/" + tile.getYtile() + "."
    385386                    + tile.getSource().getTileType());
    386387        }
    387388
    388389        protected File getTagsFile() {
    389             return new File(tileCacheDir + "/" + tile.getZoom() + "_" + tile.getXtile() + "_" + tile.getYtile()
     390            return new File(tileCacheDir + "/" + tile.getZoom() + "/" + tile.getXtile() + "/" + tile.getYtile()
    390391                    + TAGS_FILE_EXT);
    391392        }
    392393
     394        protected void prepareTileDirectory(File path) {
     395            new File(path.getParent()).mkdirs();
     396        }
     397
     398        protected void pruneTileDirectory(File path) {
     399            // Cleanup Y/X/Z in turn
     400            File parent = path;
     401            for (int i = 0; i < 3; ++i) {
     402              parent = new File(parent.getParent());
     403              if (!parent.delete()) break;
     404            }
     405        }
     406
    393407        protected void saveTileToFile(byte[] rawData) {
    394408            try {
    395                 FileOutputStream f = new FileOutputStream(tileCacheDir + "/" + tile.getZoom() + "_" + tile.getXtile()
    396                         + "_" + tile.getYtile() + "." + tile.getSource().getTileType());
     409                File file = new File(tileCacheDir + "/" + tile.getZoom() + "/" + tile.getXtile()
     410                        + "/" + tile.getYtile() + "." + tile.getSource().getTileType());
     411                prepareTileDirectory(file);
     412                FileOutputStream f = new FileOutputStream(file);
    397413                f.write(rawData);
    398414                f.close();
    399415                // System.out.println("Saved tile to file: " + tile);
     
    404420
    405421        protected void saveTagsToFile() {
    406422            File tagsFile = getTagsFile();
     423            prepareTileDirectory(tagsFile);
    407424            if (tile.getMetadata() == null) {
    408425                tagsFile.delete();
     426                pruneTileDirectory(tagsFile);
    409427                return;
    410428            }
    411429            try {
     
    499517        clearCache(source, null);
    500518    }
    501519
    502     @Override
    503     public void clearCache(TileSource source, TileClearController controller) {
    504         File dir = getSourceCacheDir(source);
     520    public void clearDirectory(TileClearController controller, File dir) throws IOException {
    505521        if (dir != null) {
    506             if (controller != null) controller.initClearDir(dir);
    507             if (dir.isDirectory()) {
     522            if (dir.isDirectory() && dir.getAbsolutePath().equals(dir.getCanonicalPath())) {
     523                if (controller != null) controller.initClearDir(dir);
    508524                File[] files = dir.listFiles();
    509525                if (controller != null) controller.initClearFiles(files);
    510526                for (File file : files) {
    511527                    if (controller != null && controller.cancel()) return;
    512                     file.delete();
     528                    clearDirectory(controller, file);
    513529                    if (controller != null) controller.fileDeleted(file);
    514530                }
    515531            }
    516532            dir.delete();
     533            if (controller != null) controller.fileDeleted(dir);
    517534        }
    518         if (controller != null) controller.clearFinished();
    519535    }
     536
     537    @Override
     538    public void clearCache(TileSource source, TileClearController controller) {
     539        File dir = getSourceCacheDir(source);
     540        try {
     541            clearDirectory(controller, dir);
     542            if (controller != null) controller.clearFinished();
     543        } catch(IOException i) {
     544        }
     545    }
    520546}