package net.techreadiness.plugin.action.task.device.edit; import java.util.Date; import java.util.HashMap; import java.util.Iterator; 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.plugin.action.device.BaseDeviceTaskAction; import net.techreadiness.security.CorePermissionCodes; import net.techreadiness.service.DataModificationStatus; import net.techreadiness.service.DeviceService; import net.techreadiness.service.OrganizationService; import net.techreadiness.service.ServiceContext; import net.techreadiness.service.common.ValidationError; import net.techreadiness.service.exception.ValidationServiceException; import net.techreadiness.service.object.Device; import net.techreadiness.service.object.Org; import org.apache.commons.lang3.StringUtils; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.Preparable; import com.opensymphony.xwork2.util.Element; import com.opensymphony.xwork2.util.Key; @Results({ @Result(name = Action.SUCCESS, type = "redirectAction", params = { "actionName", "edit" }), @Result(name = Action.ERROR, type = "lastAction", params = { "actionName", "edit" }) }) public class SaveAction extends BaseDeviceTaskAction implements Preparable { private static final long serialVersionUID = 1L; @Key(Long.class) @Element(Device.class) private Map<Long, Device> devices; private Boolean dataIsIncomplete = false; @Inject private DeviceService deviceService; @Inject private OrganizationService organizationService; @Inject DataModificationStatus dataModificationStatus; @Override @CoreSecured({ CorePermissionCodes.READY_CUSTOMER_DEVICE_UPDATE }) public String execute() { ServiceContext context = getServiceContext(); for (Entry<Long, Device> entry : devices.entrySet()) { try { Device device = deviceService.update(getServiceContext(), entry.getValue(), entry.getValue().getOrg() .getOrgId()); updateTaskFlowData(device); Org org = organizationService.getById(context, device.getOrg().getOrgId()); String dataEntryComplete = org.getDataEntryComplete(); dataIsIncomplete = checkForMissingData(device); if (dataIsIncomplete && dataEntryComplete != null && dataEntryComplete.equals("true")) { org.setDataEntryCompleteDate(new Date()); org.setDataEntryComplete("false"); org.setDataEntryCompleteUser(context.getUserName()); organizationService.addOrUpdate(context, org); dataModificationStatus.setMessage(getText("task.mark.dataentry.complete.warning")); } } catch (ValidationServiceException vse) { List<ValidationError> errors = vse.getFaultInfo().getAttributeErrors(); for (ValidationError validationError : errors) { addFieldError("devices[" + entry.getKey() + "]." + validationError.getFieldName(), validationError.getOnlineMessage()); } } } if (hasErrors()) { return ERROR; } return SUCCESS; } private void updateTaskFlowData(Device device) { Iterator<Device> i = getTaskFlowData().getDevices().iterator(); while (i.hasNext()) { Device next = i.next(); if (next.getDeviceId().equals(device.getDeviceId())) { i.remove(); break; } } getTaskFlowData().getDevices().add(device); } @Override public void prepare() throws Exception { devices = new HashMap<>(); } public Map<Long, Device> getDevices() { return devices; } private static Boolean checkForMissingData(Device device) { int deviceError = 0; String operatingSystem = device.getOperatingSystem(); if (operatingSystem == null || StringUtils.isBlank(operatingSystem)) { deviceError++; } if (device.getMemory() == null) { deviceError++; } if (device.getScreenResolution() == null) { deviceError++; } if (device.getMonitorDisplaySize() == null) { deviceError++; } String environment = device.getEnvironment(); if (environment == null || StringUtils.isBlank(environment)) { deviceError++; } if (deviceError == 0) { return false; } return true; } }