package edu.isi.karma.controller.command.alignment; import java.io.PrintWriter; import java.io.StringWriter; import java.net.URL; import java.util.List; import java.util.Scanner; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.ResIterator; import com.hp.hpl.jena.rdf.model.Resource; 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.UpdateContainer; import edu.isi.karma.er.helper.TripleStoreUtil; import edu.isi.karma.kr2rml.mapping.R2RMLMappingIdentifier; import edu.isi.karma.kr2rml.mapping.WorksheetR2RMLJenaModelParser; import edu.isi.karma.modeling.Uris; import edu.isi.karma.rep.Workspace; import edu.isi.karma.view.VWorkspace; public class SaveR2RMLModelCommand extends Command{ private String modelUrl; private String tripleStoreUrl; private String graphContext; private String collection; private String graphBaseUrl = ""; private boolean successful; private static Logger logger = LoggerFactory.getLogger(SaveR2RMLModelCommand.class); protected SaveR2RMLModelCommand(String id, String model, String modelUrl, String url, String context, String collection) { super(id, model); this.modelUrl = modelUrl; this.tripleStoreUrl = url; this.graphContext = context; this.collection = collection; successful = false; } private enum JsonKeys { updateType, fileUrl, worksheetId } @Override public String getCommandName() { return this.getClass().getSimpleName(); } @Override public String getTitle() { return "Save R2RML Model"; } @Override public String getDescription() { return "Save " + modelUrl; } @Override public CommandType getCommandType() { return CommandType.notInHistory; } public boolean getSuccessful() { return successful; } @Override public UpdateContainer doIt(Workspace workspace) throws CommandException { UpdateContainer uc = new UpdateContainer(); if (collection.compareTo("Collection") == 0) { try { URL url = new URL(graphContext); graphBaseUrl = url.getProtocol() + "://" + url.getHost() + "/worksheets/"; Scanner in = new Scanner(url.openStream()); JSONArray array = new JSONArray(in.nextLine()); in.close(); boolean result = true; for (int i = 0; i < array.length(); i++) { JSONObject obj = array.getJSONObject(i); String modelUrl = obj.getString("url"); String context = graphContext; if (context == null || context.trim().isEmpty()) { String filename = modelUrl.substring(modelUrl.indexOf('-') + 1); int location = filename.indexOf("-auto-model.ttl"); if (location == -1) location = filename.indexOf("-model.ttl"); filename = filename.substring(0, location); context = graphBaseUrl + filename; } result &= saveMapping(modelUrl, context); //System.out.println("here: " + graphBaseUrl + filename); } if (result) { logger.info("Saved collection to triple store"); uc.add(new AbstractUpdate() { public void generateJson(String prefix, PrintWriter pw, VWorkspace vWorkspace) { JSONObject outputObject = new JSONObject(); try { outputObject.put(JsonKeys.updateType.name(), "SaveCollection"); pw.println(outputObject.toString()); } catch (JSONException e) { e.printStackTrace(); logger.error("Error occured while generating JSON!"); } } }); successful = result; return uc; } }catch(Exception e) { System.out.println("here"); e.printStackTrace(); logger.error("Error occured while saving R2RML Model!"); return new UpdateContainer(new ErrorUpdate("Error occured while saving R2RML model!")); } } else { boolean result = saveMapping(modelUrl, graphContext); if (result) { logger.info("Saved model to triple store"); uc.add(new AbstractUpdate() { public void generateJson(String prefix, PrintWriter pw, VWorkspace vWorkspace) { JSONObject outputObject = new JSONObject(); try { outputObject.put(JsonKeys.updateType.name(), "SaveModel"); pw.println(outputObject.toString()); } catch (JSONException e) { e.printStackTrace(); logger.error("Error occured while generating JSON!"); } } }); successful = result; return uc; } } logger.error("Error occured while saving R2RML Model!"); return new UpdateContainer(new ErrorUpdate("Error occured while saving R2RML model!")); } @Override public UpdateContainer undoIt(Workspace workspace) { return null; } private boolean saveMapping(String modelUrl, String graphContext) { try { TripleStoreUtil utilObj = new TripleStoreUtil(); if (graphContext == null || graphContext.trim().compareTo("") == 0) return false; URL url = new URL(modelUrl); StringWriter test = new StringWriter(); R2RMLMappingIdentifier modelId = new R2RMLMappingIdentifier(modelUrl, url, null); Model model = WorksheetR2RMLJenaModelParser.loadSourceModelIntoJenaModel(modelId); Property rdfTypeProp = model.getProperty(Uris.RDF_TYPE_URI); RDFNode node = model.getResource(Uris.KM_R2RML_MAPPING_URI); ResIterator res = model.listResourcesWithProperty(rdfTypeProp, node); List<Resource> resList = res.toList(); for(Resource r: resList) { model.add(r, model.getProperty(Uris.OWL_SAMEAS_URI), model.getResource(url.toString())); } model.write(test,"TTL"); model.close(); String content = test.getBuffer().toString(); test.close(); if (utilObj.testURIExists(tripleStoreUrl, graphContext, modelUrl)) { utilObj.deleteMappingFromTripleStore(tripleStoreUrl, graphContext, modelUrl); } boolean result = utilObj.saveToStoreFromString(content, tripleStoreUrl, graphContext, new Boolean(false), null); return result; }catch (Exception e) { return false; } } }