package net.techreadiness.plugin.action.task.snapshot.edit;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.inject.Inject;
import net.techreadiness.plugin.action.task.snapshot.SnapshotTaskFlowData;
import net.techreadiness.plugin.action.task.snapshot.SnapshotTaskFlowDefinition;
import net.techreadiness.plugin.service.SnapshotWindowService;
import net.techreadiness.plugin.service.object.SnapshotWindow;
import net.techreadiness.service.common.ValidationError;
import net.techreadiness.service.exception.ServiceException;
import net.techreadiness.service.exception.ValidationServiceException;
import net.techreadiness.ui.task.BaseTaskFlowAction;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.google.common.collect.Maps;
import com.opensymphony.xwork2.Preparable;
import com.opensymphony.xwork2.util.Element;
import com.opensymphony.xwork2.util.Key;
@Results(value = { @Result(name = "success", location = "/task/snapshot/edit/edit", type = "redirect"),
@Result(name = "invalid", type = "lastAction", params={"actionName", "edit"}) })
public class SaveAction extends BaseTaskFlowAction<SnapshotTaskFlowData, SnapshotTaskFlowDefinition> implements Preparable {
private static final long serialVersionUID = 1L;
@Key(Long.class)
@Element(SnapshotWindow.class)
private Map<Long, SnapshotWindow> snapshots;
@Inject
SnapshotWindowService snapshotWindowService;
// @CoreSecured({ })
@Override
public String execute() {
for (Entry<Long, SnapshotWindow> entry : snapshots.entrySet()) {
SnapshotWindow snapshotWindow = new SnapshotWindow();
snapshotWindow.setSnapshotWindowId(Long.valueOf(entry.getKey()));
if (entry.getValue().getVisible() != null) {
Boolean visible = entry.getValue().getVisible();
snapshotWindow.setVisible(visible);
}
if (entry.getValue().getName() != null) {
String name = entry.getValue().getName();
snapshotWindow.setName(name);
}
try {
SnapshotWindow updatedSnapshot = snapshotWindowService.addOrUpdate(getServiceContext(), snapshotWindow);
updateTaskFlowData(updatedSnapshot);
} catch (ValidationServiceException vse) {
List<ValidationError> errors = vse.getFaultInfo().getAttributeErrors();
for (ValidationError validationError : errors) {
addFieldError(
"snapshots['" + snapshotWindow.getSnapshotWindowId() + "']." + validationError.getFieldName(),
validationError.getOnlineMessage());
}
} catch (ServiceException se) {
addActionError(se.getMessage());
}
}
if (hasErrors()) {
return "invalid";
}
return SUCCESS;
}
private void updateTaskFlowData(SnapshotWindow updatedSnapshot) {
List<SnapshotWindow> snapshots = getTaskFlowData().getSnapshots();
for (SnapshotWindow sw : snapshots) {
if (sw.getSnapshotWindowId().equals(updatedSnapshot.getSnapshotWindowId())) {
sw = updatedSnapshot;
}
}
}
@Override
public void prepare() throws Exception {
snapshots = Maps.newHashMap();
}
public Map<Long, SnapshotWindow> getSnapshots() {
return snapshots;
}
public void setSnapshots(Map<Long, SnapshotWindow> snapshots) {
this.snapshots = snapshots;
}
}