@Override
protected void executeUpdate(Record updatedUserRecord, Record oldUserRecord, final DSRequest request,
final DSResponse response) {
Subject updatedSubject = copyValues(updatedUserRecord);
final int subjectId = updatedSubject.getId();
final AddOrUpdateResults results = new AddOrUpdateResults();
results.subjectId = subjectId;
final String updatedPassword = updatedUserRecord.getAttributeAsString(Field.PASSWORD);
boolean passwordWasUpdated = !MASKED_PASSWORD_VALUE.equals(updatedPassword);
if (!passwordWasUpdated) {
results.passwordProcessed = true;
}
Record[] oldRoleRecords = oldUserRecord.getAttributeAsRecordArray(Field.ROLES);
Set<Role> oldRoles = RolesDataSource.getInstance().buildDataObjects(oldRoleRecords);
Record[] updatedRoleRecords = updatedUserRecord.getAttributeAsRecordArray(Field.ROLES);
Set<Role> updatedRoles = RolesDataSource.getInstance().buildDataObjects(updatedRoleRecords);
boolean rolesWereUpdated = (oldRoles != null && !oldRoles.equals(updatedRoles)) ||
(oldRoles == null && updatedRoles != null);
if (!rolesWereUpdated) {
results.rolesProcessed = true;
}
subjectService.updateSubject(updatedSubject, new AsyncCallback<Subject>() {
public void onFailure(Throwable caught) {
results.subjectProcessed = true;
results.subjectError = caught;
populateAndProcessResponseIfComplete(results, request, response);
}
public void onSuccess(final Subject updatedSubject) {
results.subjectProcessed = true;
results.updatedSubject = updatedSubject;
populateAndProcessResponseIfComplete(results, request, response);
}
});
if (passwordWasUpdated) {
subjectService.changePassword(updatedSubject.getName(), updatedPassword, new AsyncCallback<Void>() {
public void onFailure(Throwable caught) {
results.passwordProcessed = true;
results.passwordError = caught;
populateAndProcessResponseIfComplete(results, request, response);
}
public void onSuccess(Void nothing) {
results.passwordProcessed = true;
results.updatedPassword = updatedPassword;
populateAndProcessResponseIfComplete(results, request, response);
}
});
}
if (rolesWereUpdated) {
if (updatedRoles == null) {
updatedRoles = Collections.emptySet();
}
int[] updatedRoleIds = new int[updatedRoles.size()];
int index = 0;
for (Role updatedRole : updatedRoles) {
updatedRoleIds[index++] = updatedRole.getId();
}
final Set<Role> finalUpdatedRoles = updatedRoles;
GWTServiceLookup.getRoleService().setAssignedRolesForSubject(subjectId, updatedRoleIds,
new AsyncCallback<Void>() {
public void onFailure(Throwable caught) {
results.rolesProcessed = true;
results.rolesError = caught;
populateAndProcessResponseIfComplete(results, request, response);
}
public void onSuccess(Void result) {
results.rolesProcessed = true;
results.updatedRoles = finalUpdatedRoles;
populateAndProcessResponseIfComplete(results, request, response);
}
});
}
}
private void populateAndProcessResponseIfComplete(AddOrUpdateResults results, DSRequest request, DSResponse response) {
if (results.isComplete()) {
Record updatedRecord = null;
if (results.updatedSubject != null) {
updatedRecord = copyValues(results.updatedSubject);
} else {
if (results.updatedPassword != null || results.updatedRoles != null) {
RecordList recordList = response.getDataAsRecordList();
updatedRecord = recordList.find(Field.ID, results.subjectId);
}
if (results.subjectError != null) {
CoreGUI.getErrorHandler().handleError("Failed to update subject for user with id ["
+ results.subjectId + "]." , results.subjectError);
}
}
if (results.updatedPassword != null) {
updatedRecord.setAttribute(Field.PASSWORD, results.updatedPassword);
} else if (results.passwordError != null) {
CoreGUI.getErrorHandler().handleError("Failed to update password for user with id [" + results.subjectId
+ "]." , results.passwordError);
}
if (results.updatedRoles != null) {
updatedRecord.setAttribute(Field.ROLES, results.updatedRoles);
} else if (results.rolesError != null) {
CoreGUI.getErrorHandler().handleError("Failed to update assigned roles for user with id ["
+ results.subjectId + "].", results.rolesError);
}
if (updatedRecord != null) {
String username = updatedRecord.getAttribute(Field.NAME);
UsersView.setMessage(new Message("User updated.", "User [" + username + "] updated.",
Message.Severity.Info));
response.setData(new Record[] {updatedRecord});
processResponse(request.getRequestId(), response);
}
CoreGUI.goToView(UsersView.VIEW_PATH);
}
}
class AddOrUpdateResults {
int subjectId;
boolean subjectProcessed;
boolean passwordProcessed;
boolean rolesProcessed;
Subject updatedSubject;
String updatedPassword;
Set<Role> updatedRoles;
Throwable subjectError;
Throwable passwordError;
Throwable rolesError;
boolean isComplete() {
return (subjectProcessed && passwordProcessed && rolesProcessed);
}
}