/**
   * Add erratum to repodata for given channel
   *
   * @param erratum erratum to be added
   * @param channel channel info
   * @throws SAXException
   */
  private void addErratum(Errata erratum, Channel channel) throws SAXException {
    SimpleAttributesImpl attr = new SimpleAttributesImpl();
    attr.addAttribute("from", "*****@*****.**");
    attr.addAttribute("status", "final");
    attr.addAttribute("type", mapAdvisoryType(erratum.getAdvisoryType()));
    attr.addAttribute("version", Long.toString(erratum.getAdvisoryRel()));
    handler.startElement("update", attr);

    handler.addElementWithCharacters("id", sanitize(0, erratum.getAdvisoryName()));
    handler.addElementWithCharacters("title", sanitize(0, erratum.getSynopsis()));

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    attr.clear();
    attr.addAttribute("date", df.format(erratum.getIssueDate()));
    handler.startElement("issued", attr);
    handler.endElement("issued");

    attr.clear();
    attr.addAttribute("date", df.format(erratum.getUpdateDate()));
    handler.startElement("updated", attr);
    handler.endElement("updated");

    handler.addElementWithCharacters("description", sanitize(0, erratum.getDescription()));

    addErratumReferences(erratum);
    addErratumPkgList(erratum, channel);

    handler.endElement("update");
  }
  /**
   * @param handler content handler
   * @param pkgDto package info dto object
   * @throws SAXException
   */
  protected static void addPackageBoilerplate(SimpleContentHandler handler, PackageDto pkgDto)
      throws SAXException {
    long pkgId = pkgDto.getId().longValue();
    SimpleAttributesImpl attr = new SimpleAttributesImpl();
    attr.addAttribute("pkgid", sanitize(pkgId, pkgDto.getChecksum()));
    attr.addAttribute("name", sanitize(pkgId, pkgDto.getName()));
    attr.addAttribute("arch", sanitize(pkgId, pkgDto.getArchLabel()));
    handler.startElement("package", attr);

    attr.clear();
    attr.addAttribute("ver", sanitize(pkgId, pkgDto.getVersion()));
    attr.addAttribute("rel", sanitize(pkgId, pkgDto.getRelease()));
    attr.addAttribute("epoch", sanitize(pkgId, getPackageEpoch(pkgDto.getEpoch())));
    handler.startElement("version", attr);
    handler.endElement("version");
  }
  /**
   * Adds references info from the errata
   *
   * @param erratum erratum to be added
   * @throws SAXException
   */
  private void addErratumReferences(Errata erratum) throws SAXException {
    handler.startElement("references");

    Iterator iter = erratum.getBugs().iterator();
    while (iter.hasNext()) {
      Bug bug = (Bug) iter.next();

      SimpleAttributesImpl attr = new SimpleAttributesImpl();
      attr.addAttribute(
          "href", "http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=" + bug.getId());
      attr.addAttribute("id", Long.toString(bug.getId()));
      attr.addAttribute("type", "bugzilla");
      handler.startElement("reference", attr);
      handler.addCharacters(bug.getSummary());
      handler.endElement("reference");
    }

    iter = erratum.getCves().iterator();
    while (iter.hasNext()) {
      Cve cve = (Cve) iter.next();

      SimpleAttributesImpl attr = new SimpleAttributesImpl();
      attr.addAttribute("href", "http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=" + cve);
      attr.addAttribute("id", sanitize(0, cve.getName()));
      attr.addAttribute("type", "cve");
      handler.startElement("reference", attr);
      handler.endElement("reference");
    }

    handler.endElement("references");
  }
  /**
   * Adds packages associated to the errata
   *
   * @param erratum erratum to be added
   * @param channel channel info
   * @throws SAXException
   */
  private void addErratumPkgList(Errata erratum, Channel channel) throws SAXException {
    handler.startElement("pkglist");

    SimpleAttributesImpl attr = new SimpleAttributesImpl();
    attr.addAttribute("short", channel.getLabel());
    handler.startElement("collection", attr);

    handler.addElementWithCharacters("name", channel.getName());

    Iterator iter = erratum.getPackages().iterator();

    while (iter.hasNext()) {
      Package pkg = (Package) iter.next();
      if (channel.getPackages().contains(pkg)) {
        long pkgId = pkg.getId();
        String epoch = pkg.getPackageEvr().getEpoch();
        if (epoch == null || epoch.length() == 0) {
          epoch = "0";
        }
        attr.clear();
        attr.addAttribute("name", sanitize(pkgId, pkg.getPackageName().getName()));
        attr.addAttribute("version", sanitize(pkgId, pkg.getPackageEvr().getVersion()));
        attr.addAttribute("release", sanitize(pkgId, pkg.getPackageEvr().getRelease()));
        attr.addAttribute("epoch", sanitize(pkgId, epoch));
        attr.addAttribute("arch", sanitize(pkgId, pkg.getPackageArch().getLabel()));
        attr.addAttribute("src", sanitize(pkgId, pkg.getSourceRpm().getName()));
        handler.startElement("package", attr);

        handler.addElementWithCharacters("filename", sanitize(pkgId, pkg.getFilename()));

        attr.clear();
        attr.addAttribute("type", sanitize(pkgId, pkg.getChecksum().getChecksumType().getLabel()));
        handler.startElement("sum", attr);
        handler.addCharacters(sanitize(pkgId, pkg.getChecksum().getChecksum()));
        handler.endElement("sum");

        handler.endElement("package");
      }
    }

    handler.endElement("collection");

    handler.endElement("pkglist");
  }