NIHVIVO-3877 and NIHVIVO-3872 using RDFService for aspects of import and export
This commit is contained in:
parent
0f9d1a79d1
commit
eace91759a
5 changed files with 129 additions and 54 deletions
|
@ -3,7 +3,10 @@
|
|||
package edu.cornell.mannlib.vitro.webapp.controller.jena;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PipedInputStream;
|
||||
import java.io.PipedOutputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -11,6 +14,7 @@ import javax.servlet.RequestDispatcher;
|
|||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
|
@ -28,6 +32,11 @@ import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
|
|||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaModelUtils;
|
||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext;
|
||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
|
||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
|
||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException;
|
||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils;
|
||||
import edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetupBase;
|
||||
import edu.cornell.mannlib.vitro.webapp.utils.jena.JenaOutputUtils;
|
||||
|
||||
public class JenaExportController extends BaseEditController {
|
||||
|
@ -116,12 +125,10 @@ public class JenaExportController extends BaseEditController {
|
|||
getServletContext()).getABoxModel();
|
||||
}
|
||||
else if("full".equals(assertedOrInferredParam)){
|
||||
model = ModelContext.getUnionOntModelSelector(
|
||||
getServletContext()).getABoxModel();
|
||||
outputSparqlConstruct(ABOX_FULL_CONSTRUCT, formatParam, response);
|
||||
}
|
||||
else if("asserted".equals(assertedOrInferredParam)){
|
||||
model = ModelContext.getBaseOntModelSelector(
|
||||
getServletContext()).getABoxModel();
|
||||
outputSparqlConstruct(ABOX_ASSERTED_CONSTRUCT, formatParam, response);
|
||||
}
|
||||
}
|
||||
else if("tbox".equals(subgraphParam)){
|
||||
|
@ -161,47 +168,17 @@ public class JenaExportController extends BaseEditController {
|
|||
getServletContext()).getTBoxModel());
|
||||
}
|
||||
else if("full".equals(assertedOrInferredParam)){
|
||||
ontModel = xutil.extractTBox(dataset, ontologyURI, FULL_GRAPH);
|
||||
ontModel.addSubModel(ModelContext.getUnionOntModelSelector(
|
||||
getServletContext()).getABoxModel());
|
||||
ontModel.addSubModel(ModelContext.getUnionOntModelSelector(
|
||||
getServletContext()).getTBoxModel());
|
||||
ontModel.addSubModel(ModelContext.getUnionOntModelSelector(
|
||||
getServletContext()).getApplicationMetadataModel());
|
||||
outputSparqlConstruct(FULL_FULL_CONSTRUCT, formatParam, response);
|
||||
}
|
||||
else{
|
||||
ontModel = xutil.extractTBox(
|
||||
dataset, ontologyURI, ASSERTIONS_GRAPH);
|
||||
ontModel.addSubModel(ModelContext.getBaseOntModelSelector(
|
||||
getServletContext()).getABoxModel());
|
||||
ontModel.addSubModel(ModelContext.getBaseOntModelSelector(
|
||||
getServletContext()).getTBoxModel());
|
||||
ontModel.addSubModel(ModelContext.getBaseOntModelSelector(
|
||||
getServletContext()).getApplicationMetadataModel());
|
||||
outputSparqlConstruct(FULL_ASSERTED_CONSTRUCT, formatParam, response);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
JenaOutputUtils.setNameSpacePrefixes(model,vreq.getWebappDaoFactory());
|
||||
|
||||
if ( formatParam == null ) {
|
||||
formatParam = "RDF/XML-ABBREV"; // default
|
||||
}
|
||||
String mime = formatToMimetype.get( formatParam );
|
||||
if ( mime == null ) {
|
||||
throw new RuntimeException( "Unsupported RDF format " + formatParam);
|
||||
}
|
||||
|
||||
response.setContentType( mime );
|
||||
if(mime.equals("application/rdf+xml"))
|
||||
response.setHeader("content-disposition", "attachment; filename=" + "export.rdf");
|
||||
else if(mime.equals("text/n3"))
|
||||
response.setHeader("content-disposition", "attachment; filename=" + "export.n3");
|
||||
else if(mime.equals("text/plain"))
|
||||
response.setHeader("content-disposition", "attachment; filename=" + "export.txt");
|
||||
else if(mime.equals("application/x-turtle"))
|
||||
response.setHeader("content-disposition", "attachment; filename=" + "export.ttl");
|
||||
|
||||
setHeaders(response, formatParam);
|
||||
|
||||
try {
|
||||
OutputStream outStream = response.getOutputStream();
|
||||
if ( formatParam.startsWith("RDF/XML") ) {
|
||||
|
@ -237,6 +214,50 @@ public class JenaExportController extends BaseEditController {
|
|||
|
||||
}
|
||||
|
||||
private void setHeaders(HttpServletResponse response, String formatParam) {
|
||||
if ( formatParam == null ) {
|
||||
formatParam = "RDF/XML-ABBREV"; // default
|
||||
}
|
||||
String mime = formatToMimetype.get( formatParam );
|
||||
if ( mime == null ) {
|
||||
throw new RuntimeException( "Unsupported RDF format " + formatParam);
|
||||
}
|
||||
|
||||
response.setContentType( mime );
|
||||
if(mime.equals("application/rdf+xml"))
|
||||
response.setHeader("content-disposition", "attachment; filename=" + "export.rdf");
|
||||
else if(mime.equals("text/n3"))
|
||||
response.setHeader("content-disposition", "attachment; filename=" + "export.n3");
|
||||
else if(mime.equals("text/plain"))
|
||||
response.setHeader("content-disposition", "attachment; filename=" + "export.txt");
|
||||
else if(mime.equals("application/x-turtle"))
|
||||
response.setHeader("content-disposition", "attachment; filename=" + "export.ttl");
|
||||
}
|
||||
|
||||
private void outputSparqlConstruct(String queryStr, String formatParam,
|
||||
HttpServletResponse response) {
|
||||
RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(getServletContext()).getRDFService();
|
||||
try {
|
||||
setHeaders(response, formatParam);
|
||||
OutputStream out = response.getOutputStream();
|
||||
if ( formatParam.startsWith("RDF/XML") ) {
|
||||
out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>".getBytes());
|
||||
}
|
||||
InputStream in = rdfService.sparqlConstructQuery(
|
||||
queryStr, RDFServiceUtils.getSerializationFormatFromJenaString(
|
||||
formatParam));
|
||||
IOUtils.copy(in, out);
|
||||
out.flush();
|
||||
out.close();
|
||||
} catch (RDFServiceException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IOException ioe) {
|
||||
throw new RuntimeException(ioe);
|
||||
} finally {
|
||||
rdfService.close();
|
||||
}
|
||||
}
|
||||
|
||||
private void prepareExportSelectionPage( VitroRequest vreq, HttpServletResponse response ) {
|
||||
vreq.setAttribute( "bodyJsp", Controllers.EXPORT_SELECTION_JSP );
|
||||
RequestDispatcher dispatcher = vreq.getRequestDispatcher( Controllers.BASIC_JSP );
|
||||
|
@ -278,16 +299,35 @@ public class JenaExportController extends BaseEditController {
|
|||
formatToExtension.put("RDF/XML",".rdf");
|
||||
formatToExtension.put("RDF/XML-ABBREV",".rdf");
|
||||
formatToExtension.put("N3",".n3");
|
||||
formatToExtension.put("N-TRIPLES",".nt");
|
||||
formatToExtension.put("N-TRIPLE",".nt");
|
||||
formatToExtension.put("TURTLE",".ttl");
|
||||
|
||||
formatToMimetype = new HashMap<String,String>();
|
||||
formatToMimetype.put("RDF/XML","application/rdf+xml");
|
||||
formatToMimetype.put("RDF/XML-ABBREV","application/rdf+xml");
|
||||
formatToMimetype.put("N3","text/n3");
|
||||
formatToMimetype.put("N-TRIPLES", "text/plain");
|
||||
formatToMimetype.put("N-TRIPLE", "text/plain");
|
||||
formatToMimetype.put("TURTLE", "application/x-turtle");
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static final String ABOX_FULL_CONSTRUCT = "CONSTRUCT { ?s ?p ?o } " +
|
||||
"WHERE { GRAPH ?g { ?s ?p ?o } FILTER (!regex(str(?g), \"tbox\")) " +
|
||||
"FILTER (?g != <" + JenaDataSourceSetupBase.JENA_APPLICATION_METADATA_MODEL + ">) " +
|
||||
"FILTER (?g != <" + RDFServiceModelMaker.METADATA_MODEL_URI + ">) }";
|
||||
|
||||
private static final String ABOX_ASSERTED_CONSTRUCT = "CONSTRUCT { ?s ?p ?o } " +
|
||||
"WHERE { GRAPH ?g { ?s ?p ?o } FILTER (!regex(str(?g), \"tbox\")) " +
|
||||
"FILTER (?g != <" + JenaDataSourceSetupBase.JENA_INF_MODEL + ">) " +
|
||||
"FILTER (?g != <" + JenaDataSourceSetupBase.JENA_APPLICATION_METADATA_MODEL + ">) " +
|
||||
"FILTER (?g != <" + RDFServiceModelMaker.METADATA_MODEL_URI + ">) }";
|
||||
|
||||
private static final String FULL_FULL_CONSTRUCT = "CONSTRUCT { ?s ?p ?o } " +
|
||||
"WHERE { ?s ?p ?o }";
|
||||
|
||||
private static final String FULL_ASSERTED_CONSTRUCT = "CONSTRUCT { ?s ?p ?o } " +
|
||||
"WHERE { GRAPH ?g { ?s ?p ?o } " +
|
||||
"FILTER (?g != <" + JenaDataSourceSetupBase.JENA_INF_MODEL + ">) " +
|
||||
"FILTER (?g != <" + JenaDataSourceSetupBase.JENA_TBOX_INF_MODEL + ">) }";
|
||||
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ package edu.cornell.mannlib.vitro.webapp.controller.jena;
|
|||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -41,6 +42,7 @@ import edu.cornell.mannlib.vitro.webapp.filestorage.uploadrequest.FileUploadServ
|
|||
import edu.cornell.mannlib.vitro.webapp.rdfservice.ChangeSet;
|
||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
|
||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException;
|
||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils;
|
||||
import edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetupBase;
|
||||
|
||||
public class RDFUploadController extends JenaIngestController {
|
||||
|
@ -239,7 +241,13 @@ public class RDFUploadController extends JenaIngestController {
|
|||
ModelMaker maker = getVitroJenaModelMaker(request);
|
||||
|
||||
if (docLoc!=null && modelName != null) {
|
||||
doLoadRDFData(modelName, docLoc, filePath, languageStr, maker);
|
||||
RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(
|
||||
getServletContext()).getRDFService();
|
||||
try {
|
||||
doLoadRDFData(modelName, docLoc, filePath, languageStr, rdfService);
|
||||
} finally {
|
||||
rdfService.close();
|
||||
}
|
||||
String modelType = getModelType(request, maker);
|
||||
showModelList(request, maker, modelType);
|
||||
} else {
|
||||
|
@ -319,12 +327,12 @@ public class RDFUploadController extends JenaIngestController {
|
|||
String docLoc,
|
||||
String filePath,
|
||||
String language,
|
||||
ModelMaker modelMaker) {
|
||||
Model m = modelMaker.getModel(modelName);
|
||||
m.enterCriticalSection(Lock.WRITE);
|
||||
RDFService rdfService) {
|
||||
try {
|
||||
if ( (docLoc != null) && (docLoc.length()>0) ) {
|
||||
m.read(docLoc, language);
|
||||
URL docLocURL = new URL(docLoc);
|
||||
InputStream in = docLocURL.openStream();
|
||||
readIntoModel(in, language, rdfService, modelName);
|
||||
} else if ( (filePath != null) && (filePath.length()>0) ) {
|
||||
File file = new File(filePath);
|
||||
File[] files;
|
||||
|
@ -338,7 +346,8 @@ public class RDFUploadController extends JenaIngestController {
|
|||
File currentFile = files[i];
|
||||
log.debug("Reading file " + currentFile.getName());
|
||||
try {
|
||||
m.read(fileStream.getInputStream(), null, language);
|
||||
readIntoModel(fileStream.getInputStream(), language,
|
||||
rdfService, modelName);
|
||||
fileStream.delete();
|
||||
} catch (IOException ioe) {
|
||||
String errMsg = "Error loading RDF from " +
|
||||
|
@ -348,8 +357,20 @@ public class RDFUploadController extends JenaIngestController {
|
|||
}
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
m.leaveCriticalSection();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private void readIntoModel(InputStream in, String language,
|
||||
RDFService rdfService, String modelName) {
|
||||
ChangeSet cs = rdfService.manufactureChangeSet();
|
||||
cs.addAddition(in, RDFServiceUtils.getSerializationFormatFromJenaString(
|
||||
language), modelName);
|
||||
try {
|
||||
rdfService.changeSetUpdate(cs);
|
||||
} catch (RDFServiceException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -30,8 +30,6 @@ public class RDFServiceUtils {
|
|||
|
||||
private static final String RDFSERVICEFACTORY_ATTR =
|
||||
RDFServiceUtils.class.getName() + ".RDFServiceFactory";
|
||||
private static final String RDFSERVICEFACTORY_FILTERING_ATTR =
|
||||
RDFServiceUtils.class.getName() + ".RDFServiceFactory.Filtering";
|
||||
|
||||
|
||||
public static RDFServiceFactory getRDFServiceFactory(ServletContext context) {
|
||||
|
@ -80,11 +78,27 @@ public class RDFServiceUtils {
|
|||
return "RDF/XML";
|
||||
case N3:
|
||||
return "N3";
|
||||
case NTRIPLE:
|
||||
return "N-TRIPLE";
|
||||
default:
|
||||
throw new RuntimeException("unexpected format in getSerializationFormatString");
|
||||
}
|
||||
}
|
||||
|
||||
public static ModelSerializationFormat getSerializationFormatFromJenaString(String jenaString) {
|
||||
if ("N3".equals(jenaString) || "TTL".equals(jenaString)
|
||||
|| "TURTLE".equals(jenaString)) {
|
||||
return ModelSerializationFormat.N3;
|
||||
} else if ("N-TRIPLE".equals(jenaString)) {
|
||||
return ModelSerializationFormat.NTRIPLE;
|
||||
} else if ("RDF/XML".equals(jenaString)
|
||||
|| "RDF/XML-ABBREV".equals(jenaString)) {
|
||||
return ModelSerializationFormat.RDFXML;
|
||||
} else {
|
||||
throw new RuntimeException("unrecognized format " + jenaString);
|
||||
}
|
||||
}
|
||||
|
||||
public static RDFService getRDFService(VitroRequest vreq) {
|
||||
return getRDFServiceFactory(
|
||||
vreq.getSession().getServletContext()).getRDFService();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue