class HdfsSnapshotLocationManager implements SourceLocationManager {

  static List<Path> calculateSubPaths(
      List<Partition> sourcePartitions,
      String sourceDataLocation,
      String copyBaseLocation) {
    List<Path> paths = new ArrayList<>(sourcePartitions.size());
    for (Partition partition : sourcePartitions) {
      String partitionLocation = partition.getSd().getLocation();
      String partitionBranch = partitionLocation.replace(sourceDataLocation, "");
      while (partitionBranch.startsWith("/")) {
        partitionBranch = partitionBranch.substring(1);
      }
      Path copyPartitionPath = new Path(copyBaseLocation, partitionBranch);
      paths.add(copyPartitionPath);
      LOG.debug("Added sub-path {}.", copyPartitionPath.toString());
    }
    return paths;
  }

    HdfsSnapshotLocationManager(
      HiveConf sourceHiveConf,
      String eventId,
      Table sourceTable,
      boolean snapshotsDisabled,
      SourceCatalogListener sourceCatalogListener);
    HdfsSnapshotLocationManager(
      HiveConf sourceHiveConf,
      String eventId,
      Table sourceTable,
      boolean snapshotsDisabled,
      String tableBasePath,
      SourceCatalogListener sourceCatalogListener);
    HdfsSnapshotLocationManager(
      HiveConf sourceHiveConf,
      String eventId,
      Table sourceTable,
      List<Partition> sourcePartitions,
      boolean snapshotsDisabled,
      String tableBasePath,
      SourceCatalogListener sourceCatalogListener);
    HdfsSnapshotLocationManager(
      HiveConf sourceHiveConf,
      String eventId,
      Table sourceTable,
      List<Partition> sourcePartitions,
      boolean snapshotsDisabled,
      String tableBasePath,
      FileSystemFactory fileSystemFactory,
      SourceCatalogListener sourceCatalogListener);

}