This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch NLPCRAFT-108
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git


The following commit(s) were added to refs/heads/NLPCRAFT-108 by this push:
     new 111528c  WIP.
111528c is described below

commit 111528cff427c59d4eb41ee82e348ae63cbdc8a1
Author: Aaron Radzinski <[email protected]>
AuthorDate: Tue Sep 29 00:15:53 2020 -0700

    WIP.
---
 bin/nlpcraft.cmd                                   |  2 +
 bin/nlpcraft.sh                                    | 26 +++++----
 .../model/tools/cmdline/NCCommandLine.scala        | 65 +++++++++++++++++++++-
 3 files changed, 78 insertions(+), 15 deletions(-)

diff --git a/bin/nlpcraft.cmd b/bin/nlpcraft.cmd
index 132ad06..dfb0da4 100644
--- a/bin/nlpcraft.cmd
+++ b/bin/nlpcraft.cmd
@@ -104,6 +104,8 @@ set JVM_OPTS= ^
     -XX:+UseG1GC ^
     -XX:MaxMetaspaceSize=256m ^
     -DNLPCRAFT_CLI= ^
+    -DNLPCRAFT_CLI_CP="%CP%" ^
+    -DNLPCRAFT_CLI_JAVA="%JAVA_HOME%\bin\java.exe" ^
     -DNLPCRAFT_CLI_SCRIPT="%SCRIPT_NAME%" ^
     -DNLPCRAFT_CLI_INSTALL_HOME="%INSTALL_HOME%"
 
diff --git a/bin/nlpcraft.sh b/bin/nlpcraft.sh
index 4cd8ab6..31356ca 100644
--- a/bin/nlpcraft.sh
+++ b/bin/nlpcraft.sh
@@ -92,18 +92,6 @@ checkJava() {
     fi
 }
 
-MAIN_CLASS=org.apache.nlpcraft.model.tools.cmdline.NCCommandLine
-JVM_OPTS="\
-    -ea \
-    -Xms1g \
-    -Xmx1g \
-    -server \
-    -XX:+UseG1GC \
-    -XX:MaxMetaspaceSize=256m \
-    -DNLPCRAFT_CLI= \
-    -DNLPCRAFT_CLI_SCRIPT=$SCRIPT_NAME \
-    -DNLPCRAFT_CLI_INSTALL_HOME=$INSTALL_HOME"
-
 osname=$(uname)
 
 # OS specific classpath separator.
@@ -136,6 +124,20 @@ done
 # Check Java version.
 checkJava
 
+MAIN_CLASS=org.apache.nlpcraft.model.tools.cmdline.NCCommandLine
+JVM_OPTS="\
+    -ea \
+    -Xms1g \
+    -Xmx1g \
+    -server \
+    -XX:+UseG1GC \
+    -XX:MaxMetaspaceSize=256m \
+    -DNLPCRAFT_CLI= \
+    -DNLPCRAFT_CLI_CP=$CP \
+    -DNLPCRAFT_CLI_JAVA=$JAVA \
+    -DNLPCRAFT_CLI_SCRIPT=$SCRIPT_NAME \
+    -DNLPCRAFT_CLI_INSTALL_HOME=$INSTALL_HOME"
+
 case $osname in
     Darwin*)
         # shellcheck disable=SC2086
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCommandLine.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCommandLine.scala
index be5964a..5679a48 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCommandLine.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCommandLine.scala
@@ -34,6 +34,10 @@ import org.apache.nlpcraft.common._
 import org.apache.nlpcraft.common.ansi.{NCAnsi, NCAnsiSpinner}
 import org.apache.nlpcraft.common.ansi.NCAnsi._
 import org.apache.nlpcraft.common.version.NCVersion
+import java.lang.ProcessBuilder
+import java.lang.ProcessBuilder.Redirect
+import java.lang.management.ManagementFactory
+
 import resource.managed
 
 import scala.collection.mutable
