Skip to content

Commit a3b5729

Browse files
committed
Use armeria server
1 parent 3203edb commit a3b5729

File tree

3 files changed

+68
-63
lines changed

3 files changed

+68
-63
lines changed

baremaps-cli/src/main/java/org/apache/baremaps/cli/tdtiles/Serve.java

+37-19
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,19 @@
1919

2020

2121

22-
import io.servicetalk.http.netty.HttpServers;
23-
import io.servicetalk.http.router.jersey.HttpJerseyRouterBuilder;
22+
import static org.apache.baremaps.utils.ObjectMapperUtils.objectMapper;
23+
24+
import com.linecorp.armeria.common.HttpHeaderNames;
25+
import com.linecorp.armeria.common.HttpMethod;
26+
import com.linecorp.armeria.server.Server;
27+
import com.linecorp.armeria.server.annotation.JacksonResponseConverterFunction;
28+
import com.linecorp.armeria.server.cors.CorsService;
29+
import com.linecorp.armeria.server.file.FileService;
30+
import com.linecorp.armeria.server.file.HttpFile;
2431
import java.util.concurrent.Callable;
25-
import javax.sql.DataSource;
2632
import org.apache.baremaps.cli.Options;
27-
import org.apache.baremaps.server.CorsFilter;
2833
import org.apache.baremaps.server.TdTilesResources;
2934
import org.apache.baremaps.utils.PostgresUtils;
30-
import org.glassfish.hk2.utilities.binding.AbstractBinder;
31-
import org.glassfish.jersey.server.ResourceConfig;
3235
import org.slf4j.Logger;
3336
import org.slf4j.LoggerFactory;
3437
import picocli.CommandLine.Command;
@@ -55,24 +58,39 @@ public class Serve implements Callable<Integer> {
5558

5659
@Override
5760
public Integer call() throws Exception {
61+
var objectMapper = objectMapper();
5862
var datasource = PostgresUtils.createDataSource(database);
5963

60-
// Configure the application
61-
var application =
62-
new ResourceConfig().register(CorsFilter.class).register(TdTilesResources.class)
63-
.register(new AbstractBinder() {
64-
@Override
65-
protected void configure() {
66-
bind(datasource).to(DataSource.class);
67-
}
68-
});
64+
var serverBuilder = Server.builder();
65+
serverBuilder.http(port);
66+
67+
var jsonResponseConverter = new JacksonResponseConverterFunction(objectMapper);
68+
serverBuilder.annotatedService(new TdTilesResources(datasource), jsonResponseConverter);
69+
70+
var index = HttpFile.of(ClassLoader.getSystemClassLoader(), "/tdtiles/index.html");
71+
serverBuilder.service("/", index.asService());
72+
serverBuilder.serviceUnder("/", FileService.of(ClassLoader.getSystemClassLoader(), "/tdtiles"));
73+
74+
serverBuilder.decorator(CorsService.builderForAnyOrigin()
75+
.allowRequestMethods(HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE,
76+
HttpMethod.OPTIONS, HttpMethod.HEAD)
77+
.allowRequestHeaders(HttpHeaderNames.ORIGIN, HttpHeaderNames.CONTENT_TYPE,
78+
HttpHeaderNames.ACCEPT, HttpHeaderNames.AUTHORIZATION)
79+
.allowCredentials()
80+
.exposeHeaders(HttpHeaderNames.LOCATION)
81+
.newDecorator());
82+
83+
serverBuilder.disableServerHeader();
84+
serverBuilder.disableDateHeader();
85+
86+
var server = serverBuilder.build();
6987

70-
var httpService = new HttpJerseyRouterBuilder().buildBlockingStreaming(application);
71-
var serverContext = HttpServers.forPort(port).listenBlockingStreamingAndAwait(httpService);
88+
var startFuture = server.start();
89+
startFuture.join();
7290

73-
logger.info("Listening on {}", serverContext.listenAddress());
91+
var shutdownFuture = server.closeOnJvmShutdown();
92+
shutdownFuture.join();
7493

75-
serverContext.awaitShutdown();
7694
return 0;
7795
}
7896
}

baremaps-server/src/main/java/org/apache/baremaps/server/TdTilesResources.java

+30-44
Original file line numberDiff line numberDiff line change
@@ -18,56 +18,58 @@
1818
package org.apache.baremaps.server;
1919

2020
import static com.google.common.net.HttpHeaders.*;
21+
import static io.netty.handler.codec.http.HttpHeaders.Values.APPLICATION_JSON;
22+
import static io.netty.handler.codec.http.HttpHeaders.Values.BINARY;
2123

24+
import com.linecorp.armeria.common.HttpData;
25+
import com.linecorp.armeria.common.HttpResponse;
26+
import com.linecorp.armeria.common.ResponseHeaders;
27+
import com.linecorp.armeria.server.annotation.Get;
28+
import com.linecorp.armeria.server.annotation.Param;
2229
import de.javagl.jgltf.model.NodeModel;
23-
import java.io.IOException;
24-
import java.io.InputStream;
2530
import java.util.ArrayList;
2631
import java.util.List;
27-
import javax.inject.Inject;
28-
import javax.inject.Singleton;
2932
import javax.sql.DataSource;
30-
import javax.ws.rs.GET;
31-
import javax.ws.rs.PathParam;
32-
import javax.ws.rs.core.Response;
33+
3334
import org.apache.baremaps.tdtiles.GltfBuilder;
3435
import org.apache.baremaps.tdtiles.TdTilesStore;
3536
import org.apache.baremaps.tdtiles.building.Building;
3637
import org.apache.baremaps.tdtiles.subtree.Availability;
3738
import org.apache.baremaps.tdtiles.subtree.Subtree;
3839

