docs: private void buildAuthorGroup(final BuildData buildData, final SpecTopic specTopic) throws BuildProcessingException {
          log.info("\tBuilding " + AUTHOR_GROUP_FILE_NAME);
  
          // Setup Author_Group.xml
          Document authorDoc = null;
          try {
              authorDoc = XMLUtilities.convertStringToDocument("<authorgroup></authorgroup>");
          } catch (Exception ex) {
              // Exit since we shouldn't fail at converting the basic author group
              log.debug("", ex);
              throw new BuildProcessingException(
                      String.format(getMessages().getString("FAILED_CONVERTING_TEMPLATE"), AUTHOR_GROUP_FILE_NAME));
          }
          final LinkedHashMap<Integer, AuthorInformation> authorIDtoAuthor = new LinkedHashMap<Integer, AuthorInformation>();
  
          // Check if the app should be shutdown
          if (isShuttingDown.get()) {
              return;
          }
  
          // Set the id
          if (specTopic != null) {
              DocBookBuildUtilities.processTopicID(buildData, specTopic, authorDoc);
          } else {
              DocBookBuildUtilities.setDOMElementId(buildData.getDocBookVersion(), authorDoc.getDocumentElement(), "Author_Group");
          }
  
          // Get the mapping of authors using the topics inside the content spec
          for (final Integer topicId : buildData.getBuildDatabase().getTopicIds()) {
              final BaseTopicWrapper<?> topic = buildData.getBuildDatabase().getTopicNodesForTopicID(topicId).get(0).getTopic();
              final List<TagWrapper> authorTags = topic.getTagsInCategories(
                      CollectionUtilities.toArrayList(buildData.getServerEntities().getWriterCategoryId()));
  
              if (authorTags.size() > 0) {
                  for (final TagWrapper author : authorTags) {
                      if (!authorIDtoAuthor.containsKey(author.getId())) {
                          final AuthorInformation authorInfo = EntityUtilities.getAuthorInformation(providerFactory,
                                  buildData.getServerEntities(), author.getId(), author.getRevision());
                          if (authorInfo != null) {
                              authorIDtoAuthor.put(author.getId(), authorInfo);
                          }
                      }
                  }
              }
          }
  
          // Sort and make sure duplicate authors don't exist
          final Set<AuthorInformation> authors = new TreeSet<AuthorInformation>(new AuthorInformationComparator());
          for (final Entry<Integer, AuthorInformation> authorEntry : authorIDtoAuthor.entrySet()) {
              final AuthorInformation authorInfo = authorEntry.getValue();
              if (authorInfo != null) {
                  authors.add(authorInfo);
              }
          }
  
          // Check if the app should be shutdown
          if (isShuttingDown.get()) {
              return;
          }
  
          boolean insertedAuthor = false;
  
          // If one or more authors were found then remove the default and attempt to add them
          if (!authors.isEmpty()) {
              // For each author attempt to find the author information records and populate Author_Group.xml.
              for (final AuthorInformation authorInfo : authors) {
                  // Check if the app should be shutdown
                  if (isShuttingDown.get()) {
                      shutdown.set(true);
                      return;
                  }
  
                  final Element authorEle = authorDoc.createElement("author");
                  final Element firstNameEle = authorDoc.createElement("firstname");
                  firstNameEle.setTextContent(authorInfo.getFirstName());
                  final Element lastNameEle = authorDoc.createElement("surname");
                  lastNameEle.setTextContent(authorInfo.getLastName());
  
                  // Docbook 5 needs <firstname>/<surname> wrapped in <personname>
                  if (buildData.getDocBookVersion() == DocBookVersion.DOCBOOK_50) {
                      final Element personnameEle = authorDoc.createElement("personname");
                      authorEle.appendChild(personnameEle);
  
                      personnameEle.appendChild(firstNameEle);
                      personnameEle.appendChild(lastNameEle);
                  } else {
                      authorEle.appendChild(firstNameEle);
                      authorEle.appendChild(lastNameEle);
                  }
  
                  // Add the affiliation information
                  if (authorInfo.getOrganization() != null) {
                      final Element affiliationEle = authorDoc.createElement("affiliation");
                      final Element orgEle = authorDoc.createElement("orgname");
                      orgEle.setTextContent(authorInfo.getOrganization());
                      affiliationEle.appendChild(orgEle);
                      if (authorInfo.getOrgDivision() != null) {
                          final Element orgDivisionEle = authorDoc.createElement("orgdiv");
                          orgDivisionEle.setTextContent(authorInfo.getOrgDivision());
                          affiliationEle.appendChild(orgDivisionEle);
                      }
                      authorEle.appendChild(affiliationEle);
                  }
  
                  // Add an email if one exists
                  if (authorInfo.getEmail() != null) {
                      Element emailEle = authorDoc.createElement("email");
                      emailEle.setTextContent(authorInfo.getEmail());
                      authorEle.appendChild(emailEle);
                  }
                  authorDoc.getDocumentElement().appendChild(authorEle);
                  insertedAuthor = true;
              }
          }
  
          // If no authors were inserted then use a default value
          if (!insertedAuthor) {
              // Use the author "PressGang CCMS Build System"
              final Element authorEle = authorDoc.createElement("author");
              authorDoc.getDocumentElement().appendChild(authorEle);
  
              // Use the author "PressGang Alpha Build System"
              final Element firstNameEle = authorDoc.createElement("firstname");
              firstNameEle.setTextContent("");
              final Element lastNameEle = authorDoc.createElement("surname");
              lastNameEle.setTextContent("PressGang CCMS Build System");
  
              // Docbook 5 needs <firstname>/<surname> wrapped in <personname>
              if (buildData.getDocBookVersion() == DocBookVersion.DOCBOOK_50) {
                  final Element personnameEle = authorDoc.createElement("personname");
                  authorEle.appendChild(personnameEle);
  
                  personnameEle.appendChild(firstNameEle);
                  personnameEle.appendChild(lastNameEle);
              } else {
                  authorEle.appendChild(firstNameEle);
                  authorEle.appendChild(lastNameEle);
              }
  
              // Add the affiliation
              final Element affiliationEle = authorDoc.createElement("affiliation");
              final Element orgEle = authorDoc.createElement("orgname");
              orgEle.setTextContent("Red&nbsp;Hat");
              affiliationEle.appendChild(orgEle);
              final Element orgDivisionEle = authorDoc.createElement("orgdiv");
              orgDivisionEle.setTextContent("Engineering Content Services");
              affiliationEle.appendChild(orgDivisionEle);
              authorEle.appendChild(affiliationEle);
          }
  
          // Add the Author_Group.xml to the book
          final String authorGroupXml = DocBookBuildUtilities.convertDocumentToDocBookFormattedString(buildData.getDocBookVersion(),
                  authorDoc, "authorgroup", buildData.getEntityFileName(), getXMLFormatProperties());
          addToZip(buildData.getBookLocaleFolder() + AUTHOR_GROUP_FILE_NAME, authorGroupXml, buildData);
      }