Program: 91189
Project: 91189
Buggy source:
/** 
 * Get the exchange rate for the specified currency. <p/> Returns null if the current rate is too old In that the case the caller could choose to call refreshRates() and listen for callbacks. If a rate is returned the contained price may be null if the currently chosen exchange source is not available.
 */
@Override public synchronized ExchangeRate getExchangeRate(String currency){
  boolean rmcFlag=false;
  if (currency.equals("String_Node_Str")) {
    currency="String_Node_Str";
    rmcFlag=true;
  }
  boolean ethFlag=false;
  if (currency.equals("String_Node_Str")) {
    if (ethRate == 0)     return null;
    currency="String_Node_Str";
    ethFlag=true;
  }
  if (_latestRates == null || _latestRates.isEmpty() || !_latestRates.containsKey(currency)) {
    return null;
  }
  if (_latestRatesTime + MAX_RATE_AGE_MS < System.currentTimeMillis()) {
    return ExchangeRate.missingRate(_currentExchangeSourceName,System.currentTimeMillis(),currency);
  }
  for (  ExchangeRate r : _latestRates.get(currency).exchangeRates) {
    if (r.name.equals(_currentExchangeSourceName)) {
      if (r.price.equals(0d)) {
        return ExchangeRate.missingRate(_currentExchangeSourceName,System.currentTimeMillis(),currency);
      }
      if (rmcFlag) {
        r=new ExchangeRate(r.name,r.time,r.price * rmcRate,"String_Node_Str");
      }
      if (ethFlag) {
        r=new ExchangeRate(r.name,r.time,r.price / ethRate,"String_Node_Str");
      }
      return r;
    }
  }
  if (_currentExchangeSourceName != null) {
    return ExchangeRate.missingRate(_currentExchangeSourceName,System.currentTimeMillis(),currency);
  }
  return null;
}

Fixed version (ground truth):
/** 
 * Get the exchange rate for the specified currency. <p/> Returns null if the current rate is too old In that the case the caller could choose to call refreshRates() and listen for callbacks. If a rate is returned the contained price may be null if the currently chosen exchange source is not available.
 */
@Override public synchronized ExchangeRate getExchangeRate(String currency){
  boolean rmcFlag=false;
  if (currency.equals("String_Node_Str")) {
    currency="String_Node_Str";
    rmcFlag=true;
  }
  boolean ethFlag=false;
  if (currency.equals("String_Node_Str")) {
    if (ethRate == 0)     return null;
    currency="String_Node_Str";
    ethFlag=true;
  }
  if (_latestRates == null || _latestRates.isEmpty() || !_latestRates.containsKey(currency)) {
    if (currency.equals("String_Node_Str")) {
      return getRMCExchangeRate(rmcFlag,ethFlag,new ExchangeRate("String_Node_Str",0,usdRate,"String_Node_Str"));
    }
    return null;
  }
  if (_latestRatesTime + MAX_RATE_AGE_MS < System.currentTimeMillis()) {
    return ExchangeRate.missingRate(_currentExchangeSourceName,System.currentTimeMillis(),currency);
  }
  for (  ExchangeRate r : _latestRates.get(currency).exchangeRates) {
    if (r.name.equals(_currentExchangeSourceName)) {
      if (r.price.equals(0d)) {
        return ExchangeRate.missingRate(_currentExchangeSourceName,System.currentTimeMillis(),currency);
      }
      r=getRMCExchangeRate(rmcFlag,ethFlag,r);
      return r;
    }
  }
  if (_currentExchangeSourceName != null) {
    return ExchangeRate.missingRate(_currentExchangeSourceName,System.currentTimeMillis(),currency);
  }
  return null;
}