package com.bigdata.rdf.sail.webapp.client; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.HttpRequest; import org.eclipse.jetty.client.HttpResponse; import org.eclipse.jetty.client.api.Response.ResponseListener; import org.eclipse.jetty.client.api.Result; import org.eclipse.jetty.http.HttpHeader; import org.openrdf.query.resultio.TupleQueryResultFormat; import org.openrdf.rio.RDFFormat; public class MockRemoteRepository extends RemoteRepository { public final static class Data { public ConnectOptions opts; public HttpRequest request; public IPreparedTupleQuery query; protected List<ResponseListener> listeners; } public Data data; private MockRemoteRepository(RemoteRepositoryManager mgr, String sparqlEndpointURL, IRemoteTx tx, Data data) { super(mgr, sparqlEndpointURL, tx); this.data = data; } public static MockRemoteRepository create(final String tupleQueryResponse, final String graphQueryResponse) { // pojo to retrieve values from mock service final Data data = new Data(); String serviceURL = "localhost"; HttpClient httpClient = new HttpClient() { @Override protected void send(HttpRequest request, List<ResponseListener> listeners) { // Store HTTP request data.request = request; data.listeners = listeners; for (ResponseListener listener: listeners) { if (listener instanceof JettyResponseListener) { HttpResponse response = new HttpResponse(request, null){ @Override public int getStatus() { return 200; }; }; String requestMimeType = request.getHeaders().get(HttpHeader.ACCEPT).split(";")[0]; TupleQueryResultFormat tupleQueryMimeType = TupleQueryResultFormat.forMIMEType(requestMimeType); String responseMimeType; String responseContent; if (tupleQueryMimeType!=null) { responseMimeType = TupleQueryResultFormat.TSV.getDefaultMIMEType(); responseContent = tupleQueryResponse; } else { responseMimeType = RDFFormat.NTRIPLES.getDefaultMIMEType(); responseContent = graphQueryResponse; } response.getHeaders().add(HttpHeader.CONTENT_TYPE, responseMimeType); ((JettyResponseListener)listener).onHeaders(response); java.nio.ByteBuffer buf = java.nio.ByteBuffer.allocate(responseContent.length()); buf.put(responseContent.getBytes(Charset.forName(StandardCharsets.UTF_8.name()))); buf.flip(); ((JettyResponseListener)listener).onContent(response, buf); ((JettyResponseListener)listener).onSuccess(response); ((JettyResponseListener)listener).onComplete(new Result(request, response)); } } } @Override public boolean isStopped() { return false; } }; Executor executor = Executors.newCachedThreadPool(); RemoteRepositoryManager mgr = new RemoteRepositoryManager(serviceURL, httpClient, executor) { @Override public JettyResponseListener doConnect(ConnectOptions opts) throws Exception { // Store connection options data.opts = opts; return super.doConnect(opts); } }; return new MockRemoteRepository(mgr, serviceURL, null, data); } @Override public IPreparedTupleQuery prepareTupleQuery(String query) throws Exception { // Store IPreparedTupleQuery return data.query = super.prepareTupleQuery(query); } }