File writeTeamXmlFile(final TeamInfo team) {
    Element root = writeTeamXml(team);

    File outputFile = createTeamXmlFile(team.getTeamNumber());
    deleteExistingFile(outputFile);
    writeFile(outputFile, new Document(root));
    return outputFile;
  }
  @Override
  public List<TeamResult> fetchTeamResults(final MatchInfo theMatch) {
    List<MatchInfo> matchCache = Arrays.asList(theMatch);
    List<TeamInfo> teamCache = theMatch.getTeams();
    List<Category> categories = fetchAllScoringCategories();

    List<TeamResult> results = new ArrayList<>();
    for (TeamInfo theTeam : theMatch.getTeams()) {
      File inputFile = createTeamResultXmlFile(theMatch.getMatchNumber(), theTeam.getTeamNumber());
      if (inputFile.exists()) {
        results.add(readTeamResultXmlFile(matchCache, teamCache, categories, inputFile));
      } else {
        results.add(new TeamResult(theMatch, theTeam));
      }
    }

    return results;
  }
  private TeamInfo readTeamXml(final Element team) throws Exception {
    /*  example team XML file content
    <team teamNumber="1329" name="RoboRebels" city="St Louis" state="MO" country="US">
        General notes about this team
    </team>
    */
    int theTeamNumber = team.getAttribute("teamNumber").getIntValue();
    String theTeamName = team.getAttribute("name").getValue();
    String theTeamCity = team.getAttribute("city").getValue();
    String theTeamState = team.getAttribute("state").getValue();
    String theTeamCountry = team.getAttribute("country").getValue();
    String theNotes = team.getTextNormalize();

    TeamInfo theTeam =
        new TeamInfo(theTeamNumber, theTeamName, theTeamCity, theTeamState, theTeamCountry, null);
    theTeam.setNotes(theNotes);
    theTeam.setImageFile(locateImageFile(theTeamNumber));

    return theTeam;
  }
  @Override
  public List<TeamResult> fetchAllTeamResults() {
    List<MatchInfo> matchCache = fetchAllMatches();
    List<TeamInfo> teamCache = fetchAllTeams();
    List<Category> categories = fetchAllScoringCategories();

    List<TeamResult> results = new ArrayList<>();
    for (MatchInfo theMatch : matchCache) {
      for (TeamInfo theTeam : theMatch.getTeams()) {
        File inputFile =
            createTeamResultXmlFile(theMatch.getMatchNumber(), theTeam.getTeamNumber());
        if (inputFile.exists()) {
          results.add(readTeamResultXmlFile(matchCache, teamCache, categories, inputFile));
        } else {
          results.add(new TeamResult(theMatch, theTeam));
        }
      }
    }

    Comparator<TeamResult> byMatchNumber =
        (e1, e2) -> Integer.compare(e1.getMatch().getMatchNumber(), e2.getMatch().getMatchNumber());
    Collections.sort(results, byMatchNumber);
    return results;
  }
 private Element writeTeamXml(final TeamInfo team) {
   /*  example team XML file content
   <team teamNumber="1329" name="RoboRebels" city="St Louis" state="MO" country="US">
       General notes about this team
   </team>
   */
   Element e = new Element("team");
   e.setAttribute("teamNumber", Integer.toString(team.getTeamNumber()));
   e.setAttribute("name", team.getTeamName());
   if (team.getCity().length() > 0) {
     e.setAttribute("city", team.getCity());
   }
   if (team.getState().length() > 0) {
     e.setAttribute("state", team.getState());
   }
   if (team.getCountry().length() > 0) {
     e.setAttribute("country", team.getCountry());
   }
   e.setText(team.getNotes());
   return e;
 }