Program: 128456
Project: 128456
Buggy source:
protected void onValueChanged(final String newValue,boolean showAlertIfError,final Object currentModifiedBean,CELL_EDITOR_STATE state){
  final Text text=(Text)cellEditor.getControl();
  final ModifiedObjectInfo modifiedObjectInfo=tableViewerCreator.getModifiedObjectInfo();
  Object originalValue=modifiedObjectInfo.getOriginalPropertyBeanValue();
  lastValidValue=lastValidValue != null && state == CELL_EDITOR_STATE.EDITING ? lastValidValue : originalValue;
  int beanPosition=tableViewerCreator.getInputList().indexOf(currentModifiedBean);
  final String errorMessage=validateValue(newValue,beanPosition);
  if (errorMessage == null) {
    newValidValueTyped(beanPosition,lastValidValue,newValue,state);
    text.setBackground(text.getDisplay().getSystemColor(SWT.COLOR_WHITE));
    lastValidValue=newValue;
  }
 else {
    text.setBackground(text.getDisplay().getSystemColor(SWT.COLOR_RED));
    if (showAlertIfError) {
      final Point selection=text.getSelection();
      text.setText(lastValidValue.toString());
      new AsynchronousThreading(20,false,text.getDisplay(),new Runnable(){
        public void run(){
          if (errorMessage.equals("String_Node_Str")) {
            MessageDialog.openError(text.getShell(),Messages.getString("String_Node_Str"),Messages.getString("String_Node_Str"));
            final int columnPosition=tableViewerCreator.getColumns().indexOf(column);
            tableViewerCreator.getTableViewer().editElement(currentModifiedBean,columnPosition);
            text.setText(newValue);
            text.setSelection(selection.x,selection.y);
          }
 else {
            MessageDialog.openError(text.getShell(),Messages.getString("String_Node_Str"),errorMessage);
            final int columnPosition=tableViewerCreator.getColumns().indexOf(column);
            tableViewerCreator.getTableViewer().editElement(currentModifiedBean,columnPosition);
            text.setText(newValue);
            text.setSelection(selection.x,selection.y);
          }
        }
      }
).start();
    }
  }
}

Fixed version (ground truth):
protected void onValueChanged(final String newValue,boolean showAlertIfError,final Object currentModifiedBean,CELL_EDITOR_STATE state){
  final Text text=(Text)cellEditor.getControl();
  final ModifiedObjectInfo modifiedObjectInfo=tableViewerCreator.getModifiedObjectInfo();
  Object originalValue=modifiedObjectInfo.getOriginalPropertyBeanValue();
  lastValidValue=lastValidValue != null && state == CELL_EDITOR_STATE.EDITING ? lastValidValue : originalValue;
  int beanPosition=tableViewerCreator.getInputList().indexOf(currentModifiedBean);
  final String errorMessage=validateValue(newValue,beanPosition);
  if (errorMessage == null) {
    newValidValueTyped(beanPosition,lastValidValue,newValue,state);
    text.setBackground(text.getDisplay().getSystemColor(SWT.COLOR_WHITE));
    lastValidValue=newValue;
  }
 else {
    text.setBackground(text.getDisplay().getSystemColor(SWT.COLOR_RED));
    if (showAlertIfError) {
      final Point selection=text.getSelection();
      text.setText(lastValidValue.toString());
      new AsynchronousThreading(20,false,text.getDisplay(),new Runnable(){
        public void run(){
          if (errorMessage.equals("String_Node_Str")) {
            MessageDialog.openError(text.getShell(),Messages.getString("String_Node_Str"),Messages.getString("String_Node_Str"));
            final int columnPosition=tableViewerCreator.getColumns().indexOf(column);
            tableViewerCreator.getTableViewer().editElement(currentModifiedBean,columnPosition);
            if (!("String_Node_Str").equals(newValue)) {
              text.setText(newValue);
            }
            text.setSelection(selection.x,selection.y);
          }
 else {
            MessageDialog.openError(text.getShell(),Messages.getString("String_Node_Str"),errorMessage);
            final int columnPosition=tableViewerCreator.getColumns().indexOf(column);
            tableViewerCreator.getTableViewer().editElement(currentModifiedBean,columnPosition);
            text.setText(newValue);
            text.setSelection(selection.x,selection.y);
          }
        }
      }
).start();
    }
  }
}