/*
* 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.stanbol.entityhub.site.linkeddata.impl;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URLConnection;
import javax.ws.rs.core.UriBuilder;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class SparqlEndpointUtils {
private SparqlEndpointUtils() {/*
* Do not create instances of utility classes
*/
}
private static final Logger log = LoggerFactory.getLogger(SparqlEndpointUtils.class);
public static final String SPARQL_RESULT_JSON = "application/sparql-results+json";
/**
* Sends an SPARQL Request to the accessUri. Please note that based on the type of the SPARQL query
* different content are supported by the Site
*
* @param accessUri
* the uri of the SPARQL endpoint
* @param contentType
* the contentType of the returned RDF graph
* @param query
* the SPARQL Construct query
* @return the results as input stream
* @throws IOException
* @throws MalformedURLException
*/
public static InputStream sendSparqlRequest(String accessUri, String query, String contentType)
throws IOException, MalformedURLException {
log.trace("Sending SPARQL request [accessUri :: {}][query :: {}][contentType :: {}].",
new Object[]{accessUri, query,contentType});
final URI dereferenceUri = UriBuilder.fromUri(accessUri).queryParam("query", "{query}")
.queryParam("format", "{format}").build(query, contentType);
final URLConnection con = dereferenceUri.toURL().openConnection();
con.addRequestProperty("Accept", contentType);
try {
return con.getInputStream();
} catch (IOException e) {
if (con instanceof HttpURLConnection) {
// try to create a better Error Message
InputStream reason = ((HttpURLConnection) con).getErrorStream();
if (reason != null) {
String errorMessage = null;
try {
errorMessage = IOUtils.toString(reason);
} catch (IOException e1) {
// ignore ...
}
IOUtils.closeQuietly(reason);
if (errorMessage != null && !errorMessage.isEmpty()) {
throw new IOException(((HttpURLConnection) con).getRequestMethod()
+ " with Content: \n" + errorMessage, e);
}
}
}
// if still here re-throw the original exception
throw e;
}
}
}