Skip to content

Commit 2de375c

Browse files
committed
resolve excluded prefixes
1 parent 583c959 commit 2de375c

File tree

8 files changed

+107
-7
lines changed

8 files changed

+107
-7
lines changed

server/impl/src/main/java/com/walmartlabs/concord/server/boot/HttpServer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
* =====
2121
*/
2222

23-
import com.walmartlabs.concord.server.boot.resteasy.ApiDescriptor;
23+
import com.walmartlabs.concord.server.sdk.rest.ApiDescriptor;
2424
import com.walmartlabs.concord.server.cfg.ServerConfiguration;
2525
import org.eclipse.jetty.ee8.nested.SessionHandler;
2626
import org.eclipse.jetty.ee8.servlet.FilterHolder;

server/impl/src/main/java/com/walmartlabs/concord/server/boot/resteasy/ConcordApiDescriptor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
* =====
2121
*/
2222

23+
import com.walmartlabs.concord.server.sdk.rest.ApiDescriptor;
24+
2325
public class ConcordApiDescriptor implements ApiDescriptor {
2426

2527
@Override

server/impl/src/main/java/com/walmartlabs/concord/server/boot/resteasy/ResteasyModule.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import com.google.inject.Binder;
2424
import com.google.inject.Module;
25+
import com.walmartlabs.concord.server.sdk.rest.ApiDescriptor;
2526
import com.walmartlabs.concord.server.sdk.rest.Component;
2627

2728
import javax.servlet.ServletContextListener;

server/plugins/webapp/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
<packaging>jar</packaging>
1717

1818
<dependencies>
19+
<dependency>
20+
<groupId>com.walmartlabs.concord.server</groupId>
21+
<artifactId>concord-server-sdk</artifactId>
22+
<scope>provided</scope>
23+
</dependency>
1924
<dependency>
2025
<groupId>javax.inject</groupId>
2126
<artifactId>javax.inject</artifactId>
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package ca.ibodrov.concord.webapp;
2+
3+
/*-
4+
* *****
5+
* Concord
6+
* -----
7+
* Copyright (C) 2017 - 2025 Walmart Inc.
8+
* -----
9+
* Licensed under the Apache License, Version 2.0 (the "License");
10+
* you may not use this file except in compliance with the License.
11+
* You may obtain a copy of the License at
12+
*
13+
* http://www.apache.org/licenses/LICENSE-2.0
14+
*
15+
* Unless required by applicable law or agreed to in writing, software
16+
* distributed under the License is distributed on an "AS IS" BASIS,
17+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
* See the License for the specific language governing permissions and
19+
* limitations under the License.
20+
* =====
21+
*/
22+
23+
import com.walmartlabs.concord.server.sdk.rest.ApiDescriptor;
24+
import org.eclipse.jetty.ee8.servlet.ServletHolder;
25+
26+
import javax.inject.Inject;
27+
import javax.servlet.annotation.WebServlet;
28+
import javax.servlet.http.HttpServlet;
29+
import java.util.Arrays;
30+
import java.util.List;
31+
import java.util.Optional;
32+
import java.util.Set;
33+
import java.util.stream.Stream;
34+
35+
import static java.util.Comparator.reverseOrder;
36+
import static java.util.Objects.requireNonNull;
37+
38+
/**
39+
* Collects all URI prefixes that should NOT be handled by {@link WebappFilter}.
40+
*/
41+
public class ExcludedPrefixes {
42+
43+
private final List<String> prefixes;
44+
45+
@Inject
46+
public ExcludedPrefixes(Set<ApiDescriptor> apiDescriptors,
47+
Set<HttpServlet> servlets,
48+
Set<ServletHolder> servletHolders) {
49+
50+
var apiPrefixes = requireNonNull(apiDescriptors).stream()
51+
.flatMap(descriptor -> Arrays.stream(descriptor.paths()));
52+
53+
var servletPrefixes = webServletAnnotated(requireNonNull(servlets));
54+
55+
var servletHolderPrefixes = webServletAnnotated(requireNonNull(servletHolders));
56+
57+
this.prefixes = Stream.of(apiPrefixes, servletPrefixes, servletHolderPrefixes)
58+
.flatMap(p -> p)
59+
.map(prefix -> {
60+
if (prefix.endsWith("/*")) {
61+
return prefix.substring(0, prefix.length() - 1);
62+
}
63+
return prefix;
64+
})
65+
.sorted(reverseOrder())
66+
.toList();
67+
}
68+
69+
public boolean matches(String path) {
70+
return prefixes.stream().anyMatch(path::startsWith);
71+
}
72+
73+
private static Stream<String> webServletAnnotated(Set<?> instances) {
74+
return instances.stream()
75+
.flatMap(i -> Stream.ofNullable(i.getClass().getAnnotation(WebServlet.class)))
76+
.flatMap(a -> Arrays.stream(Optional.ofNullable(a.value())
77+
.filter(values -> values.length != 0)
78+
.orElse(a.urlPatterns())));
79+
}
80+
}

server/plugins/webapp/src/main/java/ca/ibodrov/concord/webapp/WebappFilter.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
* Licensed under the Apache License, Version 2.0 (the "License");
1010
* you may not use this file except in compliance with the License.
1111
* You may obtain a copy of the License at
12-
*
12+
*
1313
* http://www.apache.org/licenses/LICENSE-2.0
14-
*
14+
*
1515
* Unless required by applicable law or agreed to in writing, software
1616
* distributed under the License is distributed on an "AS IS" BASIS,
1717
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -26,6 +26,7 @@
2626
import com.google.common.collect.ImmutableMap;
2727

2828
import javax.annotation.Priority;
29+
import javax.inject.Inject;
2930
import javax.servlet.FilterChain;
3031
import javax.servlet.ServletException;
3132
import javax.servlet.annotation.WebFilter;
@@ -41,6 +42,7 @@
4142
import java.util.stream.Stream;
4243

4344
import static java.util.Comparator.comparing;
45+
import static java.util.Objects.requireNonNull;
4446
import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR;
4547

4648
/**
@@ -51,17 +53,20 @@
5153
public class WebappFilter extends HttpFilter {
5254

5355
private final WebappCollection webapps;
56+
private final ExcludedPrefixes excludedPrefixes;
5457

55-
public WebappFilter() {
58+
@Inject
59+
public WebappFilter(ExcludedPrefixes excludedPrefixes) {
5660
this.webapps = loadWebapps();
61+
this.excludedPrefixes = requireNonNull(excludedPrefixes);
5762
}
5863

5964
@Override
6065
protected void doFilter(HttpServletRequest req, HttpServletResponse resp, FilterChain chain)
6166
throws ServletException, IOException {
6267

6368
var uri = req.getRequestURI();
64-
if (uri.startsWith("/api")) {
69+
if (excludedPrefixes.matches(uri)) {
6570
chain.doFilter(req, resp);
6671
return;
6772
}

server/plugins/webapp/src/main/java/ca/ibodrov/concord/webapp/WebappPluginModule.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@
2222

2323
import com.google.inject.Binder;
2424
import com.google.inject.Module;
25+
import com.walmartlabs.concord.server.sdk.rest.ApiDescriptor;
26+
import org.eclipse.jetty.ee8.servlet.ServletHolder;
2527

2628
import javax.inject.Named;
2729
import javax.servlet.Filter;
30+
import javax.servlet.http.HttpServlet;
2831

2932
import static com.google.inject.multibindings.Multibinder.newSetBinder;
3033

@@ -33,6 +36,10 @@ public class WebappPluginModule implements Module {
3336

3437
@Override
3538
public void configure(Binder binder) {
39+
newSetBinder(binder, ApiDescriptor.class);
40+
newSetBinder(binder, HttpServlet.class);
41+
newSetBinder(binder, ServletHolder.class);
42+
3643
newSetBinder(binder, Filter.class).addBinding().to(WebappFilter.class);
3744
}
3845
}

server/impl/src/main/java/com/walmartlabs/concord/server/boot/resteasy/ApiDescriptor.java renamed to server/sdk/src/main/java/com/walmartlabs/concord/server/sdk/rest/ApiDescriptor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.walmartlabs.concord.server.boot.resteasy;
1+
package com.walmartlabs.concord.server.sdk.rest;
22

33
/*-
44
* *****
@@ -21,7 +21,7 @@
2121
*/
2222

2323
/**
24-
* Declares an API.
24+
* Declares a list of prefixes that should be served as JAX-RS resources.
2525
*/
2626
public interface ApiDescriptor {
2727

0 commit comments

Comments
 (0)