package org.aksw.jena_sparql_api.update; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.aksw.commons.collections.diff.Diff; import org.aksw.commons.util.strings.StringUtils; import org.aksw.jena_sparql_api.changeset.ChangeSet; import org.aksw.jena_sparql_api.changeset.ChangeSetMetadata; import org.aksw.jena_sparql_api.changeset.ChangeSetUtils; import org.aksw.jena_sparql_api.core.DatasetListener; import org.aksw.jena_sparql_api.core.QueryExecutionFactory; import org.aksw.jena_sparql_api.core.SparqlService; import org.aksw.jena_sparql_api.core.SparqlServiceReference; import org.aksw.jena_sparql_api.core.UpdateContext; import org.aksw.jena_sparql_api.core.UpdateExecutionFactory; import org.aksw.jena_sparql_api.core.utils.UpdateExecutionUtils; import org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.sparql.core.DatasetDescription; import org.apache.jena.sparql.core.Quad; public class DatasetListenerTrack implements DatasetListener { //private Sink<Diff<? extends Iterable<Quad>>> sink; //private UpdateExecutionFactory uef; private SparqlService trackerService; private ChangeSetMetadata changesetMetadata; private String prefix; public DatasetListenerTrack(SparqlService trackerService) { this(trackerService, new ChangeSetMetadata()); } public DatasetListenerTrack(SparqlService trackerService, ChangeSetMetadata changesetMetadata) { super(); this.trackerService = trackerService; this.changesetMetadata = changesetMetadata; } @Override public void onPreModify(Diff<Set<Quad>> quadDiff, UpdateContext updateContext) { SparqlService sparqlService = updateContext.getSparqlService(); DatasetDescription datasetDescription = sparqlService.getDatasetDescription(); SparqlServiceReference ssr = new SparqlServiceReference(sparqlService.getServiceUri(), datasetDescription); Map<Node, Diff<Set<Triple>>> tripleDiff = DiffQuadUtils.partitionQuads(quadDiff); // Note the prefix must include service and target graph information String serviceUri = ssr.getServiceURL(); prefix = "http://example.org/changeset-"; Model finalModel = ModelFactory.createDefaultModel(); for(Entry<Node, Diff<Set<Triple>>> entry : tripleDiff.entrySet()) { Node g = entry.getKey(); String graphUri = g.getURI(); if(Quad.defaultGraphIRI.equals(g) || Quad.defaultGraphNodeGenerated.equals(g)) { // g = DatasetDescriptionUtils.getSingleDefaultGraph(datasetDescription); // if(g == null) { // throw new RuntimeException("A single default graph was expected, got: " + DatasetDescriptionUtils.toString(datasetDescription)); // } throw new RuntimeException("Should not happen - default graph uris are assumed to have been replaced"); } String p = prefix + StringUtils.urlEncode(serviceUri) + "-" + StringUtils.urlEncode(graphUri) + "-"; Diff<Set<Triple>> diff = entry.getValue(); QueryExecutionFactory qef = trackerService.getQueryExecutionFactory(); Map<Node, ChangeSet> changesets = ChangeSetUtils.createChangeSets(qef, serviceUri, graphUri, changesetMetadata, diff, p); for(ChangeSet changeset : changesets.values()) { Model model = ModelFactory.createDefaultModel(); ChangeSetUtils.write(model, changeset); ChangeSetUtils.enrichWithSource(model, g, ssr); finalModel.add(model); } } UpdateExecutionFactory uef = trackerService.getUpdateExecutionFactory(); UpdateExecutionUtils.executeInsert(uef, finalModel); //sink.send(diff); } }