Program: 62531
Project: 62531
Buggy source:
@Override public void onDataReceived(String line){
  line=StringUtils.chomp(line);
  line=line.replace("String_Node_Str","String_Node_Str");
  line=line.trim();
  Pattern RESPONSE_PATTERN=Pattern.compile("String_Node_Str");
  try {
    logger.trace("String_Node_Str",line);
    Matcher matcher=RESPONSE_PATTERN.matcher(line);
    if (matcher.matches()) {
      for (int i=1; i <= matcher.groupCount(); i++) {
switch (DataField.get(i)) {
case LEVEL:
{
            DecimalType decimalType=new DecimalType(matcher.group(i));
            updateState(new ChannelUID(getThing().getUID(),DataField.get(i).channelID()),decimalType);
            break;
          }
case MODE:
{
          StringType stringType=null;
          if (matcher.group(i).equals("String_Node_Str")) {
            stringType=MANUAL;
          }
 else           if (matcher.group(i).equals("String_Node_Str")) {
            stringType=AUTOMATIC;
          }
          updateState(new ChannelUID(getThing().getUID(),DataField.get(i).channelID()),stringType);
          break;
        }
case SOURCE:
{
        StringType stringType=null;
        if (matcher.group(i).equals("String_Node_Str")) {
          stringType=RAIN;
        }
 else         if (matcher.group(i).equals("String_Node_Str")) {
          stringType=CITY;
        }
        updateState(new ChannelUID(getThing().getUID(),DataField.get(i).channelID()),stringType);
        break;
      }
default :
    if (matcher.group(i).equals("String_Node_Str")) {
      updateState(new ChannelUID(getThing().getUID(),DataField.get(i).channelID()),OnOffType.OFF);
    }
 else     if (matcher.group(i).equals("String_Node_Str")) {
      updateState(new ChannelUID(getThing().getUID(),DataField.get(i).channelID()),OnOffType.ON);
    }
  break;
}
}
}
}
 catch (Exception e) {
logger.error("String_Node_Str",e.getMessage(),e);
}
}

Fixed version (ground truth):
@Override public void onDataReceived(String line){
  line=StringUtils.chomp(line);
  line=line.replace("String_Node_Str","String_Node_Str");
  line=line.trim();
  Pattern RESPONSE_PATTERN=Pattern.compile("String_Node_Str");
  try {
    logger.trace("String_Node_Str",line);
    Matcher matcher=RESPONSE_PATTERN.matcher(line);
    if (matcher.matches()) {
      for (int i=1; i <= matcher.groupCount(); i++) {
switch (DataField.get(i)) {
case LEVEL:
{
            DecimalType decimalType=new DecimalType(matcher.group(i));
            updateState(new ChannelUID(getThing().getUID(),DataField.get(i).channelID()),decimalType);
            break;
          }
case MODE:
{
          StringType stringType=null;
          if (matcher.group(i).equals("String_Node_Str")) {
            stringType=MANUAL;
          }
 else           if (matcher.group(i).equals("String_Node_Str")) {
            stringType=AUTOMATIC;
          }
          if (stringType != null) {
            updateState(new ChannelUID(getThing().getUID(),DataField.get(i).channelID()),stringType);
          }
          break;
        }
case SOURCE:
{
        StringType stringType=null;
        if (matcher.group(i).equals("String_Node_Str")) {
          stringType=RAIN;
        }
 else         if (matcher.group(i).equals("String_Node_Str")) {
          stringType=CITY;
        }
        if (stringType != null) {
          updateState(new ChannelUID(getThing().getUID(),DataField.get(i).channelID()),stringType);
        }
        break;
      }
default :
    if (matcher.group(i).equals("String_Node_Str")) {
      updateState(new ChannelUID(getThing().getUID(),DataField.get(i).channelID()),OnOffType.OFF);
    }
 else     if (matcher.group(i).equals("String_Node_Str")) {
      updateState(new ChannelUID(getThing().getUID(),DataField.get(i).channelID()),OnOffType.ON);
    }
  break;
}
}
}
}
 catch (Exception e) {
logger.error("String_Node_Str",e.getMessage(),e);
}
}