Program: 52113
Project: 52113
Buggy source:
public void registerOnline(Context context,DSpaceObject dso,String identifier) throws IdentifierException, IllegalArgumentException, SQLException {
  String doi=DOI.formatIdentifier(identifier);
  TableRow doiRow=loadOrCreateDOI(context,dso,doi);
  if (DELETED == doiRow.getIntColumn("String_Node_Str") || TO_BE_DELETED == doiRow.getIntColumn("String_Node_Str")) {
    throw new DOIIdentifierException("String_Node_Str" + "String_Node_Str",DOIIdentifierException.DOI_IS_DELETED);
  }
  if (connector.isDOIRegistered(context,doi)) {
    if (!connector.isDOIRegistered(context,dso,doi)) {
      log.warn("String_Node_Str",doi);
      throw new DOIIdentifierException(DOIIdentifierException.DOI_ALREADY_EXISTS);
    }
  }
 else {
    if (!connector.isDOIReserved(context,dso,doi)) {
      if (connector.isDOIReserved(context,doi)) {
        log.warn("String_Node_Str" + "String_Node_Str",doi);
        throw new DOIIdentifierException("String_Node_Str" + "String_Node_Str",DOIIdentifierException.DOI_ALREADY_EXISTS);
      }
      connector.reserveDOI(context,dso,doi);
    }
    try {
      connector.registerDOI(context,dso,doi);
    }
 catch (    DOIIdentifierException die) {
      if (die.getCode() == DOIIdentifierException.REGISTER_FIRST) {
        this.reserveOnline(context,dso,identifier);
        connector.registerDOI(context,dso,doi);
      }
 else {
        throw die;
      }
    }
  }
  try {
    saveDOIToObject(context,dso,doi);
  }
 catch (  AuthorizeException ae) {
    throw new IdentifierException("String_Node_Str",ae);
  }
catch (  SQLException sqle) {
    throw new RuntimeException(sqle);
  }
  doiRow.setColumn("String_Node_Str",IS_REGISTERED);
  DatabaseManager.update(context,doiRow);
}

Fixed version (ground truth):
public void registerOnline(Context context,DSpaceObject dso,String identifier) throws IdentifierException, IllegalArgumentException, SQLException {
  String doi=DOI.formatIdentifier(identifier);
  TableRow doiRow=loadOrCreateDOI(context,dso,doi);
  if (DELETED == doiRow.getIntColumn("String_Node_Str") || TO_BE_DELETED == doiRow.getIntColumn("String_Node_Str")) {
    throw new DOIIdentifierException("String_Node_Str" + "String_Node_Str",DOIIdentifierException.DOI_IS_DELETED);
  }
  if (connector.isDOIRegistered(context,doi)) {
    if (!connector.isDOIRegistered(context,dso,doi)) {
      log.warn("String_Node_Str",doi);
      throw new DOIIdentifierException(DOIIdentifierException.DOI_ALREADY_EXISTS);
    }
  }
 else {
    if (!connector.isDOIReserved(context,dso,doi)) {
      if (connector.isDOIReserved(context,doi)) {
        log.warn("String_Node_Str" + "String_Node_Str",doi);
        throw new DOIIdentifierException("String_Node_Str" + "String_Node_Str",DOIIdentifierException.DOI_ALREADY_EXISTS);
      }
      connector.reserveDOI(context,dso,doi);
    }
    try {
      connector.registerDOI(context,dso,doi);
    }
 catch (    DOIIdentifierException die) {
      if (die.getCode() == DOIIdentifierException.RESERVE_FIRST) {
        this.reserveOnline(context,dso,identifier);
        connector.registerDOI(context,dso,doi);
      }
 else {
        throw die;
      }
    }
  }
  try {
    saveDOIToObject(context,dso,doi);
  }
 catch (  AuthorizeException ae) {
    throw new IdentifierException("String_Node_Str",ae);
  }
catch (  SQLException sqle) {
    throw new RuntimeException(sqle);
  }
  doiRow.setColumn("String_Node_Str",IS_REGISTERED);
  DatabaseManager.update(context,doiRow);
}