/*
* Licensed to Aduna under one or more contributor license agreements.
* See the NOTICE.txt file distributed with this work for additional
* information regarding copyright ownership.
*
* Aduna licenses this file to you under the terms of the Aduna BSD
* License (the "License"); you may not use this file except in compliance
* with the License. See the LICENSE.txt file distributed with this work
* for the full License.
*
* 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 com.bigdata.rdf.rio.json;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.List;
import org.apache.commons.io.input.ReaderInputStream;
import org.openrdf.model.Resource;
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
import org.openrdf.model.ValueFactory;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryResultHandlerException;
import org.openrdf.query.TupleQueryResultHandler;
import org.openrdf.query.TupleQueryResultHandlerException;
import org.openrdf.query.resultio.QueryResultParseException;
import org.openrdf.rio.RDFFormat;
import org.openrdf.rio.RDFHandlerException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.rio.RDFParser;
import org.openrdf.rio.helpers.RDFParserBase;
import com.bigdata.rdf.ServiceProviderHook;
/**
* Parser for SPARQL-1.1 JSON Results Format documents
*
* @see <a href="http://www.w3.org/TR/sparql11-results-json/">SPARQL 1.1 Query
* Results JSON Format</a>
* @author Peter Ansell
*/
public class BigdataSPARQLResultsJSONParserForConstruct extends RDFParserBase
implements RDFParser, TupleQueryResultHandler {
private final BigdataSPARQLResultsJSONParser parser;
public BigdataSPARQLResultsJSONParserForConstruct() {
this.parser = new BigdataSPARQLResultsJSONParser();
}
public BigdataSPARQLResultsJSONParserForConstruct(final ValueFactory vf) {
this.parser = new BigdataSPARQLResultsJSONParser(vf);
this.parser.setQueryResultHandler(this);
}
@Override
public RDFFormat getRDFFormat() {
return ServiceProviderHook.JSON_RDR;
}
@Override
public void parse(InputStream in, String baseURI) throws IOException,
RDFParseException, RDFHandlerException {
try {
parser.parseQueryResult(in);
} catch (QueryResultParseException e) {
throw new RDFParseException(e);
} catch (QueryResultHandlerException e) {
throw new RDFHandlerException(e);
}
}
@Override
public void parse(Reader reader, String baseURI) throws IOException,
RDFParseException, RDFHandlerException {
parse(new ReaderInputStream(reader), baseURI);
}
@Override
public void handleBoolean(boolean value) throws QueryResultHandlerException {
// do nothing
}
@Override
public void handleLinks(List<String> linkUrls)
throws QueryResultHandlerException {
// do nothing
}
@Override
public void startQueryResult(List<String> bindingNames)
throws TupleQueryResultHandlerException {
try {
getRDFHandler().startRDF();
} catch (RDFHandlerException e) {
throw new TupleQueryResultHandlerException(e);
}
}
@Override
public void endQueryResult() throws TupleQueryResultHandlerException {
try {
getRDFHandler().endRDF();
} catch (RDFHandlerException e) {
throw new TupleQueryResultHandlerException(e);
}
}
@Override
public void handleSolution(BindingSet bs)
throws TupleQueryResultHandlerException {
if (!bs.hasBinding("subject")) {
throw new TupleQueryResultHandlerException("no subject: " + bs);
}
if (!bs.hasBinding("predicate")) {
throw new TupleQueryResultHandlerException("no predicate: " + bs);
}
if (!bs.hasBinding("object")) {
throw new TupleQueryResultHandlerException("no object: " + bs);
}
final Resource s = (Resource) bs.getValue("subject");
final URI p = (URI) bs.getValue("predicate");
final Value o = (Value) bs.getValue("object");
final Resource c = bs.hasBinding("context") ?
(Resource) bs.getBinding("context") : null;
final Statement stmt = valueFactory.createStatement(s, p, o, c);
try {
getRDFHandler().handleStatement(stmt);
} catch (RDFHandlerException e) {
throw new TupleQueryResultHandlerException(e);
}
}
}