package edu.isi.karma.kr2rml;
import java.util.HashMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import edu.isi.karma.controller.command.Command;
import edu.isi.karma.controller.command.CommandFactory;
import edu.isi.karma.controller.command.ICommand.CommandTag;
import edu.isi.karma.controller.command.JSONInputCommandFactory;
import edu.isi.karma.controller.command.transformation.PythonTransformationCommand;
import edu.isi.karma.controller.history.CommandHistory.HistoryArguments;
import edu.isi.karma.rep.Workspace;
import edu.isi.karma.transformation.tokenizer.PythonTransformationAsURIValidator;
import edu.isi.karma.webserver.ExecutionController;
import edu.isi.karma.webserver.KarmaException;
import edu.isi.karma.webserver.WorkspaceRegistry;
public class KR2RMLWorksheetHistoryCompatibilityVerifier {
private static Logger logger = LoggerFactory
.getLogger(KR2RMLWorksheetHistoryCompatibilityVerifier.class);
private KR2RMLWorksheetHistoryCompatibilityVerifier() {
}
public static boolean verify(Workspace workspace, String historyJsonStr) {
boolean isR2RMLCompatible = true;
if(null != historyJsonStr && !historyJsonStr.isEmpty())
{
JSONArray commands = new JSONArray(historyJsonStr);
isR2RMLCompatible = verify(workspace,
commands);
}
return isR2RMLCompatible;
}
public static boolean verify(
Workspace workspace, JSONArray commands) {
boolean isR2RMLCompatible = true;
if(null == commands || commands.length() == 0)
{
return isR2RMLCompatible;
}
ExecutionController ctrl = WorkspaceRegistry.getInstance().getExecutionController(workspace.getId());
HashMap<String, CommandFactory> commandFactoryMap = ctrl.getCommandFactoryMap();
for(int i = 0; i < commands.length(); i++)
{
JSONObject commObject = commands.getJSONObject(i);
JSONArray tags = commObject.getJSONArray(HistoryArguments.tags.name());
if(null == tags || tags.length() == 0)
{
continue;
}
for(int j = 0; j < tags.length(); j++)
{
String tag = tags.getString(j);
if(null != tag && tag.equals(CommandTag.Transformation.name()))
{
JSONArray inputParamArr = (JSONArray) commObject.get(HistoryArguments.inputParameters.name());
CommandFactory cf = commandFactoryMap.get(commObject.get(HistoryArguments.commandName.name()));
if(cf != null && cf instanceof JSONInputCommandFactory) {
JSONInputCommandFactory scf = (JSONInputCommandFactory)cf;
Command comm = null;
try {
String model = Command.NEW_MODEL;
if(commObject.has(HistoryArguments.model.name()))
model = commObject.getString(HistoryArguments.model.name());
comm = scf.createCommand(inputParamArr, model, workspace);
} catch (JSONException | KarmaException e) {
logger.error("Unable to parse command from worksheet history");
}
if(comm != null){
if(comm instanceof PythonTransformationCommand)
{
PythonTransformationCommand pyTransform = (PythonTransformationCommand) comm;
String transformationCode = pyTransform.getTransformationCode();
PythonTransformationAsURIValidator validator = new PythonTransformationAsURIValidator();
isR2RMLCompatible = isR2RMLCompatible && validator.validate(transformationCode);
}
else
{
isR2RMLCompatible = false;
}
}
}
}
}
if(!isR2RMLCompatible)
{
break;
}
}
return isR2RMLCompatible;
}
}