import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Stream;
return running.get();
}
- public void start() throws Exception {
+ public void start(Optional<TileserverStartListener> listener) throws Exception {
// check if existing server is left hanging
if (Files.exists(getPid())) {
String pid = new String(Files.readAllBytes(getPid()));
}
// check that npm dependencies are satisfied
- if (checkAndInstall(null)) {
- checkAndInstall(ADDITIONAL_DEPENDENCIES[0]);
- checkAndInstall(ADDITIONAL_DEPENDENCIES[1]);
- }
+// if (checkAndInstall(null, listener)) {
+// checkAndInstall(ADDITIONAL_DEPENDENCIES[0], listener);
+// checkAndInstall(ADDITIONAL_DEPENDENCIES[1], listener);
+// }
checkConfigJson();
checkTm2Styles();
if (process != null && process.isAlive())
return;
- StartedProcess startedProcess = new ProcessExecutor().directory(serverRoot.resolve("tileserver-mapnik").toFile()).destroyOnExit().environment(getEnv())
- .command(NodeJS.executable().toString(), getTessera().toString(), "-c", getConfigJson().toString(), "-p", Integer.toString(MapsServerPreferences.defaultPort()))
+ Path tileliveTesseraWin = serverRoot.resolve("dist").resolve("node.exe").normalize().toAbsolutePath();
+ StartedProcess startedProcess = new ProcessExecutor().directory(serverRoot.resolve("dist").toFile()).destroyOnExit().environment(getEnv())
+ .command(tileliveTesseraWin.toString(), "-c", getConfigJson().toString(), "-p", Integer.toString(MapsServerPreferences.defaultPort()))
.redirectOutput(new Slf4jDebugOutputStream(LOGGER) {
@Override
Process nativeProcess = startedProcess.getProcess();
process = Processes.newStandardProcess(nativeProcess);
int pid = PidUtil.getPid(nativeProcess);
+ LOGGER.info("Writing pid-file to {} with pid={}", getPid(), pid);
Files.write(getPid(), (pid + "").getBytes(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
running.set(true);
+ listener.ifPresent(TileserverStartListener::started);
}
private Map<String, String> getEnv() {
return serverRoot.resolve("pid");
}
- public void restart() throws Exception {
+ public void restart(Optional<TileserverStartListener> listener) throws Exception {
stop();
- start();
- }
-
- private boolean checkIfInstalled(String module) throws Exception {
- String tileserverMapnik = tileserverMapnikRoot().toString();
- int retVal;
- try (ByteArrayOutputStream output = new ByteArrayOutputStream()) {
- if (module == null) {
- retVal = NodeJS.npm(output, "--prefix", tileserverMapnik, "list");
- } else {
- retVal = NodeJS.npm(output, "--prefix", tileserverMapnik, "list", module);
- }
- String outputString = new String(output.toByteArray(), StandardCharsets.UTF_8);
- }
- return retVal == 0;
- }
-
- private boolean install(String module) throws Exception {
- String tileserverMapnik = tileserverMapnikRoot().toString();
- int retVal;
- if (module == null)
- retVal = NodeJS.npm(null, "--prefix", tileserverMapnik, "install", "--save");
- else
- retVal = NodeJS.npm(null, "--prefix", tileserverMapnik, "install", module, "--save");
- if (retVal != 0)
- LOGGER.warn("Could not install module " + module == null ? "package.json" : module + "! " + retVal);
- return retVal == 0;
+ start(listener);
}
- private boolean checkAndInstall(String module) throws Exception {
- boolean installed = checkIfInstalled(module);
- if (!installed)
- install(module);
- return !installed;
- }
+// private boolean checkIfInstalled(String module) throws Exception {
+// String tileserverMapnik = tileserverMapnikRoot().toString();
+// int retVal;
+// try (ByteArrayOutputStream output = new ByteArrayOutputStream()) {
+// if (module == null) {
+// retVal = NodeJS.npm(output, "--prefix", tileserverMapnik, "list");
+// } else {
+// retVal = NodeJS.npm(output, "--prefix", tileserverMapnik, "list", module);
+// }
+// String outputString = new String(output.toByteArray(), StandardCharsets.UTF_8);
+// }
+// return retVal == 0;
+// }
+//
+// private int install(String module, Optional<TileserverStartListener> listener) throws Exception {
+// String tileserverMapnik = tileserverMapnikRoot().toString();
+// int retVal;
+// if (module == null) {
+// listener.ifPresent(l -> l.installing("Installing tileserver-mapnik"));
+// retVal = NodeJS.npm(null, "--prefix", tileserverMapnik, "install", "--save");
+// } else {
+// retVal = NodeJS.npm(null, "--prefix", tileserverMapnik, "install", module, "--save");
+// }
+// if (retVal != 0)
+// LOGGER.warn("Could not install module " + module == null ? "package.json" : module + "! " + retVal);
+// return retVal;
+// }
+//
+// private boolean checkAndInstall(String module, Optional<TileserverStartListener> listener) throws Exception {
+// LOGGER.info("Installing module {}", String.valueOf(module));
+// boolean installed = checkIfInstalled(module);
+// if (!installed) {
+// int installSuccessfull = install(module, listener);
+// if (installSuccessfull != 0) {
+// LOGGER.warn("Installation of module {} failed!", String.valueOf(module));
+// listener.ifPresent(l -> l.installationFailed(module, installSuccessfull));
+// }
+// } else {
+// LOGGER.info("Module {} was already installed", String.valueOf(module));
+// }
+// return !installed;
+// }
private Path tileserverMapnikRoot() {
}
private Path getICU() {
- return serverRoot.resolve("tileserver-mapnik/node_modules/tilelive-vector/node_modules/mapnik/lib/binding/node-v46-win32-x64/share/icu").toAbsolutePath();
+ return serverRoot.resolve("dist/share/icu").toAbsolutePath();
}
private Path getTessera() {
return results;
}
+ public static interface TileserverStartListener {
+
+ void installing(String module);
+
+ void installationFailed(String module, int returnValue);
+
+ void started();
+ }
}