@Override
  public void calculateMetricValue(Entity entity) {

    SortedSet<Version> versions = entity.getVersions();

    Version previousVersion = null;
    Double firstVersionMetricValue = null;

    if (!versions.isEmpty()) {
      previousVersion = versions.first();
      firstVersionMetricValue = entity.getMetricValue(versions.first(), conventionalMetric);
    }

    onNewEntity(entity);

    for (Version version : versions) {
      Double previousMetricValue = entity.getMetricValue(previousVersion, conventionalMetric);
      Double currentMetricValue = entity.getMetricValue(version, conventionalMetric);

      Double value =
          calculateMetricValueForOneVersion(
              firstVersionMetricValue, previousMetricValue, currentMetricValue);

      entity.addMetricValue(version, this, value);

      previousVersion = version;
    }
  }