You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@baremaps.apache.org by bc...@apache.org on 2023/06/17 12:20:39 UTC
[incubator-baremaps] 02/02: Adapt the change listener
This is an automated email from the ASF dual-hosted git repository.
bchapuis pushed a commit to branch server-refactoring
in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git
commit 4d7ff05d5babaaa9482e211fcd2256e0ec88678c
Author: Bertil Chapuis <bc...@gmail.com>
AuthorDate: Sat Jun 17 14:20:25 2023 +0200
Adapt the change listener
---
.../org/apache/baremaps/cli/geocoder/Serve.java | 4 +-
.../java/org/apache/baremaps/cli/iploc/Serve.java | 4 +-
.../main/java/org/apache/baremaps/cli/map/Dev.java | 15 ++-
.../java/org/apache/baremaps/cli/map/Serve.java | 7 +-
.../org/apache/baremaps/server/ChangeResource.java | 112 +++++++++++++++++++++
...ssPathResources.java => ClassPathResource.java} | 4 +-
.../apache/baremaps/server/DirectoryWatcher.java | 64 ------------
...eocoderResources.java => GeocoderResource.java} | 4 +-
.../{IpLocResources.java => IpLocResource.java} | 6 +-
.../{StyleRessources.java => StyleResource.java} | 4 +-
.../{TileResources.java => TileResource.java} | 4 +-
...TilesetRessources.java => TilesetResource.java} | 4 +-
.../apache/baremaps/server/ViewerResources.java | 95 -----------------
13 files changed, 143 insertions(+), 184 deletions(-)
diff --git a/baremaps-cli/src/main/java/org/apache/baremaps/cli/geocoder/Serve.java b/baremaps-cli/src/main/java/org/apache/baremaps/cli/geocoder/Serve.java
index 6a2af117..7a3282c1 100644
--- a/baremaps-cli/src/main/java/org/apache/baremaps/cli/geocoder/Serve.java
+++ b/baremaps-cli/src/main/java/org/apache/baremaps/cli/geocoder/Serve.java
@@ -19,7 +19,7 @@ import io.servicetalk.http.router.jersey.HttpJerseyRouterBuilder;
import java.nio.file.Path;
import java.util.concurrent.Callable;
import org.apache.baremaps.server.CorsFilter;
-import org.apache.baremaps.server.GeocoderResources;
+import org.apache.baremaps.server.GeocoderResource;
import org.apache.lucene.search.SearcherFactory;
import org.apache.lucene.search.SearcherManager;
import org.apache.lucene.store.MMapDirectory;
@@ -53,7 +53,7 @@ public class Serve implements Callable<Integer> {
var searcherManager = new SearcherManager(directory, new SearcherFactory())) {
// Configure the application
var application = new ResourceConfig().register(CorsFilter.class)
- .register(GeocoderResources.class).register(new AbstractBinder() {
+ .register(GeocoderResource.class).register(new AbstractBinder() {
@Override
protected void configure() {
bind(searcherManager).to(SearcherManager.class).named("searcherManager");
diff --git a/baremaps-cli/src/main/java/org/apache/baremaps/cli/iploc/Serve.java b/baremaps-cli/src/main/java/org/apache/baremaps/cli/iploc/Serve.java
index 4ff2088c..371c395b 100644
--- a/baremaps-cli/src/main/java/org/apache/baremaps/cli/iploc/Serve.java
+++ b/baremaps-cli/src/main/java/org/apache/baremaps/cli/iploc/Serve.java
@@ -23,7 +23,7 @@ import java.util.concurrent.Callable;
import javax.sql.DataSource;
import org.apache.baremaps.iploc.IpLocRepository;
import org.apache.baremaps.server.CorsFilter;
-import org.apache.baremaps.server.IpLocResources;
+import org.apache.baremaps.server.IpLocResource;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.ResourceConfig;
import org.slf4j.Logger;
@@ -62,7 +62,7 @@ public class Serve implements Callable<Integer> {
IpLocRepository ipLocRepository = new IpLocRepository(dataSource);
// Configure the application
- var application = new ResourceConfig().register(CorsFilter.class).register(IpLocResources.class)
+ var application = new ResourceConfig().register(CorsFilter.class).register(IpLocResource.class)
.register(new AbstractBinder() {
@Override
protected void configure() {
diff --git a/baremaps-cli/src/main/java/org/apache/baremaps/cli/map/Dev.java b/baremaps-cli/src/main/java/org/apache/baremaps/cli/map/Dev.java
index 1f9084f5..f11b70a8 100644
--- a/baremaps-cli/src/main/java/org/apache/baremaps/cli/map/Dev.java
+++ b/baremaps-cli/src/main/java/org/apache/baremaps/cli/map/Dev.java
@@ -46,6 +46,7 @@ public class Dev implements Callable<Integer> {
@Mixin
private Options options;
+
@Option(names = {"--cache"}, paramLabel = "CACHE", description = "The caffeine cache directive.")
private String cache = "";
@@ -103,17 +104,21 @@ public class Dev implements Callable<Integer> {
}
};
- // Configure the application
var application = new ResourceConfig()
.register(CorsFilter.class)
- .register(ViewerResources.class)
- .register(StyleRessources.class)
- .register(TileResources.class)
- .register(ClassPathResources.class)
+ .register(ChangeResource.class)
+ .register(TileResource.class)
+ .register(StyleResource.class)
+ .register(TilesetResource.class)
+ .register(ChangeResource.class)
+ .register(ClassPathResource.class)
.register(newContextResolver(objectMapper))
.register(new AbstractBinder() {
@Override
protected void configure() {
+ bind(tilesetPath).to(Path.class).named("tileset");
+ bind(stylePath).to(Path.class).named("style");
+ bind("assets").to(String.class).named("directory");
bind("assets").to(String.class).named("directory");
bind("viewer.html").to(String.class).named("index");
bind(tileStoreSupplier).to(tileStoreType);
diff --git a/baremaps-cli/src/main/java/org/apache/baremaps/cli/map/Serve.java b/baremaps-cli/src/main/java/org/apache/baremaps/cli/map/Serve.java
index ddec8687..e0002b03 100644
--- a/baremaps-cli/src/main/java/org/apache/baremaps/cli/map/Serve.java
+++ b/baremaps-cli/src/main/java/org/apache/baremaps/cli/map/Serve.java
@@ -89,9 +89,10 @@ public class Serve implements Callable<Integer> {
var application =
new ResourceConfig()
.register(CorsFilter.class)
- .register(StyleRessources.class)
- .register(TileResources.class)
- .register(ClassPathResources.class)
+ .register(TileResource.class)
+ .register(StyleResource.class)
+ .register(TilesetResource.class)
+ .register(ClassPathResource.class)
.register(newContextResolver(objectMapper))
.register(new AbstractBinder() {
@Override
diff --git a/baremaps-server/src/main/java/org/apache/baremaps/server/ChangeResource.java b/baremaps-server/src/main/java/org/apache/baremaps/server/ChangeResource.java
new file mode 100644
index 00000000..183ff19c
--- /dev/null
+++ b/baremaps-server/src/main/java/org/apache/baremaps/server/ChangeResource.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.baremaps.server;
+
+
+import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import java.nio.file.*;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+import javax.ws.rs.GET;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.sse.OutboundSseEvent;
+import javax.ws.rs.sse.Sse;
+import javax.ws.rs.sse.SseBroadcaster;
+import javax.ws.rs.sse.SseEventSink;
+import org.apache.baremaps.config.ConfigReader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Singleton
+@javax.ws.rs.Path("/")
+public class ChangeResource {
+
+ private static final Logger logger = LoggerFactory.getLogger(ChangeResource.class);
+
+ private final ConfigReader configReader = new ConfigReader();
+
+ private final ObjectMapper objectMapper = new ObjectMapper();
+
+ private final Path tileset;
+
+ private final Path style;
+
+ private final SseBroadcaster sseBroadcaster;
+
+ private final OutboundSseEvent.Builder sseEventBuilder;
+
+ @Inject
+ public ChangeResource(
+ @Named("tileset") Path tileset,
+ @Named("style") Path style,
+ Sse sse) {
+ this.tileset = tileset;
+ this.style = style;
+ this.sseBroadcaster = sse.newBroadcaster();
+ this.sseEventBuilder = sse.newEventBuilder();
+ var changeListener = new ChangeListener();
+ new Thread(changeListener).start();
+ }
+
+ @GET
+ @javax.ws.rs.Path("changes")
+ @Produces("text/event-stream")
+ public void changes(@Context SseEventSink sseEventSink) {
+ sseBroadcaster.register(sseEventSink);
+ }
+
+ public class ChangeListener implements Runnable {
+
+ @Override
+ public void run() {
+ try (WatchService watchService = FileSystems.getDefault().newWatchService()) {
+ if (tileset != null && Files.exists(tileset)) {
+ tileset.toAbsolutePath().getParent().register(watchService, ENTRY_MODIFY);
+ }
+ if (style != null && Files.exists(style)) {
+ style.toAbsolutePath().getParent().register(watchService, ENTRY_MODIFY);
+ }
+ WatchKey key;
+ while ((key = watchService.take()) != null) {
+ Path dir = (Path) key.watchable();
+
+ for (WatchEvent<?> event : key.pollEvents()) {
+ Path path = dir.resolve((Path) event.context()).toAbsolutePath();
+ logger.info("Change detected in {}", path);
+
+ if (style != null) {
+ var value = configReader.read(style);
+ var styleObjectNode = objectMapper.readValue(value, ObjectNode.class);
+
+ // reload the page if changes affected the tileset
+ if (tileset != null && path.endsWith(tileset.getFileName())) {
+ styleObjectNode.put("reload", true);
+ }
+
+ // broadcast the changes
+ sseBroadcaster.broadcast(sseEventBuilder.data(styleObjectNode.toString()).build());
+ }
+ }
+ key.reset();
+ }
+ } catch (Exception e) {
+ logger.error("Error while watching for changes", e);
+ }
+ }
+ }
+}
diff --git a/baremaps-server/src/main/java/org/apache/baremaps/server/ClassPathResources.java b/baremaps-server/src/main/java/org/apache/baremaps/server/ClassPathResource.java
similarity index 96%
rename from baremaps-server/src/main/java/org/apache/baremaps/server/ClassPathResources.java
rename to baremaps-server/src/main/java/org/apache/baremaps/server/ClassPathResource.java
index f89f9460..daf6408e 100644
--- a/baremaps-server/src/main/java/org/apache/baremaps/server/ClassPathResources.java
+++ b/baremaps-server/src/main/java/org/apache/baremaps/server/ClassPathResource.java
@@ -26,7 +26,7 @@ import javax.ws.rs.core.Response;
*/
@Singleton
@javax.ws.rs.Path("/")
-public class ClassPathResources {
+public class ClassPathResource {
private final String directory;
@@ -39,7 +39,7 @@ public class ClassPathResources {
* @param index the index
*/
@Inject
- public ClassPathResources(
+ public ClassPathResource(
@Named("directory") String directory,
@Named("index") String index) {
this.directory = directory;
diff --git a/baremaps-server/src/main/java/org/apache/baremaps/server/DirectoryWatcher.java b/baremaps-server/src/main/java/org/apache/baremaps/server/DirectoryWatcher.java
deleted file mode 100644
index d83caae8..00000000
--- a/baremaps-server/src/main/java/org/apache/baremaps/server/DirectoryWatcher.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.apache.baremaps.server;
-
-import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
-import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
-import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;
-
-import java.io.IOException;
-import java.nio.file.FileSystems;
-import java.nio.file.Path;
-import java.nio.file.WatchEvent;
-import java.nio.file.WatchKey;
-import java.nio.file.WatchService;
-import java.util.Set;
-import java.util.function.Consumer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class DirectoryWatcher implements Runnable {
-
- private static final Logger logger = LoggerFactory.getLogger(DirectoryWatcher.class);
-
- private final Set<Path> directories;
-
- private final Consumer<Path> consumer;
-
- public DirectoryWatcher(Set<Path> directories, Consumer<Path> consumer) {
- this.directories = directories;
- this.consumer = consumer;
- }
-
- @Override
- public void run() {
- try (WatchService watchService = FileSystems.getDefault().newWatchService()) {
- for (Path directory : directories) {
- directory.register(watchService, ENTRY_MODIFY, ENTRY_CREATE, ENTRY_DELETE);
- }
- WatchKey key;
- while ((key = watchService.take()) != null) {
- Path dir = (Path) key.watchable();
- for (WatchEvent<?> event : key.pollEvents()) {
- Path path = dir.resolve((Path) event.context()).toAbsolutePath();
- logger.info("Change detected in {}", path);
- consumer.accept(path);
- }
- key.reset();
- }
- } catch (InterruptedException | IOException e) {
- logger.error(e.getMessage());
- Thread.currentThread().interrupt();
- }
- }
-}
diff --git a/baremaps-server/src/main/java/org/apache/baremaps/server/GeocoderResources.java b/baremaps-server/src/main/java/org/apache/baremaps/server/GeocoderResource.java
similarity index 97%
rename from baremaps-server/src/main/java/org/apache/baremaps/server/GeocoderResources.java
rename to baremaps-server/src/main/java/org/apache/baremaps/server/GeocoderResource.java
index 390b115a..b28ad224 100644
--- a/baremaps-server/src/main/java/org/apache/baremaps/server/GeocoderResources.java
+++ b/baremaps-server/src/main/java/org/apache/baremaps/server/GeocoderResource.java
@@ -34,7 +34,7 @@ import org.apache.lucene.search.SearcherManager;
@Singleton
@javax.ws.rs.Path("/")
-public class GeocoderResources {
+public class GeocoderResource {
record GeocoderResponse(List<GeocoderResult> results) {
}
@@ -47,7 +47,7 @@ public class GeocoderResources {
private final SearcherManager searcherManager;
@Inject
- public GeocoderResources(SearcherManager searcherManager) {
+ public GeocoderResource(SearcherManager searcherManager) {
this.searcherManager = searcherManager;
}
diff --git a/baremaps-server/src/main/java/org/apache/baremaps/server/IpLocResources.java b/baremaps-server/src/main/java/org/apache/baremaps/server/IpLocResource.java
similarity index 96%
rename from baremaps-server/src/main/java/org/apache/baremaps/server/IpLocResources.java
rename to baremaps-server/src/main/java/org/apache/baremaps/server/IpLocResource.java
index 6da3e697..c06e7c2f 100644
--- a/baremaps-server/src/main/java/org/apache/baremaps/server/IpLocResources.java
+++ b/baremaps-server/src/main/java/org/apache/baremaps/server/IpLocResource.java
@@ -36,14 +36,14 @@ import org.slf4j.LoggerFactory;
@Singleton
@javax.ws.rs.Path("/")
-public class IpLocResources {
+public class IpLocResource {
- private static final Logger logger = LoggerFactory.getLogger(DirectoryWatcher.class);
+ private static final Logger logger = LoggerFactory.getLogger(IpLocResource.class);
private final IpLocRepository ipLocRepository;
@Inject
- public IpLocResources(IpLocRepository ipLocRepository) {
+ public IpLocResource(IpLocRepository ipLocRepository) {
this.ipLocRepository = ipLocRepository;
}
diff --git a/baremaps-server/src/main/java/org/apache/baremaps/server/StyleRessources.java b/baremaps-server/src/main/java/org/apache/baremaps/server/StyleResource.java
similarity index 92%
rename from baremaps-server/src/main/java/org/apache/baremaps/server/StyleRessources.java
rename to baremaps-server/src/main/java/org/apache/baremaps/server/StyleResource.java
index 7fc0f303..4df95c99 100644
--- a/baremaps-server/src/main/java/org/apache/baremaps/server/StyleRessources.java
+++ b/baremaps-server/src/main/java/org/apache/baremaps/server/StyleResource.java
@@ -22,12 +22,12 @@ import org.apache.baremaps.vectortile.style.Style;
@Singleton
@javax.ws.rs.Path("/")
-public class StyleRessources {
+public class StyleResource {
private final Supplier<Style> styleSupplier;
@Inject
- public StyleRessources(Supplier<Style> styleSupplier) {
+ public StyleResource(Supplier<Style> styleSupplier) {
this.styleSupplier = styleSupplier;
}
diff --git a/baremaps-server/src/main/java/org/apache/baremaps/server/TileResources.java b/baremaps-server/src/main/java/org/apache/baremaps/server/TileResource.java
similarity index 95%
rename from baremaps-server/src/main/java/org/apache/baremaps/server/TileResources.java
rename to baremaps-server/src/main/java/org/apache/baremaps/server/TileResource.java
index e990e7c9..eb5743e3 100644
--- a/baremaps-server/src/main/java/org/apache/baremaps/server/TileResources.java
+++ b/baremaps-server/src/main/java/org/apache/baremaps/server/TileResource.java
@@ -27,7 +27,7 @@ import org.apache.baremaps.tilestore.TileStoreException;
@Singleton
@javax.ws.rs.Path("/")
-public class TileResources {
+public class TileResource {
public static final String TILE_ENCODING = "gzip";
@@ -36,7 +36,7 @@ public class TileResources {
private final Supplier<TileStore> tileStoreSupplier;
@Inject
- public TileResources(Supplier<TileStore> tileStoreSupplier) {
+ public TileResource(Supplier<TileStore> tileStoreSupplier) {
this.tileStoreSupplier = tileStoreSupplier;
}
diff --git a/baremaps-server/src/main/java/org/apache/baremaps/server/TilesetRessources.java b/baremaps-server/src/main/java/org/apache/baremaps/server/TilesetResource.java
similarity index 91%
rename from baremaps-server/src/main/java/org/apache/baremaps/server/TilesetRessources.java
rename to baremaps-server/src/main/java/org/apache/baremaps/server/TilesetResource.java
index 1ff41670..2981689d 100644
--- a/baremaps-server/src/main/java/org/apache/baremaps/server/TilesetRessources.java
+++ b/baremaps-server/src/main/java/org/apache/baremaps/server/TilesetResource.java
@@ -22,12 +22,12 @@ import org.apache.baremaps.vectortile.tilejson.TileJSON;
@Singleton
@javax.ws.rs.Path("/")
-public class TilesetRessources {
+public class TilesetResource {
private final Supplier<TileJSON> tileJSONSupplier;
@Inject
- public TilesetRessources(Supplier<TileJSON> tileJSONSupplier) {
+ public TilesetResource(Supplier<TileJSON> tileJSONSupplier) {
this.tileJSONSupplier = tileJSONSupplier;
}
diff --git a/baremaps-server/src/main/java/org/apache/baremaps/server/ViewerResources.java b/baremaps-server/src/main/java/org/apache/baremaps/server/ViewerResources.java
deleted file mode 100644
index 942e9f9f..00000000
--- a/baremaps-server/src/main/java/org/apache/baremaps/server/ViewerResources.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.apache.baremaps.server;
-
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.Arrays;
-import java.util.HashSet;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.sse.OutboundSseEvent;
-import javax.ws.rs.sse.Sse;
-import javax.ws.rs.sse.SseBroadcaster;
-import javax.ws.rs.sse.SseEventSink;
-import org.apache.baremaps.config.ConfigReader;
-import org.apache.baremaps.vectortile.style.Style;
-import org.apache.baremaps.vectortile.tilejson.TileJSON;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-@javax.ws.rs.Path("/")
-public class ViewerResources {
-
- private static final Logger logger = LoggerFactory.getLogger(ViewerResources.class);
-
- private final ConfigReader configReader = new ConfigReader();
-
- private final Path style;
-
- private final Path tileset;
-
- private final ObjectMapper objectMapper;
-
- private final SseBroadcaster sseBroadcaster;
-
- private final OutboundSseEvent.Builder sseEventBuilder;
-
- @Inject
- public ViewerResources(
- @Named("tileset") Path tileset,
- @Named("style") Path style,
- ObjectMapper objectMapper,
- Sse sse) {
- this.tileset = tileset.toAbsolutePath();
- this.style = style.toAbsolutePath();
- this.objectMapper = objectMapper;
- this.sseBroadcaster = sse.newBroadcaster();
- this.sseEventBuilder = sse.newEventBuilder();
-
- // Observe the file system for changes
- var directories = new HashSet<>(Arrays.asList(tileset.getParent(), style.getParent()));
- new Thread(new DirectoryWatcher(directories, this::broadcastChanges)).start();
- }
-
- public void broadcastChanges(Path path) {
- try {
- var value = configReader.read(style);
- var styleObjectNode = objectMapper.readValue(value, ObjectNode.class);
-
- // reload the page if changes affected the tileset
- styleObjectNode.put("reload", path.endsWith(tileset.getFileName()));
-
- // broadcast the changes
- sseBroadcaster.broadcast(sseEventBuilder.data(styleObjectNode.toString()).build());
- } catch (IOException e) {
- logger.error("Unable to broadcast change", e);
- }
- }
-
- @GET
- @javax.ws.rs.Path("changes")
- @Produces("text/event-stream")
- public void changes(@Context SseEventSink sseEventSink) {
- sseBroadcaster.register(sseEventSink);
- }
-}