docs: protected Element generateRevision(final BuildData buildData, final Document xmlDoc,
              final AuthorInformation authorInfo) throws BuildProcessingException {
          if (authorInfo == null) {
              return null;
          }
  
          // Build up the revision
          final Element revision = xmlDoc.createElement("revision");
  
          final Element revnumberEle = xmlDoc.createElement("revnumber");
          revision.appendChild(revnumberEle);
  
          final Element revDateEle = xmlDoc.createElement("date");
          final DateFormat dateFormatter = new SimpleDateFormat(BuilderConstants.REV_DATE_STRING_FORMAT, Locale.ENGLISH);
          revDateEle.setTextContent(dateFormatter.format(buildData.getBuildDate()));
          revision.appendChild(revDateEle);
  
          /*
           * Determine the revnumber to use. If we have an override specified then use that directly. If not then build up the
           * revision number using the Book Edition and Publication Number. The format to build it in is: <EDITION>-<PUBSNUMBER>.
           * If Edition only specifies a x or x.y version (eg 5 or 5.1) then postfix the version so it matches the x.y.z format
           * (eg 5.0.0).
           */
          final String overrideRevnumber = buildData.getBuildOptions().getOverrides().get(CSConstants.REVNUMBER_OVERRIDE);
          final String revnumber;
          if (overrideRevnumber == null) {
              revnumber = DocBookBuildUtilities.generateRevisionNumber(buildData.getContentSpec());
          } else {
              revnumber = overrideRevnumber;
          }
  
          // Set the revision number in Revision_History.xml
          revnumberEle.setTextContent(revnumber);
  
          // Create the Author node
          final Element author = xmlDoc.createElement("author");
          revision.appendChild(author);
  
          final Element firstName = xmlDoc.createElement("firstname");
          firstName.setTextContent(authorInfo.getFirstName());
  
          final Element lastName = xmlDoc.createElement("surname");
          lastName.setTextContent(authorInfo.getLastName());
  
          // Docbook 5 needs <firstname>/<surname> wrapped in <personname>
          if (buildData.getDocBookVersion() == DocBookVersion.DOCBOOK_50) {
              final Element personname = xmlDoc.createElement("personname");
              author.appendChild(personname);
  
              personname.appendChild(firstName);
              personname.appendChild(lastName);
          } else {
              author.appendChild(firstName);
              author.appendChild(lastName);
          }
  
          final Element email = xmlDoc.createElement("email");
          email.setTextContent(authorInfo.getEmail() == null ? BuilderConstants.DEFAULT_EMAIL : authorInfo.getEmail());
          author.appendChild(email);
  
          // Create the Revision Messages
          final Element revDescription = xmlDoc.createElement("revdescription");
          revision.appendChild(revDescription);
  
          final Element simplelist = xmlDoc.createElement("simplelist");
          revDescription.appendChild(simplelist);
  
          // Add the custom revision messages if one or more exists.
          if (buildData.getBuildOptions().getRevisionMessages() != null && !buildData.getBuildOptions().getRevisionMessages().isEmpty()) {
              for (final String revMessage : buildData.getBuildOptions().getRevisionMessages()) {
                  final Element revMemberEle = xmlDoc.createElement("member");
                  revMemberEle.setTextContent(revMessage);
                  simplelist.appendChild(revMemberEle);
              }
          }
  
          // Add the revision information
          final Element listMemberEle = xmlDoc.createElement("member");
  
          final ContentSpec contentSpec = buildData.getContentSpec();
          if (contentSpec.getId() != null && contentSpec.getId() > 0) {
              if (contentSpec.getRevision() == null) {
                  listMemberEle.setTextContent(String.format(BuilderConstants.BUILT_MSG, contentSpec.getId(),
                          contentSpecProvider.getContentSpec(
                                  contentSpec.getId()).getRevision()) + (authorInfo.getAuthorId() > 0 ? (" by " + buildData.getRequester())
                          : ""));
              } else {
                  listMemberEle.setTextContent(String.format(BuilderConstants.BUILT_MSG, contentSpec.getId(),
                          contentSpec.getRevision()) + (authorInfo.getAuthorId() > 0 ? (" by " + buildData.getRequester()) : ""));
              }
          } else {
              listMemberEle.setTextContent(
                      BuilderConstants.BUILT_FILE_MSG + (authorInfo.getAuthorId() > 0 ? (" by " + buildData.getRequester()) : ""));
          }
  
          simplelist.appendChild(listMemberEle);
  
          return revision;
      }