Move event listening to RDFServiceGraph level to avoid adding a new redundant listener each time a model is made for an existing RDFServiceGraph. Resolve https://jira.lyrasis.org/browse/VIVO-1976
This commit is contained in:
parent
48297bba56
commit
0df4231b41
2 changed files with 76 additions and 18 deletions
|
@ -12,10 +12,10 @@ import java.util.function.Supplier;
|
|||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.apache.jena.graph.Capabilities;
|
||||
import org.apache.jena.graph.Graph;
|
||||
import org.apache.jena.graph.GraphEventManager;
|
||||
import org.apache.jena.graph.GraphListener;
|
||||
import org.apache.jena.graph.GraphStatisticsHandler;
|
||||
import org.apache.jena.graph.Node;
|
||||
import org.apache.jena.graph.TransactionHandler;
|
||||
|
@ -23,7 +23,6 @@ import org.apache.jena.graph.Triple;
|
|||
import org.apache.jena.graph.impl.GraphWithPerform;
|
||||
import org.apache.jena.graph.impl.SimpleEventManager;
|
||||
import org.apache.jena.query.QuerySolution;
|
||||
import org.apache.jena.rdf.listeners.StatementListener;
|
||||
import org.apache.jena.rdf.model.Model;
|
||||
import org.apache.jena.rdf.model.ModelFactory;
|
||||
import org.apache.jena.rdf.model.StmtIterator;
|
||||
|
@ -404,7 +403,18 @@ public class RDFServiceGraph implements GraphWithPerform {
|
|||
@Override
|
||||
public GraphEventManager getEventManager() {
|
||||
if (eventManager == null) {
|
||||
eventManager = new SimpleEventManager(this);
|
||||
eventManager = new SimpleEventManager() {
|
||||
@Override
|
||||
public void notifyEvent(Graph g, Object event) {
|
||||
ChangeSet changeSet = rdfService.manufactureChangeSet();
|
||||
changeSet.addPreChangeEvent(event);
|
||||
try {
|
||||
rdfService.changeSetUpdate(changeSet);
|
||||
} catch (RDFServiceException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
return eventManager;
|
||||
}
|
||||
|
@ -590,21 +600,7 @@ public class RDFServiceGraph implements GraphWithPerform {
|
|||
}
|
||||
|
||||
public static Model createRDFServiceModel(final RDFServiceGraph g) {
|
||||
Model m = VitroModelFactory.createModelForGraph(g);
|
||||
m.register(new StatementListener() {
|
||||
@Override
|
||||
public void notifyEvent(Model m, Object event) {
|
||||
ChangeSet changeSet = g.getRDFService().manufactureChangeSet();
|
||||
changeSet.addPreChangeEvent(event);
|
||||
try {
|
||||
g.getRDFService().changeSetUpdate(changeSet);
|
||||
} catch (RDFServiceException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
return m;
|
||||
return VitroModelFactory.createModelForGraph(g);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
package edu.cornell.mannlib.vitro.webapp.dao.jena;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.apache.jena.rdf.model.Model;
|
||||
import org.apache.jena.rdf.model.ModelFactory;
|
||||
import org.junit.Test;
|
||||
|
||||
import edu.cornell.mannlib.vitro.testing.AbstractTestClass;
|
||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.ChangeListener;
|
||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.ModelChange;
|
||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
|
||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException;
|
||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.model.RDFServiceModel;
|
||||
|
||||
|
||||
public class RDFServiceGraphTest extends AbstractTestClass {
|
||||
|
||||
@Test
|
||||
/**
|
||||
* Test that creating a new model with the same underlying RDFServiceGraph
|
||||
* does not result in a new listener registered on that graph. No matter
|
||||
* how many models have been created using a given RDFServiceGraph, an event
|
||||
* sent to the last-created model should be heard only once by the
|
||||
* RDFService.
|
||||
* @throws RDFServiceException
|
||||
*/
|
||||
public void testEventListening() throws RDFServiceException {
|
||||
Model m = ModelFactory.createDefaultModel();
|
||||
RDFService rdfService = new RDFServiceModel(m);
|
||||
EventsCounter counter = new EventsCounter();
|
||||
rdfService.registerListener(counter);
|
||||
RDFServiceGraph g = new RDFServiceGraph(rdfService);
|
||||
Model model = null;
|
||||
for (int i = 0; i < 100; i++) {
|
||||
model = RDFServiceGraph.createRDFServiceModel(g);
|
||||
}
|
||||
model.notifyEvent("event");
|
||||
assertEquals(1, counter.getCount());
|
||||
}
|
||||
|
||||
private class EventsCounter implements ChangeListener {
|
||||
|
||||
private int count = 0;
|
||||
|
||||
public int getCount() {
|
||||
return count;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyModelChange(ModelChange modelChange) {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyEvent(String graphURI, Object event) {
|
||||
count++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Reference in a new issue