/**
   * @throws Exception
   * @see DescriptionTraverserAgent#apply(SimpleDescriptionObject, List)
   */
  public AccessRestrictNotifierResult apply(
      SimpleDescriptionObject sdo, List<AccessRestrictNotifierResult> childResults)
      throws Exception {

    AccessRestrictNotifierResult result = new AccessRestrictNotifierResult();

    if (childResults != null) {
      // Add the results from the children
      for (AccessRestrictNotifierResult childResult : childResults) {
        if (childResult.getDescriptionObjects().size() > 0) {
          result.addDescriptionObjects(childResult.getDescriptionObjects());
        }
      }
    }

    if (sdo.getSubElementsCount() == 0
        && (sdo.getLevel().equals(DescriptionLevel.FILE)
            || sdo.getLevel().equals(DescriptionLevel.ITEM))) {

      DescriptionObject descriptionObject = browserService.getDescriptionObject(sdo.getPid());

      String accessrestrict = descriptionObject.getAccessrestrict();

      if (!StringUtils.isBlank(accessrestrict)) {

        Date currentDate = new Date();

        Date representationDate = DateParser.parse(descriptionObject.getDateFinal());

        Calendar representationCalendar = Calendar.getInstance();
        representationCalendar.setTime(representationDate);

        if (accessrestrict.toLowerCase().startsWith("segredo de estado")) {

          // segredo de estado => 25 years
          representationCalendar.add(Calendar.YEAR, 25);

        } else if (accessrestrict.equalsIgnoreCase("Dados pessoais")) {

          // Dados pessoais => 75 years
          representationCalendar.add(Calendar.YEAR, 75);

        } else if (accessrestrict.equalsIgnoreCase("Dados sensíveis de pessoas colectivas")) {

          // Dados sensíveis de pessoas colectivas => 50 years
          representationCalendar.add(Calendar.YEAR, 50);

        } else {
          logger.warn(
              "DO "
                  + sdo.getPid()
                  + " accessrestrict '"
                  + accessrestrict
                  + "' is not a recognized value.");
          representationCalendar = null;
        }

        if (representationCalendar != null
            && currentDate.compareTo(representationCalendar.getTime()) > 0) {
          result.addDescriptionObject(descriptionObject);
        }

      } else {
        // DO doesn't have accessrestrict value
      }
    }

    return result;
  }