package eu.lod2.rsine.service;
import eu.lod2.rsine.changesetstore.ChangeSetStore;
import eu.lod2.rsine.queryhandling.IQueryDispatcher;
import eu.lod2.rsine.remotenotification.RemoteNotificationServiceBase;
import eu.lod2.util.Namespaces;
import org.openrdf.model.Model;
import org.openrdf.model.URI;
import org.openrdf.model.impl.StatementImpl;
import org.openrdf.model.impl.URIImpl;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.repository.RepositoryException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class PersistAndNotifyProvider {
private final Logger logger = LoggerFactory.getLogger(PersistAndNotifyProvider.class);
private URI lastPersistedChangeSetUri;
@Autowired
private ChangeSetStore changeSetStore;
@Autowired
private IQueryDispatcher queryDispatcher;
@Autowired
private RemoteNotificationServiceBase remoteNotificationService;
public synchronized void persistAndNotify(Model changeSet, boolean notifyOnlyLocal) {
try {
persistChangeSet(changeSet);
queryDispatcher.trigger();
if (!notifyOnlyLocal) remoteNotificationService.announce(changeSet);
}
catch (RepositoryException e) {
logger.error("Error persisting changeset to changeset store", e);
}
}
private void persistChangeSet(Model changeSet) throws RepositoryException {
addPrecedingChangeSet(changeSet);
changeSetStore.persistChangeSet(changeSet);
lastPersistedChangeSetUri = getChangeSetUri(changeSet);
}
private void addPrecedingChangeSet(Model changeSet) {
if (lastPersistedChangeSetUri != null) {
changeSet.add(new StatementImpl(getChangeSetUri(changeSet),
new URIImpl(Namespaces.CS_NAMESPACE.getName() + "precedingChangeSet"),
lastPersistedChangeSetUri));
}
}
private URI getChangeSetUri(Model changeSet) {
Model typeSubjects = changeSet.filter(null, RDF.TYPE, new URIImpl(Namespaces.CS_NAMESPACE.getName() + "ChangeSet"));
return (URI) typeSubjects.subjects().iterator().next();
}
}