diff --git a/karma-app/build b/karma-app/build index c890da29e..2fd3cddc0 100755 --- a/karma-app/build +++ b/karma-app/build @@ -27,9 +27,11 @@ mv $CURRENT/target/cluster*.war $CURRENT/target/clusterService.war cd $CURRENT/target # download tomcat binary -wget http://apache.cs.utah.edu/tomcat/tomcat-7/v7.0.72/bin/apache-tomcat-7.0.72.zip -O tomcat.zip +wget https://github.com/alseambusher/karma-app-deps/archive/master.zip +unzip master.zip +mv karma-app-deps-master/*.tar.gz karma-app-deps-master/*.zip . +rm -rf karma-app-deps-master master.zip -# TODO if this fails, exit unzip tomcat.zip rm tomcat.zip @@ -47,9 +49,16 @@ cd $CURRENT/desktop npm install npm run prerelease cd app + +tar -xzvf $CURRENT/target/jre*windows*.tar.gz electron-packager . --platform=win32 --arch=x64 --icon=../resources/icons/karma.ico --overwrite -electron-packager . --platform=linux --arch=x64 --icon=../resources/icons/karma.png --overwrite +rm -rf jre* +tar -xzvf $CURRENT/target/jre*macosx*.tar.gz electron-packager . --platform=darwin --arch=x64 --icon=../resources/icons/karma.icns --overwrite +rm -rf jre* +tar -xzvf $CURRENT/target/jre*linux*.tar.gz +electron-packager . --platform=linux --arch=x64 --icon=../resources/icons/karma.png --overwrite +rm -rf jre* cp -rf Karma-darwin* $CURRENT/target/Karma-Mac cp -rf Karma-linux* $CURRENT/target/Karma-Linux @@ -57,6 +66,7 @@ cp -rf Karma-win* $CURRENT/target/Karma-Windows rm -rf Karma-* cd $CURRENT/target +rm *.tar.gz #put our license for build_folder in `ls |grep Karma` diff --git a/karma-app/desktop/src/app.js b/karma-app/desktop/src/app.js index f2bdd27d3..3be3528b2 100644 --- a/karma-app/desktop/src/app.js +++ b/karma-app/desktop/src/app.js @@ -9,6 +9,7 @@ var path = require("path"); var fs = require("fs"); var dialogPolyfill = require("dialog-polyfill"); const {ipcRenderer} = require('electron'); +var glob = require("glob"); console.log('Loaded environment variables:', env); @@ -35,14 +36,27 @@ document.addEventListener('DOMContentLoaded', function () { log(data); }); - log("Starting Karma..."); - karma.start(); - function m_launch(){ karma.launch(); log("Launching Karma. Go to http://localhost:8080 if it doesn't launch."); } - // Launches Karma in browser after 10 seconds. + + // set java home to java shipped with app if JAVA_HOME is not set + karma.getJavaHome((_java_home) => { + if (!_java_home){ + glob(path.join(__dirname, "jre*"), (err, files) => { + if (files[0]){ + if (fs.existsSync(path.join(files[0], "bin", "java" + (/^win/.test(process.platform) ? ".exe" : "")))) { + karma.setJavaHome(files[0]); + } + } + }); + } + }); + setTimeout(() => { + log("Starting Karma..."); + karma.start(); + }, 1000); setTimeout(m_launch, 10000); document.getElementById("launch").onclick = m_launch; document.getElementById("restart").onclick = function(){ @@ -62,11 +76,11 @@ document.addEventListener('DOMContentLoaded', function () { document.getElementById("submit_setJavaHome").onclick = function(){ let value = document.getElementById("input_setJavaHome").value; if (!fs.existsSync(path.join(value, "bin", "java" + (/^win/.test(process.platform) ? ".exe" : "")))) { - // if (!fs.existsSync(value + path.sep + "bin" + path.sep + "java" + (/^win/.test(process.platform) ? ".exe" : ""))) { document.querySelector("#dialog_setJavaHome .warning").innerHTML = "Invalid path for Java"; setTimeout(() => {dialog_setJavaHome.showModal();}, 1000); } else { karma.setJavaHome(value); + log("Your JAVA_HOME is set. Restart karma."); } }; @@ -117,6 +131,7 @@ document.addEventListener('DOMContentLoaded', function () { dialog_setJavaHome.showModal(); }); }); + }); diff --git a/karma-app/desktop/src/karma.js b/karma-app/desktop/src/karma.js index b424365b2..6fe66780d 100644 --- a/karma-app/desktop/src/karma.js +++ b/karma-app/desktop/src/karma.js @@ -43,7 +43,9 @@ exports.start = function(){ process.env.JAVA_HOME = _java_home; process.env.JRE_HOME = _java_home; } - exec(exports.tomcat.startcmd, options, function(error, stdout, stderr) { + // cd to catalina_home in windows and it doesnt work in some machines + let cmd = (/^win/.test(process.platform) ? 'cd /D ' + options.cwd + ' & ' : '') + exports.tomcat.startcmd; + exec(cmd, options, function(error, stdout, stderr) { console.log(error); console.log(stdout); console.log(stderr); @@ -108,7 +110,12 @@ exports.setJavaHome = function(value){ exports.getJavaHome = function(callback){ var env = jetpack.cwd(__dirname).read('env.json', 'json'); - callback(env.java_home); + let java_home = env.java_home; + // if it is not set in the app, get it from global environment vars + if (!java_home) { + java_home = process.env.JAVA_HOME ? process.env.JAVA_HOME : process.env.JRE_HOME; + } + callback(java_home); }; exports.setJavaHomeHelp = function() { diff --git a/karma-commands/commands-alignment-openrdf/src/main/java/edu/isi/karma/controller/command/worksheet/ApplyHistoryFromR2RMLModelCommand.java b/karma-commands/commands-alignment-openrdf/src/main/java/edu/isi/karma/controller/command/worksheet/ApplyHistoryFromR2RMLModelCommand.java index 68aef2614..72ec56bc5 100644 --- a/karma-commands/commands-alignment-openrdf/src/main/java/edu/isi/karma/controller/command/worksheet/ApplyHistoryFromR2RMLModelCommand.java +++ b/karma-commands/commands-alignment-openrdf/src/main/java/edu/isi/karma/controller/command/worksheet/ApplyHistoryFromR2RMLModelCommand.java @@ -82,7 +82,7 @@ protected ApplyHistoryFromR2RMLModelCommand(String id, String model, String mode } private enum JsonKeys { - updateType, worksheetId, baseURI, prefix, graphLabel + updateType, worksheetId, baseURI, prefix, graphLabel, GithubURL } @Override @@ -193,6 +193,9 @@ public void generateJson(String prefix, PrintWriter pw, outputObject.put(JsonKeys.prefix.name(), props.getPropertyValue(Property.prefix)); if (props.getPropertyValue(Property.graphLabel) != null && !props.getPropertyValue(Property.graphLabel).trim().isEmpty()) outputObject.put(JsonKeys.graphLabel.name(), props.getPropertyValue(Property.graphLabel)); + if (props.getPropertyValue(Property.GithubURL) != null && !props.getPropertyValue(Property.GithubURL).trim().isEmpty()) + outputObject.put(JsonKeys.GithubURL.name(), props.getPropertyValue(Property.GithubURL)); + pw.println(outputObject.toString()); } catch (JSONException e) { e.printStackTrace(); diff --git a/karma-commands/commands-import/import-csv/src/main/java/edu/isi/karma/controller/update/CSVImportPreviewUpdate.java b/karma-commands/commands-import/import-csv/src/main/java/edu/isi/karma/controller/update/CSVImportPreviewUpdate.java index aefea0688..a1e3fa1fc 100644 --- a/karma-commands/commands-import/import-csv/src/main/java/edu/isi/karma/controller/update/CSVImportPreviewUpdate.java +++ b/karma-commands/commands-import/import-csv/src/main/java/edu/isi/karma/controller/update/CSVImportPreviewUpdate.java @@ -21,10 +21,13 @@ package edu.isi.karma.controller.update; import java.io.File; +import java.io.FileReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.io.StringReader; +import java.io.InputStreamReader; +import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; import java.util.Scanner; @@ -36,7 +39,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import au.com.bytecode.opencsv.CSVReader; +import com.opencsv.CSVReader; import edu.isi.karma.util.EncodingDetector; import edu.isi.karma.view.VWorkspace; @@ -92,7 +95,7 @@ public CSVImportPreviewUpdate(char delimiterChar, char quoteChar, @Override public void generateJson(String prefix, PrintWriter pw, VWorkspace vWorkspace) { - Scanner scanner = null; + // Scanner scanner = null; int rowCount = 0; int previewRowCounter = 0; @@ -105,7 +108,7 @@ public void generateJson(String prefix, PrintWriter pw, if (encoding == null) { encoding = EncodingDetector.detect(csvFile); } - scanner = new Scanner(csvFile, encoding); + // scanner = new Scanner(csvFile, encoding); JSONWriter writer = jsonStr.object().key(JsonKeys.commandId.name()) .value(commandId).key(GenericJsonKeys.updateType.name()) .value("ImportCSVPreview").key(JsonKeys.fileName.name()) @@ -113,18 +116,17 @@ public void generateJson(String prefix, PrintWriter pw, .key("maxNumLines").value(maxNumLines); JSONArray dataRows = new JSONArray(); - while (scanner.hasNextLine()) { + CSVReader reader = new CSVReader( + new InputStreamReader(new FileInputStream(csvFile), encoding), + delimiter, quoteCharacter, escapeCharacter); + String[] rowValues = null; + while ((rowValues = reader.readNext()) != null) { // Check for the header row if (rowCount + 1 == headerRowIndex) { - String line = scanner.nextLine(); - CSVReader reader = new CSVReader(new StringReader(line), - delimiter, quoteCharacter, escapeCharacter); - String[] rowValues = reader.readNext(); List headers = new ArrayList<>(); if (rowValues == null || rowValues.length == 0) { logger.error("No data found in the Header row!"); rowCount++; - scanner.nextLine(); continue; } for (int i = 0; i < rowValues.length; i++) { @@ -137,7 +139,6 @@ public void generateJson(String prefix, PrintWriter pw, JSONArray arr = new JSONArray(headers); writer.key(JsonKeys.headers.name()).value(arr); rowCount++; - reader.close(); continue; } @@ -147,10 +148,6 @@ public void generateJson(String prefix, PrintWriter pw, if (previewRowCounter++ > 5) { break; } - String line = scanner.nextLine(); - CSVReader reader = new CSVReader(new StringReader(line), - delimiter, quoteCharacter, escapeCharacter); - String[] rowValues = reader.readNext(); List vals = new ArrayList<>(); if (rowValues != null) { for (int i = 0; i < rowValues.length; i++) { @@ -160,7 +157,6 @@ public void generateJson(String prefix, PrintWriter pw, vals.add(""); // Add the row index vals.add(0, Integer.toString(rowCount + 1)); - reader.close(); // Add to the data rows JSON dataRows.put(vals); @@ -169,9 +165,9 @@ public void generateJson(String prefix, PrintWriter pw, } rowCount++; - scanner.nextLine(); } + reader.close(); writer.key(JsonKeys.rows.name()).value(dataRows); writer.endObject(); pw.println(jsonStr.toString()); @@ -182,8 +178,8 @@ public void generateJson(String prefix, PrintWriter pw, } catch (JSONException e) { logger.error("Error occured while writing to JSON", e); } finally { - if(scanner != null) - scanner.close(); + // if(scanner != null) + // scanner.close(); } } diff --git a/karma-commands/commands-publish/src/main/java/edu/isi/karma/controller/command/publish/PublishGithubCommand.java b/karma-commands/commands-publish/src/main/java/edu/isi/karma/controller/command/publish/PublishGithubCommand.java new file mode 100644 index 000000000..903da3c1e --- /dev/null +++ b/karma-commands/commands-publish/src/main/java/edu/isi/karma/controller/command/publish/PublishGithubCommand.java @@ -0,0 +1,314 @@ +package edu.isi.karma.controller.command.publish; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashMap; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.IOUtils; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.json.JSONArray; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import edu.isi.karma.config.ModelingConfiguration; +import edu.isi.karma.config.ModelingConfigurationRegistry; +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.update.AbstractUpdate; +import edu.isi.karma.controller.update.ErrorUpdate; +import edu.isi.karma.controller.update.InfoUpdate; +import edu.isi.karma.controller.update.UpdateContainer; +import edu.isi.karma.rep.Worksheet; +import edu.isi.karma.rep.Workspace; +import edu.isi.karma.rep.metadata.WorksheetProperties; +import edu.isi.karma.rep.metadata.WorksheetProperties.Property; +import edu.isi.karma.view.VWorkspace; +import edu.isi.karma.webserver.ContextParametersRegistry; +import edu.isi.karma.webserver.ServletContextParameterMap; +import edu.isi.karma.webserver.WorkspaceKarmaHomeRegistry; + +/** + * Created by alse on 11/21/16. + * This command publishes dot, model, model json and report to github + */ +public class PublishGithubCommand extends Command { + private static Logger logger = LoggerFactory.getLogger(PublishGithubCommand.class); + private String worksheetId; + private String repo; + private String auth; + private String branch; + private HashMap fileSHAMap = new HashMap<>(); + private String graphvizServer; + + private enum JsonKeys { + updateType, url, worksheetId + } + + /* + worksheetId - is the id of the worksheet that has to be published + repo - is the github url of the repo where the files have to be published + branch - is the branch of the repo where the files have to be published + auth - is the base64 encoded string of username:password required for authentication + */ + public PublishGithubCommand(String id, String model, String worksheetId, String githubUrl, String auth) { + super(id, model); + this.worksheetId = worksheetId; + + String repoDetails = githubUrl.split("github\\.com")[1]; + int treeIdx = repoDetails.indexOf("/tree/"); + if(treeIdx != -1) { + int endIdx = repoDetails.indexOf("/", treeIdx+6); + String rest = ""; + if(endIdx != -1) { + this.branch = repoDetails.substring(treeIdx+6, endIdx); + rest = repoDetails.substring(endIdx); + } else { + this.branch = repoDetails.substring(treeIdx+6); + } + repoDetails = repoDetails.substring(0, treeIdx) + + "/contents" + rest + "/"; + } else { + this.branch = "master"; + repoDetails = repoDetails + "/contents/"; + } + + this.repo = "https://api.github.com/repos" + repoDetails; + this.auth = auth; + } + @Override + public String getCommandName() { + return this.getClass().getSimpleName(); + } + + @Override + public String getTitle() { + return "Publish Github Command"; + } + + @Override + public String getDescription() { + return null; + } + + @Override + public CommandType getCommandType() { + return CommandType.notInHistory; + } + + @Override + public UpdateContainer doIt(Workspace workspace) throws CommandException { + UpdateContainer uc = new UpdateContainer(); + try{ + try { + this.buildFileSHAMap(); + } catch (FileNotFoundException fe) { + logger.warn("Github URL does not exist. Will try to see if it can be created."); + } + ModelingConfiguration modelingConfiguration = ModelingConfigurationRegistry.getInstance() + .getModelingConfiguration(WorkspaceKarmaHomeRegistry.getInstance().getKarmaHome(workspace.getId())); + this.graphvizServer = modelingConfiguration.getGraphvizServer(); + + Worksheet worksheet = workspace.getWorksheet(this.worksheetId); + + WorksheetProperties props = worksheet.getMetadataContainer().getWorksheetProperties(); + String modelName = props.getPropertyValue(Property.graphLabel); + String worksheetTitle = worksheet.getTitle(); + + String dotFile = ContextParametersRegistry.getInstance() + .getContextParameters(ContextParametersRegistry.getInstance().getDefault().getId()) + .getParameterValue(ServletContextParameterMap.ContextParameter.GRAPHVIZ_MODELS_DIR) + + worksheetTitle + ".model.dot"; + + String modelFile = ContextParametersRegistry.getInstance() + .getContextParameters(ContextParametersRegistry.getInstance().getDefault().getId()) + .getParameterValue(ServletContextParameterMap.ContextParameter.R2RML_PUBLISH_DIR) + + modelName + "-model.ttl"; + + String reportFile = ContextParametersRegistry.getInstance() + .getContextParameters(ContextParametersRegistry.getInstance().getDefault().getId()) + .getParameterValue(ServletContextParameterMap.ContextParameter.REPORT_PUBLISH_DIR) + + worksheetTitle + ".md"; + + String modelJsonFile = ContextParametersRegistry.getInstance() + .getContextParameters(ContextParametersRegistry.getInstance().getDefault().getId()) + .getParameterValue(ServletContextParameterMap.ContextParameter.JSON_MODELS_DIR) + + worksheetTitle + ".model.json"; + + if (fileExists(dotFile)) { + String contents = getFileContents(dotFile); + push(modelName + "-model.dot", contents); + try { + //Use hosted graphviz server to convert dot to pdf + //https://github.com/omerio/graphviz-server + contents = contents.replace("digraph n0", "digraph G"); + InputStream pdfStream = this.getGraphizPdf(contents); + push(modelName + "-model.pdf", pdfStream); + } catch(Exception e) { + logger.error("Error generating png for the dot file", e); + } + } + + if (fileExists(modelFile)) { + String contents = getFileContents(modelFile); + push(modelName + "-model.ttl", contents); + } + + if (fileExists(reportFile)) { + String contents = getFileContents(reportFile); + push(modelName + "-model.md", contents); + } + + if (fileExists(modelJsonFile)) { + String contents = getFileContents(modelJsonFile); + push(modelName + "-model.json", contents); + } + + uc.add(new AbstractUpdate() { + @Override + public void generateJson(String prefix, PrintWriter pw, VWorkspace vWorkspace) { + try { + JSONObject outputObject = new JSONObject(); + outputObject.put(JsonKeys.updateType.name(), "PublishGithubUpdate"); + outputObject.put(JsonKeys.url.name(), repo); + outputObject.put(JsonKeys.worksheetId.name(), worksheetId); + pw.println(outputObject.toString(4)); + pw.println(","); + new InfoUpdate("Succesfully pushed model to Github").generateJson(prefix, pw, vWorkspace); + } catch (Exception e) { + logger.error("Error unable to set Github", e); + } + } + }); + } catch ( FileNotFoundException fe) { + logger.error("Error pushing to Github:" , fe); + uc.add(new ErrorUpdate("Error pushing to Github.
Github URL is invalid")); + } catch (Exception e) { + logger.error("Error pushing to Github:" , e); + uc.add(new ErrorUpdate("Error pushing to Github:
" + e.getMessage())); + } + return uc; + } + + @Override + public UpdateContainer undoIt(Workspace workspace) { + return null; + } + + /* + This function does the push operation to github + */ + private Integer push(String fileName, String fileContents) throws IOException{ + return push(fileName, fileContents.getBytes()); + } + + private Integer push(String fileName, InputStream fileStream) throws IOException { + byte[] bytes = IOUtils.toByteArray(fileStream); + return push(fileName, bytes); + } + + private Integer push(String fileName, byte[] bytes) throws IOException{ + URL url = new URL(this.repo + fileName); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("PUT"); + connection.setDoOutput(true); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("Accept", "application/json"); + connection.setRequestProperty ("Authorization", "Basic " + this.auth); + OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream()); + + String b64FileContent = new String(Base64.encodeBase64(bytes)); + String fileSHA = getFileSHA(fileName); + if (fileSHA == null) { + osw.write("{\"message\": \"Create file " + fileName + + "\", \"branch\":\"" + this.branch + + "\", \"content\": \"" + + b64FileContent + "\"}"); + } else { + osw.write("{\"message\": \"Update file " + fileName + + "\", \"branch\":\"" + this.branch + + "\", \"content\": \"" + + b64FileContent + "\", \"sha\": \"" + fileSHA + "\"}"); + } + osw.flush(); + osw.close(); + return connection.getResponseCode(); + } + + private Boolean fileExists(String path) { + File f = new File(path); + return f.exists() && !f.isDirectory(); + } + + private String getFileContents(String path) throws IOException { + byte[] encoded = Files.readAllBytes(Paths.get(path)); + return new String(encoded, "UTF-8"); + } + + private InputStream getGraphizPdf(String dotContents) throws ClientProtocolException, IOException { + HttpClient httpClient = new DefaultHttpClient(); + HttpPost httpPost = new HttpPost(this.graphvizServer + "pdf"); + httpPost.setEntity(new StringEntity(dotContents)); + HttpResponse response = httpClient.execute(httpPost); + + // Parse the response and store it in a String + HttpEntity entity = response.getEntity(); + return entity.getContent(); + } + + // Whenever we are doing an update instead of create, we need the blob sha of the file which exists on github. + private void buildFileSHAMap() throws IOException { + this.fileSHAMap.clear(); + String repo; //Need to remove the extra / if present, else API does not use the ref parameter + if(this.repo.endsWith("/")) + repo = this.repo.substring(0, this.repo.length()-1); + else + repo = this.repo; + String urlStr = repo + "?ref=" + this.branch; + URL url = new URL(urlStr); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setDoOutput(true); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("Accept", "application/json"); + connection.setRequestProperty("Authorization", "Basic " + this.auth); + + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String inputLine; + StringBuffer response = new StringBuffer(); + + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + in.close(); + + JSONArray fileTree = new JSONArray(response.toString()); + for(int i=0; i getCorrespondingCommand() { + return PublishGithubCommand.class; + } +} diff --git a/karma-commands/commands-publish/src/main/java/edu/isi/karma/controller/command/publish/PublishReportCommand.java b/karma-commands/commands-publish/src/main/java/edu/isi/karma/controller/command/publish/PublishReportCommand.java index 821594b1f..bebf1f598 100644 --- a/karma-commands/commands-publish/src/main/java/edu/isi/karma/controller/command/publish/PublishReportCommand.java +++ b/karma-commands/commands-publish/src/main/java/edu/isi/karma/controller/command/publish/PublishReportCommand.java @@ -3,6 +3,7 @@ import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; @@ -33,7 +34,7 @@ import edu.isi.karma.rep.alignment.Label; import edu.isi.karma.rep.alignment.LabeledLink; import edu.isi.karma.rep.alignment.Node; -import edu.isi.karma.rep.alignment.NodeType; +import edu.isi.karma.view.VWorksheet; import edu.isi.karma.view.VWorkspace; import edu.isi.karma.webserver.ContextParametersRegistry; import edu.isi.karma.webserver.ServletContextParameterMap; @@ -71,7 +72,7 @@ public String getDescription() { @Override public CommandType getCommandType() { - return CommandType.undoable; + return CommandType.notInHistory; } @Override @@ -98,18 +99,31 @@ public void generateJson(String prefix, PrintWriter pw, parentDir.mkdirs(); PrintWriter fileWriter = new PrintWriter(f); - fileWriter.println("## " + worksheet.getTitle()); + fileWriter.println("# " + worksheet.getTitle()); fileWriter.println(); - fileWriter.println("### PyTransforms"); + fileWriter.println("## Add Column"); + writeAddColumns(finalWorkspace, worksheet, fileWriter); + + fileWriter.println(); + fileWriter.println("## Add Node/Literal"); + writeAddNodes(finalWorkspace, worksheet, fileWriter); + + fileWriter.println(); + fileWriter.println("## PyTransforms"); writePyTransforms(finalWorkspace, worksheet, fileWriter); fileWriter.println(); - fileWriter.println("### Semantic Types"); - writeSemanticTypes(finalWorkspace, worksheet, fileWriter); + fileWriter.println("## Selections"); + writeSelections(finalWorkspace, worksheet, fileWriter); fileWriter.println(); - fileWriter.println("### Links"); + fileWriter.println("## Semantic Types"); + VWorksheet viewWorksheet = vWorkspace.getViewFactory().getVWorksheetByWorksheetId(worksheetId); + writeSemanticTypes(vWorkspace, viewWorksheet, fileWriter); + + fileWriter.println(); + fileWriter.println("## Links"); writeLinks(finalWorkspace, worksheet, fileWriter); fileWriter.close(); @@ -122,7 +136,7 @@ public void generateJson(String prefix, PrintWriter pw, pw.println(","); new InfoUpdate("Succesfully generated report").generateJson(prefix, pw, vWorkspace); } catch(Exception e) { - pw.println("Error generting report"); + pw.println("Error generating report"); logger.error("Error generating report", e); } @@ -145,42 +159,145 @@ private void writePyTransforms(Workspace workspace, Worksheet worksheet, PrintWr JSONArray history = CommandHistory.getHistorySaver(workspace.getId()).loadHistory(historyFile); for(int i=0; i stringStringEntry : pyTransformMap.entrySet()) { + pw.print(stringStringEntry.getValue()); + } + } + + private void writeSelections(Workspace workspace, Worksheet worksheet, PrintWriter pw) throws IOException { + + //Map for py transforms, so only the latest pyTransform for a column gets written + String linebreak = System.getProperty("line.separator"); + + String historyFile = CommandHistory.getHistorySaver(workspace.getId()).getHistoryFilepath(worksheetId); + try { + JSONArray history = CommandHistory.getHistorySaver(workspace.getId()).loadHistory(historyFile); + + for(int i=0; iOperation: `" + operation + "`").append(linebreak); + pyTransform.append("``` python").append(linebreak); + pyTransform.append(code).append(linebreak); + pyTransform.append("```").append(linebreak); + pyTransform.append(linebreak); + + pw.print(pyTransform.toString()); } - - StringBuffer pyTransform = new StringBuffer("#### _" + columnName + "_"); - pyTransform.append(linebreak); - - //Pedro: throw-away code, ought to have a better way to construct column paths. - JSONArray hNodeIdArray = HistoryJsonUtil.getJSONArrayValue("hNodeId", inputParamArr); - String invocationColumnName = ""; - String sep = ""; - for(int j=0; j pyTransformMap = new LinkedHashMap<>(); + String linebreak = System.getProperty("line.separator"); + + String historyFile = CommandHistory.getHistorySaver(workspace.getId()).getHistoryFilepath(worksheetId); + try { + + + JSONArray history = CommandHistory.getHistorySaver(workspace.getId()).loadHistory(historyFile); + + for(int i=0; iValue: `" + value + "`").append(linebreak); + + pyTransform.append(linebreak); + + pyTransformMap.put(columnName, pyTransform.toString()); } - pyTransform.append("From column: _" + invocationColumnName + "_").append(linebreak); - - pyTransform.append("``` python").append(linebreak); - pyTransform.append(code).append(linebreak); - pyTransform.append("```").append(linebreak); - pyTransform.append(linebreak); - - pyTransformMap.put(columnName, pyTransform.toString()); + } catch(Exception e) { + logger.error("Error writing AddColumns for Publish Report"); } } } catch(Exception e) { @@ -190,27 +307,93 @@ private void writePyTransforms(Workspace workspace, Worksheet worksheet, PrintWr //Now get all transforms from the map and write them to the writer for(Map.Entry stringStringEntry : pyTransformMap.entrySet()) { pw.print(stringStringEntry.getValue()); - } + } } + private void writeAddNodes(Workspace workspace, Worksheet worksheet, PrintWriter pw) throws IOException { + //Map for py transforms, so only the latest pyTransform for a column gets written + LinkedHashMap pyTransformMap = new LinkedHashMap<>(); + String linebreak = System.getProperty("line.separator"); + + String historyFile = CommandHistory.getHistorySaver(workspace.getId()).getHistoryFilepath(worksheetId); + try { + + + JSONArray history = CommandHistory.getHistorySaver(workspace.getId()).loadHistory(historyFile); + + for(int i=0; iId: `" + node_id + "`").append(linebreak); + pyTransform.append(linebreak); + pyTransformMap.put(nodeLabel, pyTransform.toString()); + } else if(commandName.equals("AddLiteralNodeCommand")) { + String value = HistoryJsonUtil.getStringValue("literalValue", inputParamArr); + String literalType = HistoryJsonUtil.getStringValue("literalType", inputParamArr); + String language = HistoryJsonUtil.getStringValue("language", inputParamArr); + boolean isUri = HistoryJsonUtil.getBooleanValue("isUri", inputParamArr); + + StringBuffer pyTransform = new StringBuffer("#### Literal Node: `" + value + "`"); + pyTransform.append(linebreak); + pyTransform.append("Literal Type: `" + literalType + "`").append(linebreak); + pyTransform.append("
Language: `" + language + "`").append(linebreak); + pyTransform.append("
isUri: `" + isUri + "`").append(linebreak); + + pyTransform.append(linebreak); + pyTransformMap.put(value, pyTransform.toString()); + } + } catch(Exception e) { + logger.error("Error writing AddNodes for Publish Report"); + } + } + } catch(Exception e) { + logger.error("Error reading history file:" + historyFile); + } + + //Now get all transforms from the map and write them to the writer + for(Map.Entry stringStringEntry : pyTransformMap.entrySet()) { + pw.print(stringStringEntry.getValue()); + } + + } - private void writeSemanticTypes(Workspace workspace, Worksheet worksheet, PrintWriter pw) { + private void writeSemanticTypes(VWorkspace vWorkspace, VWorksheet vWorksheet, PrintWriter pw) { pw.println("| Column | Property | Class |"); pw.println("| ----- | -------- | ----- |"); - Alignment alignment = AlignmentManager.Instance().getAlignment(workspace.getId(), worksheet.getId()); + List hNodeIdList = vWorksheet.getHeaderVisibleLeafNodes(); + + String alignmentId = AlignmentManager.Instance().constructAlignmentId( + vWorkspace.getWorkspace().getId(), vWorksheet.getWorksheetId()); + Alignment alignment = AlignmentManager.Instance().getAlignment(alignmentId); + if(alignment != null) { - List columnNodes = Arrays.asList(alignment.getNodesByType(NodeType.ColumnNode).toArray(new Node[0])); - Collections.sort(columnNodes, new Comparator() { - @Override - public int compare(Node n1, Node n2) { - String l1name = getClassName(n1); - String l2name = getClassName(n2); - return l1name.compareTo(l2name); - } - }); + List columnNodes = new ArrayList<>(); + for(String hNodeId: hNodeIdList) { + Node columnNode = alignment.getNodeById(hNodeId); + columnNodes.add(columnNode); + } + Collections.sort(columnNodes, new Comparator() { + @Override + public int compare(Node n1, Node n2) { + String l1name = getClassName(n1); + String l2name = getClassName(n2); + return l1name.compareTo(l2name); + } + }); if(columnNodes != null) { for(Node node : columnNodes) { diff --git a/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/SetWorksheetPropertiesCommand.java b/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/SetWorksheetPropertiesCommand.java index 333726457..ee46abbeb 100644 --- a/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/SetWorksheetPropertiesCommand.java +++ b/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/SetWorksheetPropertiesCommand.java @@ -61,18 +61,27 @@ public String getDescription() { JSONObject propertiesJson = new JSONObject(properties); String desc = ""; String sep = ""; - if (propertiesJson.getBoolean(Property.hasServiceProperties.name())) { + if (propertiesJson.has(Property.hasServiceProperties.name()) && propertiesJson.getBoolean(Property.hasServiceProperties.name())) { desc = "Service"; sep = ", "; } - if (propertiesJson.getBoolean("hasPrefix")) { + if (propertiesJson.has(Property.graphLabel.name()) && + !propertiesJson.getString(Property.graphLabel.name()).isEmpty()) { + desc = desc + sep + "Model Name: " + propertiesJson.getString(Property.graphLabel.name()); + sep = ", "; + } + if (propertiesJson.has("hasPrefix") && propertiesJson.getBoolean("hasPrefix")) { desc = desc + sep + "Prefix: " + propertiesJson.getString(Property.prefix.name()); sep = ", "; } - if (propertiesJson.getBoolean("hasBaseURI")) { + if (propertiesJson.has("hasBaseURI") && propertiesJson.getBoolean("hasBaseURI")) { desc = desc + sep + "Base URI: " + propertiesJson.getString(Property.baseURI.name()); sep = ", "; } + if (propertiesJson.has("hasGithubURL") && propertiesJson.getBoolean("hasGithubURL")) { + desc = desc + sep + "Github URL: " + propertiesJson.getString(Property.GithubURL.name()); + sep = ", "; + } return desc; } @@ -116,6 +125,10 @@ public UpdateContainer doIt(Workspace workspace) throws CommandException { propertiesJson.getString(Property.serviceDataPostMethod.name())); } } + + if (propertiesJson.has(Property.GithubURL.name()) && !propertiesJson.getString(Property.GithubURL.name()).isEmpty()) + props.setPropertyValue(Property.GithubURL, propertiesJson.getString(Property.GithubURL.name())); + if (propertiesJson.getBoolean("hasPrefix")) { props.setPropertyValue(Property.prefix, propertiesJson.getString(Property.prefix.name())); diff --git a/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/SplitColumnByDelimiter.java b/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/SplitColumnByDelimiter.java index c17212d60..f8f3a5f73 100644 --- a/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/SplitColumnByDelimiter.java +++ b/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/SplitColumnByDelimiter.java @@ -13,7 +13,7 @@ import com.kenai.jffi.Array; -import au.com.bytecode.opencsv.CSVReader; +import com.opencsv.CSVReader; import edu.isi.karma.controller.command.selection.SuperSelection; import edu.isi.karma.er.helper.CloneTableUtils; import edu.isi.karma.rep.CellValue; diff --git a/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/ClearSelectionCommand.java b/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/ClearSelectionCommand.java index f79cb629c..ab099f1a7 100644 --- a/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/ClearSelectionCommand.java +++ b/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/ClearSelectionCommand.java @@ -78,9 +78,14 @@ public UpdateContainer doIt(Workspace workspace) throws CommandException { } } } + WorksheetUpdateFactory.detectSelectionStatusChange(worksheetId, workspace, this); - UpdateContainer uc = WorksheetUpdateFactory.createWorksheetHierarchicalAndCleaningResultsUpdates(worksheetId, superSel, workspace.getContextId()); - return uc; + if(!this.isExecutedInBatch()) { + UpdateContainer uc = WorksheetUpdateFactory.createWorksheetHierarchicalAndCleaningResultsUpdates(worksheetId, superSel, workspace.getContextId()); + return uc; + } else { + return new UpdateContainer(); + } } @Override diff --git a/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/OperateSelectionCommand.java b/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/OperateSelectionCommand.java index 5658b0b5c..55e3f136b 100644 --- a/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/OperateSelectionCommand.java +++ b/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/OperateSelectionCommand.java @@ -92,8 +92,12 @@ public UpdateContainer doIt(Workspace workspace) throws CommandException { return getErrorUpdate("The operation is undefined"); } WorksheetUpdateFactory.detectSelectionStatusChange(worksheetId, workspace, this); - UpdateContainer uc = WorksheetUpdateFactory.createWorksheetHierarchicalAndCleaningResultsUpdates(worksheetId, superSel, workspace.getContextId()); - return uc; + if(!this.isExecutedInBatch()) { + UpdateContainer uc = WorksheetUpdateFactory.createWorksheetHierarchicalAndCleaningResultsUpdates(worksheetId, superSel, workspace.getContextId()); + return uc; + } else { + return new UpdateContainer(); + } } @Override diff --git a/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/RefreshSelectionCommand.java b/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/RefreshSelectionCommand.java index 1d139b534..f8035deb3 100644 --- a/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/RefreshSelectionCommand.java +++ b/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/RefreshSelectionCommand.java @@ -10,6 +10,7 @@ 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.ICommand.CommandTag; 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; @@ -37,6 +38,7 @@ public RefreshSelectionCommand(String id, String model, String worksheetId, super(id, model, worksheetId, selectionId); this.hNodeId = hNodeId; addTag(CommandTag.Selection); + addTag(CommandTag.IgnoreInBatch); } @Override diff --git a/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/RefreshSuperSelectionCommand.java b/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/RefreshSuperSelectionCommand.java index 449ed60a6..c38b70704 100644 --- a/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/RefreshSuperSelectionCommand.java +++ b/karma-commands/commands-worksheet/src/main/java/edu/isi/karma/controller/command/worksheet/selection/RefreshSuperSelectionCommand.java @@ -11,6 +11,7 @@ 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.ICommand.CommandTag; import edu.isi.karma.controller.command.selection.Selection; import edu.isi.karma.controller.command.selection.SuperSelection; import edu.isi.karma.controller.history.HistoryJsonUtil.ParameterType; @@ -22,6 +23,7 @@ import edu.isi.karma.rep.Worksheet; import edu.isi.karma.rep.Workspace; import edu.isi.karma.util.CommandInputJSONUtil; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,6 +35,7 @@ public RefreshSuperSelectionCommand(String id, String model, String worksheetId, String selectionId) { super(id, model, worksheetId, selectionId); addTag(CommandTag.Selection); + addTag(CommandTag.IgnoreInBatch); } private class SelectionWithPriority implements Comparable{ diff --git a/karma-common/pom.xml b/karma-common/pom.xml index ac3631279..5f7ed02e8 100644 --- a/karma-common/pom.xml +++ b/karma-common/pom.xml @@ -122,10 +122,11 @@ reflections - - net.sf.opencsv - opencsv - + + com.opencsv + opencsv + 3.8 + org.apache.httpcomponents diff --git a/karma-common/src/main/java/edu/isi/karma/config/ModelingConfiguration.java b/karma-common/src/main/java/edu/isi/karma/config/ModelingConfiguration.java index 3de248bcd..0afeac724 100644 --- a/karma-common/src/main/java/edu/isi/karma/config/ModelingConfiguration.java +++ b/karma-common/src/main/java/edu/isi/karma/config/ModelingConfiguration.java @@ -81,6 +81,7 @@ public class ModelingConfiguration { private Boolean showModelsWithoutMatching; private String defaultProperty = null; + private String graphvizServer = null; private final String newLine = System.getProperty("line.separator"); @@ -163,7 +164,8 @@ public class ModelingConfiguration { "##########################################################################################" + newLine + "" + newLine + "models.display.nomatching=false" + newLine + - "history.store.old=false" + "history.store.old=false" + newLine + + "graphiz.server=http://52.38.65.60/graphviz/" ; @@ -287,9 +289,19 @@ public void load() { if(defaultProperty == null) { //need to add this property to the end PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file, true))); + out.println(); out.println("default.property=http://schema.org/name"); out.close(); } + + graphvizServer = modelingProperties.getProperty("graphviz.server"); + if(graphvizServer == null) { + PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file, true))); + out.println(); + graphvizServer = "http://52.38.65.60/graphviz/"; + out.println("graphviz.server=" + graphvizServer); + out.close(); + } } catch (IOException e) { logger.error("Error occured while reading config file ...", e); System.exit(1); @@ -550,5 +562,8 @@ public void setManualAlignment() knownModelsAlignment = false; } + public String getGraphvizServer() { + return graphvizServer; + } } diff --git a/karma-common/src/main/java/edu/isi/karma/imp/csv/CSVImport.java b/karma-common/src/main/java/edu/isi/karma/imp/csv/CSVImport.java index 63ecebd26..b29b499de 100644 --- a/karma-common/src/main/java/edu/isi/karma/imp/csv/CSVImport.java +++ b/karma-common/src/main/java/edu/isi/karma/imp/csv/CSVImport.java @@ -1,6 +1,6 @@ package edu.isi.karma.imp.csv; -import au.com.bytecode.opencsv.CSVReader; +import com.opencsv.CSVReader; import edu.isi.karma.imp.Import; import edu.isi.karma.rep.*; import edu.isi.karma.rep.HNode.HNodeType; @@ -19,7 +19,7 @@ public class CSVImport extends Import { private static Logger logger = LoggerFactory.getLogger(CSVImport.class); - protected final int headerRowIndex; + protected final int headerRowIndex; protected final int dataStartRowIndex; protected final char delimiter; protected final char quoteCharacter; @@ -63,113 +63,96 @@ public CSVImport(int headerRowIndex, int dataStartRowIndex, public Worksheet generateWorksheet() throws IOException, KarmaException { Table dataTable = getWorksheet().getDataTable(); - BufferedReader br = getLineReader(); - - // Index for row currently being read int rowCount = 0; Map hNodeIdList = new HashMap<>(); - // If no row is present for the column headers - if (headerRowIndex == 0) { - hNodeIdList = addEmptyHeaders(getWorksheet(), getFactory(), br); - if (hNodeIdList == null || hNodeIdList.isEmpty()) { - br.close(); - throw new KarmaException("Error occured while counting header " - + "nodes for the worksheet!"); - } - } + CSVReader reader = getCSVReader(); // Populate the worksheet model - String line = null; - while ((line = br.readLine()) != null) { - logger.debug("Read line: '" + line + "'"); + String[] rowValues = null; + while ((rowValues = reader.readNext()) != null) { + // logger.debug("Read line: '" + line + "'"); // Check for the header row if (rowCount + 1 == headerRowIndex) { - hNodeIdList = addHeaders(getWorksheet(), getFactory(), line, br); + hNodeIdList = addHeaders(getWorksheet(), getFactory(), rowValues, reader); rowCount++; continue; } // Populate the model with data rows if (rowCount + 1 >= dataStartRowIndex) { - boolean added = addRow(getWorksheet(), getFactory(), line, hNodeIdList, dataTable); + boolean added = addRow(getWorksheet(), getFactory(), rowValues, hNodeIdList, dataTable); if(added) { - rowCount++; - - if(maxNumLines > 0 && (rowCount - dataStartRowIndex) >= maxNumLines-1) { - break; - } + rowCount++; + if(maxNumLines > 0 && (rowCount - dataStartRowIndex) >= maxNumLines-1) { + break; + } } continue; } rowCount++; } - br.close(); + reader.close(); getWorksheet().getMetadataContainer().getWorksheetProperties().setPropertyValue(Property.sourceType, SourceTypes.CSV.toString()); return getWorksheet(); } - protected BufferedReader getLineReader() throws IOException { - // Prepare the reader for reading file line by line - + protected BufferedReader getLineReader() throws IOException { + // Prepare the reader for reading file line by line InputStreamReader isr = EncodingDetector.getInputStreamReader(is, encoding); - return new BufferedReader(isr); - } + } + + protected CSVReader getCSVReader() throws IOException { + BufferedReader br = getLineReader(); + return new CSVReader(br, delimiter, quoteCharacter, escapeCharacter); + } private Map addHeaders(Worksheet worksheet, RepFactory fac, - String line, BufferedReader br) throws IOException { + String[] rowValues, CSVReader reader) throws IOException { HTable headers = worksheet.getHeaders(); Map headersMap = new HashMap<>(); - CSVReader reader = new CSVReader(new StringReader(line), delimiter, - quoteCharacter, escapeCharacter); - String[] rowValues = null; - rowValues = reader.readNext(); - - if (rowValues == null || rowValues.length == 0) { - reader.close(); - return addEmptyHeaders(worksheet, fac, br); - } - for (int i = 0; i < rowValues.length; i++) { HNode hNode = null; if (headerRowIndex == 0) { - if (isVisible("Column_" + (i + 1))) - hNode = headers.addHNode("Column_" + (i + 1), HNodeType.Regular, worksheet, fac); + if (isVisible("Column_" + (i + 1))) + hNode = headers.addHNode("Column_" + (i + 1), HNodeType.Regular, worksheet, fac); } else { - if (isVisible(rowValues[i])) - hNode = headers.addHNode(rowValues[i], HNodeType.Regular, worksheet, fac); + if (isVisible(rowValues[i])) + hNode = headers.addHNode(rowValues[i], HNodeType.Regular, worksheet, fac); } if (hNode != null) - headersMap.put(i, hNode.getId()); + headersMap.put(i, hNode.getId()); } - reader.close(); + return headersMap; } - private boolean addRow(Worksheet worksheet, RepFactory fac, String line, - Map hNodeIdMap, Table dataTable) throws IOException { - CSVReader reader = new CSVReader(new StringReader(line), delimiter, - quoteCharacter, escapeCharacter); - String[] rowValues = null; - rowValues = reader.readNext(); + private boolean addRow(Worksheet worksheet, RepFactory fac, String[] rowValues, + Map hNodeIdMap, Table dataTable) throws IOException { + if (rowValues == null || rowValues.length == 0) { - reader.close(); return false; } Row row = dataTable.addRow(fac); int size = hNodeIdMap.size(); if (columnsJson != null) - size = columnsJson.length(); + size = columnsJson.length(); for (int i = 0; i < rowValues.length; i++) { + if(i >= size) { + HTable headers = worksheet.getHeaders(); + HNode hNode = headers.addHNode("Column_" + (i + 1), HNodeType.Regular, worksheet, fac); + hNodeIdMap.put(i, hNode.getId()); + size = hNodeIdMap.size(); + } if (i < size) { - String hNodeId = hNodeIdMap.get(i); - if (hNodeId != null) - row.setValue(hNodeId, rowValues[i], fac); + String hNodeId = hNodeIdMap.get(i); + if (hNodeId != null) + row.setValue(hNodeId, rowValues[i], fac); } else { // TODO Our model does not allow a value to be added to a row // without its associated HNode. In CSVs, there could be case @@ -177,58 +160,17 @@ private boolean addRow(Worksheet worksheet, RepFactory fac, String line, logger.error("More data elements detected in the row than number of headers!"); } } - reader.close(); return true; } - private Map addEmptyHeaders(Worksheet worksheet, - RepFactory fac, BufferedReader br) throws IOException { - HTable headers = worksheet.getHeaders(); - Map headersMap = new HashMap<>(); - - - br.mark(1000000); - br.readLine(); - - // Use the first data row to count the number of columns we need to add - int rowCount = 0; - String line = null; - while (null != (line = br.readLine())) { - if (rowCount + 1 == dataStartRowIndex) { - line = br.readLine(); - CSVReader reader = new CSVReader(new StringReader(line), - delimiter, quoteCharacter, escapeCharacter); - String[] rowValues = null; - try { - rowValues = reader.readNext(); - } catch (IOException e) { - logger.error("Error reading Line:" + line, e); - } - for (int i = 0; i < rowValues.length; i++) { - - HNode hNode = null; - if (isVisible("Column_" + (i + 1))) - hNode = headers.addHNode("Column_" + (i + 1), HNodeType.Regular, - worksheet, fac); - if (hNode != null) - headersMap.put(i, hNode.getId()); - } - reader.close(); - break; - } - rowCount++; - } - br.reset(); - return headersMap; - } private boolean isVisible(String key) { - if (columnsJson == null) - return true; - for (int i = 0; i < columnsJson.length(); i++) { - JSONObject obj = columnsJson.getJSONObject(i); - if (obj.has(key)) - return obj.getBoolean(key); - } - return false; - } + if (columnsJson == null) + return true; + for (int i = 0; i < columnsJson.length(); i++) { + JSONObject obj = columnsJson.getJSONObject(i); + if (obj.has(key)) + return obj.getBoolean(key); + } + return false; + } } \ No newline at end of file diff --git a/karma-common/src/main/java/edu/isi/karma/imp/json/JsonImportValues.java b/karma-common/src/main/java/edu/isi/karma/imp/json/JsonImportValues.java index a34fffc2f..9e76af147 100644 --- a/karma-common/src/main/java/edu/isi/karma/imp/json/JsonImportValues.java +++ b/karma-common/src/main/java/edu/isi/karma/imp/json/JsonImportValues.java @@ -214,6 +214,11 @@ public Iterator getSortedKeysIterator(JSONObject object) { public void addListElement(Object listValue, HTable headers, Table dataTable) throws JSONException { + + if(JSONObject.NULL.equals(listValue)) { + listValue = ""; + } + if (listValue instanceof JSONObject) { if (maxNumLines <= 0 || numObjects < maxNumLines) { Row row = dataTable.addRow(factory); @@ -265,7 +270,8 @@ public void addListElement(Object listValue, HTable headers, } } } else { - logger.error("Cannot handle whatever case is not covered by the if statements. Sorry."); + logger.error("Cannot handle whatever case is not covered by the if statements. Sorry"); + logger.error(listValue.toString()); } } diff --git a/karma-common/src/main/java/edu/isi/karma/modeling/alignment/GraphVizUtil.java b/karma-common/src/main/java/edu/isi/karma/modeling/alignment/GraphVizUtil.java index a7b6296b7..7ebb442bb 100644 --- a/karma-common/src/main/java/edu/isi/karma/modeling/alignment/GraphVizUtil.java +++ b/karma-common/src/main/java/edu/isi/karma/modeling/alignment/GraphVizUtil.java @@ -161,6 +161,8 @@ private static org.kohsuke.graphviz.Graph convertToGraphviz( if (source instanceof ColumnNode) { ColumnNode mappedColumn = (mappingToSourceColumns == null) ? (ColumnNode)source : mappingToSourceColumns.get(source); sourceLabel = mappedColumn.getColumnName(); + } else if(source instanceof LiteralNode) { + sourceLabel = ((LiteralNode)source).getValue(); } else if (nodeLabelType == GraphVizLabelType.Id) sourceLabel = sourceId; else if (nodeLabelType == GraphVizLabelType.LocalId) @@ -196,6 +198,8 @@ else if (source instanceof LiteralNode) // literal if (target instanceof ColumnNode) { ColumnNode mappedColumn = (mappingToSourceColumns == null) ? (ColumnNode)target : mappingToSourceColumns.get(target); targetLabel = mappedColumn.getColumnName(); + } else if(target instanceof LiteralNode) { + targetLabel = ((LiteralNode)target).getValue(); } else if (nodeLabelType == GraphVizLabelType.Id) targetLabel = targetId; else if (nodeLabelType == GraphVizLabelType.LocalId) diff --git a/karma-common/src/main/java/edu/isi/karma/rdf/RdfGenerator.java b/karma-common/src/main/java/edu/isi/karma/rdf/RdfGenerator.java index b1af576db..855936867 100644 --- a/karma-common/src/main/java/edu/isi/karma/rdf/RdfGenerator.java +++ b/karma-common/src/main/java/edu/isi/karma/rdf/RdfGenerator.java @@ -76,6 +76,7 @@ protected void applyHistoryToWorksheet(Workspace workspace, Worksheet worksheet, try { List tags = new ArrayList<>(); + tags.add(CommandTag.Selection); tags.add(CommandTag.Transformation); List ignoreTags = new ArrayList<>(); diff --git a/karma-common/src/main/java/edu/isi/karma/rep/metadata/WorksheetProperties.java b/karma-common/src/main/java/edu/isi/karma/rep/metadata/WorksheetProperties.java index d07e9135f..fe18fe779 100644 --- a/karma-common/src/main/java/edu/isi/karma/rep/metadata/WorksheetProperties.java +++ b/karma-common/src/main/java/edu/isi/karma/rep/metadata/WorksheetProperties.java @@ -44,7 +44,8 @@ public enum Property { graphName, serviceUrl, hasServiceProperties, sourceType, modelUrl, modelRepository, modelContext, baseURI, prefix, graphLabel, inputColumns, - outputColumns, oldCommandHistory + outputColumns, oldCommandHistory, + GithubURL } public enum SourceTypes { diff --git a/karma-web/src/main/webapp/index.jsp b/karma-web/src/main/webapp/index.jsp index 692590aed..65b52a01b 100755 --- a/karma-web/src/main/webapp/index.jsp +++ b/karma-web/src/main/webapp/index.jsp @@ -183,6 +183,7 @@ and related projects, please see: http://www.isi.edu/integration