/**
  * Use our knowledge of the hierarchy and the relative path of the current data file to determine
  * if certain elements represent paths to our hierarchy children. If so, rename them
  * appropriately.
  */
 private boolean maybeRenameRelativeHierarchyPaths(DataFileEntry e) {
   setFilename(e);
   if (currentNode != null) {
     String dataName = e.getKey();
     String remappedName = currentNode.remapRelativePath(dataName);
     if (remappedName != null && !remappedName.equals(dataName)) {
       e.setKey(remappedName);
       return true;
     }
   }
   return false;
 }
  /**
   * Throughout the hierarchy, certain data elements are used to tag the
   * inclusion/exclusion/ordering of tasks within task lists. These data names contain task list
   * names and could contain task names, so they must be renamed.
   */
  private boolean maybeRenameLocalTsElement(DataFileEntry e) {
    String dataName = e.getKey();
    int[] tsPrefixPos = getTsPrefixPos(dataName);
    if (tsPrefixPos == null) return false;

    String path = dataName.substring(0, tsPrefixPos[0]);
    String tsPrefix = dataName.substring(tsPrefixPos[0], tsPrefixPos[1]);
    String taskListName = dataName.substring(tsPrefixPos[1]);
    String newName =
        pathMapper.getString(path) + tsPrefix + taskListMapper.hashTaskListName(taskListName);
    e.setKey(newName);
    return true;
  }
 private void setFilename(DataFileEntry e) {
   String datafile = e.getFilename();
   if (!datafile.equals(currentDatafile)) {
     this.currentDatafile = datafile;
     this.currentNode = hierarchyInfo.findNodeForDataFile(datafile);
   }
 }
  /**
   * Certain elements are commonly written by dashboard logic relative to hierarchy paths. If this
   * entry represents one of those well-known items, remap the name.
   */
  private boolean maybeRenameCommonTaskNameBasedElements(DataFileEntry e) {
    String dataName = e.getKey();
    int suffixPos = getTaskNameSuffixPos(dataName);
    if (suffixPos == -1) return false;

    String origPath = dataName.substring(0, suffixPos);
    if (origPath.contains(" /") || origPath.contains("/ "))
      // the presence of a space next to a slash indicates that this is a
      // process-namespaced data element.
      return false;

    String suffix = dataName.substring(suffixPos);
    String newPath = pathMapper.getString(origPath);
    String newName = newPath + suffix;
    e.setKey(newName);
    return true;
  }
  /**
   * The global.dat file contains data elements that hold metadata for locally defined task lists.
   * These data element names contain task list names and must be renamed.
   */
  private boolean maybeRenameGlobalTSElement(DataFileEntry e) {
    // check to see if we are in the global data file
    if (!"global.dat".equals(e.getFilename())) return false;

    // look for the presence of the task & schedule dataname prefix
    String dataName = e.getKey();
    if (!dataName.startsWith(GLOBAL_TS_PREFIX)) return false;

    // extract the task list name out of the data name
    int end = dataName.indexOf('/', beg + 1);
    if (end == -1) return false;
    String taskListName = dataName.substring(beg, end);

    // construct a new name for the data element
    String newName = taskListMapper.hashTaskListName(taskListName);
    e.setKey(GLOBAL_TS_PREFIX + newName + dataName.substring(end));
    return true;
  }