package edu.isi.karma.controller.command.worksheet;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import edu.isi.karma.controller.command.Command;
import edu.isi.karma.controller.command.CommandException;
import edu.isi.karma.controller.update.UpdateContainer;
import edu.isi.karma.rep.Node;
import edu.isi.karma.rep.RepFactory;
import edu.isi.karma.rep.Row;
import edu.isi.karma.view.VWorksheet;
import edu.isi.karma.view.VWorkspace;
public class MultipleValueEditColumnCommand extends Command {
private String hNodeID;
private final String vWorksheetId;
private Map<String, String> newRowValueMap;
private Map<String, String> oldRowValueMap = new HashMap<String, String>();
private static Logger logger = LoggerFactory.getLogger(MultipleValueEditColumnCommand.class);
protected MultipleValueEditColumnCommand(String id, String vWorksheetID, String hNodeID, Map<String, String> rowValueMap) {
super(id);
this.hNodeID = hNodeID;
this.vWorksheetId = vWorksheetID;
this.newRowValueMap = rowValueMap;
}
@Override
public String getCommandName() {
return this.getClass().getSimpleName();
}
@Override
public String getTitle() {
return "Multiple Cell Value Edit Command";
}
@Override
public String getDescription() {
return "";
}
@Override
public CommandType getCommandType() {
return CommandType.undoable;
}
@Override
public UpdateContainer doIt(VWorkspace vWorkspace) throws CommandException {
UpdateContainer c = new UpdateContainer();
VWorksheet vw = vWorkspace.getViewFactory().getVWorksheet(vWorksheetId);
RepFactory factory = vWorkspace.getRepFactory();
for (String rowID: newRowValueMap.keySet()) {
Row row = factory.getRow(rowID);
Node existingNode = row.getNode(hNodeID);
if (existingNode.hasNestedTable()) {
logger.error("Existing node has a nested table. Cannot overwrite such node with new value. NodeID: " + existingNode.getId());
continue;
}
String existingCellValue = existingNode.getValue().asString();
oldRowValueMap.put(rowID, existingCellValue);
String newCellValue = newRowValueMap.get(rowID);
row.setValue(hNodeID, newCellValue, factory);
}
vw.update(c);
return c;
}
@Override
public UpdateContainer undoIt(VWorkspace vWorkspace) {
UpdateContainer c = new UpdateContainer();
VWorksheet vw = vWorkspace.getViewFactory().getVWorksheet(vWorksheetId);
RepFactory factory = vWorkspace.getRepFactory();
for (String rowID: oldRowValueMap.keySet()) {
Row row = factory.getRow(rowID);
Node existingNode = row.getNode(hNodeID);
if (existingNode.hasNestedTable()) {
logger.error("Existing node has a nested table. Cannot overwrite such node with new value. NodeID: " + existingNode.getId());
continue;
}
String oldCellValue = oldRowValueMap.get(rowID);
row.setValue(hNodeID, oldCellValue, factory);
}
vw.update(c);
return c;
}
}