package org.simantics.district.maps.server; import java.io.IOException; import java.io.OutputStream; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.concurrent.TimeoutException; import org.simantics.district.maps.server.utils.EnvUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.zeroturnaround.exec.InvalidExitValueException; import org.zeroturnaround.exec.ProcessExecutor; import org.zeroturnaround.exec.stream.slf4j.Slf4jInfoOutputStream; public class NodeJS { public static final String NODEJS_VERSION = "v4.8.0"; private static final Logger LOGGER = LoggerFactory.getLogger(NodeJS.class); private static final String NODE = "node"; private static Path nodeJSFolder() throws IOException, URISyntaxException { StringBuilder sb = new StringBuilder(); sb.append(NODE).append("-").append(NODEJS_VERSION).append("-").append(getOs()).append("-").append(getArch()); return Activator.getNodeJSRoot().resolve(sb.toString()); } public static Path executable() throws IOException, URISyntaxException { String nodeJSexecutable = NODE; if (EnvUtil.calculateOS() == "win") nodeJSexecutable = nodeJSexecutable + ".exe"; return nodeJSFolder().resolve(nodeJSexecutable).toAbsolutePath().normalize(); } private static Path npmExecutable() throws IOException, URISyntaxException { String npmExecutable = "npm"; if (EnvUtil.calculateOS() == "win") npmExecutable = npmExecutable + ".cmd"; return nodeJSFolder().resolve(npmExecutable).toAbsolutePath().normalize(); } private static String getArch() { return EnvUtil.calculateArch(); } private static String getOs() { return EnvUtil.calculateOS(); } public static int npm(OutputStream output, String... args) throws InvalidExitValueException, IOException, InterruptedException, TimeoutException, URISyntaxException { LOGGER.info("Executing npm with args {}", Arrays.toString(args)); List actualArgs = new ArrayList<>(); actualArgs.add(npmExecutable().toString()); actualArgs.addAll(Arrays.asList(args)); ProcessExecutor exec = new ProcessExecutor().command(actualArgs).redirectOutput(new Slf4jInfoOutputStream(LOGGER) { @Override protected void processLine(String line) { // Convert to UTF-8 string String utf8Line = new String(line.getBytes(), StandardCharsets.UTF_8); log.info(utf8Line); } }).destroyOnExit(); if (output != null) exec.redirectOutputAlsoTo(output); return exec.execute().getExitValue(); } public static void main(String[] args) throws Exception { TileserverMapnik server = TileserverMapnikInstance.get(); server.start(Optional.empty()); } }