Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 0555B200B73 for ; Mon, 15 Aug 2016 06:44:30 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 03F20160AA9; Mon, 15 Aug 2016 04:44:30 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id C685A160AB4 for ; Mon, 15 Aug 2016 06:44:28 +0200 (CEST) Received: (qmail 81929 invoked by uid 500); 15 Aug 2016 04:44:28 -0000 Mailing-List: contact commits-help@clerezza.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@clerezza.apache.org Delivered-To: mailing list commits@clerezza.apache.org Received: (qmail 81904 invoked by uid 99); 15 Aug 2016 04:44:26 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 15 Aug 2016 04:44:26 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 9A12BE094D; Mon, 15 Aug 2016 04:44:26 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: reto@apache.org To: commits@clerezza.apache.org Date: Mon, 15 Aug 2016 04:44:27 -0000 Message-Id: In-Reply-To: <29d8ed289ebc496aa15f4e8570cea701@git.apache.org> References: <29d8ed289ebc496aa15f4e8570cea701@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/2] clerezza-rdf-core git commit: Added support for queries returning graphs archived-at: Mon, 15 Aug 2016 04:44:30 -0000 Added support for queries returning graphs Project: http://git-wip-us.apache.org/repos/asf/clerezza-rdf-core/repo Commit: http://git-wip-us.apache.org/repos/asf/clerezza-rdf-core/commit/3da2f8bd Tree: http://git-wip-us.apache.org/repos/asf/clerezza-rdf-core/tree/3da2f8bd Diff: http://git-wip-us.apache.org/repos/asf/clerezza-rdf-core/diff/3da2f8bd Branch: refs/heads/master Commit: 3da2f8bde63419cfa82b61662c805a3c14276bc7 Parents: 91aeda1 Author: Reto Gmuer Authored: Mon Aug 15 04:44:08 2016 +0000 Committer: Reto Gmuer Committed: Mon Aug 15 04:44:08 2016 +0000 ---------------------------------------------------------------------- impl.sparql/pom.xml | 7 +- .../commons/rdf/impl/sparql/SparqlClient.java | 210 ++--------------- .../rdf/impl/sparql/SparqlResultParser.java | 225 +++++++++++++++++++ .../rdf/impl/sparql/SparqlClientTest.java | 11 +- 4 files changed, 254 insertions(+), 199 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/clerezza-rdf-core/blob/3da2f8bd/impl.sparql/pom.xml ---------------------------------------------------------------------- diff --git a/impl.sparql/pom.xml b/impl.sparql/pom.xml index 8cde92d..dcf81fc 100644 --- a/impl.sparql/pom.xml +++ b/impl.sparql/pom.xml @@ -106,7 +106,12 @@ org.apache.clerezza rdf.core 1.0.0 - test + + + org.apache.clerezza + rdf.jena.parser + 1.1.1 + runtime org.apache.clerezza http://git-wip-us.apache.org/repos/asf/clerezza-rdf-core/blob/3da2f8bd/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClient.java ---------------------------------------------------------------------- diff --git a/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClient.java b/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClient.java index 4191748..6379325 100644 --- a/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClient.java +++ b/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClient.java @@ -15,13 +15,9 @@ */ package org.apache.clerezza.commons.rdf.impl.sparql; -import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.StringWriter; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.http.HttpEntity; @@ -33,14 +29,8 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; -import javax.xml.parsers.*; -import org.apache.clerezza.commons.rdf.BlankNode; -import org.apache.clerezza.commons.rdf.IRI; -import org.apache.clerezza.commons.rdf.Language; import org.apache.clerezza.commons.rdf.RDFTerm; -import org.apache.clerezza.commons.rdf.impl.utils.AbstractLiteral; -import org.xml.sax.*; -import org.xml.sax.helpers.*; +import org.apache.clerezza.rdf.core.serializedform.Parser; /** * @@ -65,199 +55,25 @@ public class SparqlClient { nvps.add(new BasicNameValuePair("query", query)); httpPost.setEntity(new UrlEncodedFormEntity(nvps)); CloseableHttpResponse response2 = httpclient.execute(httpPost); - + HttpEntity entity2 = response2.getEntity(); try { - HttpEntity entity2 = response2.getEntity(); InputStream in = entity2.getContent(); - SAXParserFactory spf = SAXParserFactory.newInstance(); - spf.setNamespaceAware(true); - SAXParser saxParser = spf.newSAXParser(); - XMLReader xmlReader = saxParser.getXMLReader(); - final SparqlsResultsHandler sparqlsResultsHandler = new SparqlsResultsHandler(); - xmlReader.setContentHandler(sparqlsResultsHandler); - xmlReader.parse(new InputSource(in)); - /* - for (int ch = in.read(); ch != -1; ch = in.read()) { - System.out.print((char)ch); - } - */ - // do something useful with the response body - // and ensure it is fully consumed + final String mediaType = entity2.getContentType().getValue(); + if ("application/sparql-results+xml".equals(mediaType)) { + return SparqlResultParser.parse(in); + } else { + //assuming RDF response + //FIXME clerezza-core-rdf to clerezza dependency + Parser parser = Parser.getInstance(); + return parser.parse(in, mediaType); + } + } finally { EntityUtils.consume(entity2); - return sparqlsResultsHandler.getResults(); - } catch (ParserConfigurationException ex) { - throw new RuntimeException(ex); - } catch (SAXException ex) { - throw new RuntimeException(ex); - } finally { response2.close(); } } - final public static class SparqlsResultsHandler extends DefaultHandler { - - private String currentBindingName; - private Map currentResult = null; - private Object results = null; - private boolean readingValue; - private String lang; //the xml:lang attribute of a literal - private StringWriter valueWriter; - private Map bNodeMap = new HashMap<>(); - private static final IRI XSD_STRING = new IRI("http://www.w3.org/2001/XMLSchema#string"); - private static final IRI RDF_LANG_STRING = new IRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#langString"); - - private RDFTerm getBNode(String value) { - if (!bNodeMap.containsKey(value)) { - bNodeMap.put(value, new BlankNode()); - } - return bNodeMap.get(value); - } - - private Object getResults() { - return results; - } - - private List> getResultValueMaps() { - return (List>)results; - } - - enum BindingType { - - uri, bnode, literal; - } - - @Override - public void startDocument() throws SAXException { - - } - - @Override - public void startElement(String namespaceURI, - String localName, - String qName, - Attributes atts) - throws SAXException { - if ("http://www.w3.org/2005/sparql-results#".equals(namespaceURI)) { - if ("boolean".equals(localName)) { - if (results != null) { - throw new SAXException("unexpected tag "); - } - //results will have Boolean value assigned once value is read - readingValue = true; - valueWriter = new StringWriter(); - } else if ("results".equals(localName)) { - if (results != null) { - throw new SAXException("unexpected tag "); - } - results = new ArrayList>(); - } else if ("result".equals(localName)) { - if (currentResult != null) { - throw new SAXException("unexpected tag "); - } - currentResult = new HashMap(); - } else if ("binding".equals(localName)) { - if (currentResult == null) { - throw new SAXException("unexpected tag "); - } - currentBindingName = atts.getValue("name"); - } else if ("uri".equals(localName) || "bnode".equals(localName) || "literal".equals(localName)) { - if (readingValue) { - throw new SAXException("unexpected tag <" + localName + ">"); - } - lang = atts.getValue("http://www.w3.org/XML/1998/namespace", "lang"); - readingValue = true; - valueWriter = new StringWriter(); - } - } - - //System.out.println(namespaceURI); - //System.out.println(qName); - } - - @Override - public void characters(char[] chars, int start, int length) throws SAXException { - if (readingValue) { - valueWriter.write(chars, start, length); - //System.err.println(value + start + ", " + length); - } - } - - @Override - public void endElement(String namespaceURI, - String localName, - String qName) - throws SAXException { - if ("http://www.w3.org/2005/sparql-results#".equals(namespaceURI)) { - if ("result".equals(localName)) { - ((List>)results).add(currentResult); - currentResult = null; - } else if ("binding".equals(localName)) { - if (currentBindingName == null) { - throw new SAXException("unexpected tag "); - } - currentBindingName = null; - } else if ("boolean".equals(localName)) { - results = new Boolean(valueWriter.toString()); - valueWriter = null; - readingValue = false; - } else { - try { - BindingType b = BindingType.valueOf(localName); - RDFTerm rdfTerm = null; - final Language language = lang == null? null : new Language(lang);; - switch (b) { - case uri: - rdfTerm = new IRI(valueWriter.toString()); - valueWriter = null; - break; - case bnode: - rdfTerm = getBNode(valueWriter.toString()); - valueWriter = null; - break; - case literal: - final String lf = valueWriter.toString(); - rdfTerm = new AbstractLiteral() { - - @Override - public String getLexicalForm() { - return lf; - } - - @Override - public IRI getDataType() { - if (language != null) { - return RDF_LANG_STRING; - } - //TODO implement - return XSD_STRING; - } - - @Override - public Language getLanguage() { - return language; - } - - @Override - public String toString() { - return "\""+getLexicalForm()+"\"@"+getLanguage(); - } - }; - break; - } - currentResult.put(currentBindingName, rdfTerm); - readingValue = false; - } catch (IllegalArgumentException e) { - //not uri|bnode|literal - } - } - } - } - - public void endDocument() throws SAXException { - //System.out.println("results: " + results.size()); - } - - } + } http://git-wip-us.apache.org/repos/asf/clerezza-rdf-core/blob/3da2f8bd/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlResultParser.java ---------------------------------------------------------------------- diff --git a/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlResultParser.java b/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlResultParser.java new file mode 100644 index 0000000..43d48f0 --- /dev/null +++ b/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlResultParser.java @@ -0,0 +1,225 @@ +/* + * Copyright 2016 The Apache Software Foundation. + * + * Licensed 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.clerezza.commons.rdf.impl.sparql; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import org.apache.clerezza.commons.rdf.BlankNode; +import org.apache.clerezza.commons.rdf.IRI; +import org.apache.clerezza.commons.rdf.Language; +import org.apache.clerezza.commons.rdf.RDFTerm; +import org.apache.clerezza.commons.rdf.impl.utils.AbstractLiteral; +import org.apache.http.util.EntityUtils; +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.DefaultHandler; + +/** + * + * @author user + */ +public class SparqlResultParser { + + static Object parse(InputStream in) throws IOException { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setNamespaceAware(true); + SAXParser saxParser = spf.newSAXParser(); + XMLReader xmlReader = saxParser.getXMLReader(); + final SparqlsResultsHandler sparqlsResultsHandler = new SparqlsResultsHandler(); + xmlReader.setContentHandler(sparqlsResultsHandler); + xmlReader.parse(new InputSource(in)); + return sparqlsResultsHandler.getResults(); + } catch (ParserConfigurationException | SAXException ex) { + throw new RuntimeException(ex); + } + } + + final public static class SparqlsResultsHandler extends DefaultHandler { + + private String currentBindingName; + private Map currentResult = null; + private Object results = null; + private boolean readingValue; + private String lang; //the xml:lang attribute of a literal + private StringWriter valueWriter; + private Map bNodeMap = new HashMap<>(); + private static final IRI XSD_STRING = new IRI("http://www.w3.org/2001/XMLSchema#string"); + private static final IRI RDF_LANG_STRING = new IRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#langString"); + + private RDFTerm getBNode(String value) { + if (!bNodeMap.containsKey(value)) { + bNodeMap.put(value, new BlankNode()); + } + return bNodeMap.get(value); + } + + private Object getResults() { + return results; + } + + private List> getResultValueMaps() { + return (List>) results; + } + + enum BindingType { + + uri, bnode, literal; + } + + @Override + public void startDocument() throws SAXException { + + } + + @Override + public void startElement(String namespaceURI, + String localName, + String qName, + Attributes atts) + throws SAXException { + if ("http://www.w3.org/2005/sparql-results#".equals(namespaceURI)) { + if ("boolean".equals(localName)) { + if (results != null) { + throw new SAXException("unexpected tag "); + } + //results will have Boolean value assigned once value is read + readingValue = true; + valueWriter = new StringWriter(); + } else if ("results".equals(localName)) { + if (results != null) { + throw new SAXException("unexpected tag "); + } + results = new ArrayList>(); + } else if ("result".equals(localName)) { + if (currentResult != null) { + throw new SAXException("unexpected tag "); + } + currentResult = new HashMap(); + } else if ("binding".equals(localName)) { + if (currentResult == null) { + throw new SAXException("unexpected tag "); + } + currentBindingName = atts.getValue("name"); + } else if ("uri".equals(localName) || "bnode".equals(localName) || "literal".equals(localName)) { + if (readingValue) { + throw new SAXException("unexpected tag <" + localName + ">"); + } + lang = atts.getValue("http://www.w3.org/XML/1998/namespace", "lang"); + readingValue = true; + valueWriter = new StringWriter(); + } + } + + //System.out.println(namespaceURI); + //System.out.println(qName); + } + + @Override + public void characters(char[] chars, int start, int length) throws SAXException { + if (readingValue) { + valueWriter.write(chars, start, length); + //System.err.println(value + start + ", " + length); + } + } + + @Override + public void endElement(String namespaceURI, + String localName, + String qName) + throws SAXException { + if ("http://www.w3.org/2005/sparql-results#".equals(namespaceURI)) { + if ("result".equals(localName)) { + ((List>) results).add(currentResult); + currentResult = null; + } else if ("binding".equals(localName)) { + if (currentBindingName == null) { + throw new SAXException("unexpected tag "); + } + currentBindingName = null; + } else if ("boolean".equals(localName)) { + results = new Boolean(valueWriter.toString()); + valueWriter = null; + readingValue = false; + } else { + try { + BindingType b = BindingType.valueOf(localName); + RDFTerm rdfTerm = null; + final Language language = lang == null ? null : new Language(lang);; + switch (b) { + case uri: + rdfTerm = new IRI(valueWriter.toString()); + valueWriter = null; + break; + case bnode: + rdfTerm = getBNode(valueWriter.toString()); + valueWriter = null; + break; + case literal: + final String lf = valueWriter.toString(); + rdfTerm = new AbstractLiteral() { + + @Override + public String getLexicalForm() { + return lf; + } + + @Override + public IRI getDataType() { + if (language != null) { + return RDF_LANG_STRING; + } + //TODO implement + return XSD_STRING; + } + + @Override + public Language getLanguage() { + return language; + } + + @Override + public String toString() { + return "\"" + getLexicalForm() + "\"@" + getLanguage(); + } + }; + break; + } + currentResult.put(currentBindingName, rdfTerm); + readingValue = false; + } catch (IllegalArgumentException e) { + //not uri|bnode|literal + } + } + } + } + + public void endDocument() throws SAXException { + //System.out.println("results: " + results.size()); + } + + } +} http://git-wip-us.apache.org/repos/asf/clerezza-rdf-core/blob/3da2f8bd/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClientTest.java ---------------------------------------------------------------------- diff --git a/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClientTest.java b/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClientTest.java index fcda4de..2977f4e 100644 --- a/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClientTest.java +++ b/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClientTest.java @@ -85,7 +85,16 @@ public class SparqlClientTest { + " " + " ?name}"); Assert.assertEquals("ASK should result to true", Boolean.TRUE, result); - } + } + + @Test + public void desribe() throws IOException { + final SparqlClient sparqlClient = new SparqlClient( + "http://localhost:" + serverPort + "/ds/query"); + Object result = sparqlClient.queryResult( + "DESCRIBE "); + Assert.assertTrue("DESCRIBE should return a graph", result instanceof Graph); + } public static int findFreePort() { int port = 0;