package org.aksw.jena_sparql_api.web.servlets; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.Context; import org.aksw.jena_sparql_api.core.SparqlService; import org.aksw.jena_sparql_api.core.SparqlServiceFactory; import org.aksw.jena_sparql_api.core.UpdateExecutionFactory; import org.aksw.jena_sparql_api.stmt.SparqlStmtUpdate; import org.aksw.jena_sparql_api.web.utils.AuthenticatorUtils; import org.aksw.jena_sparql_api.web.utils.DatasetDescriptionRequestUtils; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.HttpClient; import org.apache.jena.query.Query; import org.apache.jena.query.QueryExecution; import org.apache.jena.sparql.core.DatasetDescription; import org.apache.jena.update.UpdateProcessor; import org.apache.jena.update.UpdateRequest; import org.springframework.util.Assert; import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.ServletRequestUtils; /** * Proxy implementation based on a Sparql service object * @author raven * */ public abstract class ServletSparqlServiceBase extends SparqlEndpointBase { // private static final Logger logger = LoggerFactory.getLogger(ServletSparqlServiceBase.class); protected @Context HttpServletRequest req; //protected abstract SparqlStmtParser sparqlStmtParser; protected abstract SparqlServiceFactory getSparqlServiceFactory(); /** * Important: If no SPARQL service is specified, null is returned. * This means, that it is up to the SparqlServiceFactory to * - use a default service * - reject invalid service requests * * * @return */ protected String getServiceUri() { String result; try { result = ServletRequestUtils.getStringParameter(req, "service-uri"); } catch (ServletRequestBindingException e) { throw new RuntimeException(e); } return result; } protected UsernamePasswordCredentials getCredentials() { UsernamePasswordCredentials result = AuthenticatorUtils.parseCredentials(req); return result; } protected DatasetDescription getDatasetDescription() { DatasetDescription result = DatasetDescriptionRequestUtils.extractDatasetDescriptionAny(req); return result; } @Override public QueryExecution createQueryExecution(Query query) { SparqlServiceFactory ssf = getSparqlServiceFactory(); Assert.notNull(ssf, "Got null for SparqlServiceFactory"); String serviceUri = getServiceUri(); DatasetDescription datasetDescription = getDatasetDescription(); UsernamePasswordCredentials credentials = getCredentials(); HttpClient httpClient = AuthenticatorUtils.prepareHttpClientBuilder(credentials).build(); SparqlService ss = ssf.createSparqlService(serviceUri, datasetDescription, httpClient); QueryExecution result = ss.getQueryExecutionFactory().createQueryExecution(query); return result; } @Override public UpdateProcessor createUpdateProcessor(SparqlStmtUpdate stmt) { SparqlServiceFactory ssf = getSparqlServiceFactory(); Assert.notNull(ssf, "Got null for SparqlServiceFactory"); String serviceUri = getServiceUri(); DatasetDescription datasetDescription = getDatasetDescription(); UsernamePasswordCredentials credentials = getCredentials(); HttpClient httpClient = AuthenticatorUtils.prepareHttpClientBuilder(credentials).build(); SparqlService ss = ssf.createSparqlService(serviceUri, datasetDescription, httpClient); UpdateExecutionFactory uef = ss.getUpdateExecutionFactory(); UpdateProcessor result; if(stmt.isParsed()) { UpdateRequest updateRequest = stmt.getUpdateRequest(); result = uef.createUpdateProcessor(updateRequest); } else { String updateRequestStr = stmt.getOriginalString(); result = uef.createUpdateProcessor(updateRequestStr); } return result; } }