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() ; }
     }