private void saveMeasures(DecoratorContext context, List<Issue> issues) {
    // group issues by requirement
    ListMultimap<TechnicalDebtRequirement, Issue> issuesByRequirement = issuesByRequirement(issues);

    double total = 0.0;
    Map<TechnicalDebtCharacteristic, Double> characteristicCosts = newHashMap();
    Map<TechnicalDebtRequirement, Double> requirementCosts = newHashMap();

    for (TechnicalDebtRequirement requirement : technicalDebtModel.getAllRequirements()) {
      List<Issue> requirementIssues = issuesByRequirement.get(requirement);
      double value =
          computeTechnicalDebt(CoreMetrics.TECHNICAL_DEBT, context, requirement, requirementIssues);

      requirementCosts.put(requirement, value);
      total += value;
      propagateTechnicalDebtInParents(requirement.getParent(), value, characteristicCosts);
    }

    context.saveMeasure(new Measure(CoreMetrics.TECHNICAL_DEBT, total, DECIMALS_PRECISION));
    saveOnCharacteristic(context, characteristicCosts);
    saveOnRequirement(context, requirementCosts);
  }
  private double computeTechnicalDebt(
      Metric metric,
      DecoratorContext context,
      TechnicalDebtRequirement requirement,
      Collection<Issue> issues) {
    double value = 0.0;
    if (issues != null) {
      for (Issue issue : issues) {
        value += converter.toDays(((DefaultIssue) issue).technicalDebt());
      }
    }

    for (Measure measure :
        context.getChildrenMeasures(
            MeasuresFilters.characteristic(metric, requirement.toCharacteristic()))) {
      if (measure.getCharacteristic() != null
          && measure.getCharacteristic().equals(requirement.toCharacteristic())
          && measure.getValue() != null) {
        value += measure.getValue();
      }
    }
    return value;
  }