@@ -51,9 +55,18 @@ object NCCommandLine extends App {
     private final val SRV_PID_PATH = ".nlpcraft/server_pid"
 
     private final lazy val VER = NCVersion.getCurrent
+    private final lazy val JAVA = U.sysEnv("NLPCRAFT_CLI_JAVA").getOrElse(
+        new File(
+            SystemUtils.getJavaHome,
+            s"bin/java${if (SystemUtils.IS_OS_UNIX) "" else ".exe"}"
+        ).getAbsolutePath
+    )
     private final lazy val INSTALL_HOME = 
U.sysEnv("NLPCRAFT_CLI_INSTALL_HOME").getOrElse(
         SystemUtils.USER_DIR
     )
+    private final lazy val JAVA_CP = 
U.sysEnv("NLPCRAFT_CLI_JAVA_CP").getOrElse(
+        ManagementFactory.getRuntimeMXBean.getClassPath
+    )
     private final lazy val SCRIPT_NAME = 
U.sysEnv("NLPCRAFT_CLI_SCRIPT").getOrElse(
         s"nlpcraft.${if (SystemUtils.IS_OS_UNIX) "sh" else "cmd"}"
     )
@@ -158,13 +171,13 @@ object NCCommandLine extends App {
                         "provide an alternative path."
                 ),
                 Parameter(
-                    id = "outputPath",
+                    id = "output",
                     names = Seq("--output-path", "-o"),
                     value = Some("path"),
                     optional = true,
                     desc =
                         "File path for both REST server stdout and stderr 
output. If not provided, the REST server" +
-                        s"output will be piped into 
'$${USER_HOME}/.nlpcraft/server-output.txt' file."
+                        s"output will be piped into 
'$${USER_HOME}/.nlpcraft/server-output-xxx.txt' file."
                 )
             ),
             examples = Seq(
@@ -321,7 +334,53 @@ object NCCommandLine extends App {
      * @param args Arguments, if any, for this command.
      */
     private def cmdStartServer(cmd: Command, args: Seq[Argument]): Unit = {
-        // TODO
+        val cfgPath = args.find(_.parameter.id == "config")
+        val igniteCfgPath = args.find(_.parameter.id == "igniteConfig")
+        val output = args.find(_.parameter.id == "output") match {
+            case Some(arg) ⇒ new File(arg.value.get)
+            case None ⇒ new File(SystemUtils.getUserHome, 
s".nlpcraft/server-output-${currentTime}.txt")
+        }
+
+        val pb = new ProcessBuilder(
+            JAVA,
+            "-ea",
+            "-Xms2048m",
+            "-XX:+UseG1GC",
+            "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
+            "--add-exports=java.base/sun.nio.ch=ALL-UNNAMED",
+            
"--add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED",
+            
"--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED",
+            
"--add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED",
+            
"--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED",
+            "--illegal-access=permit",
+            "-DNLPCRAFT_ANSI_COLOR_DISABLED=true",
+            "-cp",
+            s""""${JAVA_CP}"""",
+            "org.apache.nlpcraft.NCStart",
+            "-server",
+            cfgPath match {
+                case Some(path) ⇒ s"-config=$path"
+                case None ⇒ ""
+            },
+            igniteCfgPath match {
+                case Some(path) ⇒ s"-igniteConfig=$path"
+                case None ⇒ ""
+            },
+        )
+
+        pb.directory(new File(INSTALL_HOME))
+        pb.redirectErrorStream(true)
+        pb.redirectOutput(Redirect.appendTo(output))
+
+        try {
+            pb.start()
+
+            `>`(s"REST server started, output redirected to 
${ansiCyan(output.getAbsolutePath)}")
+            `>`(s"Use ${ansiGreen("stop-server")} command to stop it.")
+        }
+        catch {
+            case e: Exception ⇒ error(s"REST server failed to start: 
${ansiYellow(e.getLocalizedMessage)}")
+        }
     }
 
     /**

Reply via email to