--- /dev/null
+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;
+ }
+}