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; } }