/**
   * Deletes incomplete files more than INCOMPLETE_PURGE_TIME days old from disk Then removes
   * entries in this for which there is no file on disk.
   *
   * @param activeFiles which files are currently being downloaded.
   * @return true iff any entries were purged
   */
  public synchronized boolean initialPurge(Collection<File> activeFiles) {
    // Remove any files that are old.
    boolean ret = false;
    for (Iterator<File> iter = blocks.keySet().iterator(); iter.hasNext(); ) {
      File file = iter.next();
      try {
        file = FileUtils.getCanonicalFile(file);
      } catch (IOException iox) {
        file = file.getAbsoluteFile();
      }
      if (!file.exists() || (isOld(file) && !activeFiles.contains(file))) {
        ret = true;
        fileManager.get().getManagedFileList().remove(file);
        file.delete();
        iter.remove();
      }
    }
    for (Iterator<File> iter = hashes.values().iterator(); iter.hasNext(); ) {
      File file = iter.next();
      if (!file.exists()) {
        iter.remove();
        ret = true;
      }
    }

    return ret;
  }
  /**
   * replaces tokens in the update command with info about the specific system i.e. <PATH> ->
   * C:\Documents And Settings....
   */
  private static void prepareUpdateCommand(UpdateData info) {
    if (info == null || info.getUpdateCommand() == null) return;

    File path = LibraryUtils.PREFERENCE_SHARE.getAbsoluteFile();
    String name = info.getUpdateFileName();

    try {
      path = FileUtils.getCanonicalFile(path);
    } catch (IOException bad) {
    }

    String command = info.getUpdateCommand();
    command = StringUtils.replace(command, "$", path.getPath() + File.separator);
    command = StringUtils.replace(command, "%", name);
    info.setUpdateCommand(command);
  }