Program: 9150
Project: 9150
Buggy source:
/** 
 * Creates a (potentially recursive) tree of node by reading from the file and constructing using the maker. Clients may read results in Node tree form when complete or snoop the selector for a list of objects made. The selector can prevent collection in the node by returning false. Results are guaranteed by the Maker to be of the Maker's type.
 * @param file an absolute path to a structured file
 * @param selector determines whether not to keep an object made.(if null, then all are kept)
 * @return Node with objects available from getItems()and sub-suite Node available from getNodes()
 * @throws Error on any read error if abortOnReadError (default)
 */
public Node readNodes(final File file,final ObjectChecker selector,final boolean abortOnReadError,final PrintStream err) throws IOException {
  final Node result=new Node(file.getPath(),maker.getType());
  if (null == file) {
    throw new IllegalArgumentException("String_Node_Str");
  }
 else   if (!file.isAbsolute()) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  LineReader reader=null;
  try {
    reader=LineReader.createTester(file);
    if (null == reader) {
      throw new IOException("String_Node_Str" + file);
    }
    final String baseDir=file.getParent();
    String line;
    boolean skipEmpties=true;
    while (null != (line=reader.nextLine(skipEmpties))) {
      if (line.charAt(0) == '@') {
        if (line.length() > 1) {
          String newFilePath=line.substring(1).trim();
          File newFile=new File(newFilePath);
          if (!newFile.isAbsolute()) {
            newFile=new File(baseDir,newFilePath);
          }
          Node node=readNodes(newFile,selector,abortOnReadError,err);
          if (!result.addNode(node)) {
            System.err.println("String_Node_Str" + node);
            break;
          }
        }
      }
 else {
        try {
          Object made=maker.make(reader);
          if ((null == selector) || (selector.isValid(made))) {
            if (!result.add(made)) {
              break;
            }
          }
        }
 catch (        AbortException e) {
          if (abortOnReadError) {
            throw e;
          }
          if (null != err) {
            String m;
            IMessage mssg=e.getIMessage();
            if (null != mssg) {
              m="String_Node_Str" + mssg;
            }
 else {
              m=LangUtil.unqualifiedClassName(e) + "String_Node_Str" + e.getMessage();
            }
            err.println(m);
          }
          reader.readToBlankLine();
        }
      }
    }
  }
  finally {
    try {
      if (null != reader) {
        reader.close();
      }
    }
 catch (    IOException e) {
    }
  }
  return result;
}

Fixed version (ground truth):
/** 
 * Creates a (potentially recursive) tree of node by reading from the file and constructing using the maker. Clients may read results in Node tree form when complete or snoop the selector for a list of objects made. The selector can prevent collection in the node by returning false. Results are guaranteed by the Maker to be of the Maker's type.
 * @param file an absolute path to a structured file
 * @param selector determines whether not to keep an object made.(if null, then all are kept)
 * @return Node with objects available from getItems()and sub-suite Node available from getNodes()
 * @throws Error on any read error if abortOnReadError (default)
 */
public Node readNodes(final File file,final ObjectChecker selector,final boolean abortOnReadError,final PrintStream err) throws IOException {
  final Node result=new Node(file.getPath(),maker.getType());
  if (null == file) {
    throw new IllegalArgumentException("String_Node_Str");
  }
 else   if (!file.isAbsolute()) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  UtilLineReader reader=null;
  try {
    reader=UtilLineReader.createTester(file);
    if (null == reader) {
      throw new IOException("String_Node_Str" + file);
    }
    final String baseDir=file.getParent();
    String line;
    boolean skipEmpties=true;
    while (null != (line=reader.nextLine(skipEmpties))) {
      if (line.charAt(0) == '@') {
        if (line.length() > 1) {
          String newFilePath=line.substring(1).trim();
          File newFile=new File(newFilePath);
          if (!newFile.isAbsolute()) {
            newFile=new File(baseDir,newFilePath);
          }
          Node node=readNodes(newFile,selector,abortOnReadError,err);
          if (!result.addNode(node)) {
            System.err.println("String_Node_Str" + node);
            break;
          }
        }
      }
 else {
        try {
          Object made=maker.make(reader);
          if ((null == selector) || (selector.isValid(made))) {
            if (!result.add(made)) {
              break;
            }
          }
        }
 catch (        AbortException e) {
          if (abortOnReadError) {
            throw e;
          }
          if (null != err) {
            String m;
            IMessage mssg=e.getIMessage();
            if (null != mssg) {
              m="String_Node_Str" + mssg;
            }
 else {
              m=LangUtil.unqualifiedClassName(e) + "String_Node_Str" + e.getMessage();
            }
            err.println(m);
          }
          reader.readToBlankLine();
        }
      }
    }
  }
  finally {
    try {
      if (null != reader) {
        reader.close();
      }
    }
 catch (    IOException e) {
    }
  }
  return result;
}