diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingModel.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingModel.java index cce2808d4..695295933 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingModel.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingModel.java @@ -26,24 +26,33 @@ public class BulkUpdatingModel extends AbstractModelDecorator { protected BulkUpdatingModel(Model m) { super(m); - Graph graph = m.getGraph(); - if (graph instanceof RDFServiceGraph) { - updater = new RDFServiceBulkUpdater((RDFServiceGraph)graph); - } else if (graph instanceof SparqlGraph) { - updater = new SparqlBulkUpdater((SparqlGraph)graph); + if (m instanceof BulkUpdatingModel) { + this.updater = ((BulkUpdatingModel) m).updater; } else { - updater = null; + Graph graph = GraphUtils.unwrapUnionGraphs(m.getGraph()); + if (graph instanceof RDFServiceGraph) { + updater = new RDFServiceBulkUpdater((RDFServiceGraph) graph); + } else if (graph instanceof SparqlGraph) { + updater = new SparqlBulkUpdater((SparqlGraph) graph); + } else { + updater = null; + } } } - protected BulkUpdatingModel(Model m, Graph graph) { + protected BulkUpdatingModel(Model m, Model baseModel) { super(m); - if (graph instanceof RDFServiceGraph) { - updater = new RDFServiceBulkUpdater((RDFServiceGraph)graph); - } else if (graph instanceof SparqlGraph) { - updater = new SparqlBulkUpdater((SparqlGraph)graph); + if (baseModel instanceof BulkUpdatingModel) { + this.updater = ((BulkUpdatingModel) baseModel).updater; } else { - updater = null; + Graph graph = GraphUtils.unwrapUnionGraphs(baseModel.getGraph()); + if (graph instanceof RDFServiceGraph) { + updater = new RDFServiceBulkUpdater((RDFServiceGraph) graph); + } else if (graph instanceof SparqlGraph) { + updater = new SparqlBulkUpdater((SparqlGraph) graph); + } else { + updater = null; + } } } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingOntModel.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingOntModel.java index 9fb336c6d..8eb1521fe 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingOntModel.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingOntModel.java @@ -27,24 +27,33 @@ public class BulkUpdatingOntModel extends AbstractOntModelDecorator { protected BulkUpdatingOntModel(OntModel m) { super(m); - Graph graph = m.getGraph(); - if (graph instanceof RDFServiceGraph) { - updater = new RDFServiceBulkUpdater((RDFServiceGraph)graph); - } else if (graph instanceof SparqlGraph) { - updater = new SparqlBulkUpdater((SparqlGraph)graph); + if (m instanceof BulkUpdatingOntModel) { + this.updater = ((BulkUpdatingOntModel) m).updater; } else { - updater = null; + Graph graph = GraphUtils.unwrapUnionGraphs(m.getGraph()); + if (graph instanceof RDFServiceGraph) { + updater = new RDFServiceBulkUpdater((RDFServiceGraph) graph); + } else if (graph instanceof SparqlGraph) { + updater = new SparqlBulkUpdater((SparqlGraph) graph); + } else { + updater = null; + } } } - protected BulkUpdatingOntModel(OntModel m, Graph graph) { + protected BulkUpdatingOntModel(OntModel m, OntModel baseModel) { super(m); - if (graph instanceof RDFServiceGraph) { - updater = new RDFServiceBulkUpdater((RDFServiceGraph)graph); - } else if (graph instanceof SparqlGraph) { - updater = new SparqlBulkUpdater((SparqlGraph)graph); + if (baseModel instanceof BulkUpdatingOntModel) { + this.updater = ((BulkUpdatingOntModel) baseModel).updater; } else { - updater = null; + Graph graph = GraphUtils.unwrapUnionGraphs(baseModel.getGraph()); + if (graph instanceof RDFServiceGraph) { + updater = new RDFServiceBulkUpdater((RDFServiceGraph) graph); + } else if (graph instanceof SparqlGraph) { + updater = new SparqlBulkUpdater((SparqlGraph) graph); + } else { + updater = null; + } } } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/GraphUtils.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/GraphUtils.java new file mode 100644 index 000000000..d681ad27b --- /dev/null +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/GraphUtils.java @@ -0,0 +1,21 @@ +/* $This file is distributed under the terms of the license in LICENSE$ */ + +package edu.cornell.mannlib.vitro.webapp.rdfservice.adapters; + +import org.apache.jena.graph.Graph; +import org.apache.jena.graph.compose.MultiUnion; + +import java.util.List; + +final public class GraphUtils { + public static Graph unwrapUnionGraphs(Graph graph) { + if (graph != null && graph instanceof MultiUnion) { + List subGraphs = ((MultiUnion)graph).getSubGraphs(); + if (subGraphs == null || subGraphs.isEmpty()) { + return ((MultiUnion)graph).getBaseGraph(); + } + } + + return graph; + } +} diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/VitroModelFactory.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/VitroModelFactory.java index 1f15a29e9..4b5dbd2ad 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/VitroModelFactory.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/VitroModelFactory.java @@ -4,10 +4,13 @@ package edu.cornell.mannlib.vitro.webapp.rdfservice.adapters; import static org.apache.jena.ontology.OntModelSpec.OWL_MEM; +import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceGraph; +import edu.cornell.mannlib.vitro.webapp.dao.jena.SparqlGraph; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.jena.graph.Graph; +import org.apache.jena.graph.compose.MultiUnion; import org.apache.jena.graph.compose.Union; import org.apache.jena.ontology.OntModel; import org.apache.jena.ontology.impl.OntModelImpl; @@ -17,6 +20,8 @@ import org.apache.jena.rdf.model.impl.ModelCom; import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString; +import java.util.List; + /** * Make models that will do proper bulk updates. */ @@ -46,7 +51,7 @@ public class VitroModelFactory { Model unionModel = ModelFactory.createModelForGraph(unionGraph); - return new BulkUpdatingModel(unionModel, baseGraph); + return new BulkUpdatingModel(unionModel, baseModel); } public static OntModel createUnion(OntModel baseModel, OntModel plusModel) { @@ -58,7 +63,8 @@ public class VitroModelFactory { Model unionModel = ModelFactory.createModelForGraph(unionGraph); OntModel unionOntModel = ModelFactory.createOntologyModel(OWL_MEM, unionModel); - return new BulkUpdatingOntModel(unionOntModel, baseGraph); + + return new BulkUpdatingOntModel(unionOntModel, baseModel); } public static Model createModelForGraph(Graph g) {