X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Ffunction%2Fcache%2FTileSet.java;fp=src%2Ftim%2Fprune%2Ffunction%2Fcache%2FTileSet.java;h=525696e518e8566289b90cb11691930fbef9e2fc;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/function/cache/TileSet.java b/src/tim/prune/function/cache/TileSet.java new file mode 100644 index 0000000..525696e --- /dev/null +++ b/src/tim/prune/function/cache/TileSet.java @@ -0,0 +1,136 @@ +package tim.prune.function.cache; + +import java.io.File; + + +/** + * Class to hold information about a single tile set + * within the overall Tile Cache. + */ +public class TileSet +{ + /** Summary row info for whole tileset */ + private RowInfo _rowInfo = null; + /** Path relative to mapcache root */ + private String _path = null; + /** Comma-separated list of configs using this tileset */ + private String _usedBy = null; + + + /** + * Constructor + * @param inDir directory of tileset + * @param inPath String describing relative path from cache root + * @param inUsedBy String describing which configs use this Tileset + */ + public TileSet(File inDir, String inPath, String inUsedBy) + { + _path = inPath; + _usedBy = inUsedBy; + _rowInfo = new RowInfo(); + // Go through zoom directories and construct row info objects + if (inDir != null && inDir.exists() && inDir.isDirectory() && inDir.canRead()) + { + for (File subdir : inDir.listFiles()) + { + if (subdir != null && subdir.exists() && subdir.isDirectory() + && subdir.canRead() && isNumeric(subdir.getName())) + { + RowInfo row = makeRowInfo(subdir); + _rowInfo.addRow(row); + } + } + } + } + + /** + * Check if a directory name is numeric + * @param inName name of directory + * @return true if it only contains characters 0-9 + */ + public static boolean isNumeric(String inName) + { + if (inName == null || inName.equals("")) return false; + for (int i=0; i '9') return false; + } + return true; + } + + /** + * Check if a filename is numeric up until the first dot + * This appears to be much faster than scanning for a . with indexOf, then + * chopping to make a new String, and then calling isNumeric to scan through again + * @param inName name of file + * @return true if it only contains characters 0-9 before the first dot + */ + public static boolean isNumericUntilDot(String inName) + { + if (inName == null || inName.equals("") || inName.charAt(0) == '.') { + return false; + } + try + { + char c = '.'; + int i = 0; + do + { + c = inName.charAt(i); + if (c == '.') return true; // found the dot, so stop + if (c < '0' || c > '9') return false; // not numeric + i++; + } while (c != '\0'); + } + catch (IndexOutOfBoundsException iobe) {} + // Didn't find a dot, so can't be a valid name + return false; + } + + /** + * Make a RowInfo object from the given directory + * @param inDir directory for a single zoom level + * @return RowInfo object describing files and size + */ + private static RowInfo makeRowInfo(File inDir) + { + RowInfo row = new RowInfo(); + row.setZoom(Integer.parseInt(inDir.getName())); + for (File subdir : inDir.listFiles()) + { + if (subdir != null && subdir.exists() && subdir.isDirectory() + && subdir.canRead() && isNumeric(subdir.getName())) + { + // Found a directory of images (finally!) + for (File f : subdir.listFiles()) + { + if (f != null && f.exists() && f.isFile() && f.canRead()) + { + if (isNumericUntilDot(f.getName())) { + row.addTile(f.length()); + } + } + } + } + } + return row; + } + + /** + * @return row info object + */ + public RowInfo getRowInfo() { + return _rowInfo; + } + + /** @return relative path to tileset */ + public String getPath() { + return _path; + } + + /** @return users of tileset */ + public String getUsedBy() { + return _usedBy; + } +}