@SuppressWarnings("boxing")
public void action() throws DataAccessException, InterruptedException {
int delay = 10000;
String name = "UpdaterWithWait:" + Thread.currentThread().getId() + ":";
// Extract developer information
Developer d = this.dbDao.readDeveloperById(DEVELOPER_ID);
System.out.println("==============================");
System.out.printf("THREAD ID : %s\n", name);
System.out.printf("DEV LOCK VERS ID : %s\n", d.getOptimisticLockId());
System.out.printf("DEV ID : %s\n", d.getIdDeveloper());
System.out.printf("DEV NAME : %s\n", d.getNameDeveloper());
System.out.printf("DEV LEVEL : %s\n", d.getIdDeveloperLevel()
.getLabelLevel());
System.out.printf("LEV LOCK VERS ID : %s\n", d.getIdDeveloperLevel()
.getOptimisticLockId());
System.out.printf("--> Data readed, wait %s seconds !!!!\n",
(delay / 1000));
System.out.println("==============================");
// Wait 5 seconds
Thread.sleep(delay);
// Modify object info
d.setNameDeveloper(name);
d.getIdDeveloperLevel().setLabelLevel("MIDDLE_" + name);
// Update info
this.dbDao.updateDeveloper(d);
System.out.println("==============================");
System.out.printf("THREAD ID : %s\n", name);
System.out.printf("DEV LOCK VERS ID : %s\n", d.getOptimisticLockId());
System.out.printf("DEV ID : %s\n", d.getIdDeveloper());
System.out.printf("DEV NAME : %s\n", d.getNameDeveloper());
System.out.printf("DEV LEVEL : %s\n", d.getIdDeveloperLevel()
.getLabelLevel());
System.out.printf("LEV LOCK VERS ID : %s\n", d.getIdDeveloperLevel()
.getOptimisticLockId());
System.out.println("==============================");
}