diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaExportController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaExportController.java index 6c3b38a34..ab666c61f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaExportController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaExportController.java @@ -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("".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(); 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 + ">) }"; + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/RDFUploadController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/RDFUploadController.java index 108639c0b..42aa63583 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/RDFUploadController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/RDFUploadController.java @@ -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); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceUtils.java index 7158396d0..1f013e571 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceUtils.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceUtils.java @@ -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(); diff --git a/webapp/web/jenaIngest/exportSelection.jsp b/webapp/web/jenaIngest/exportSelection.jsp index 5c876c408..4c78bebfb 100644 --- a/webapp/web/jenaIngest/exportSelection.jsp +++ b/webapp/web/jenaIngest/exportSelection.jsp @@ -39,7 +39,7 @@ - + @@ -47,4 +47,4 @@ - \ No newline at end of file + diff --git a/webapp/web/templates/edit/specific/ontologies_edit.jsp b/webapp/web/templates/edit/specific/ontologies_edit.jsp index 79942d865..b7ed9a61c 100644 --- a/webapp/web/templates/edit/specific/ontologies_edit.jsp +++ b/webapp/web/templates/edit/specific/ontologies_edit.jsp @@ -62,7 +62,7 @@ RDF/XML abbreviated RDF/XML N3 - N-Triples + N-Triples Turtle