package edu.isi.karma.controller.command.worksheet.selection;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import edu.isi.karma.controller.command.Command;
import edu.isi.karma.controller.command.CommandException;
import edu.isi.karma.controller.command.CommandType;
import edu.isi.karma.controller.command.WorksheetSelectionCommand;
import edu.isi.karma.controller.command.selection.LargeSelection.Operation;
import edu.isi.karma.controller.command.selection.Selection;
import edu.isi.karma.controller.command.selection.SelectionManager;
import edu.isi.karma.controller.command.selection.SuperSelection;
import edu.isi.karma.controller.history.CommandHistory;
import edu.isi.karma.controller.history.CommandHistory.HistoryArguments;
import edu.isi.karma.controller.history.HistoryJsonUtil.ParameterType;
import edu.isi.karma.controller.history.WorksheetCommandHistoryExecutor;
import edu.isi.karma.controller.update.ErrorUpdate;
import edu.isi.karma.controller.update.HistoryUpdate;
import edu.isi.karma.controller.update.UpdateContainer;
import edu.isi.karma.controller.update.WorksheetUpdateFactory;
import edu.isi.karma.rep.HNode;
import edu.isi.karma.rep.HTable;
import edu.isi.karma.rep.RepFactory;
import edu.isi.karma.rep.Worksheet;
import edu.isi.karma.rep.Workspace;
import edu.isi.karma.util.CommandInputJSONUtil;
public class RefreshSelectionCommand extends WorksheetSelectionCommand {
private String hNodeId;
public RefreshSelectionCommand(String id, String worksheetId,
String selectionId, String hNodeId) {
super(id, worksheetId, selectionId);
this.hNodeId = hNodeId;
addTag(CommandTag.Transformation);
}
@Override
public String getCommandName() {
return this.getClass().getSimpleName();
}
@Override
public String getTitle() {
return "Update Selection";
}
@Override
public String getDescription() {
return "";
}
@Override
public CommandType getCommandType() {
return CommandType.notUndoable;
}
@Override
public UpdateContainer doIt(Workspace workspace) throws CommandException {
Worksheet worksheet = workspace.getWorksheet(worksheetId);
RepFactory factory = workspace.getFactory();
SuperSelection superSel = getSuperSelection(worksheet);
HTable hTable = factory.getHTable(factory.getHNode(hNodeId).getHTableId());
Selection currentSel = superSel.getSelection(hTable.getId());
if (currentSel != null) {
currentSel.updateSelection();
}
CommandHistory history = workspace.getCommandHistory();
List<Command> tmp = gatherAllOperateSelectionCommands(history.getCommandsFromWorksheetId(worksheetId), workspace);
if (tmp.size() > 0) {
JSONArray inputJSON = new JSONArray();
inputJSON.put(CommandInputJSONUtil.createJsonObject("worksheetId", worksheetId, ParameterType.worksheetId));
inputJSON.put(CommandInputJSONUtil.createJsonObject("hNodeId", hNodeId, ParameterType.hNodeId));
inputJSON.put(CommandInputJSONUtil.createJsonObject("operation", Operation.Intersect.name(), ParameterType.other));
inputJSON.put(CommandInputJSONUtil.createJsonObject("pythonCode", SelectionManager.defaultCode, ParameterType.other));
inputJSON.put(CommandInputJSONUtil.createJsonObject("onError", "false", ParameterType.other));
inputJSON.put(CommandInputJSONUtil.createJsonObject("selectionName", superSel.getName(), ParameterType.other));
Command t = null;
try {
t = new OperateSelectionCommandFactory().createCommand(inputJSON, workspace);
}catch(Exception e) {
}
if (t != null)
history._getHistory().add(t);
history._getHistory().addAll(tmp);
}
UpdateContainer uc = WorksheetUpdateFactory.createWorksheetHierarchicalAndCleaningResultsUpdates(worksheetId, superSel);
uc.add(new HistoryUpdate(history));
return uc;
}
@Override
public UpdateContainer undoIt(Workspace workspace) {
return null;
}
public UpdateContainer getErrorUpdate(String msg) {
return new UpdateContainer(new ErrorUpdate(msg));
}
private List<Command> gatherAllOperateSelectionCommands(List<Command> commands, Workspace workspace) {
List<Command> operationCommands = new ArrayList<Command>();
for (Command c : commands) {
if (c instanceof OperateSelectionCommand) {
OperateSelectionCommand t = (OperateSelectionCommand)c;
if (isSamehTableId(t.getHNodeId(), hNodeId, workspace)) {
JSONObject obj = workspace.getCommandHistory().getCommandJSON(workspace, t);
Command tmp = generateCommandFromJSON(workspace, obj);
if (tmp != null)
operationCommands.add(tmp);
}
}
}
return operationCommands;
}
private boolean isSamehTableId(String hNodeId1, String hNodeId2, Workspace workspace) {
HNode hNode1 = workspace.getFactory().getHNode(hNodeId1);
HNode hNode2 = workspace.getFactory().getHNode(hNodeId2);
if (hNode1 == null || hNode2 == null)
return false;
return hNode1.getHTableId().equals(hNode2.getHTableId());
}
private Command generateCommandFromJSON(Workspace workspace, JSONObject obj) {
JSONArray inputParamArr = (JSONArray) obj.get(HistoryArguments.inputParameters.name());
String commandName = (String)obj.get(HistoryArguments.commandName.name());
WorksheetCommandHistoryExecutor ex = new WorksheetCommandHistoryExecutor(worksheetId, workspace);
ex.normalizeCommandHistoryJsonInput(workspace, worksheetId, inputParamArr, commandName, true);
try {
Command c = new OperateSelectionCommandFactory().createCommand(inputParamArr, workspace);
return c;
} catch (Exception e) {
return null;
}
}
}