package edu.isi.karma.controller.history;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import edu.isi.karma.controller.command.Command;
import edu.isi.karma.controller.command.Command.CommandTag;
import edu.isi.karma.controller.history.HistoryJsonUtil.ClientJsonKeys;
import edu.isi.karma.controller.history.HistoryJsonUtil.ParameterType;
import edu.isi.karma.rep.HNode;
import edu.isi.karma.util.JSONUtil;
import edu.isi.karma.view.VWorkspace;
public class CommandHistoryWriter {
private final ArrayList<Command> history;
private VWorkspace vWorkspace;
public enum HistoryArguments {
vWorksheetId, commandName, inputParameters, hNodeId, tags
}
public CommandHistoryWriter(ArrayList<Command> history, VWorkspace vWorkspace) {
this.history = history;
this.vWorkspace = vWorkspace;
}
public void writeHistoryPerWorksheet() throws JSONException {
HashMap<String, List<Command>> comMap = new HashMap<String, List<Command>>();
for(Command command : history) {
if(command.isSavedInHistory() && (command.hasTag(CommandTag.Modeling)
|| command.hasTag(CommandTag.Transformation))) {
JSONArray json = new JSONArray(command.getInputParameterJson());
String vWorksheetId = HistoryJsonUtil.getStringValue(HistoryArguments.vWorksheetId.name(), json);
String worksheetName = vWorkspace.getViewFactory().getVWorksheet(vWorksheetId).getWorksheet().getTitle();
if(comMap.get(worksheetName) == null)
comMap.put(worksheetName, new ArrayList<Command>());
comMap.get(worksheetName).add(command);
}
}
for(String wkName : comMap.keySet()) {
List<Command> comms = comMap.get(wkName);
JSONArray commArr = new JSONArray();
for(Command comm : comms) {
JSONObject commObj = new JSONObject();
commObj.put(HistoryArguments.commandName.name(), comm.getCommandName());
// Populate the tags
JSONArray tagsArr = new JSONArray();
for (CommandTag tag : comm.getTags())
tagsArr.put(tag.name());
commObj.put(HistoryArguments.tags.name(), tagsArr);
JSONArray inputArr = new JSONArray(comm.getInputParameterJson());
for (int i = 0; i < inputArr.length(); i++) {
JSONObject inpP = inputArr.getJSONObject(i);
/*** Check the input parameter type and accordingly make changes ***/
if(HistoryJsonUtil.getParameterType(inpP) == ParameterType.hNodeId) {
String hNodeId = inpP.getString(ClientJsonKeys.value.name());
HNode node = vWorkspace.getRepFactory().getHNode(hNodeId);
JSONArray hNodeRepresentation = node.getJSONArrayRepresentation(vWorkspace.getRepFactory());
inpP.put(ClientJsonKeys.value.name(), hNodeRepresentation);
} else if (HistoryJsonUtil.getParameterType(inpP) == ParameterType.vWorksheetId) {
inpP.put(ClientJsonKeys.value.name(), "VW");
} else {
// do nothing
}
}
commObj.put(HistoryArguments.inputParameters.name(), inputArr);
if(!commandAlreadyexists(commArr, commObj))
commArr.put(commObj);
}
// System.out.println(commArr.toString(4));
JSONUtil.writeJsonFile(commArr, HistoryJsonUtil.constructWorksheetHistoryJsonFilePath(wkName,
vWorkspace.getPreferencesId()));
}
}
private boolean commandAlreadyexists(JSONArray commArr, JSONObject commObj1) throws JSONException {
for (int i = 0; i< commArr.length(); i++) {
JSONObject commObj2 = (JSONObject) commArr.get(i);
if (JSONUtil.compareJSONObjects(commObj1, commObj2)) {
return true;
}
}
return false;
}
}