You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by an...@apache.org on 2013/06/25 04:49:33 UTC

[1/2] git commit: MARMOTTA-265 : Avoid recoding a SPARQL Results JSON parser in SPARQLClient

Updated Branches:
  refs/heads/develop e2f157ddf -> e931d8bc1


MARMOTTA-265 : Avoid recoding a SPARQL Results JSON parser in SPARQLClient


Project: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/commit/bb4c15ef
Tree: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/tree/bb4c15ef
Diff: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/diff/bb4c15ef

Branch: refs/heads/develop
Commit: bb4c15efddaf0848ce6bb0163dd4a2c05f729481
Parents: e2f157d
Author: Peter Ansell <p_...@yahoo.com>
Authored: Tue Jun 25 12:27:55 2013 +1000
Committer: Peter Ansell <p_...@yahoo.com>
Committed: Tue Jun 25 12:27:55 2013 +1000

----------------------------------------------------------------------
 client/marmotta-client-java/pom.xml             |  13 +++
 .../marmotta/client/clients/SPARQLClient.java   | 117 +++++++++++++------
 2 files changed, 94 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/bb4c15ef/client/marmotta-client-java/pom.xml
----------------------------------------------------------------------
diff --git a/client/marmotta-client-java/pom.xml b/client/marmotta-client-java/pom.xml
index ba38e9a..b79125f 100644
--- a/client/marmotta-client-java/pom.xml
+++ b/client/marmotta-client-java/pom.xml
@@ -102,9 +102,22 @@
         </dependency>
         <dependency>
         	<groupId>org.openrdf.sesame</groupId>
+        	<artifactId>sesame-rio-api</artifactId>
+        </dependency>
+        <dependency>
+        	<groupId>org.openrdf.sesame</groupId>
         	<artifactId>sesame-rio-rdfjson</artifactId>
         </dependency>
         <dependency>
+        	<groupId>org.openrdf.sesame</groupId>
+        	<artifactId>sesame-queryresultio-api</artifactId>
+        </dependency>
+        <dependency>
+        	<groupId>org.openrdf.sesame</groupId>
+        	<artifactId>sesame-queryresultio-sparqljson</artifactId>
+        	<scope>runtime</scope>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/bb4c15ef/client/marmotta-client-java/src/main/java/org/apache/marmotta/client/clients/SPARQLClient.java
----------------------------------------------------------------------
diff --git a/client/marmotta-client-java/src/main/java/org/apache/marmotta/client/clients/SPARQLClient.java b/client/marmotta-client-java/src/main/java/org/apache/marmotta/client/clients/SPARQLClient.java
index fe4c9f1..235f122 100644
--- a/client/marmotta-client-java/src/main/java/org/apache/marmotta/client/clients/SPARQLClient.java
+++ b/client/marmotta-client-java/src/main/java/org/apache/marmotta/client/clients/SPARQLClient.java
@@ -31,13 +31,32 @@ import org.apache.marmotta.client.util.HTTPUtil;
 import org.codehaus.jackson.JsonParser;
 import org.codehaus.jackson.map.ObjectMapper;
 import org.codehaus.jackson.type.TypeReference;
