Implemented searching option using a network endpoint.
Change-Id: I1a35d482f0df49fc1acaef9aca027eb2fa551401
diff --git a/full/Changes b/full/Changes
index b179a17..049a39f 100644
--- a/full/Changes
+++ b/full/Changes
@@ -17,7 +17,9 @@
- Added new APIs: list user-installed plugins and uninstall plugin.
- Moved install and list plugin APIs to PluginController and updated their
service paths under /plugins.
-
+2022-06-03
+ - Implemented searching option using a network endpoint
+
# version 0.67.1
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/SearchNetworkEndpointTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/SearchNetworkEndpointTest.java
new file mode 100644
index 0000000..27e6695
--- /dev/null
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/SearchNetworkEndpointTest.java
@@ -0,0 +1,123 @@
+package de.ids_mannheim.korap.web.controller;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockserver.integration.ClientAndServer.startClientAndServer;
+import static org.mockserver.model.HttpRequest.request;
+import static org.mockserver.model.HttpResponse.response;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockserver.client.MockServerClient;
+import org.mockserver.integration.ClientAndServer;
+import org.mockserver.model.Header;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.sun.jersey.api.client.ClientResponse;
+
+import de.ids_mannheim.korap.config.KustvaktConfiguration;
+import de.ids_mannheim.korap.config.SpringJerseyTest;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.exceptions.StatusCodes;
+import de.ids_mannheim.korap.utils.JsonUtils;
+
+public class SearchNetworkEndpointTest extends SpringJerseyTest {
+
+ @Autowired
+ private KustvaktConfiguration config;
+
+ private ClientAndServer mockServer;
+ private MockServerClient mockClient;
+
+ private int port = 6081;
+ private String searchResult;
+ private String endpointURL = "http://localhost:"+port+"/searchEndpoint";
+
+ public SearchNetworkEndpointTest () throws IOException {
+ searchResult = IOUtils.toString(
+ ClassLoader.getSystemResourceAsStream(
+ "network-output/search-result.jsonld"),
+ StandardCharsets.UTF_8);
+ }
+
+
+ @Before
+ public void startMockServer () {
+ mockServer = startClientAndServer(port);
+ mockClient = new MockServerClient("localhost", mockServer.getPort());
+ }
+
+
+ @After
+ public void stopMockServer () {
+ mockServer.stop();
+ }
+
+
+ @Test
+ public void testSearchNetwork ()
+ throws IOException, KustvaktException, URISyntaxException {
+ config.setNetworkEndpointURL(endpointURL);
+ mockClient.reset()
+ .when(request().withMethod("POST").withPath("/searchEndpoint")
+ .withHeaders(
+ new Header("Content-Type",
+ "application/json; charset=utf-8"),
+ new Header("Accept", "application/json")))
+ .respond(response()
+ .withHeader(new Header("Content-Type",
+ "application/json; charset=utf-8"))
+ .withBody(searchResult).withStatusCode(200));
+
+ ClientResponse response = resource().path(API_VERSION).path("search")
+ .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
+ .queryParam("engine", "network").get(ClientResponse.class);
+
+ assertEquals(ClientResponse.Status.OK.getStatusCode(),
+ response.getStatus());
+
+ String entity = response.getEntity(String.class);
+ JsonNode node = JsonUtils.readTree(entity);
+
+ assertEquals(2, node.at("/matches").size());
+ }
+
+
+ @Test
+ public void testSearchWithUnknownURL ()
+ throws IOException, KustvaktException {
+ config.setNetworkEndpointURL("http://localhost:1040/search");
+ ClientResponse response = resource().path(API_VERSION).path("search")
+ .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
+ .queryParam("engine", "network").get(ClientResponse.class);
+
+ String entity = response.getEntity(String.class);
+ JsonNode node = JsonUtils.readTree(entity);
+ assertEquals(StatusCodes.SEARCH_NETWORK_ENDPOINT_FAILED,
+ node.at("/errors/0/0").asInt());
+ assertEquals(ClientResponse.Status.BAD_REQUEST.getStatusCode(),
+ response.getStatus());
+ }
+
+ @Test
+ public void testSearchWithUnknownHost () throws KustvaktException {
+ config.setNetworkEndpointURL("http://search.com");
+
+ ClientResponse response = resource().path(API_VERSION).path("search")
+ .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
+ .queryParam("engine", "network").get(ClientResponse.class);
+
+ String entity = response.getEntity(String.class);
+ JsonNode node = JsonUtils.readTree(entity);
+ assertEquals(StatusCodes.SEARCH_NETWORK_ENDPOINT_FAILED,
+ node.at("/errors/0/0").asInt());
+ assertEquals(ClientResponse.Status.BAD_REQUEST.getStatusCode(),
+ response.getStatus());
+ }
+}
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/SearchPipeTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/SearchPipeTest.java
index 99a6d86..2d95b19 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/SearchPipeTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/SearchPipeTest.java
@@ -37,8 +37,9 @@
private ClientAndServer mockServer;
private MockServerClient mockClient;
+ private int port = 6071;
private String pipeJson, pipeWithParamJson;
- private String glemmUri = "http://localhost:1080/glemm";
+ private String glemmUri = "http://localhost:"+port+"/glemm";
public SearchPipeTest () throws URISyntaxException, IOException {
pipeJson = IOUtils.toString(
@@ -54,7 +55,7 @@
@Before
public void startMockServer () {
- mockServer = startClientAndServer(1080);
+ mockServer = startClientAndServer(port);
mockClient = new MockServerClient("localhost", mockServer.getPort());
}
@@ -74,7 +75,7 @@
"application/json; charset=utf-8"))
.withBody("{test}").withStatusCode(200));
- URL url = new URL("http://localhost:1080/test");
+ URL url = new URL("http://localhost:"+port+"/test");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type",
@@ -233,7 +234,7 @@
.when(request().withMethod("POST").withPath("/non-json-pipe"))
.respond(response().withStatusCode(415));
- String pipeUri = "http://localhost:1080/non-json-pipe";
+ String pipeUri = "http://localhost:"+port+"/non-json-pipe";
ClientResponse response = resource().path(API_VERSION).path("search")
.queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
@@ -287,7 +288,7 @@
.withHeaders(new Header("Content-Type",
"application/json; charset=utf-8")));
- String pipeUri = "http://localhost:1080/invalid-response";
+ String pipeUri = "http://localhost:"+port+"/invalid-response";
ClientResponse response = resource().path(API_VERSION).path("search")
.queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
.queryParam("pipes", pipeUri).get(ClientResponse.class);
@@ -311,7 +312,7 @@
new Header("Accept", "application/json")))
.respond(response().withBody("blah").withStatusCode(200));
- String pipeUri = "http://localhost:1080/plain-text";
+ String pipeUri = "http://localhost:"+port+"/plain-text";
ClientResponse response = resource().path(API_VERSION).path("search")
.queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
.queryParam("pipes", pipeUri).get(ClientResponse.class);