Skip to content

Commit 2dbefdd

Browse files
authored
Merge branch 'master' into FilterOutputStream
2 parents 0126f3a + bbc4f1b commit 2dbefdd

File tree

5 files changed

+45
-11
lines changed

5 files changed

+45
-11
lines changed

avaje-jex/src/main/java/io/avaje/jex/Routing.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.avaje.jex.http.HttpFilter;
1515
import io.avaje.jex.http.sse.SseClient;
1616
import io.avaje.jex.security.Role;
17+
import io.avaje.jex.spi.JexExtension;
1718

1819
/** Routing abstraction. */
1920
public interface Routing {
@@ -171,7 +172,7 @@ default Routing sse(String path, Consumer<SseClient> handler, Role... roles) {
171172

172173
/** Adds to the Routing. */
173174
@FunctionalInterface
174-
interface HttpService {
175+
non-sealed interface HttpService extends JexExtension {
175176

176177
/**
177178
* Add to the routing.

avaje-jex/src/main/java/io/avaje/jex/core/BootstrapServer.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import io.avaje.jex.Jex;
1717
import io.avaje.jex.JexConfig;
1818
import io.avaje.jex.routes.RoutesBuilder;
19-
import io.avaje.jex.routes.SpiRoutes;
2019

2120
public final class BootstrapServer {
2221

@@ -32,14 +31,11 @@ public static Jex.Server start(Jex jex) {
3231

3332
CoreServiceLoader.plugins().forEach(p -> p.apply(jex));
3433

35-
final SpiRoutes routes = new RoutesBuilder(jex.routing(), config).build();
34+
var routing = jex.routing();
35+
routing.addAll(CoreServiceLoader.spiRoutes());
36+
final var routes = new RoutesBuilder(routing, config).build();
3637

37-
return start(jex, routes);
38-
}
39-
40-
static Jex.Server start(Jex jex, SpiRoutes routes) {
4138
try {
42-
final var config = jex.config();
4339
final var socketAddress = createSocketAddress(config);
4440
final var https = config.httpsConfig();
4541
final var provider = config.serverProvider();
@@ -54,9 +50,8 @@ static Jex.Server start(Jex jex, SpiRoutes routes) {
5450

5551
final var scheme = config.scheme();
5652
final var contextPath = config.contextPath();
57-
ServiceManager serviceManager = ServiceManager.create(jex);
53+
var serviceManager = ServiceManager.create(jex);
5854
final var handler = new RoutingHandler(routes, serviceManager);
59-
6055
final var serverClass = server.getClass();
6156

6257
// jetty's server does not support setExecutor with virtual threads (VT)

avaje-jex/src/main/java/io/avaje/jex/core/CoreServiceLoader.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.Optional;
66
import java.util.ServiceLoader;
77

8+
import io.avaje.jex.Routing.HttpService;
89
import io.avaje.jex.spi.JexExtension;
910
import io.avaje.jex.spi.JexPlugin;
1011
import io.avaje.jex.spi.JsonService;
@@ -18,6 +19,7 @@ final class CoreServiceLoader {
1819
private final JsonService jsonService;
1920
private final List<TemplateRender> renders = new ArrayList<>();
2021
private final List<JexPlugin> plugins = new ArrayList<>();
22+
private final List<HttpService> spiRoutes = new ArrayList<>();
2123

2224
CoreServiceLoader() {
2325
JsonService spiJsonService = null;
@@ -26,6 +28,7 @@ final class CoreServiceLoader {
2628
case JsonService s -> spiJsonService = s;
2729
case TemplateRender r -> renders.add(r);
2830
case JexPlugin p -> plugins.add(p);
31+
case HttpService p -> spiRoutes.add(p);
2932
}
3033
}
3134
jsonService = spiJsonService;
@@ -42,4 +45,8 @@ static List<TemplateRender> getRenders() {
4245
static List<JexPlugin> plugins() {
4346
return INSTANCE.plugins;
4447
}
48+
49+
static List<HttpService> spiRoutes() {
50+
return INSTANCE.spiRoutes;
51+
}
4552
}

avaje-jex/src/main/java/io/avaje/jex/spi/JexExtension.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.avaje.jex.spi;
22

3+
import io.avaje.jex.Routing.HttpService;
34
import io.avaje.spi.Service;
45

56
/**
@@ -9,4 +10,4 @@
910
* META-INF/services/io.avaje.jex.spi.JexExtension } for it to be auto loaded
1011
*/
1112
@Service
12-
public sealed interface JexExtension permits JsonService, TemplateRender, JexPlugin {}
13+
public sealed interface JexExtension permits HttpService, JexPlugin, JsonService, TemplateRender {}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.avaje.jex;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.net.http.HttpResponse;
6+
7+
import org.junit.jupiter.api.Test;
8+
9+
import io.avaje.jex.Routing.HttpService;
10+
import io.avaje.jex.core.TestPair;
11+
import io.avaje.spi.ServiceProvider;
12+
13+
@ServiceProvider
14+
public class SpiRouteTest implements HttpService {
15+
16+
@Override
17+
public void add(Routing routing) {
18+
19+
routing.get("/spi", ctx -> ctx.write("hello from spi"));
20+
}
21+
22+
@Test
23+
void get() {
24+
var pair = TestPair.create(Jex.create());
25+
HttpResponse<String> res = pair.request().path("spi").GET().asString();
26+
27+
assertThat(res.body()).isEqualTo("hello from spi");
28+
pair.shutdown();
29+
}
30+
}

0 commit comments

Comments
 (0)