Program: 156106
Project: 156106
Buggy source:
@Override protected Object decode(Channel channel,SocketAddress remoteAddress,Object msg) throws Exception {
  String sentence=(String)msg;
  Matcher parser=PATTERN.matcher(sentence);
  if (!parser.matches()) {
    return null;
  }
  Position position=new Position();
  position.setProtocol(getProtocolName());
  Integer index=1;
  if (!identify(parser.group(index++),channel)) {
    return null;
  }
  position.setDeviceId(getDeviceId());
  Calendar time=Calendar.getInstance(TimeZone.getTimeZone("String_Node_Str"));
  time.clear();
  time.set(Calendar.DAY_OF_MONTH,Integer.parseInt(parser.group(index++)));
  time.set(Calendar.MONTH,Integer.parseInt(parser.group(index++)) - 1);
  time.set(Calendar.YEAR,2000 + Integer.parseInt(parser.group(index++)));
  time.set(Calendar.HOUR_OF_DAY,Integer.parseInt(parser.group(index++)));
  time.set(Calendar.MINUTE,Integer.parseInt(parser.group(index++)));
  time.set(Calendar.SECOND,Integer.parseInt(parser.group(index++)));
  position.setTime(time.getTime());
  Double latitude=Double.parseDouble(parser.group(index++));
  latitude+=Double.parseDouble(parser.group(index++) + parser.group(index++)) / 600000;
  if (parser.group(index++).compareTo("String_Node_Str") == 0)   latitude=-latitude;
  position.setLatitude(latitude);
  Double longitude=Double.parseDouble(parser.group(index++));
  longitude+=Double.parseDouble(parser.group(index++) + parser.group(index++)) / 600000;
  if (parser.group(index++).compareTo("String_Node_Str") == 0)   longitude=-longitude;
  position.setLongitude(longitude);
  position.setSpeed(Double.parseDouble(parser.group(index++)));
  position.setCourse(Double.parseDouble(parser.group(index++)));
  if (parser.group(index) != null) {
    position.set(Event.KEY_ODOMETER,Integer.parseInt(parser.group(index++)));
    position.set(Event.KEY_IGNITION,Integer.parseInt(parser.group(index++)));
    position.set(Event.KEY_INPUT,Integer.parseInt(parser.group(index++)) + Integer.parseInt(parser.group(index++)) << 1);
    position.set(Event.KEY_FUEL,Integer.parseInt(parser.group(index++)));
  }
 else {
    index+=5;
  }
  if (parser.group(index) != null) {
    position.set(Event.KEY_CHARGE,Integer.parseInt(parser.group(index++)) == 1);
    position.set(Event.KEY_IGNITION,Integer.parseInt(parser.group(index++)));
    position.set(Event.KEY_INPUT,Integer.parseInt(parser.group(index++)));
    position.set(Event.KEY_RFID,parser.group(index++));
    position.set(Event.KEY_ODOMETER,Integer.parseInt(parser.group(index++)));
    position.set(Event.PREFIX_TEMP + 1,Integer.parseInt(parser.group(index++)));
    position.set(Event.KEY_FUEL,Integer.parseInt(parser.group(index++)));
    position.set("String_Node_Str",Integer.parseInt(parser.group(index++)) == 1);
    position.set(Event.KEY_OUTPUT,Integer.parseInt(parser.group(index++)) + Integer.parseInt(parser.group(index++)) << 1);
  }
 else {
    index+=10;
  }
  position.setValid(parser.group(index++).compareTo("String_Node_Str") == 0);
  return position;
}

Fixed version (ground truth):
@Override protected Object decode(Channel channel,SocketAddress remoteAddress,Object msg) throws Exception {
  Parser parser=new Parser(PATTERN,(String)msg);
  if (!parser.matches()) {
    return null;
  }
  Position position=new Position();
  position.setProtocol(getProtocolName());
  if (!identify(parser.next(),channel)) {
    return null;
  }
  position.setDeviceId(getDeviceId());
  DateBuilder dateBuilder=new DateBuilder().setDateReverse(parser.nextInt(),parser.nextInt(),parser.nextInt()).setTime(parser.nextInt(),parser.nextInt(),parser.nextInt());
  position.setTime(dateBuilder.getDate());
  position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_MIN_MIN_HEM));
  position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_MIN_MIN_HEM));
  position.setSpeed(parser.nextDouble());
  position.setCourse(parser.nextDouble());
  if (parser.hasNext(5)) {
    position.set(Event.KEY_ODOMETER,parser.nextInt());
    position.set(Event.KEY_IGNITION,parser.nextInt());
    position.set(Event.KEY_INPUT,parser.nextInt() + parser.nextInt() << 1);
    position.set(Event.KEY_FUEL,parser.nextInt());
  }
  if (parser.hasNext(10)) {
    position.set(Event.KEY_CHARGE,parser.nextInt() == 1);
    position.set(Event.KEY_IGNITION,parser.nextInt());
    position.set(Event.KEY_INPUT,parser.nextInt());
    position.set(Event.KEY_RFID,parser.next());
    position.set(Event.KEY_ODOMETER,parser.nextInt());
    position.set(Event.PREFIX_TEMP + 1,parser.nextInt());
    position.set(Event.KEY_FUEL,parser.nextInt());
    position.set("String_Node_Str",parser.nextInt() == 1);
    position.set(Event.KEY_OUTPUT,parser.nextInt() + parser.nextInt() << 1);
  }
  position.setValid(parser.next().equals("String_Node_Str"));
  return position;
}