package net.techreadiness.customer.action.task.user.orgassign;
import static net.techreadiness.security.CorePermissionCodes.CORE_CUSTOMER_USER_ORG_UPDATE;
import javax.inject.Inject;
import net.techreadiness.annotation.CoreSecured;
import net.techreadiness.service.UserOrgService;
import net.techreadiness.service.exception.ValidationServiceException;
import net.techreadiness.service.object.Org;
import net.techreadiness.service.object.User;
import net.techreadiness.service.object.UserOrg;
import net.techreadiness.ui.action.task.user.UserTaskFlowAction;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.opensymphony.xwork2.Preparable;
import com.opensymphony.xwork2.util.Element;
import com.opensymphony.xwork2.util.Key;
@Results({ @Result(name = "success", type = "redirect", location = "/task/user/orgassign/edit"),
@Result(name = "invalid", type = "lastAction", params = { "actionName", "edit" }) })
public class SaveAction extends UserTaskFlowAction implements Preparable {
private static final long serialVersionUID = 1L;
@Key(Long.class)
@Element(Long.class)
private Multimap<Long, Long> assignments;
@Inject
private UserOrgService userOrgService;
@Override
public void prepare() throws Exception {
assignments = HashMultimap.create();
}
@Override
@CoreSecured({ CORE_CUSTOMER_USER_ORG_UPDATE })
public String execute() {
for (User user : getTaskFlowData().getUsers()) {
for (Org org : getTaskFlowData().getOrgs()) {
try {
if (assignments.get(user.getUserId()).contains(org.getOrgId())) {
UserOrg userOrg = userOrgService.persist(getServiceContext(), user.getUserId(), org.getOrgId());
user.getUserOrgs().add(userOrg);
}
} catch (ValidationServiceException e) {
addFieldError("assignments[" + user.getUserId() + "]", e.getLocalizedMessage());
}
}
}
for (User user : getTaskFlowData().getUsers()) {
for (Org org : getTaskFlowData().getOrgs()) {
try {
if (!assignments.get(user.getUserId()).contains(org.getOrgId())) {
userOrgService.delete(getServiceContext(), user.getUserId(), org.getOrgId());
UserOrg userOrg = new UserOrg();
userOrg.setOrgId(org.getOrgId());
userOrg.setUserId(user.getUserId());
user.getUserOrgs().remove(userOrg);
}
} catch (ValidationServiceException e) {
addFieldError("assignments[" + user.getUserId() + "]", e.getLocalizedMessage());
}
}
}
if (hasErrors()) {
return "invalid";
}
return SUCCESS;
}
public Multimap<Long, Long> getAssignments() {
return assignments;
}
}