39-
@Singleton
40-
@javax.ws.rs.Path("/")
4140
public class TdTilesResources {
41+
42+
private static final ResponseHeaders GLB_HEADERS = ResponseHeaders.builder(200)
43+
.add(CONTENT_TYPE, BINARY)
44+
.add(ACCESS_CONTROL_ALLOW_ORIGIN, "*")
45+
.build();
46+
47+
private static final ResponseHeaders JSON_HEADERS = ResponseHeaders.builder(200)
48+
.add(CONTENT_TYPE, APPLICATION_JSON)
49+
.add(ACCESS_CONTROL_ALLOW_ORIGIN, "*")
50+
.build();
51+
4252
private final TdTilesStore tdTilesStore;
4353

44-
@Inject
4554
public TdTilesResources(DataSource dataSource) {
4655
this.tdTilesStore = new TdTilesStore(dataSource);
4756
}
4857

49-
@GET
50-
@javax.ws.rs.Path("/subtrees/{level}.{x}.{y}.json")
51-
public Response getSubtree(@PathParam("level") int level, @PathParam("x") int x,
52-
@PathParam("y") int y) {
58+
@Get("regex:^/subtrees/(?<level>[0-9]+).(?<x>[0-9]+).(?<y>[0-9]+).json")
59+
public HttpResponse getSubtree(@Param("level") int level, @Param("x") int x, @Param("y") int y) {
5360
if (level == 18) {
54-
return Response.ok()
55-
.entity(
56-
new Subtree(new Availability(false), new Availability(true), new Availability(false)))
57-
.header(CONTENT_TYPE, "application/json").build();
61+
return HttpResponse.ofJson(JSON_HEADERS,
62+
new Subtree(new Availability(false), new Availability(true), new Availability(false)));
5863
}
59-
return Response.ok()
60-
.entity(new Subtree(new Availability(true), new Availability(true), new Availability(true)))
61-
.header(CONTENT_TYPE, "application/json").build();
64+
return HttpResponse.ofJson(JSON_HEADERS,
65+
new Subtree(new Availability(true), new Availability(true), new Availability(true)));
6266
}
6367

64-
@GET
65-
@javax.ws.rs.Path("/content/content_{level}__{x}_{y}.glb")
66-
public Response getContent(@PathParam("level") int level, @PathParam("x") int x,
67-
@PathParam("y") int y) throws Exception {
68+
@Get("regex:^/content/content_(?<level>[0-9]+)__(?<x>[0-9]+)_(?<y>[0-9]+).glb")
69+
public HttpResponse getContent(@Param("level") int level, @Param("x") int x, @Param("y") int y)
70+
throws Exception {
6871
if (level < 14) {
69-
return Response.ok().entity(
70-
GltfBuilder.createGltf(new ArrayList<>())).build();
72+
return HttpResponse.of(GLB_HEADERS, HttpData.wrap(GltfBuilder.createGltf(new ArrayList<>())));
7173
}
7274
float[] coords = xyzToLatLonRadians(x, y, level);
7375
List<NodeModel> nodes = new ArrayList<>();
@@ -77,23 +79,7 @@ public Response getContent(@PathParam("level") int level, @PathParam("x") int x,
7779
float tolerance = level > 17 ? 0.00001f : level > 15 ? 0.00002f : 0.00004f;
7880
nodes.add(GltfBuilder.createNode(building, tolerance));
7981
}
80-
return Response.ok().entity(
81-
GltfBuilder.createGltf(nodes)).build();
82-
}
83-
84-
@GET
85-
@javax.ws.rs.Path("/{path:.*}")
86-
public Response get(@PathParam("path") String path) {
87-
if (path.equals("") || path.endsWith("/")) {
88-
path += "index.html";
89-
}
90-
path = String.format("tdtiles/%s", path);
91-
try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(path)) {
92-
var bytes = inputStream.readAllBytes();
93-
return Response.ok().entity(bytes).build();
94-
} catch (IOException e) {
95-
return Response.status(404).build();
96-
}
82+
return HttpResponse.of(GLB_HEADERS, HttpData.wrap(GltfBuilder.createGltf(nodes)));
9783
}
9884

9985
/**

pom.xml

+1
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ limitations under the License.
9393
<version.lib.hikari>5.0.1</version.lib.hikari>
9494
<version.lib.ipresource>1.52</version.lib.ipresource>
9595
<version.lib.jackson>2.16.1</version.lib.jackson>
96+
<version.lib.jgltf>2.0.3</version.lib.jgltf>
9697
<version.lib.jmh>1.35</version.lib.jmh>
9798
<version.lib.jts>1.19.0</version.lib.jts>
9899
<version.lib.junit>5.10.0</version.lib.junit>

0 commit comments

Comments
 (0)