package net.techreadiness.batch.user;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import net.techreadiness.batch.BaseItemWriter;
import net.techreadiness.service.ServiceContext;
import net.techreadiness.service.UserOrgService;
import net.techreadiness.service.UserRoleService;
import net.techreadiness.service.UserService;
import net.techreadiness.service.common.ValidationError;
import net.techreadiness.service.exception.FaultInfo;
import net.techreadiness.service.exception.ValidationServiceException;
import net.techreadiness.service.object.User;
import org.apache.commons.lang3.StringUtils;
import org.springframework.batch.item.ItemWriter;
import org.springframework.context.MessageSource;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
public class UserWriter extends BaseItemWriter implements ItemWriter<UserData> {
@Inject
private UserService userService;
@Inject
private UserOrgService userOrgService;
@Inject
private UserRoleService userRoleService;
@Inject
private MessageSource messageSource;
@Override
public void write(List<? extends UserData> items) throws Exception {
for (final UserData userData : items) {
List<ValidationError> errors = Lists.newLinkedList();
ServiceContext serviceContext = getServiceContext();
User user = null;
try {
if ("c".equalsIgnoreCase(userData.getAction())) {
userData.getUser().setEmail(userData.getUser().getUsername());
user = userService.create(serviceContext, userData.getUser());
} else if ("u".equalsIgnoreCase(userData.getAction())) {
User existingUser = userService.getByUsername(serviceContext, userData.getUser().getUsername());
userData.getUser().setEmail(existingUser.getEmail());
user = userService.update(serviceContext, userData.getUser());
} else if ("d".equalsIgnoreCase(userData.getAction())) {
User existingUser = userService.getByUsername(serviceContext, userData.getUser().getUsername());
userData.getUser().setEmail(existingUser.getEmail());
Date userDeleteDate = userData.getUser().getDeleteDate();
if (userDeleteDate == null) {
Date deleteDate = new Date();
userData.getUser().setDeleteDate(deleteDate);
}
user = userService.update(serviceContext, userData.getUser());
} else {
ValidationError invalidOperation = new ValidationError("action", "Action", messageSource.getMessage(
"validation.user.batch.actionIsRequired", null, Locale.getDefault()));
errors.add(invalidOperation);
}
if (StringUtils.isBlank(userData.getStateCode())) {
ValidationError stateCode = new ValidationError("stateCode", "State Code", messageSource.getMessage(
"validation.user.readinessStateCodeRequired", null, Locale.getDefault()));
errors.add(stateCode);
}
} catch (ValidationServiceException e) {
handleValidationException(errors, e);
}
List<String> orgCodes = Lists.transform(userData.getOrgCodes(), new Function<String, String>() {
@Override
public String apply(String input) {
return userData.getStateCode() + "-" + input;
}
});
if (user != null) {
try {
userOrgService.mergeUserOrgs(serviceContext, user.getUserId(), orgCodes);
} catch (ValidationServiceException e) {
handleValidationException(errors, e);
}
try {
userRoleService.mergeUserRoles(serviceContext, user.getUserId(), userData.getRoleCodes());
} catch (ValidationServiceException e) {
handleValidationException(errors, e);
}
}
if (errors.isEmpty()) {
if ("c".equalsIgnoreCase(userData.getAction())) {
// Wait to send an email in case the transaction rolls back
userService.newAccountPassword(serviceContext, user);
}
} else {
ValidationServiceException e = new ValidationServiceException(new FaultInfo());
e.getFaultInfo().getAttributeErrors().addAll(errors);
throw e;
}
}
}
}