+import org.openrdf.model.Value;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.model.impl.ValueFactoryImpl;
+import org.openrdf.query.Binding;
+import org.openrdf.query.BindingSet;
+import org.openrdf.query.QueryResultHandler;
+import org.openrdf.query.QueryResultHandlerException;
+import org.openrdf.query.TupleQueryResult;
+import org.openrdf.query.TupleQueryResultHandler;
+import org.openrdf.query.TupleQueryResultHandlerException;
+import org.openrdf.query.resultio.QueryResultIO;
+import org.openrdf.query.resultio.QueryResultParseException;
+import org.openrdf.query.resultio.QueryResultParser;
+import org.openrdf.query.resultio.TupleQueryResultFormat;
+import org.openrdf.query.resultio.TupleQueryResultParser;
+import org.openrdf.query.resultio.UnsupportedQueryResultFormatException;
+import org.openrdf.query.resultio.helpers.QueryResultCollector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.net.URLEncoder;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -84,57 +103,50 @@ public class SPARQLClient {
             switch(response.getStatusLine().getStatusCode()) {
                 case 200:
                     log.debug("SPARQL Query {} evaluated successfully",query);
-                    ObjectMapper mapper = new ObjectMapper();
-                    mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
-                    Map<String,Map<String,List<?>>> resultMap =
-                            mapper.readValue(response.getEntity().getContent(),new TypeReference<Map<String,Map<String,List<?>>>>(){});
+                    QueryResultCollector results = new QueryResultCollector();
+                    
+                    parse(response.getEntity().getContent(), TupleQueryResultFormat.JSON, results, ValueFactoryImpl.getInstance());
 
-                    if(resultMap.isEmpty()) {
+                    if(!results.getHandledTuple() || results.getBindingSets().isEmpty()) {
                         return null;
                     } else {
-                        List<?> head = resultMap.get("head").get("vars");
-                        Set<String> fieldNames = new HashSet<String>();
-                        for(Object o : head) {
-                            if(o instanceof String) {
-                                fieldNames.add((String)o);
-                            }
-                        }
+                        List<String> fieldNames = results.getBindingNames();
 
-                        SPARQLResult result = new SPARQLResult(fieldNames);
+                        SPARQLResult result = new SPARQLResult(new LinkedHashSet<String>(fieldNames));
 
-                        List<?> bindings = resultMap.get("results").get("bindings");
-                        for(Object o : bindings) {
-                            if(o instanceof Map) {
-                                Map<String,RDFNode> row = new HashMap<String, RDFNode>();
-                                for(Map.Entry<String,?> entry : ((Map<String,?>)o).entrySet()) {
-                                    Map<String,String> nodeDef = (Map<String,String>) entry.getValue();
+                        //List<?> bindings = resultMap.get("results").get("bindings");
+                        for(BindingSet nextRow : results.getBindingSets()) {
+                            Map<String,RDFNode> row = new HashMap<String, RDFNode>();
+                            
+                            for(String nextBindingName : fieldNames) {
+                                if(nextRow.hasBinding(nextBindingName)) {
+                                    Binding nextBinding = nextRow.getBinding(nextBindingName);
+                                    //Map<String,String> nodeDef = (Map<String,String>) entry.getValue();
+                                    Value nodeDef = nextBinding.getValue();
                                     RDFNode node = null;
-                                    if("uri".equalsIgnoreCase(nodeDef.get("type"))) {
-                                        node = new URI(nodeDef.get("value"));
-                                    } else if("literal".equalsIgnoreCase(nodeDef.get("type")) ||
-                                              "typed-literal".equalsIgnoreCase(nodeDef.get("type"))) {
-                                        String lang = nodeDef.get("xml:lang");
-                                        String datatype = nodeDef.get("datatype");
-
-                                        if(lang != null) {
-                                            node = new Literal(nodeDef.get("value"),lang);
-                                        } else if(datatype != null) {
-                                            node = new Literal(nodeDef.get("value"),new URI(datatype));
+                                    if(nodeDef instanceof org.openrdf.model.URI) {
+                                        node = new URI(nodeDef.stringValue());
+                                    } else if(nodeDef instanceof org.openrdf.model.BNode) {
+                                        node = new BNode(((org.openrdf.model.BNode)nodeDef).getID());
+                                    } else if(nodeDef instanceof org.openrdf.model.Literal) {
+                                        org.openrdf.model.Literal nodeLiteral = (org.openrdf.model.Literal)nodeDef;
+                                        if(nodeLiteral.getLanguage() != null) {
+                                            node = new Literal(nodeLiteral.getLabel(), nodeLiteral.getLanguage());
+                                        } else if(nodeLiteral.getDatatype() != null) {
+                                            node = new Literal(nodeLiteral.getLabel(), new URI(nodeLiteral.getDatatype().stringValue()));
                                         } else {
-                                            node = new Literal(nodeDef.get("value"));
+                                            node = new Literal(nodeLiteral.getLabel());
                                         }
-                                    } else if("bnode".equalsIgnoreCase(nodeDef.get("type"))) {
-                                        node = new BNode(nodeDef.get("value"));
                                     } else {
-                                        log.error("unknown result node type: {}",nodeDef.get("type"));
+                                        log.error("unknown result node type: {}",nodeDef);
                                     }
                                     
                                     if(node != null) {
-                                        row.put(entry.getKey(),node);
+                                        row.put(nextBindingName, node);
                                     }
                                 }
-                                result.add(row);
                             }
+                            result.add(row);
                         }
                         return result;
                     }
@@ -143,12 +155,45 @@ public class SPARQLClient {
                     throw new MarmottaClientException("error evaluating SPARQL Select Query "+query+": "+response.getStatusLine().getStatusCode() + " " + response.getStatusLine().getReasonPhrase());
             }
 
+        } catch(TupleQueryResultHandlerException e) {
+            throw new MarmottaClientException("error evaluating SPARQL Select Query ", e);
+        } catch(QueryResultParseException e) {
+            throw new MarmottaClientException("error evaluating SPARQL Select Query ", e);
+        } catch(UnsupportedQueryResultFormatException e) {
+            throw new MarmottaClientException("error evaluating SPARQL Select Query ", e);
+        } catch(IllegalStateException e) {
+            throw new MarmottaClientException("error evaluating SPARQL Select Query ", e);
+        } catch(QueryResultHandlerException e) {
+            throw new MarmottaClientException("error evaluating SPARQL Select Query ", e);
         } finally {
             get.releaseConnection();
         }
     }
 
     /**
+     * FIXME: Replace this with QueryResultIO.parse after Sesame-2.7.3.
+     * 
+     * @param in
+     * @param format
+     * @param handler
+     * @param valueFactory
+     * @throws IOException
+     * @throws QueryResultParseException
+     * @throws TupleQueryResultHandlerException
+     * @throws UnsupportedQueryResultFormatException
+     */
+    private static void parse(InputStream in, TupleQueryResultFormat format, QueryResultHandler handler,
+            ValueFactory valueFactory)
+        throws IOException, QueryResultParseException, QueryResultHandlerException,
+        UnsupportedQueryResultFormatException
+    {
+        QueryResultParser parser = QueryResultIO.createParser(format);
+        parser.setValueFactory(valueFactory);
+        parser.setQueryResultHandler(handler);
+        parser.parseQueryResult(in);
+    }
+    
+    /**
      * Carry out a SPARQL ASK Query and return either true or false, depending on the query result.
      *
      * @param askQuery


[2/2] git commit: MARMOTTA-265 : Replace SPARQL Results JSON writers and parsers in marmotta-sparql

Posted by an...@apache.org.
MARMOTTA-265 : Replace SPARQL Results JSON writers and parsers in marmotta-sparql


Project: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/commit/e931d8bc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/tree/e931d8bc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/diff/e931d8bc

Branch: refs/heads/develop
Commit: e931d8bc13867cc91a609a2a00308d8975b24cf6
Parents: bb4c15e
Author: Peter Ansell <p_...@yahoo.com>
Authored: Tue Jun 25 12:47:45 2013 +1000
Committer: Peter Ansell <p_...@yahoo.com>
Committed: Tue Jun 25 12:48:50 2013 +1000

----------------------------------------------------------------------
 .../services/sparql/SparqlServiceImpl.java      |  25 +-
 .../sparqljson/SPARQLBooleanJSONWriter.java     | 176 ----------
 .../sparqljson/SPARQLResultsJSONWriter.java     | 339 -------------------
 .../sparql/webservices/SparqlWebService.java    |  42 ++-
 4 files changed, 31 insertions(+), 551 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/e931d8bc/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparql/SparqlServiceImpl.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparql/SparqlServiceImpl.java b/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparql/SparqlServiceImpl.java
index edcb99d..99af90d 100644
--- a/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparql/SparqlServiceImpl.java
+++ b/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparql/SparqlServiceImpl.java
@@ -36,8 +36,6 @@ import org.apache.marmotta.platform.sparql.api.sparql.SparqlService;
 import org.apache.marmotta.platform.sparql.services.sparqlio.rdf.SPARQLGraphResultWriter;
 import org.apache.marmotta.platform.sparql.services.sparqlio.sparqlhtml.SPARQLBooleanHTMLWriter;
 import org.apache.marmotta.platform.sparql.services.sparqlio.sparqlhtml.SPARQLResultsHTMLWriter;
-import org.apache.marmotta.platform.sparql.services.sparqlio.sparqljson.SPARQLBooleanJSONWriter;
-import org.apache.marmotta.platform.sparql.services.sparqlio.sparqljson.SPARQLResultsJSONWriter;
 import org.openrdf.model.Value;
 import org.openrdf.query.Binding;
 import org.openrdf.query.BindingSet;
@@ -52,12 +50,11 @@ import org.openrdf.query.TupleQueryResult;
 import org.openrdf.query.TupleQueryResultHandlerException;
 import org.openrdf.query.Update;
 import org.openrdf.query.UpdateExecutionException;
+import org.openrdf.query.resultio.BooleanQueryResultFormat;
 import org.openrdf.query.resultio.BooleanQueryResultWriter;
+import org.openrdf.query.resultio.QueryResultIO;
+import org.openrdf.query.resultio.TupleQueryResultFormat;
 import org.openrdf.query.resultio.TupleQueryResultWriter;
-import org.openrdf.query.resultio.sparqlxml.SPARQLBooleanXMLWriter;
-import org.openrdf.query.resultio.sparqlxml.SPARQLResultsXMLWriter;
-import org.openrdf.query.resultio.text.BooleanTextWriter;
-import org.openrdf.query.resultio.text.csv.SPARQLResultsCSVWriter;
 import org.openrdf.repository.RepositoryConnection;
 import org.openrdf.repository.RepositoryException;
 import org.slf4j.Logger;
@@ -340,15 +337,15 @@ public class SparqlServiceImpl implements SparqlService {
         //build outputwriter
         final TupleQueryResultWriter out;
         if(format == null) {
-            out = new SPARQLResultsXMLWriter(os);
+            out = QueryResultIO.createWriter(TupleQueryResultFormat.SPARQL, os);
         } else if(SparqlWritersHelper.parseSubType(format).equals("html")) {
             out = new SPARQLResultsHTMLWriter(os, templatingService);
         } else if(SparqlWritersHelper.parseSubType(format).equals("json")) {
-            out = new SPARQLResultsJSONWriter(os);
+            out = QueryResultIO.createWriter(TupleQueryResultFormat.JSON, os);
         } else if(SparqlWritersHelper.parseSubType(format).equals("xml")) {
-            out = new SPARQLResultsXMLWriter(os);
+            out = QueryResultIO.createWriter(TupleQueryResultFormat.SPARQL, os);
         } else if(SparqlWritersHelper.parseSubType(format).equals("csv")) {
-            out = new SPARQLResultsCSVWriter(os);
+            out = QueryResultIO.createWriter(TupleQueryResultFormat.CSV, os);
         } else throw new InvalidArgumentException("could not produce format "+format);
         return out;
     }
@@ -357,15 +354,15 @@ public class SparqlServiceImpl implements SparqlService {
         //build outputwriter
         final BooleanQueryResultWriter out;
         if(format == null) {
-            out = new SPARQLBooleanXMLWriter(os);
+            out = QueryResultIO.createWriter(BooleanQueryResultFormat.SPARQL, os);
         } else if(SparqlWritersHelper.parseSubType(format).equals("html")) {
             out = new SPARQLBooleanHTMLWriter(os);
         } else if(SparqlWritersHelper.parseSubType(format).equals("json")) {
-            out = new SPARQLBooleanJSONWriter(os);
+            out = QueryResultIO.createWriter(BooleanQueryResultFormat.JSON, os);
         } else if(SparqlWritersHelper.parseSubType(format).equals("xml")) {
-            out = new SPARQLBooleanXMLWriter(os);
+            out = QueryResultIO.createWriter(BooleanQueryResultFormat.SPARQL, os);
         } else if(SparqlWritersHelper.parseSubType(format).equals("csv")) {
-            out = new BooleanTextWriter(os);
+            out = QueryResultIO.createWriter(BooleanQueryResultFormat.TEXT, os);
         } else throw new InvalidArgumentException("could not produce format "+format);
         return out;
     }

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/e931d8bc/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparqlio/sparqljson/SPARQLBooleanJSONWriter.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparqlio/sparqljson/SPARQLBooleanJSONWriter.java b/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparqlio/sparqljson/SPARQLBooleanJSONWriter.java
deleted file mode 100644
index e7e988b..0000000
--- a/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparqlio/sparqljson/SPARQLBooleanJSONWriter.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.marmotta.platform.sparql.services.sparqlio.sparqljson;
-
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.resultio.BooleanQueryResultFormat;
-import org.openrdf.query.resultio.BooleanQueryResultWriter;
-import org.openrdf.query.resultio.QueryResultFormat;
-import org.openrdf.rio.RioSetting;
-import org.openrdf.rio.WriterConfig;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Add file description here!
- * <p/>
- * User: sschaffe
- */
-public class SPARQLBooleanJSONWriter implements BooleanQueryResultWriter {
-
-    private OutputStream out;
-    private WriterConfig config;
-
-    public SPARQLBooleanJSONWriter(OutputStream out) {
-        this.out = out;
-    }
-
-    /**
-     * Gets the query result format that this writer uses.
-     */
-    @Override
-    public BooleanQueryResultFormat getBooleanQueryResultFormat() {
-        return new BooleanQueryResultFormat("SPARQL/JSON",
-			"application/sparql-results+json", Charset.forName("UTF-8"), "srj");
-    }
-
-    /**
-     * Writes the specified boolean value.
-     */
-    @Override
-    @Deprecated
-    public void write(boolean value) throws IOException {
-    	try {
-			handleBoolean(value);
-		} catch (QueryResultHandlerException e) {
-			throw new IOException(e);
-		}
-    }
-    
-    /**
-     * @return A collection of {@link RioSetting}s that are supported by this
-     *         RDFWriter.
-     * @since 2.7.0
-     */
-	@Override
-	public Collection<RioSetting<?>> getSupportedSettings() {
-		return new ArrayList<RioSetting<?>>();
-	}
-
-    /**
-     * Retrieves the current writer configuration as a single object.
-     * 
-     * @return a writer configuration object representing the current
-     *         configuration of the writer.
-     * @since 2.7.0
-     */
-	@Override
-	public WriterConfig getWriterConfig() {
-		return config;
-	}
-
-    /**
-     * Sets all supplied writer configuration options.
-     * 
-     * @param config
-     *        a writer configuration object.
-     * @since 2.7.0
-     */
-	@Override
-	public void setWriterConfig(WriterConfig config) {
-		this.config = config;
-	}
-
-	@Override
-	public QueryResultFormat getQueryResultFormat() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public void handleNamespace(String prefix, String uri) throws QueryResultHandlerException {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void startDocument() throws QueryResultHandlerException {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void handleStylesheet(String stylesheetUrl) throws QueryResultHandlerException {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void startHeader() throws QueryResultHandlerException {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void endHeader() throws QueryResultHandlerException {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void endQueryResult() throws TupleQueryResultHandlerException {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void handleBoolean(boolean value) throws QueryResultHandlerException {
-        PrintWriter writer = new PrintWriter(new OutputStreamWriter(out));
-        writer.println("{ \"head\": {}, \"boolean\": \""+value+"\" }");
-        writer.flush();
-        writer.close();
-	}
-
-	@Override
-	public void handleLinks(List<String> arg0) throws QueryResultHandlerException {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void handleSolution(BindingSet arg0) throws TupleQueryResultHandlerException {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void startQueryResult(List<String> arg0) throws TupleQueryResultHandlerException {
-		// TODO Auto-generated method stub
-		
-	}
-	
-}

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/e931d8bc/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparqlio/sparqljson/SPARQLResultsJSONWriter.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparqlio/sparqljson/SPARQLResultsJSONWriter.java b/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparqlio/sparqljson/SPARQLResultsJSONWriter.java
deleted file mode 100644
index cfa5ec1..0000000
--- a/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparqlio/sparqljson/SPARQLResultsJSONWriter.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.marmotta.platform.sparql.services.sparqlio.sparqljson;
-
-import info.aduna.io.IndentingWriter;
-import info.aduna.text.StringUtil;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.openrdf.model.BNode;
-import org.openrdf.model.Literal;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.resultio.QueryResultFormat;
-import org.openrdf.query.resultio.TupleQueryResultFormat;
-import org.openrdf.query.resultio.TupleQueryResultWriter;
-import org.openrdf.rio.RioSetting;
-import org.openrdf.rio.WriterConfig;
-
-/**
- * A TupleQueryResultWriter that writes query results in the <a
- * href="http://www.w3.org/TR/rdf-sparql-json-res/">SPARQL Query Results JSON
- * Format</a>.
- */
-public class SPARQLResultsJSONWriter implements TupleQueryResultWriter {
-
-	private IndentingWriter writer;
-
-	private WriterConfig config;
-	
-	private boolean firstTupleWritten;
-
-	public SPARQLResultsJSONWriter(OutputStream out) {
-		Writer w = new OutputStreamWriter(out, Charset.forName("UTF-8"));
-		w = new BufferedWriter(w, 1024);
-		writer = new IndentingWriter(w);
-	}
-
-	public final TupleQueryResultFormat getTupleQueryResultFormat() {
-		return TupleQueryResultFormat.JSON;
-	}
-
-	public void startQueryResult(List<String> columnHeaders) throws TupleQueryResultHandlerException {
-		try {
-			openBraces();
-
-			// Write header
-			writeKey("head");
-			openBraces();
-			writeKeyValue("vars", columnHeaders);
-			closeBraces();
-
-			writeComma();
-
-			// Write results
-			writeKey("results");
-			openBraces();
-
-			writeKey("bindings");
-			openArray();
-
-			firstTupleWritten = false;
-		} catch (IOException e) {
-			throw new TupleQueryResultHandlerException(e);
-		}
-	}
-
-	public void endQueryResult() throws TupleQueryResultHandlerException {
-		try {
-			closeArray(); // bindings array
-			closeBraces(); // results braces
-			closeBraces(); // root braces
-			writer.flush();
-		} catch (IOException e) {
-			throw new TupleQueryResultHandlerException(e);
-		}
-	}
-
-	public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException {
-		try {
-			if (firstTupleWritten) {
-				writeComma();
-			} else {
-				firstTupleWritten = true;
-			}
-
-			openBraces(); // start of new solution
-
-			Iterator<Binding> bindingIter = bindingSet.iterator();
-			while (bindingIter.hasNext()) {
-				Binding binding = bindingIter.next();
-
-				writeKeyValue(binding.getName(), binding.getValue());
-
-				if (bindingIter.hasNext()) {
-					writeComma();
-				}
-			}
-
-			closeBraces(); // end solution
-
-			writer.flush();
-		} catch (IOException e) {
-			throw new TupleQueryResultHandlerException(e);
-		}
-	}
-
-	private void writeKeyValue(String key, String value) throws IOException {
-		writeKey(key);
-		writeString(value);
-	}
-
-	private void writeKeyValue(String key, Value value) throws IOException, TupleQueryResultHandlerException {
-		writeKey(key);
-		writeValue(value);
-	}
-
-	private void writeKeyValue(String key, Iterable<String> array)
-			throws IOException {
-		writeKey(key);
-		writeArray(array);
-	}
-
-	private void writeKey(String key) throws IOException {
-		writeString(key);
-		writer.write(": ");
-	}
-
-	private void writeValue(Value value) throws IOException, TupleQueryResultHandlerException {
-		writer.write("{ ");
-
-		if (value instanceof URI) {
-			writeKeyValue("type", "uri");
-			writer.write(", ");
-			writeKeyValue("value", ((URI) value).toString());
-		} else if (value instanceof BNode) {
-			writeKeyValue("type", "bnode");
-			writer.write(", ");
-			writeKeyValue("value", ((BNode) value).getID());
-		} else if (value instanceof Literal) {
-			Literal lit = (Literal) value;
-
-			if (lit.getLanguage() != null) {
-				writeKeyValue("xml:lang", lit.getLanguage());
-				writer.write(", ");
-			}
-			if (lit.getDatatype() != null) {
-				writeKeyValue("datatype", lit.getDatatype().toString());
-				writer.write(", ");
-			}
-
-			writeKeyValue("type", "literal");
-
-			writer.write(", ");
-			writeKeyValue("value", lit.getLabel());
-		} else {
-			throw new TupleQueryResultHandlerException(
-					"Unknown Value object type: " + value.getClass());
-		}
-
-		writer.write(" }");
-	}
-
-	private void writeString(String value) throws IOException {
-		// Escape special characters
-		value = StringUtil.gsub("\\", "\\\\", value);
-		value = StringUtil.gsub("\"", "\\\"", value);
-		value = StringUtil.gsub("/", "\\/", value);
-		value = StringUtil.gsub("\b", "\\b", value);
-		value = StringUtil.gsub("\f", "\\f", value);
-		value = StringUtil.gsub("\n", "\\n", value);
-		value = StringUtil.gsub("\r", "\\r", value);
-		value = StringUtil.gsub("\t", "\\t", value);
-
-		writer.write("\"");
-		writer.write(value);
-		writer.write("\"");
-	}
-
-	private void writeArray(Iterable<String> array) throws IOException {
-		writer.write("[ ");
-
-		Iterator<String> iter = array.iterator();
-		while (iter.hasNext()) {
-			String value = iter.next();
-
-			writeString(value);
-
-			if (iter.hasNext()) {
-				writer.write(", ");
-			}
-		}
-
-		writer.write(" ]");
-	}
-
-	private void openArray() throws IOException {
-		writer.write("[");
-		writer.writeEOL();
-		writer.increaseIndentation();
-	}
-
-	private void closeArray() throws IOException {
-		writer.writeEOL();
-		writer.decreaseIndentation();
-		writer.write("]");
-	}
-
-	private void openBraces() throws IOException {
-		writer.write("{");
-		writer.writeEOL();
-		writer.increaseIndentation();
-	}
-
-	private void closeBraces() throws IOException {
-		writer.writeEOL();
-		writer.decreaseIndentation();
-		writer.write("}");
-	}
-
-	private void writeComma() throws IOException {
-		writer.write(", ");
-		writer.writeEOL();
-	}
-
-	@Override
-	public void handleBoolean(boolean arg0) throws QueryResultHandlerException {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void handleLinks(List<String> arg0)
-			throws QueryResultHandlerException {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public QueryResultFormat getQueryResultFormat() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public void handleNamespace(String prefix, String uri)
-			throws QueryResultHandlerException {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void startDocument() throws QueryResultHandlerException {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void handleStylesheet(String stylesheetUrl)
-			throws QueryResultHandlerException {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void startHeader() throws QueryResultHandlerException {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void endHeader() throws QueryResultHandlerException {
-		// TODO Auto-generated method stub
-
-	}
-
-    /**
-     * @return A collection of {@link RioSetting}s that are supported by this
-     *         RDFWriter.
-     * @since 2.7.0
-     */
-	@Override
-	public Collection<RioSetting<?>> getSupportedSettings() {
-		return new ArrayList<RioSetting<?>>();
-	}
-
-    /**
-     * Retrieves the current writer configuration as a single object.
-     * 
-     * @return a writer configuration object representing the current
-     *         configuration of the writer.
-     * @since 2.7.0
-     */
-	@Override
-	public WriterConfig getWriterConfig() {
-		return config;
-	}
-
-    /**
-     * Sets all supplied writer configuration options.
-     * 
-     * @param config
-     *        a writer configuration object.
-     * @since 2.7.0
-     */
-	@Override
-	public void setWriterConfig(WriterConfig config) {
-		this.config = config;
-	}
-	
-}

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/e931d8bc/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebService.java b/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebService.java
index d3f11fd..2383886 100644
--- a/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebService.java
+++ b/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/webservices/SparqlWebService.java
@@ -20,11 +20,10 @@ package org.apache.marmotta.platform.sparql.webservices;
 import org.apache.marmotta.platform.core.api.templating.TemplatingService;
 import org.apache.marmotta.platform.core.exception.MarmottaException;
 import org.apache.marmotta.platform.sparql.api.sparql.SparqlService;
+import org.apache.marmotta.platform.sparql.services.sparql.SparqlWritersHelper;
 import org.apache.marmotta.platform.sparql.services.sparqlio.rdf.SPARQLGraphResultWriter;
 import org.apache.marmotta.platform.sparql.services.sparqlio.sparqlhtml.SPARQLBooleanHTMLWriter;
 import org.apache.marmotta.platform.sparql.services.sparqlio.sparqlhtml.SPARQLResultsHTMLWriter;
-import org.apache.marmotta.platform.sparql.services.sparqlio.sparqljson.SPARQLBooleanJSONWriter;
-import org.apache.marmotta.platform.sparql.services.sparqlio.sparqljson.SPARQLResultsJSONWriter;
 import com.google.common.collect.Lists;
 import com.google.common.io.CharStreams;
 import org.apache.marmotta.platform.core.api.config.ConfigurationService;
@@ -37,12 +36,11 @@ import org.openrdf.query.MalformedQueryException;
 import org.openrdf.query.QueryEvaluationException;
 import org.openrdf.query.QueryLanguage;
 import org.openrdf.query.UpdateExecutionException;
+import org.openrdf.query.resultio.BooleanQueryResultFormat;
 import org.openrdf.query.resultio.BooleanQueryResultWriter;
+import org.openrdf.query.resultio.QueryResultIO;
+import org.openrdf.query.resultio.TupleQueryResultFormat;
 import org.openrdf.query.resultio.TupleQueryResultWriter;
-import org.openrdf.query.resultio.sparqlxml.SPARQLBooleanXMLWriter;
-import org.openrdf.query.resultio.sparqlxml.SPARQLResultsXMLWriter;
-import org.openrdf.query.resultio.text.BooleanTextWriter;
-import org.openrdf.query.resultio.text.csv.SPARQLResultsCSVWriter;
 import org.slf4j.Logger;
 
 import javax.enterprise.context.ApplicationScoped;
@@ -535,15 +533,15 @@ public class SparqlWebService {
         //build outputwriter
         final TupleQueryResultWriter out;
         if(format == null) {
-            out = new SPARQLResultsXMLWriter(os);
-        } else if(parseSubType(format).equals("html")) {
+            out = QueryResultIO.createWriter(TupleQueryResultFormat.SPARQL, os);
+        } else if(SparqlWritersHelper.parseSubType(format).equals("html")) {
             out = new SPARQLResultsHTMLWriter(os, templatingService);
-        } else if(parseSubType(format).equals("json")) {
-            out = new SPARQLResultsJSONWriter(os);
-        } else if(parseSubType(format).equals("xml")) {
-            out = new SPARQLResultsXMLWriter(os);
-        } else if(parseSubType(format).equals("csv")) {
-            out = new SPARQLResultsCSVWriter(os);
+        } else if(SparqlWritersHelper.parseSubType(format).equals("json")) {
+            out = QueryResultIO.createWriter(TupleQueryResultFormat.JSON, os);
+        } else if(SparqlWritersHelper.parseSubType(format).equals("xml")) {
+            out = QueryResultIO.createWriter(TupleQueryResultFormat.SPARQL, os);
+        } else if(SparqlWritersHelper.parseSubType(format).equals("csv")) {
+            out = QueryResultIO.createWriter(TupleQueryResultFormat.CSV, os);
         } else throw new InvalidArgumentException("could not produce format "+format);
         return out;
     }
@@ -552,15 +550,15 @@ public class SparqlWebService {
         //build outputwriter
         final BooleanQueryResultWriter out;
         if(format == null) {
-            out = new SPARQLBooleanXMLWriter(os);
-        } else if(parseSubType(format).equals("html")) {
+            out = QueryResultIO.createWriter(BooleanQueryResultFormat.SPARQL, os);
+        } else if(SparqlWritersHelper.parseSubType(format).equals("html")) {
             out = new SPARQLBooleanHTMLWriter(os);
-        } else if(parseSubType(format).equals("json")) {
-            out = new SPARQLBooleanJSONWriter(os);
-        } else if(parseSubType(format).equals("xml")) {
-            out = new SPARQLBooleanXMLWriter(os);
-        } else if(parseSubType(format).equals("csv")) {
-            out = new BooleanTextWriter(os);
+        } else if(SparqlWritersHelper.parseSubType(format).equals("json")) {
+            out = QueryResultIO.createWriter(BooleanQueryResultFormat.JSON, os);
+        } else if(SparqlWritersHelper.parseSubType(format).equals("xml")) {
+            out = QueryResultIO.createWriter(BooleanQueryResultFormat.SPARQL, os);
+        } else if(SparqlWritersHelper.parseSubType(format).equals("csv")) {
+            out = QueryResultIO.createWriter(BooleanQueryResultFormat.TEXT, os);
         } else throw new InvalidArgumentException("could not produce format "+format);
         return out;
     }