/**
   * Filesystem checker.
   *
   * @param conf configuration (namenode config)
   * @param namenode namenode that this fsck is going to use
   * @param pmap key=value[] map passed to the http servlet as url parameters
   * @param out output stream to write the fsck output
   * @param totalDatanodes number of live datanodes
   * @param minReplication minimum replication
   * @param remoteAddress source address of the fsck request
   * @throws IOException
   */
  NamenodeFsck(
      Configuration conf,
      NameNode namenode,
      NetworkTopology networktopology,
      Map<String, String[]> pmap,
      PrintWriter out,
      int totalDatanodes,
      short minReplication,
      InetAddress remoteAddress) {
    this.conf = conf;
    this.namenode = namenode;
    this.networktopology = networktopology;
    this.out = out;
    this.totalDatanodes = totalDatanodes;
    this.minReplication = minReplication;
    this.remoteAddress = remoteAddress;
    this.bpPolicy = BlockPlacementPolicy.getInstance(conf, null, networktopology);

    for (Iterator<String> it = pmap.keySet().iterator(); it.hasNext(); ) {
      String key = it.next();
      if (key.equals("path")) {
        this.path = pmap.get("path")[0];
      } else if (key.equals("move")) {
        this.doMove = true;
      } else if (key.equals("delete")) {
        this.doDelete = true;
      } else if (key.equals("files")) {
        this.showFiles = true;
      } else if (key.equals("blocks")) {
        this.showBlocks = true;
      } else if (key.equals("locations")) {
        this.showLocations = true;
      } else if (key.equals("racks")) {
        this.showRacks = true;
      } else if (key.equals("openforwrite")) {
        this.showOpenFiles = true;
      } else if (key.equals("listcorruptfileblocks")) {
        this.showCorruptFileBlocks = true;
      } else if (key.equals("startblockafter")) {
        this.currentCookie[0] = pmap.get("startblockafter")[0];
      } else if (key.equals("includeSnapshots")) {
        this.snapshottableDirs = new ArrayList<String>();
      }
    }
  }