VIVO-1009 Use ModelMakerWithPersistenEmptyModels so new models show up.

With ListCachingModelMaker, the filegraph models did not show up until you started VIVO for a second time.
Also, models that you create by the SPARQL Update API are not evident until restarting.
This fixes that.
This commit is contained in:
Jim Blake 2015-03-30 16:36:11 -04:00
parent abf3d00996
commit b0b6e9dbc9
7 changed files with 352 additions and 10 deletions

View file

@ -18,7 +18,11 @@ import com.hp.hpl.jena.util.iterator.WrappedIterator;
* that remove a model must remove its name from the list.
*
* This is a useful decorator for some ModelMakers where listModels() is a
* costly operation.
* costly operation. The drawback is that it will not see models that were
* created at a lower level; perhaps by RDFServiceDataset.getNamedModel().
*
* If listModels() is not costly, you might be better off with a
* ModelMakerWithPersistentEmptyModels.
*/
public class ListCachingModelMaker extends AbstractModelMakerDecorator {
private final Set<String> modelNames;

View file

@ -0,0 +1,115 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.modelaccess.adapters;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelMaker;
import com.hp.hpl.jena.rdf.model.ModelReader;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import com.hp.hpl.jena.util.iterator.WrappedIterator;
/**
* This ModelMaker will remember the URIs of models you create, even if you
* don't add triples to them. Of course, when VIVO is shut down, this ModelMaker
* forgets.
*
* This is a useful decorator for some triple stores which do not remember empty
* models. SDB, for example. With this decorator, a GUI can offer to let you
* create a model, and then offer to let you add triples to it. Without this
* decorator, you would need to do that in a single step.
*
* If you are dealing with a triple store where listModels() is a costly
* operation, you might be better off using a ListCachingModelMaker instead. The
* drawback is that ListCachingModelMaker will not see models that were created
* at a lower level; perhaps by RDFServiceDataset.getNamedModel().
*
* The methods that create a model must add its name to the list. The methods
* that remove a model must remove its name from the list.
*/
public class ModelMakerWithPersistentEmptyModels extends
AbstractModelMakerDecorator {
private final Set<String> modelNames = new HashSet<>();
public ModelMakerWithPersistentEmptyModels(ModelMaker inner) {
super(inner);
}
@Override
public boolean hasModel(String name) {
return modelNames.contains(name) || super.hasModel(name);
}
@Override
public ExtendedIterator<String> listModels() {
Set<String> allNames = new TreeSet<>(modelNames);
allNames.addAll(super.listModels().toList());
return WrappedIterator.create(allNames.iterator());
}
@Override
public Model getModel(String URL) {
Model m = super.getModel(URL);
if (m != null) {
addModelNameIfNeeded(URL);
}
return m;
}
@Override
public Model getModel(String URL, ModelReader loadIfAbsent) {
Model m = super.getModel(URL, loadIfAbsent);
addModelNameIfNeeded(URL);
return m;
}
@Override
public Model createModel(String name, boolean strict) {
Model m = super.createModel(name, strict);
addModelNameIfNeeded(name);
return m;
}
@Override
public Model createModel(String name) {
return createModel(name, false);
}
@Override
public Model openModel(String name) {
Model m = super.openModel(name);
addModelNameIfNeeded(name);
return m;
}
@Override
public Model openModelIfPresent(String name) {
Model m = super.openModelIfPresent(name);
if (m != null) {
addModelNameIfNeeded(name);
}
return m;
}
@Override
public Model openModel(String name, boolean strict) {
Model m = super.openModel(name, strict);
addModelNameIfNeeded(name);
return m;
}
@Override
public void removeModel(String name) {
super.removeModel(name);
modelNames.remove(name);
}
private void addModelNameIfNeeded(String name) {
if (!super.listModels().toList().contains(name)) {
modelNames.add(name);
}
}
}

View file

@ -32,8 +32,8 @@ import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ModelMakerWithPersistentEmptyModels;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.MaskingOntModelCache;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.ModelMakerOntModelCache;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
@ -164,7 +164,7 @@ public class ContentTripleSourceSDB extends ContentTripleSource {
}
private ModelMaker createModelMaker() {
return addContentDecorators(new ListCachingModelMaker(
return addContentDecorators(new ModelMakerWithPersistentEmptyModels(
new MemoryMappingModelMaker(new RDFServiceModelMaker(
this.rdfService), SMALL_CONTENT_MODELS)));
}
@ -201,7 +201,7 @@ public class ContentTripleSourceSDB extends ContentTripleSource {
public OntModelCache getShortTermOntModels(RDFService shortTermRdfService,
OntModelCache longTermOntModelCache) {
ModelMakerOntModelCache shortCache = new ModelMakerOntModelCache(
addContentDecorators(new ListCachingModelMaker(
addContentDecorators(new ModelMakerWithPersistentEmptyModels(
new RDFServiceModelMaker(shortTermRdfService))));
MaskingOntModelCache combinedCache = new MaskingOntModelCache(

View file

@ -7,8 +7,8 @@ import com.hp.hpl.jena.rdf.model.ModelMaker;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ModelMakerWithPersistentEmptyModels;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
import edu.cornell.mannlib.vitro.webapp.modules.Application;
import edu.cornell.mannlib.vitro.webapp.modules.ComponentStartupStatus;
@ -102,7 +102,7 @@ public class ContentTripleSourceSPARQL extends ContentTripleSource {
}
private ModelMaker createModelMaker() {
return addContentDecorators(new ListCachingModelMaker(
return addContentDecorators(new ModelMakerWithPersistentEmptyModels(
new MemoryMappingModelMaker(new RDFServiceModelMaker(
getRDFService()), SMALL_CONTENT_MODELS)));
}

View file

@ -12,8 +12,8 @@ import com.hp.hpl.jena.tdb.TDB;
import edu.cornell.mannlib.vitro.webapp.application.ApplicationUtils;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ModelMakerWithPersistentEmptyModels;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
import edu.cornell.mannlib.vitro.webapp.modules.Application;
import edu.cornell.mannlib.vitro.webapp.modules.ComponentStartupStatus;
@ -78,7 +78,7 @@ public class ConfigurationTripleSourceTDB extends ConfigurationTripleSource {
}
private ModelMaker createModelMaker() {
ModelMaker longTermModelMaker = new ListCachingModelMaker(
ModelMaker longTermModelMaker = new ModelMakerWithPersistentEmptyModels(
new MemoryMappingModelMaker(new RDFServiceModelMaker(
this.unclosableRdfService), CONFIGURATION_MODELS));
return addConfigurationDecorators(longTermModelMaker);

View file

@ -11,8 +11,8 @@ import com.hp.hpl.jena.tdb.TDB;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ModelMakerWithPersistentEmptyModels;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
import edu.cornell.mannlib.vitro.webapp.modules.Application;
import edu.cornell.mannlib.vitro.webapp.modules.ComponentStartupStatus;
@ -100,7 +100,7 @@ public class ContentTripleSourceTDB extends ContentTripleSource {
}
private ModelMaker createModelMaker() {
return addContentDecorators(new ListCachingModelMaker(
return addContentDecorators(new ModelMakerWithPersistentEmptyModels(
new MemoryMappingModelMaker(new RDFServiceModelMaker(
this.unclosableRdfService), SMALL_CONTENT_MODELS)));
}