package org.aksw.jena_sparql_api.example.proxy; import java.util.Collection; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Path; import javax.ws.rs.core.Context; import org.aksw.jena_sparql_api.core.QueryExecutionFactory; import org.aksw.jena_sparql_api.http.QueryExecutionFactoryHttp; import org.aksw.jena_sparql_api.stmt.SparqlStmtUpdate; import org.aksw.jena_sparql_api.utils.UriUtils; import org.aksw.jena_sparql_api.web.servlets.SparqlEndpointBase; import com.google.common.collect.Multimap; import org.apache.jena.query.Query; import org.apache.jena.query.QueryExecution; import org.apache.jena.update.UpdateProcessor; @Path("/sparql") public class SparqlEndpointProxy extends SparqlEndpointBase { private String defaultServiceUri; private boolean allowOverrideServiceUri = false; public SparqlEndpointProxy(@Context ServletContext context) { this.defaultServiceUri = (String)context.getAttribute("defaultServiceUri"); Boolean tmp = (Boolean)context.getAttribute("allowOverrideServiceUri"); this.allowOverrideServiceUri = tmp == null ? true : tmp; if(!allowOverrideServiceUri && (defaultServiceUri == null || defaultServiceUri.isEmpty()) ) { throw new RuntimeException("Overriding of service URI disabled, but no default URI set."); } } @Override public QueryExecution createQueryExecution(final Query query, @Context HttpServletRequest req) { Multimap<String, String> qs = UriUtils.parseQueryString(req.getQueryString()); Collection<String> serviceUris = qs.get("service-uri"); String serviceUri; if(serviceUris == null || serviceUris.isEmpty()) { serviceUri = defaultServiceUri; } else { serviceUri = serviceUris.iterator().next(); // If overriding is disabled, a given uri must match the default one if(!allowOverrideServiceUri && !defaultServiceUri.equals(serviceUri)) { throw new RuntimeException("Access to any service other than " + defaultServiceUri + " is blocked."); } } if(serviceUri == null) { throw new RuntimeException("No SPARQL service URI sent with the request and no default one is configured"); } QueryExecutionFactory qef = new QueryExecutionFactoryHttp(serviceUri); QueryExecution result = qef.createQueryExecution(query); return result; } @Override public UpdateProcessor createUpdateProcessor(SparqlStmtUpdate stmt) { throw new RuntimeException("Updates not supported"); } }