package org.aksw.jena_sparql_api.batch.processor; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; import java.util.Set; import org.aksw.commons.collections.SetUtils; import org.aksw.commons.collections.diff.Diff; import org.aksw.jena_sparql_api.modifier.Modifier; import org.aksw.jena_sparql_api.utils.SetDatasetGraph; import org.springframework.batch.item.ItemProcessor; import com.google.common.collect.Sets; import org.apache.jena.graph.Triple; import org.apache.jena.query.Dataset; import org.apache.jena.query.DatasetFactory; import org.apache.jena.rdf.model.Resource; import org.apache.jena.sparql.core.DatasetGraph; import org.apache.jena.sparql.core.DatasetGraphFactory; import org.apache.jena.sparql.core.Quad; public class ItemProcessorDatasetDiff implements ItemProcessor<Entry<Resource, Dataset>, Diff<Set<Quad>>> { private Modifier<Dataset> modifier; public ItemProcessorDatasetDiff(Modifier<Dataset> modifier) { this.modifier = modifier; } @Override public Diff<Set<Quad>> process(Entry<Resource, Dataset> entry) throws Exception { Dataset base = entry.getValue(); DatasetGraph baseGraph = base.asDatasetGraph(); DatasetGraph cloneGraph = DatasetGraphFactory.createMem(); Iterator<Quad> it = baseGraph.find(); while(it.hasNext()) { Quad q = it.next(); cloneGraph.add(q); } Dataset clone = DatasetFactory.create(cloneGraph); modifier.apply(clone); Set<Quad> baseQuads = SetDatasetGraph.wrap(base.asDatasetGraph()); Set<Quad> cloneQuads = SetDatasetGraph.wrap(clone.asDatasetGraph()); //Diff<Set<Quad>> Diff<Set<Quad>> result = createDiff(baseQuads, cloneQuads); return result; } public static <T> Diff<Set<T>> createDiff(Collection<T> before, Collection<T> after) { Set<T> x = SetUtils.asSet(before); Set<T> y = SetUtils.asSet(after); Set<T> added = new HashSet<T>(Sets.difference(x, y)); Set<T> removed = new HashSet<T>(Sets.difference(y, x)); Diff<Set<T>> result = Diff.create(added, removed); return result; } }