VIVO-33 fix to allow RDB models to be uploaded to via ingest tools

This commit is contained in:
brianjlowe 2013-03-11 17:08:07 -04:00
parent e1f2832fbd
commit 811de3ec9f
3 changed files with 53 additions and 22 deletions

View file

@ -116,6 +116,9 @@ public class JenaIngestController extends BaseEditController {
private static final String RENAME_RESOURCE = "/jenaIngest/renameResource.jsp";
private static final String RENAME_RESULT = "/jenaIngest/renameResult.jsp";
private static final String CREATED_GRAPH_BASE_URI = "http://vitro.mannlib.cornell.edu/a/graph/";
public static final boolean MAIN_STORE_STATE = true;
public static final boolean AUXILIARY_STORE_STATE = false;
private static final String INGEST_STORE_ATTR = JenaIngestController.class.getName() + ".isUsingMainStoreForIngest";
private static final Map<String, Model> attachedModels = new HashMap<String, Model>();
@ -214,15 +217,30 @@ public class JenaIngestController extends BaseEditController {
showModelList(vreq, maker, modelType);
}
public static boolean isUsingMainStoreForIngest(VitroRequest vreq) {
Boolean storeState = (Boolean) vreq.getSession().getAttribute(INGEST_STORE_ATTR);
if (storeState == null) {
return MAIN_STORE_STATE;
} else {
return storeState;
}
}
private void setUsingMainStoreForIngest(VitroRequest vreq, boolean storeState) {
vreq.getSession().setAttribute(INGEST_STORE_ATTR, storeState);
}
private void processRDBModelsRequest(VitroRequest vreq, ModelMaker maker, String modelType) {
ModelMaker vjmm = (ModelMaker) getServletContext().getAttribute("vitroJenaModelMaker");
vreq.getSession().setAttribute("vitroJenaModelMaker", vjmm);
setUsingMainStoreForIngest(vreq, AUXILIARY_STORE_STATE);
showModelList(vreq, vjmm, "rdb");
}
private void processSDBModelsRequest(VitroRequest vreq, ModelMaker maker, String modelType) {
ModelMaker vsmm = (ModelMaker) getServletContext().getAttribute("vitroJenaSDBModelMaker");
vreq.getSession().setAttribute("vitroJenaModelMaker", vsmm);
setUsingMainStoreForIngest(vreq, MAIN_STORE_STATE);
showModelList(vreq, vsmm, "sdb");
}

View file

@ -53,9 +53,7 @@ public class RDFUploadController extends JenaIngestController {
private static int maxFileSizeInBytes = 1024 * 1024 * 2000; //2000mb
private static FileItem fileStream = null;
private static final String INGEST_MENU_JSP = "/jenaIngest/ingestMenu.jsp";
private static final String LOAD_RDF_DATA_JSP="/jenaIngest/loadRDFData.jsp";
private static final String LIST_MODELS_JSP = "/jenaIngest/listModels.jsp";
public void doPost(HttpServletRequest rawRequest,
HttpServletResponse response) throws ServletException, IOException {
@ -244,9 +242,11 @@ public class RDFUploadController extends JenaIngestController {
String languageStr = request.getParameter("language");
ModelMaker maker = getVitroJenaModelMaker(request);
if (docLoc!=null && modelName != null) {
RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(
getServletContext()).getRDFService();
if (modelName == null) {
request.setAttribute("title","Load RDF Data");
request.setAttribute("bodyJsp",LOAD_RDF_DATA_JSP);
} else {
RDFService rdfService = getRDFService(request, maker, modelName);
try {
doLoadRDFData(modelName, docLoc, filePath, languageStr, rdfService);
} finally {
@ -254,10 +254,7 @@ public class RDFUploadController extends JenaIngestController {
}
String modelType = getModelType(request, maker);
showModelList(request, maker, modelType);
} else {
request.setAttribute("title","Load RDF Data");
request.setAttribute("bodyJsp",LOAD_RDF_DATA_JSP);
}
}
RequestDispatcher rd = request.getRequestDispatcher(
Controllers.BASIC_JSP);
@ -272,6 +269,18 @@ public class RDFUploadController extends JenaIngestController {
}
private RDFService getRDFService(VitroRequest vreq, ModelMaker maker, String modelName) {
if (JenaIngestController.isUsingMainStoreForIngest(vreq)) {
log.debug("Using main RDFService");
return RDFServiceUtils.getRDFServiceFactory(
getServletContext()).getRDFService();
} else {
log.debug("Making RDFService for single model from ModelMaker");
Model m = maker.getModel(modelName);
return new RDFServiceModel(m);
}
}
private long operateOnModel(WebappDaoFactory webappDaoFactory,
OntModel mainModel,
Model changesModel,

View file

@ -9,11 +9,12 @@ import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.query.DataSource;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.DatasetFactory;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.shared.Lock;
import com.hp.hpl.jena.sparql.core.DatasetImpl;
import edu.cornell.mannlib.vitro.webapp.dao.jena.DatasetWrapper;
import edu.cornell.mannlib.vitro.webapp.rdfservice.ChangeSet;
@ -28,14 +29,25 @@ public class RDFServiceModel extends RDFServiceJena implements RDFService {
private final static Log log = LogFactory.getLog(RDFServiceModel.class);
private Model model;
private String modelName;
/**
* Create an RDFService to access a single default graph
* @param model
*/
public RDFServiceModel(Model model) {
this.model = model;
}
@Override
protected DatasetWrapper getDatasetWrapper() {
DatasetWrapper datasetWrapper = new DatasetWrapper(new DatasetImpl(model));
DataSource d = DatasetFactory.create();
if (modelName == null) {
d.setDefaultModel(this.model);
} else {
d.addNamedModel(this.modelName, model);
}
DatasetWrapper datasetWrapper = new DatasetWrapper(d);
return datasetWrapper;
}
@ -50,7 +62,7 @@ public class RDFServiceModel extends RDFServiceJena implements RDFService {
return false;
}
Dataset dataset = getDatasetWrapper().getDataset();
//Dataset dataset = getDatasetWrapper().getDataset();
try {
for (Object o : changeSet.getPreChangeEvents()) {
@ -65,15 +77,7 @@ public class RDFServiceModel extends RDFServiceJena implements RDFService {
modelChange.setSerializedModel(new ByteArrayInputStream(bytes));
}
modelChange.getSerializedModel().mark(Integer.MAX_VALUE);
dataset.getLock().enterCriticalSection(Lock.WRITE);
try {
Model model = (modelChange.getGraphURI() == null)
? dataset.getDefaultModel()
: dataset.getNamedModel(modelChange.getGraphURI());
operateOnModel(model, modelChange, dataset);
} finally {
dataset.getLock().leaveCriticalSection();
}
operateOnModel(model, modelChange, null);
}
// notify listeners of triple changes