package net.techreadiness.customer.action.task.org.contact;
import static net.techreadiness.security.CorePermissionCodes.CORE_CUSTOMER_ORG_CONTACT_UPDATE;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.inject.Inject;
import net.techreadiness.annotation.CoreSecured;
import net.techreadiness.service.ContactService;
import net.techreadiness.service.common.ValidationError;
import net.techreadiness.service.exception.ValidationServiceException;
import net.techreadiness.ui.action.task.org.OrgTaskFlowAction;
import net.techreadiness.util.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.Preparable;
import com.opensymphony.xwork2.util.Element;
@Results({
@Result(name = "success", type = "redirectAction", params = { "orgSelection", "%{orgSelection}", "namespace",
"/task/org/contact", "actionName", "edit" }),
@Result(name = "invalid", type = "lastAction", params = { "actionName", "edit" }) })
public class SaveAction extends OrgTaskFlowAction implements Preparable {
private static final long serialVersionUID = 1L;
@Element(String.class)
private Map<String, Map<String, String>> contacts;
@Inject
ContactService contactService;
private Long orgSelection;
@Override
public void prepare() throws Exception {
contacts = MapUtils.makeComputingMap();
}
@Override
@CoreSecured({ CORE_CUSTOMER_ORG_CONTACT_UPDATE })
public String execute() {
for (Entry<String, Map<String, String>> entry : contacts.entrySet()) {
Map<String, String> contact = entry.getValue();
Long contactTypeId = Long.valueOf(entry.getKey());
Long orgId = Long.valueOf(contact.get("orgId"));
Long contactId = null;
try {
if (StringUtils.isNotBlank(contact.get("contactId"))) {
contactId = Long.valueOf(contact.get("contactId"));
contactService.update(getServiceContext(), contactId, contact, contactTypeId);
} else {
contactService.create(getServiceContext(), contact, contactTypeId, orgId);
}
} catch (ValidationServiceException e) {
List<ValidationError> errors = e.getFaultInfo().getAttributeErrors();
for (ValidationError validationError : errors) {
addFieldError("contacts['" + contactTypeId + "']." + validationError.getFieldName(),
validationError.getOnlineMessage());
}
}
}
if (hasErrors()) {
return "invalid";
}
return SUCCESS;
}
public Map<String, Map<String, String>> getContacts() {
return contacts;
}
public void setContacts(Map<String, Map<String, String>> contacts) {
this.contacts = contacts;
}
public void setOrgSelection(Long orgSelection) {
this.orgSelection = orgSelection;
}
public Long getOrgSelection() {
return orgSelection;
}
}