Skip to content

Commit ad4434b

Browse files
authored
Merge pull request #3572 from espenaf/master
Added support for filterClass to OpenApiServlet
2 parents 898bced + 1bee9be commit ad4434b

File tree

3 files changed

+135
-0
lines changed

3 files changed

+135
-0
lines changed

modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/OpenApiServlet.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package io.swagger.v3.jaxrs2.integration;
22

3+
import io.swagger.v3.core.filter.OpenAPISpecFilter;
4+
import io.swagger.v3.core.filter.SpecFilter;
35
import io.swagger.v3.core.util.Json;
46
import io.swagger.v3.core.util.Yaml;
7+
import io.swagger.v3.jaxrs2.util.ServletUtils;
58
import io.swagger.v3.oas.integration.OpenApiConfigurationException;
69
import io.swagger.v3.oas.integration.OpenApiContextLocator;
710
import io.swagger.v3.oas.integration.api.OpenApiContext;
811
import io.swagger.v3.oas.models.OpenAPI;
912
import org.apache.commons.lang3.StringUtils;
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
1015

1116
import javax.servlet.ServletConfig;
1217
import javax.servlet.ServletException;
@@ -20,6 +25,8 @@
2025

2126
public class OpenApiServlet extends HttpServlet {
2227

28+
private static final Logger LOGGER = LoggerFactory.getLogger(OpenApiServlet.class);
29+
2330
public static final String APPLICATION_JSON = "application/json";
2431
public static final String APPLICATION_YAML = "application/yaml";
2532
public static final String ACCEPT_HEADER = "Accept";
@@ -48,6 +55,19 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se
4855
OpenApiContext ctx = OpenApiContextLocator.getInstance().getOpenApiContext(ctxId);
4956
OpenAPI oas = ctx.read();
5057

58+
if (oas != null) {
59+
if (ctx.getOpenApiConfiguration() != null && ctx.getOpenApiConfiguration().getFilterClass() != null) {
60+
try {
61+
OpenAPISpecFilter filterImpl = (OpenAPISpecFilter) Class.forName(ctx.getOpenApiConfiguration().getFilterClass()).newInstance();
62+
SpecFilter f = new SpecFilter();
63+
oas = f.filter(oas, filterImpl, ServletUtils.getQueryParams(req.getParameterMap()),
64+
ServletUtils.getCookies(req.getCookies()), ServletUtils.getHeaders(req));
65+
} catch (Exception e) {
66+
LOGGER.error("failed to load filter", e);
67+
}
68+
}
69+
}
70+
5171
String type = "json";
5272

5373
String acceptHeader = req.getHeader(ACCEPT_HEADER);
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package io.swagger.v3.jaxrs2.util;
2+
3+
import io.swagger.v3.jaxrs2.integration.OpenApiServlet;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
7+
import javax.servlet.http.Cookie;
8+
import javax.servlet.http.HttpServletRequest;
9+
import javax.ws.rs.core.MultivaluedHashMap;
10+
import java.io.UnsupportedEncodingException;
11+
import java.net.URLDecoder;
12+
import java.nio.charset.StandardCharsets;
13+
import java.util.Collections;
14+
import java.util.HashMap;
15+
import java.util.List;
16+
import java.util.Map;
17+
import java.util.function.Function;
18+
import java.util.stream.Collectors;
19+
20+
public class ServletUtils {
21+
22+
private static final Logger LOGGER = LoggerFactory.getLogger(ServletUtils.class);
23+
24+
public static MultivaluedHashMap<String, String> getQueryParams(Map<String, String[]> parameterMap) {
25+
MultivaluedHashMap<String, String> queryParameters = new MultivaluedHashMap<>();
26+
27+
if (parameterMap.size() == 0) {
28+
return queryParameters;
29+
}
30+
31+
for (Map.Entry<String, String[]> parameter : parameterMap.entrySet()) {
32+
for (String value : parameter.getValue()) {
33+
try {
34+
queryParameters.add(URLDecoder.decode(parameter.getKey(), StandardCharsets.UTF_8.name()),
35+
URLDecoder.decode(value, StandardCharsets.UTF_8.name()));
36+
} catch (UnsupportedEncodingException e) {
37+
LOGGER.error("Unable to decode query parameter", e);
38+
}
39+
}
40+
}
41+
return queryParameters;
42+
}
43+
44+
public static Map<String, String> getCookies(Cookie[] cookies) {
45+
Map<String, String> mapOfCookies = new HashMap<>();
46+
if (cookies != null) {
47+
for (Cookie cookie : cookies) {
48+
mapOfCookies.put(cookie.getName(), cookie.getValue());
49+
}
50+
}
51+
return mapOfCookies;
52+
}
53+
54+
public static Map<String, List<String>> getHeaders(HttpServletRequest req) {
55+
if (req.getHeaderNames() == null) {
56+
return Collections.emptyMap();
57+
} else {
58+
return Collections
59+
.list(req.getHeaderNames())
60+
.stream()
61+
.collect(Collectors.toMap(
62+
Function.identity(),
63+
header -> Collections.list(req.getHeaders(header))));
64+
}
65+
}
66+
67+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.swagger.v3.jaxrs2.util;
2+
3+
import org.hamcrest.collection.IsMapContaining;
4+
import org.testng.annotations.Test;
5+
6+
import javax.ws.rs.core.MultivaluedHashMap;
7+
import java.net.URLEncoder;
8+
import java.util.Arrays;
9+
import java.util.HashMap;
10+
import java.util.Map;
11+
12+
import static java.nio.charset.StandardCharsets.UTF_8;
13+
import static org.hamcrest.MatcherAssert.assertThat;
14+
import static org.testng.Assert.assertEquals;
15+
16+
public class ServletUtilsTest {
17+
18+
@Test(description = "convert query parameters to multivaluedmap")
19+
public void convertWithRightOutputSize() throws Exception {
20+
21+
Map<String, String[]> params = new HashMap<>();
22+
params.put("key1", new String[]{"value1", "value2"});
23+
params.put("key2", new String[]{"value2", "value3", "value4", "value4"});
24+
25+
MultivaluedHashMap<String, String> multivaluedMap = ServletUtils.getQueryParams(params);
26+
assertEquals(multivaluedMap.size(), 2);
27+
assertEquals(multivaluedMap.get("key1").size(), 2);
28+
assertEquals(multivaluedMap.get("key2").size(), 4);
29+
assertEquals(multivaluedMap.keySet().iterator().next(), "key1");
30+
}
31+
32+
@Test(description = "convert query parameters to multivaluedmap with decoded values")
33+
public void convertWithDecodedValues() throws Exception {
34+
35+
Map<String, String[]> params = new HashMap<>();
36+
params.put(URLEncoder.encode("key1&", UTF_8.name()), new String[]{"value1", URLEncoder.encode("value2?", UTF_8.name())});
37+
params.put("key2", new String[]{URLEncoder.encode("value2", UTF_8.name()), "value3", "value4", "value4"});
38+
assertThat(params, IsMapContaining.hasEntry("key1%26", new String[]{"value1", "value2%3F"}));
39+
40+
MultivaluedHashMap<String, String> multivaluedHashMap = ServletUtils.getQueryParams(params);
41+
assertEquals(multivaluedHashMap.size(), 2);
42+
assertThat(multivaluedHashMap, IsMapContaining.hasKey("key1&"));
43+
assertEquals(multivaluedHashMap.get("key1&").size(), 2);
44+
assertEquals(multivaluedHashMap.get("key1&"), Arrays.asList("value1", "value2?"));
45+
assertEquals(multivaluedHashMap.get("key2"), Arrays.asList("value2", "value3", "value4", "value4"));
46+
}
47+
48+
}

0 commit comments

Comments
 (0)