Program: 2581
Project: 2581
Buggy source:
public RoomNotificationPresenter(final RoomPresenter roomPresenter,final Room room){
  this.roomPresenter=roomPresenter;
  final Session session=Suco.get(Session.class);
  me=session.getCurrentUser().getNode();
  room.onOccupantAdded(new Listener<Occupant>(){
    @Override public void onEvent(    final Occupant occupant){
      final String body=i18n().occupantHasJoined(occupant.getNick());
      show(body);
    }
  }
);
  room.onOccupantRemoved(new Listener<Occupant>(){
    @Override public void onEvent(    final Occupant occupant){
      if (!me.equals(occupant.getUserUri().getNode())) {
        final String body=i18n().occupantHasLeft(occupant.getNick());
        show(body);
      }
    }
  }
);
  room.onSubjectChanged(new Listener2<Occupant,String>(){
    @Override public void onEvent(    final Occupant who,    final String newSubject){
      String message;
      if (who != null) {
        message=i18n().roomSubjectChanged(who.getNick(),newSubject);
      }
 else {
        message=i18n().roomSubjectChangedAnonymous(newSubject);
      }
      show(message);
    }
  }
);
  room.onInvitationSent(new Listener2<XmppURI,String>(){
    @Override public void onEvent(    final XmppURI uri,    final String reason){
      final Roster roster=Suco.get(Roster.class);
      final RosterItem item=roster.getItemByJID(uri);
      final String name=item != null ? item.getName() : uri.getNode();
      final String body=isEmpty(reason) ? i18n().invitationSent(name) : i18n().invitationSentWithReason(name,reason);
      show(body);
    }
    private boolean isEmpty(    final String reason){
      return reason == null || reason.trim().equals("String_Node_Str");
    }
  }
);
}

Fixed version (ground truth):
public RoomNotificationPresenter(final RoomPresenter roomPresenter,final Room room){
  this.roomPresenter=roomPresenter;
  final Session session=Suco.get(Session.class);
  me=session.getCurrentUser().getNode();
  room.onOccupantAdded(new Listener<Occupant>(){
    @Override public void onEvent(    final Occupant occupant){
      final String body=i18n().occupantHasJoined(occupant.getNick());
      show(body);
    }
  }
);
  room.onOccupantRemoved(new Listener<Occupant>(){
    @Override public void onEvent(    final Occupant occupant){
      if (!me.equals(occupant.getUserUri().getNode())) {
        final String body=i18n().occupantHasLeft(occupant.getNick());
        show(body);
      }
    }
  }
);
  room.onSubjectChanged(new Listener2<Occupant,String>(){
    @Override public void onEvent(    final Occupant who,    final String newSubject){
      String message;
      if (who != null) {
        message=i18n().roomSubjectChanged(who.getNick(),newSubject);
      }
 else {
        message=i18n().roomSubjectChangedAnonymous(newSubject);
      }
      show(message);
    }
  }
);
  room.onInvitationSent(new Listener2<XmppURI,String>(){
    @Override public void onEvent(    final XmppURI uri,    final String reason){
      final Roster roster=Suco.get(Roster.class);
      final RosterItem item=roster.getItemByJID(uri);
      final String name=((item != null) && (item.getName() != null)) ? item.getName() : uri.getNode();
      final String body=isEmpty(reason) ? i18n().invitationSent(name) : i18n().invitationSentWithReason(name,reason);
      show(body);
    }
    private boolean isEmpty(    final String reason){
      return reason == null || reason.trim().equals("String_Node_Str");
    }
  }
);
}