package eu.lod2.rsine.service; import eu.lod2.util.Namespaces; import org.openrdf.model.*; import org.openrdf.model.impl.StatementImpl; import org.openrdf.model.impl.TreeModel; import org.openrdf.model.impl.ValueFactoryImpl; import org.openrdf.model.vocabulary.RDF; import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.Date; import java.util.HashSet; @Component public class ChangeSetCreator { private final ValueFactory valueFactory = ValueFactoryImpl.getInstance(); public Model assembleChangeset(Statement affectedStatement, Statement secondaryStatement, String changeType) { Model model = new TreeModel(new HashSet<Namespace>(Arrays.asList(Namespaces.RSINE_NAMESPACE, Namespaces.CS_NAMESPACE))); URI changeSet = valueFactory.createURI( Namespaces.RSINE_NAMESPACE.getName(), "cs" +System.currentTimeMillis()+"_" +Math.round(Math.random() * 1000)); model.add(new StatementImpl(changeSet, RDF.TYPE, valueFactory.createURI(Namespaces.CS_NAMESPACE.getName(), "ChangeSet"))); model.add(new StatementImpl(changeSet, valueFactory.createURI(Namespaces.CS_NAMESPACE.getName(), "createdDate"), valueFactory.createLiteral(new Date()))); model.add(new StatementImpl(changeSet, valueFactory.createURI(Namespaces.RSINE_NAMESPACE.getName(), "createdTimeStamp"), valueFactory.createLiteral(System.currentTimeMillis()))); if (changeType.equals(ChangeTripleService.CHANGETYPE_REMOVE)) { addActionStatement(model, changeSet, affectedStatement, "removal"); } else if (changeType.equals(ChangeTripleService.CHANGETYPE_ADD)) { addActionStatement(model, changeSet, affectedStatement, "addition"); } else if (changeType.equals(ChangeTripleService.CHANGETYPE_UPDATE)) { addActionStatement(model, changeSet, affectedStatement, "removal"); addActionStatement(model, changeSet, secondaryStatement, "addition"); } return model; } private void addActionStatement(Graph graph, Resource changeSet, Statement statement, String action) { graph.add(new StatementImpl(changeSet, valueFactory.createURI(Namespaces.CS_NAMESPACE.getName(), action), createStatementNode(statement, graph))); } private BNode createStatementNode(Statement affectedStatement, Graph graph) { BNode statementNode = valueFactory.createBNode(); graph.add(new StatementImpl(statementNode, RDF.TYPE, RDF.STATEMENT)); graph.add(new StatementImpl(statementNode, RDF.SUBJECT, affectedStatement.getSubject())); graph.add(new StatementImpl(statementNode, RDF.PREDICATE, affectedStatement.getPredicate())); graph.add(new StatementImpl(statementNode, RDF.OBJECT, affectedStatement.getObject())); return statementNode; } }