-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<inName.length(); i++)
- {
- char a = inName.charAt(i);
- if (a < '0' || a > '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;
- }
-}