You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2016/05/20 11:31:25 UTC
[4/4] jena git commit: JENA-1183: Protect against problems writing
RDF (esp RDF/XML)
JENA-1183: Protect against problems writing RDF (esp RDF/XML)
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/86974d3d
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/86974d3d
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/86974d3d
Branch: refs/heads/master
Commit: 86974d3d922f664413f17e37dd968de55afdea96
Parents: 8aff663
Author: Andy Seaborne <an...@apache.org>
Authored: Fri May 20 12:30:31 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri May 20 12:30:31 2016 +0100
----------------------------------------------------------------------
.../jena/fuseki/servlets/REST_Quads_R.java | 15 ++++++++++++--
.../jena/fuseki/servlets/ResponseDataset.java | 21 +++++++++++++++-----
.../jena/fuseki/servlets/SPARQL_GSP_R.java | 17 +++++++++++++---
3 files changed, 43 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/86974d3d/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_R.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_R.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_R.java
index e51a6fe..8d91854 100644
--- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_R.java
+++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_R.java
@@ -27,6 +27,7 @@ import javax.servlet.ServletOutputStream ;
import org.apache.jena.atlas.web.MediaType ;
import org.apache.jena.atlas.web.TypedOutputStream ;
import org.apache.jena.riot.web.HttpNames ;
+import org.apache.jena.shared.JenaException ;
import org.apache.jena.riot.* ;
import org.apache.jena.sparql.core.DatasetGraph ;
@@ -83,9 +84,19 @@ public class REST_Quads_R extends REST_Quads {
try {
DatasetGraph dsg = action.getActiveDSG() ;
action.response.setHeader("Content-type", lang.getContentType().toHeaderString());
+ // ActionLib.contentNegotationQuads above
+ // RDF/XML is not a choice but this code is general.
RDFFormat fmt =
- ( lang == Lang.RDFXML ) ? RDFFormat.RDFXML_PLAIN : RDFWriterRegistry.defaultSerialization(lang) ;
- RDFDataMgr.write(out, dsg, fmt) ;
+ // Choose streaming.
+ ( lang == Lang.RDFXML ) ? RDFFormat.RDFXML_PLAIN : RDFWriterRegistry.defaultSerialization(lang) ;
+ try {
+ RDFDataMgr.write(out, dsg, fmt) ;
+ } catch (JenaException ex) {
+ if ( fmt.getLang().equals(Lang.RDFXML) )
+ ServletOps.errorBadRequest("Failed to write output in RDF/XML: "+ex.getMessage()) ;
+ else
+ ServletOps.errorOccurred("Failed to write output: "+ex.getMessage(), ex) ;
+ }
ServletOps.success(action) ;
} finally {
action.endRead() ;
http://git-wip-us.apache.org/repos/asf/jena/blob/86974d3d/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ResponseDataset.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ResponseDataset.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ResponseDataset.java
index 26a5023..34d3495 100644
--- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ResponseDataset.java
+++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ResponseDataset.java
@@ -39,6 +39,7 @@ import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.riot.RDFLanguages;
import org.apache.jena.riot.WebContent;
+import org.apache.jena.shared.JenaException ;
import org.apache.jena.web.HttpSC;
public class ResponseDataset
@@ -119,12 +120,22 @@ public class ResponseDataset
ResponseResultSet.setHttpResponse(action, contentType, charset) ;
response.setStatus(HttpSC.OK_200) ;
ServletOutputStream out = response.getOutputStream() ;
- if ( RDFLanguages.isQuads(lang) )
- RDFDataMgr.write(out, dataset, lang) ;
- else
- RDFDataMgr.write(out, dataset.getDefaultModel(), lang) ;
- out.flush() ;
+ try {
+ if ( RDFLanguages.isQuads(lang) )
+ RDFDataMgr.write(out, dataset, lang) ;
+ else
+ RDFDataMgr.write(out, dataset.getDefaultModel(), lang) ;
+ out.flush() ;
+ } catch (JenaException ex) {
+ // Some RDF/XML data is unwritable. All we can do is pretend it's a bad
+ // request (inappropriate content type).
+ if ( lang.equals(Lang.RDFXML) )
+ ServletOps.errorBadRequest("Failed to write output in RDF/XML: "+ex.getMessage()) ;
+ else
+ ServletOps.errorOccurred("Failed to write output: "+ex.getMessage(), ex) ;
+ }
}
+ catch (ActionErrorException ex) { throw ex ; }
catch (Exception ex) {
action.log.info("Exception while writing the response model: "+ex.getMessage(), ex) ;
ServletOps.errorOccurred("Exception while writing the response model: "+ex.getMessage(), ex) ;
http://git-wip-us.apache.org/repos/asf/jena/blob/86974d3d/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_R.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_R.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_R.java
index b7b5d07..632f3d6 100644
--- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_R.java
+++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_R.java
@@ -27,8 +27,9 @@ import javax.servlet.ServletOutputStream ;
import org.apache.jena.atlas.web.MediaType ;
import org.apache.jena.atlas.web.TypedOutputStream ;
import org.apache.jena.graph.Graph ;
-import org.apache.jena.riot.web.HttpNames ;
import org.apache.jena.riot.* ;
+import org.apache.jena.riot.web.HttpNames ;
+import org.apache.jena.shared.JenaException ;
/** Only the READ operations */
public class SPARQL_GSP_R extends SPARQL_GSP
@@ -74,8 +75,18 @@ public class SPARQL_GSP_R extends SPARQL_GSP
Graph g = target.graph() ;
//Special case RDF/XML to be the plain (faster, less readable) form
RDFFormat fmt =
- ( lang == Lang.RDFXML ) ? RDFFormat.RDFXML_PLAIN : RDFWriterRegistry.defaultSerialization(lang) ;
- RDFDataMgr.write(out, g, fmt) ;
+ ( lang == Lang.RDFXML ) ? RDFFormat.RDFXML_PLAIN : RDFWriterRegistry.defaultSerialization(lang) ;
+ try {
+ RDFDataMgr.write(out, g, fmt) ;
+ } catch (JenaException ex) {
+ // Some RDF/XML data is unwritable. All we can do is pretend it's a bad
+ // request (inappropriate content type).
+ // Good news - this happens before any output for RDF/XML-ABBREV.
+ if ( fmt.getLang().equals(Lang.RDFXML) )
+ ServletOps.errorBadRequest("Failed to write output in RDF/XML: "+ex.getMessage()) ;
+ else
+ ServletOps.errorOccurred("Failed to write output: "+ex.getMessage(), ex) ;
+ }
ServletOps.success(action) ;
} finally { action.endRead() ; }
}