public void checkPortConsistency(
      FeatureInstance srcFI, FeatureInstance dstFI, ConnectionInstance conni) {
    double srcDataSize = GetProperties.getSourceDataSizeInBytes(srcFI);
    double dstDataSize = GetProperties.getSourceDataSizeInBytes(dstFI);

    RecordValue srcRate = GetProperties.getOutPutRate(srcFI);
    RecordValue dstRate = GetProperties.getInPutRate(dstFI);
    EnumerationLiteral srcRU = null;
    EnumerationLiteral dstRU = null;
    double srcMaxRateValue = 0;
    double dstMaxRateValue = 0;
    double srcMinRateValue = 0;
    double dstMinRateValue = 0;
    if (srcRate != null && dstRate != null) {
      srcRU = GetProperties.getRateUnit(srcRate);
      dstRU = GetProperties.getRateUnit(dstRate);
      srcMaxRateValue = GetProperties.getMaxDataRate(srcRate);
      dstMaxRateValue = GetProperties.getMaxDataRate(dstRate);
      srcMinRateValue = GetProperties.getMinDataRate(srcRate);
      dstMinRateValue = GetProperties.getMinDataRate(dstRate);
    }
    // now try it as SEI::Data_Rate
    double srcRateValue = GetProperties.getMessageRatePerSecond(srcFI);
    double dstRateValue = GetProperties.getMessageRatePerSecond(dstFI);

    Classifier srcC = GetProperties.getSingleBaseType(srcFI);
    Classifier dstC = GetProperties.getSingleBaseType(dstFI);

    String srcS = GetProperties.getMeasurementUnit(srcFI);
    String dstS = GetProperties.getMeasurementUnit(dstFI);

    // error logging

    if (srcDataSize > 0 && dstDataSize > 0) {
      if (srcDataSize != dstDataSize) {
        error(
            conni,
            "Source data size "
                + srcDataSize
                + " Bytes and destination data size "
                + dstDataSize
                + " Bytes differ");
      }
    } else {
      if (srcDataSize == 0 && dstDataSize > 0) error(conni, "Source data size is missing or zero");
      if (dstDataSize == 0 && srcDataSize > 0)
        error(conni, "Destination data size is missing or zero");
    }

    if (srcRU != null && dstRU != null && srcRU != dstRU) {
      error(
          conni,
          "Source rate unit "
              + srcRU.getName()
              + " and destination rate unit "
              + dstRU.getName()
              + " differ");
    }

    if (srcMaxRateValue > 0 && dstMaxRateValue > 0) {
      if (srcMaxRateValue > dstMaxRateValue) {
        error(
            conni,
            "Maximum source data rate "
                + srcMaxRateValue
                + " is greater than maximum destination data rate "
                + dstMaxRateValue);
      }
      if (srcMinRateValue < dstMinRateValue) {
        error(
            conni,
            "Minimum source data rate "
                + srcMinRateValue
                + " is less than minimum destination data rate "
                + dstMinRateValue);
      }
    } else {
      if (srcRate != null || dstRate != null) {
        error(conni, "Missing input rate or output rate");
      }
    }

    if (srcRateValue > 0 && dstRateValue > 0) {
      if (srcRateValue != dstRateValue) {
        error(
            conni,
            "Source data rate "
                + srcRateValue
                + " and destination data rate "
                + dstRateValue
                + " differ");
      }
    } else {
      if (srcRateValue == 0 && dstRateValue > 0)
        error(conni, "Source data rate is missing or zero");
      if (dstRateValue == 0 && srcRateValue > 0)
        error(conni, "Destination data rate is missing or zero");
    }

    if (srcC != null && dstC != null) {
      if (srcC != dstC) {
        error(
            conni,
            "Source base type "
                + srcC.getName()
                + " and destination base type "
                + dstC.getName()
                + " differ");
      }
    } else {
      if (srcC == null && dstC != null) error(conni, "Source base type is missing");
      if (dstC == null && srcC != null) error(conni, "Destination base type is missing");
    }

    if (srcS.length() > 0 && dstS.length() > 0) {
      if (!srcS.equalsIgnoreCase(dstS)) {
        error(
            conni,
            "Source measurement unit "
                + srcS
                + " and destination measurement unit "
                + dstS
                + " differ");
      }
    } else {
      if (srcS.length() == 0 && dstS.length() > 0)
        error(conni, "Source measurement unit is missing");
      if (dstS.length() == 0 && srcS.length() > 0)
        error(conni, "Destination measurement unit is missing");
    }
  }