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 53cd823  WIP.
53cd823 is described below

commit 53cd8230553b32ef5a3a230ad23ecb050a76ab76
Author: Aaron Radzinski <[email protected]>
AuthorDate: Wed Sep 30 15:44:55 2020 -0700

    WIP.
---
 .../main/scala/org/apache/nlpcraft/NCStart.scala   |  2 +-
 .../org/apache/nlpcraft/common/NCService.scala     |  2 +-
 .../org/apache/nlpcraft/common/ansi/NCAnsi.scala   | 16 +++---
 .../nlpcraft/common/ascii/NCAsciiTable.scala       | 14 +++---
 .../nlpcraft/common/config/NCConfigurable.scala    |  2 +-
 .../nlpcraft/common/makro/NCMacroParser.scala      | 24 ++++-----
 .../scala/org/apache/nlpcraft/common/package.scala | 35 ++++++-------
 .../org/apache/nlpcraft/common/util/NCUtils.scala  |  8 +--
 .../apache/nlpcraft/model/NCModelFileAdapter.java  |  6 +--
 .../apache/nlpcraft/model/impl/NCTokenLogger.scala |  8 +--
 .../model/intent/impl/NCIntentDslCompiler.scala    |  9 ++--
 .../model/intent/impl/NCIntentSolver.scala         |  7 ++-
 .../model/intent/impl/NCIntentSolverEngine.scala   |  6 +--
 .../model/intent/utils/NCDslTokenPredicate.java    | 18 +++----
 .../cmdline/{NCCommandLine.scala => NCCli.scala}   | 40 +++++++--------
 .../model/tools/cmdline/NCCliServerBeacon.scala    | 34 +++++++++++++
 .../sqlgen/impl/NCSqlModelGeneratorImpl.scala      |  2 +-
 .../tools/sqlgen/impl/NCSqlSchemaBuilderImpl.scala |  4 +-
 .../test/impl/NCTestAutoModelValidatorImpl.scala   |  4 +-
 .../nlpcraft/probe/mgrs/model/NCModelManager.scala | 10 ++--
 .../probe/mgrs/nlp/NCProbeEnrichmentManager.scala  | 26 +++++-----
 .../org/apache/nlpcraft/server/NCServer.scala      | 58 ++++++++++++++++------
 .../server/geo/tools/NCGeoNamesGenerator.scala     |  2 +-
 .../org/apache/nlpcraft/server/json/NCJson.scala   |  4 +-
 .../nlpcraft/server/mdo/impl/NCAnnotatedMdo.scala  | 12 ++---
 .../nlp/enrichers/NCServerEnrichmentManager.scala  |  2 +-
 .../nlpcraft/server/probe/NCProbeManager.scala     |  8 +--
 .../nlpcraft/server/query/NCQueryManager.scala     | 14 +++---
 .../nlpcraft/server/rest/NCRestManager.scala       |  5 +-
 .../org/apache/nlpcraft/server/sql/NCSql.scala     | 16 +++++-
 .../nlpcraft/server/user/NCUserManager.scala       |  6 ++-
 31 files changed, 237 insertions(+), 167 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCStart.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCStart.scala
index bc289a5..80b854f 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCStart.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCStart.scala
@@ -63,7 +63,7 @@ object NCStart extends App with LazyLogging {
             for (msg ← msgs)
                 logger.error(msg)
     
-            logger.info(ansiGreen("Usage:"))
+            logger.info(g("Usage:"))
             logger.info("  Use '-server' argument to start server.")
             logger.info("  Use '-probe' argument to start probe.")
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala
index 66422a6..7a592ce 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala
@@ -121,7 +121,7 @@ abstract class NCService extends LazyLogging with 
NCOpenCensusTrace {
             "state" → "started"
         )
 
-        val dur = s"$ansiBlueFg[${currentTime - timeStampMs}ms]$ansiReset"
+        val dur = s"$ansiGreenFg[${currentTime - timeStampMs}ms]$ansiReset"
 
         logger.info(s"$name started $dur")
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/ansi/NCAnsi.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/ansi/NCAnsi.scala
index 82a29c7..f65e333 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/ansi/NCAnsi.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/ansi/NCAnsi.scala
@@ -96,14 +96,14 @@ sealed trait NCAnsi extends LazyLogging {
     def ansiBlink: String = if (isEnabled) BLINK else ""
     def ansiInvisible: String = if (isEnabled) INVISIBLE else ""
 
-    def ansiGreen(s: String): String = s"$ansiGreenFg$s$ansiReset"
-    def ansiRed(s: String): String = s"$ansiRedFg$s$ansiReset"
-    def ansiCyan(s: String): String = s"$ansiCyanFg$s$ansiReset"
-    def ansiYellow(s: String): String = s"$ansiYellowFg$s$ansiReset"
-    def ansiBlack(s: String): String = s"$ansiBlackFg$s$ansiReset"
-    def ansiWhite(s: String): String = s"$ansiWhiteFg$s$ansiReset"
-    def ansiBlue(s: String): String = s"$ansiBlueFg$s$ansiReset"
-    def ansiBold(s: String): String = s"$ansiBold$s$ansiReset"
+    def ansiGreen(s: Any): String = s"$ansiGreenFg${s.toString}$ansiReset"
+    def ansiRed(s: Any): String = s"$ansiRedFg${s.toString}$ansiReset"
+    def ansiCyan(s: Any): String = s"$ansiCyanFg${s.toString}s$ansiReset"
+    def ansiYellow(s: Any): String = s"$ansiYellowFg${s.toString}$ansiReset"
+    def ansiBlack(s: Any): String = s"$ansiBlackFg${s.toString}s$ansiReset"
+    def ansiWhite(s: Any): String = s"$ansiWhiteFg${s.toString}$ansiReset"
+    def ansiBlue(s: Any): String = s"$ansiBlueFg${s.toString}$ansiReset"
+    def ansiBold(s: Any): String = s"$ansiBold${s.toString}$ansiReset"
 
     // Erase functions.
     def ansiClearScreen: String = if (isEnabled) CLEAR_SCREEN else ""
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/ascii/NCAsciiTable.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/ascii/NCAsciiTable.scala
index cc7e5af..62a96bd 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/ascii/NCAsciiTable.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/ascii/NCAsciiTable.scala
@@ -112,12 +112,12 @@ class NCAsciiTable {
     )
 
     // Table drawing symbols.
-    private val HDR_HOR = ansiCyan("=")
-    private val HDR_VER = ansiCyan("|")
-    private val HDR_CRS = ansiBlue("+")
-    private val ROW_HOR = ansiCyan("-")
-    private val ROW_VER = ansiCyan("|")
-    private val ROW_CRS = ansiBlue("+")
+    private val HDR_HOR = c("=")
+    private val HDR_VER = c("|")
+    private val HDR_CRS = c("+")
+    private val ROW_HOR = c("-")
+    private val ROW_VER = c("|")
+    private val ROW_CRS = c("+")
 
     // Headers & rows.
     private var hdr = IndexedSeq.empty[Cell]
@@ -455,7 +455,7 @@ class NCAsciiTable {
             case "center" ⇒ space(d / 2) + txt + space(d / 2 + d % 2)
             case "left" ⇒ space(sty.leftPad) + txt + space(d - sty.leftPad)
             case "right" ⇒ space(d - sty.rightPad) + txt + space(sty.rightPad)
-            case _ ⇒ throw new AssertionError(s"Invalid align option in: $sty")
+            case _ ⇒ throw new AssertionError(s"Invalid align option: $sty")
         }
     }
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/config/NCConfigurable.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/config/NCConfigurable.scala
index 1cb4d7a..222286d 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/config/NCConfigurable.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/config/NCConfigurable.scala
@@ -324,7 +324,7 @@ object NCConfigurable extends LazyLogging {
             logger.error(s"Invalid configuration.")
             logger.error(s"Note that you can use environment variable to 
provide configuration properties - see 
https://nlpcraft.apache.org/server-and-probe.html.";)
     
-            throw new NCE(s"No valid configuration found in: 
${tmpCfg.origin().description()}")
+            throw new NCE(s"No valid configuration found: 
${tmpCfg.origin().description()}")
         }
         else {
             if (overrideCfg.isDefined)
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/NCMacroParser.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/NCMacroParser.scala
index da46a8a..951dddd 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/NCMacroParser.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/NCMacroParser.scala
@@ -112,7 +112,7 @@ class NCMacroParser {
         val last = s.length() - 1
         
         if (s.head != '{' || s.charAt(last) != '}')
-            throw new NCE(s"Invalid option group in: $txt")
+            throw new NCE(s"Invalid option group: $txt")
         
         s = s.substring(1, last) // Trim out opening '{' and closing '}'.
         
@@ -151,9 +151,9 @@ class NCMacroParser {
                 }
                 
                 if (depth != 0)
-                    throw new NCE(s"Uneven curly brackets in: $txt")
+                    throw new NCE(s"Uneven curly brackets: $txt")
                 if (isEscape)
-                    throw new NCE(s"Incomplete '\\' escape usage in: $txt")
+                    throw new NCE(s"Incomplete '\\' escape usage: $txt")
                 
                 if (!found)
                     Some(Token(s.substring(0), ""))
@@ -189,7 +189,7 @@ class NCMacroParser {
         def procMarker(fix: String): Option[Token] = {
             if (s.startsWith(fix))
                 s.substring(fix.length).indexOf(fix) match {
-                    case -1 ⇒ throw new NCE(s"Uneven '$fix' marker in: $s")
+                    case -1 ⇒ throw new NCE(s"Uneven '$fix' marker: $s")
                     case i ⇒
                         val tail = i + 2 * fix.length
     
@@ -222,7 +222,7 @@ class NCMacroParser {
                     val i = s.substring(DSL_FIX.length).indexOf(DSL_FIX)
                     
                     if (i == -1)
-                        throw new NCE(s"Uneven '$DSL_FIX' marker in: $s")
+                        throw new NCE(s"Uneven '$DSL_FIX' marker: $s")
                     
                     val tail = i + 2 * DSL_FIX.length
         
@@ -252,9 +252,9 @@ class NCMacroParser {
                     }
                     
                     if (depth != 0 || !found)
-                        throw new NCE(s"Uneven curly brackets in: $s")
+                        throw new NCE(s"Uneven curly brackets: $s")
                     if (isEscape)
-                        throw new NCE(s"Incomplete '\\' escape usage in: $s")
+                        throw new NCE(s"Incomplete '\\' escape usage: $s")
                     
                     Some(Token(s.substring(0, i), s.substring(i)))
                 }
@@ -269,7 +269,7 @@ class NCMacroParser {
                         else {
                             if (!isEscape)
                                 ch match {
-                                    case '|' | '*' | '}' ⇒ throw new 
NCE(s"Suspicious '$ch' at pos $i in: '$s'")
+                                    case '|' | '*' | '}' ⇒ throw new 
NCE(s"Suspicious '$ch' at pos $i: '$s'")
                                     case '{' ⇒ found = true // Found start of 
the option group.
                                     case _ ⇒
                                 }
@@ -281,7 +281,7 @@ class NCMacroParser {
                     }
                     
                     if (isEscape)
-                        throw new NCE(s"Incomplete '\\' escape usage in: $s")
+                        throw new NCE(s"Incomplete '\\' escape usage: $s")
     
                     if (!found)
                         Some(Token(s.substring(0), ""))
@@ -398,7 +398,7 @@ class NCMacroParser {
         
         // Check for potentially invalid macros syntax.
         if (BROKEN_MACRO_REGEX1.findFirstIn(s).isDefined || 
BROKEN_MACRO_REGEX2.findFirstIn(s).isDefined)
-            throw new NCE(s"Likely invalid macro in: $txt")
+            throw new NCE(s"Likely invalid macro: $txt")
         
         U.distinct(expand0(s).toList map trimDupSpaces map processEscapes)
     }
@@ -410,9 +410,9 @@ class NCMacroParser {
       */
     private def checkName(name: String): Unit = {
         if (name.head != '<')
-            throw new NCE(s"Missing macro '<' opening in: $name")
+            throw new NCE(s"Missing macro '<' opening: $name")
         if (name.reverse.head != '>')
-            throw new NCE(s"Missing macro '>' closing in: $name")
+            throw new NCE(s"Missing macro '>' closing: $name")
     }
     
     /**
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/package.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/package.scala
index b79d64a..ccedb9e 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/package.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/package.scala
@@ -19,7 +19,7 @@ package org.apache.nlpcraft
 
 import java.util.concurrent.Callable
 import java.util.function.{BiPredicate, Consumer, Supplier, Function ⇒ 
JFunction, Predicate ⇒ JPredicate}
-
+import org.apache.nlpcraft.common.ansi.NCAnsi._
 import org.apache.nlpcraft.common.util._
 
 import scala.language.implicitConversions
@@ -40,6 +40,15 @@ package object common {
     final val MDL_META_ALL_GRP_IDS_KEY = "__NLPCRAFT_MDL_META_ALL_GRP_IDS"
     final val MDL_META_ALL_ALIASES_KEY = "__NLPCRAFT_MDL_META_ALL_ALIASES"
     final val TOK_META_ALIASES_KEY = "__NLPCRAFT_TOK_META_ALIASES"
+
+    // Real foreground color shortcuts...
+    def g(s: Any): String = s"$ansiGreenFg${s.toString}$ansiReset"
+    def r(s: Any): String = s"$ansiRedFg${s.toString}$ansiReset"
+    def c(s: Any): String = s"$ansiCyanFg${s.toString}$ansiReset"
+    def y(s: Any): String = s"$ansiYellowFg${s.toString}$ansiReset"
+    def w(s: Any): String = s"$ansiWhiteFg${s.toString}$ansiReset"
+    def b(s: Any): String = s"$ansiBlueFg${s.toString}$ansiReset"
+    def k(s: Any): String = s"$ansiBlackFg${s.toString}$ansiReset"
     
     /**
      * 
@@ -47,9 +56,7 @@ package object common {
      * @tparam T
      * @return
      */
-    implicit def toJavaConsumer[T](f: T ⇒ Unit): Consumer[T] = new Consumer[T] 
{
-        override def accept(t: T): Unit = f(t)
-    }
+    implicit def toJavaConsumer[T](f: T ⇒ Unit): Consumer[T] = (t: T) => f(t)
     
     /**
       *
@@ -57,9 +64,7 @@ package object common {
       * @tparam A
       * @return
       */
-    implicit def toJavaSupplier[A](f: () ⇒ A): Supplier[A] = new Supplier[A] {
-        override def get(): A = f()
-    }
+    implicit def toJavaSupplier[A](f: () ⇒ A): Supplier[A] = () => f()
     
     /**
       *
@@ -68,9 +73,7 @@ package object common {
       * @tparam B
       * @return
       */
-    implicit def toJavaFunction[A, B](f: A ⇒ B): JFunction[A, B] = new 
JFunction[A, B] {
-        override def apply(a: A): B = f(a)
-    }
+    implicit def toJavaFunction[A, B](f: A ⇒ B): JFunction[A, B] = (a: A) => 
f(a)
     
     /**
       *
@@ -78,9 +81,7 @@ package object common {
       * @tparam A
       * @return
       */
-    implicit def toJavaPredicate[A](f: A ⇒ Boolean): JPredicate[A] = new 
JPredicate[A] {
-        override def test(a: A): Boolean = f(a)
-    }
+    implicit def toJavaPredicate[A](f: A ⇒ Boolean): JPredicate[A] = (a: A) => 
f(a)
     
     /**
       *
@@ -89,9 +90,7 @@ package object common {
       * @tparam B
       * @return
       */
-    implicit def toJavaBiPredicate[A, B](predicate: (A, B) ⇒ Boolean): 
BiPredicate[A, B] = new BiPredicate[A, B] {
-        override def test(a: A, b: B): Boolean = predicate(a, b)
-    }
+    implicit def toJavaBiPredicate[A, B](predicate: (A, B) ⇒ Boolean): 
BiPredicate[A, B] = (a: A, b: B) => predicate(a, b)
     
     /**
       * @param f Lambda to convert.
@@ -107,7 +106,5 @@ package object common {
       * @return Callable object.
       */
     implicit def toCallable[R](f: () ⇒ R): Callable[R] =
-        new Callable[R] {
-            override def call(): R = f()
-        }
+        () => f()
 }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCUtils.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCUtils.scala
index b91f728..c7a50e8 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCUtils.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCUtils.scala
@@ -1490,12 +1490,12 @@ object NCUtils extends LazyLogging {
 
         for (ch ← json) {
             ch match {
-                case ':' if !inQuotes ⇒ buf ++= ansiRed(":")
-                case '[' | ']' | '{' | '}' if !inQuotes ⇒ buf ++= 
ansiYellow(s"$ch")
-                case ',' if !inQuotes ⇒ buf ++= ansiGreen(s"$ch")
+                case ':' if !inQuotes ⇒ buf ++= r(":")
+                case '[' | ']' | '{' | '}' if !inQuotes ⇒ buf ++= y(s"$ch")
+                case ',' if !inQuotes ⇒ buf ++= g(s"$ch")
                 case '"' ⇒
                     if (inQuotes)
-                        buf ++= ansiBlue(s"$ch")
+                        buf ++= b(s"$ch")
                     else
                         buf ++= s"$ansiBlueFg$ch$ansiCyanFg"
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelFileAdapter.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelFileAdapter.java
index aa25fe1..54fab0f 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelFileAdapter.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelFileAdapter.java
@@ -157,7 +157,7 @@ abstract public class NCModelFileAdapter extends 
NCModelAdapter {
             throw new NCException("Malformed model configuration URI: " + 
uri.toString(), e);
         }
         catch (IOException e) {
-            throw new NCException("Failed to read model configuration from: " 
+ uri.toString(), e);
+            throw new NCException("Failed to read model configuration: " + 
uri.toString(), e);
         }
     }
     
@@ -177,7 +177,7 @@ abstract public class NCModelFileAdapter extends 
NCModelAdapter {
                 return mapper.readValue(in, NCModelJson.class);
             }
             catch (Exception e) {
-                throw new NCException("Failed to load YAML from: " + path, e);
+                throw new NCException("Failed to load YAML: " + path, e);
             }
         }
         else if (pathLow.endsWith("js") || pathLow.endsWith("json")) {
@@ -185,7 +185,7 @@ abstract public class NCModelFileAdapter extends 
NCModelAdapter {
                 return GSON.fromJson(reader, NCModelJson.class);
             }
             catch (Exception e) {
-                throw new NCException("Failed to load JSON from: " + path, e);
+                throw new NCException("Failed to load JSON: " + path, e);
             }
         }
         
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCTokenLogger.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCTokenLogger.scala
index b43cda0..5db7a11 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCTokenLogger.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCTokenLogger.scala
@@ -429,9 +429,9 @@ object NCTokenLogger extends LazyLogging {
 
             val origTxtStr =
                 if (tok.isStopWord)
-                    ansiRed(tok.origText)
+                    r(tok.origText)
                 else if (tok.isFreeWord)
-                    ansiYellow(tok.origText)
+                    y(tok.origText)
                 else
                     tok.origText
 
@@ -442,8 +442,8 @@ object NCTokenLogger extends LazyLogging {
                     tok.lemma,
                     tok.pos,
                     tok.isQuoted,
-                    if (tok.isStopWord) s"${ansiRedFg}true$ansiReset" else 
"false",
-                    if (tok.isFreeWord) s"${ansiYellowFg}true$ansiReset" else 
"false",
+                    if (tok.isStopWord) s"${r("true")}" else "false",
+                    if (tok.isFreeWord) s"${y("true")}" else "false",
                     s"[${tok.wordIndexes.mkString(",")}]",
                     tok.isDirect,
                     tok.sparsity
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
index abbc3aa..fa56ba2 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
@@ -20,11 +20,10 @@ package org.apache.nlpcraft.model.intent.impl
 import com.typesafe.scalalogging.LazyLogging
 import org.antlr.v4.runtime._
 import org.antlr.v4.runtime.tree._
-import org.apache.nlpcraft.common.NCE
 import org.apache.nlpcraft.model.NCToken
 import org.apache.nlpcraft.model.intent.impl.antlr4.{NCIntentDslBaseListener, 
NCIntentDslLexer, NCIntentDslParser}
 import org.apache.nlpcraft.model.intent.utils.{NCDslFlowItem, NCDslIntent, 
NCDslTerm, NCDslTokenPredicate}
-import org.apache.nlpcraft.common.ansi.NCAnsi._
+import org.apache.nlpcraft.common._
 
 import scala.collection.JavaConverters._
 import scala.collection.mutable
@@ -330,9 +329,9 @@ object NCIntentDslCompiler extends LazyLogging {
             e: RecognitionException): Unit = {
             
             val errMsg = s"Intent DSL syntax error at line $line:$charPos - 
$msg\n" +
-                s"  |- ${ansiCyan("Model:")}  $mdlId\n" +
-                s"  |- ${ansiCyan("Intent:")} $dsl\n" +
-                s"  +- ${ansiCyan("Error:")}  ${makeCharPosPointer(dsl.length, 
charPos)}"
+                s"  |- ${c("Model:")}  $mdlId\n" +
+                s"  |- ${c("Intent:")} $dsl\n" +
+                s"  +- ${c("Error:")}  ${makeCharPosPointer(dsl.length, 
charPos)}"
             
             throw new NCE(errMsg)
         }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolver.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolver.scala
index ce6e1ca..dde3624 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolver.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolver.scala
@@ -19,7 +19,6 @@ package org.apache.nlpcraft.model.intent.impl
 
 import com.typesafe.scalalogging.LazyLogging
 import io.opencensus.trace.Span
-import org.apache.nlpcraft.common.NCException
 import org.apache.nlpcraft.common.debug.NCLogHolder
 import org.apache.nlpcraft.common.opencensus.NCOpenCensusTrace
 import org.apache.nlpcraft.common.util.NCUtils
@@ -27,7 +26,7 @@ import org.apache.nlpcraft.model.impl.NCVariantImpl
 import org.apache.nlpcraft.model.intent.utils.NCDslIntent
 import org.apache.nlpcraft.model.{NCContext, NCIntentMatch, NCIntentSkip, 
NCModel, NCRejection, NCResult, NCToken, NCVariant}
 import org.apache.nlpcraft.probe.mgrs.dialogflow.NCDialogFlowManager
-import org.apache.nlpcraft.common.ansi.NCAnsi._
+import org.apache.nlpcraft.common._
 import scala.collection.JavaConverters._
 
 /**
@@ -151,7 +150,7 @@ class NCIntentSolver(intents: List[(NCDslIntent/*Intent*/, 
NCIntentMatch ⇒ NCR
                 if (cbRes.getIntentId == null)
                     cbRes.setIntentId(res.intentId)
                     
-                logger.info(s"Intent '${res.intentId}' for variant 
#${res.variantIdx + 1} selected as the ${ansiRed("<<best match>>")}")
+                logger.info(s"Intent '${res.intentId}' for variant 
#${res.variantIdx + 1} selected as the ${r("<<best match>>")}")
 
                 NCDialogFlowManager.addMatchedIntent(res.intentId, 
req.getUser.getId, ctx.getModel.getId, span)
                 
@@ -164,7 +163,7 @@ class NCIntentSolver(intents: List[(NCDslIntent/*Intent*/, 
NCIntentMatch ⇒ NCR
                 case e: NCIntentSkip ⇒
                     // No-op - just skipping this result.
                     e.getMessage match {
-                        case s if s != null ⇒ logger.info(s"Selected intent 
'${res.intentId}' skipped due to: $s")
+                        case s if s != null ⇒ logger.info(s"Selected intent 
'${res.intentId}' skipped: $s")
                         case _ ⇒ logger.info(s"Selected intent 
'${res.intentId}' skipped.")
                     }
             }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
index e82fc67..5168d12 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
@@ -249,11 +249,11 @@ object NCIntentSolverEngine extends LazyLogging with 
NCOpenCensusTrace {
                         tbl += (
                             Seq(
                                 s"#${m.variantIdx + 1}",
-                                ansiRed("<<best match")
+                                r("<<best match")
                             ),
                             Seq(
                                 im.intent.id,
-                                ansiRed("<<best match")
+                                r("<<best match")
                             ),
                             mkPickTokens(im)
                         )
@@ -276,7 +276,7 @@ object NCIntentSolverEngine extends LazyLogging with 
NCOpenCensusTrace {
                         )
                 })
 
-                tbl.info(logger, Some(s"Found matching intents (sorted 
${ansiRed("best")} to worst):"))
+                tbl.info(logger, Some(s"Found matching intents (sorted 
${r("best")} to worst):"))
             }
             else
                 logger.info("No matching intent found.")
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java
index f1f0cdb..c717833 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java
@@ -79,13 +79,13 @@ public class NCDslTokenPredicate implements 
Function<NCToken, Boolean> {
         // Assert?
         if (param == null || (param.charAt(0) != '~' && 
!PARAMS.contains(param)))
             throw new IllegalArgumentException(String.format(
-                "Invalid token predicate DSL parameter ('%s') in: %s %s %s",
+                "Invalid token predicate DSL parameter ('%s'): %s %s %s",
                 param, param, op, value));
 
         // Assert?
         if (op == null || !OPS.contains(op))
             throw new IllegalArgumentException(String.format(
-                "Invalid token predicate DSL operation ('%s') in: %s %s %s",
+                "Invalid token predicate DSL operation ('%s'): %s %s %s",
                 op, param, op, value));
 
         this.parts = new ArrayList<>(parts);
@@ -370,7 +370,7 @@ public class NCDslTokenPredicate implements 
Function<NCToken, Boolean> {
             String str = param.substring(1);
 
             if (str.isEmpty())
-                throw new IllegalArgumentException(String.format("Token 
predicate DSL empty meta parameter name in: %s %s %s",
+                throw new IllegalArgumentException(String.format("Token 
predicate DSL empty meta parameter name: %s %s %s",
                     param, op, valueStr));
 
             String[] parts = str.split("[\\[\\]]");
@@ -387,7 +387,7 @@ public class NCDslTokenPredicate implements 
Function<NCToken, Boolean> {
 
                     if (strIdx.isEmpty())
                         throw new IllegalArgumentException(
-                            String.format("Token predicate DSL meta parameter 
empty index in: %s %s %s", param, op,
+                            String.format("Token predicate DSL meta parameter 
empty index: %s %s %s", param, op,
                                 valueStr));
                     else if (obj instanceof java.util.List) {
                         try {
@@ -395,7 +395,7 @@ public class NCDslTokenPredicate implements 
Function<NCToken, Boolean> {
                         }
                         catch (NumberFormatException e) {
                             throw new IllegalArgumentException(String.format(
-                                "Invalid token predicate DSL meta parameter 
index ('%s') for java.util.List value (integer only) in: %s %s %s",
+                                "Invalid token predicate DSL meta parameter 
index ('%s') for java.util.List value (integer only): %s %s %s",
                                 strIdx, param, op, valueStr),
                                 e);
                         }
@@ -411,7 +411,7 @@ public class NCDslTokenPredicate implements 
Function<NCToken, Boolean> {
             }
             else
                 throw new IllegalArgumentException(String.format(
-                    "Invalid token predicate DSL meta parameter in: %s %s %s", 
param, op, valueStr));
+                    "Invalid token predicate DSL meta parameter: %s %s %s", 
param, op, valueStr));
         }
         else
             switch (param) {
@@ -425,7 +425,7 @@ public class NCDslTokenPredicate implements 
Function<NCToken, Boolean> {
                 case "parent": lval = tok.getParentId() == null ? null : 
tok.getParentId().trim(); break;
 
                 default: throw new IllegalArgumentException(String.format(
-                    "Invalid token predicate DSL parameter ('%s') in: %s %s 
%s",
+                    "Invalid token predicate DSL parameter ('%s'): %s %s %s",
                     param, param, op, valueStr));
             }
 
@@ -439,12 +439,12 @@ public class NCDslTokenPredicate implements 
Function<NCToken, Boolean> {
                 param.equals("id") ||
                 param.equals("parent")) &&
                 !NCDslTokenChecker.isValidElementId(tok, (String)rval))
-                throw new IllegalArgumentException(String.format("Attempt to 
check unknown element ID '%s' in: %s %s %s",
+                throw new IllegalArgumentException(String.format("Attempt to 
check unknown element ID '%s': %s %s %s",
                     rval, param, op, valueStr));
 
             if ((param.equals("groups")) &&
                 !NCDslTokenChecker.isValidGroup(tok, (String)rval))
-                throw new IllegalArgumentException(String.format("Attempt to 
check unknown group ID '%s' in: %s %s %s",
+                throw new IllegalArgumentException(String.format("Attempt to 
check unknown group ID '%s': %s %s %s",
                     rval, param, op, valueStr));
 
             validated = true;
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/NCCli.scala
similarity index 95%
rename from 
nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCommandLine.scala
rename to 
nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCli.scala
index 35f91ae..0aa3a38 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/NCCli.scala
@@ -48,7 +48,7 @@ import scala.compat.Platform.currentTime
 /**
  * 'nlpcraft' script entry point.
  */
-object NCCommandLine extends App {
+object NCCli extends App {
     private final val NAME = "Apache NLPCraft CLI"
 
     private final val SRV_PID_PATH = ".nlpcraft/server_pid"
@@ -374,11 +374,11 @@ object NCCommandLine extends App {
         try {
             pb.start()
 
-            `>`(s"REST server is starting, output redirected to 
${ansiCyan(output.getAbsolutePath)}")
-            `>`(s"Use ${ansiGreen("stop-server")} command to stop it.")
+            `>`(s"REST server is starting, output redirected to 
${c(output.getAbsolutePath)}")
+            `>`(s"Use ${g("stop-server")} command to stop it.")
         }
         catch {
-            case e: Exception ⇒ error(s"REST server failed to start: 
${ansiYellow(e.getLocalizedMessage)}")
+            case e: Exception ⇒ error(s"REST server failed to start: 
${y(e.getLocalizedMessage)}")
         }
     }
 
@@ -405,7 +405,7 @@ object NCCommandLine extends App {
         var i = 0
 
         while (i < num) {
-            `>>`(s"Pinging REST server at ${ansiBlue(endpoint)} ")
+            `>>`(s"Pinging REST server at ${b(endpoint)} ")
 
             val spinner = new NCAnsiSpinner(
                 System.out,
@@ -425,23 +425,23 @@ object NCCommandLine extends App {
                     case 200 ⇒
                         spinner.stop()
 
-                        log(ansiGreen("OK") + " " + ansiCyan(s"[${currentTime 
- startMs}ms]"))
+                        log(g("OK") + " " + c(s"[${currentTime - startMs}ms]"))
 
                     case code: Int ⇒
                         spinner.stop()
 
-                        log(ansiRed("FAIL") + s" [HTTP 
$ansiYellowFg$code$ansiReset]")
+                        log(r("FAIL") + s" [HTTP ${y(code.toString)}]")
                 }
             catch {
                 case _: SSLException ⇒
                     spinner.stop()
 
-                    log(ansiRed("FAIL") + s" ${ansiYellow("[SSL error]")}")
+                    log(r("FAIL") + s" ${y("[SSL error]")}")
 
                 case _: IOException ⇒
                     spinner.stop()
 
-                    log(ansiRed("FAIL") + s" ${ansiYellow("[I/O error]")}")
+                    log(r("FAIL") + s" ${y("[I/O error]")}")
             }
 
             i += 1
@@ -472,9 +472,9 @@ object NCCommandLine extends App {
             ProcessHandle.of(pid).asScala match {
                 case Some(ph) ⇒
                     if (ph.destroy())
-                        `>`(s"Local REST server (pid 
${ansiCyan(pid.toString)}) has been stopped.")
+                        `>`(s"Local REST server (pid ${c(pid.toString)}) has 
been stopped.")
                     else
-                        error(s"Failed to stop the local REST server (pid 
${ansiCyan(pid.toString)}).")
+                        error(s"Failed to stop the local REST server (pid 
${c(pid.toString)}).")
 
 
                 case None ⇒ error("Cannot find locally running REST server.")
@@ -533,7 +533,7 @@ object NCCommandLine extends App {
                         else
                             s"$T___${param.names.mkString(", ")}"
 
-                    lines += ansiCyan(line)
+                    lines += c(line)
 
                     if (param.optional)
                         lines += s"$T___${T___}Optional."
@@ -550,7 +550,7 @@ object NCCommandLine extends App {
                 lines += ansiBold("EXAMPLES")
 
                 for (ex ← cmd.examples) {
-                    lines ++= ex.usage.map(s ⇒ ansiYellow(s"$T___$s"))
+                    lines ++= ex.usage.map(s ⇒ y(s"$T___$s"))
                     lines += s"$T___$T___${ex.desc}"
                 }
             }
@@ -631,8 +631,8 @@ object NCCommandLine extends App {
         if (args.isEmpty)
             log((
                 new NCAsciiTable
-                    += ("Version:", ansiCyan(VER.version))
-                    += ("Release date:", ansiCyan(VER.date.toString))
+                    += ("Version:", c(VER.version))
+                    += ("Release date:", c(VER.date.toString))
                 ).toString
             )
         else {
@@ -660,7 +660,7 @@ object NCCommandLine extends App {
 
         val msg2 = if (msg.head.isLower) msg.head.toUpper + msg.tail else msg
 
-        System.err.println(s"${ansiRed("ERR:")} $msg2")
+        System.err.println(s"${r("ERR:")} $msg2")
     }
 
     /**
@@ -673,19 +673,19 @@ object NCCommandLine extends App {
      *
      * @param msg
      */
-    private def `>`(msg: String): Unit = 
System.out.println(s"${ansiGreen(">")} $msg")
+    private def `>`(msg: String): Unit = System.out.println(s"${g(">")} $msg")
 
     /**
      *
      * @param msg
      */
-    private def `>>`(msg: String): Unit = System.out.print(s"${ansiGreen(">")} 
$msg")
+    private def `>>`(msg: String): Unit = System.out.print(s"${g(">")} $msg")
 
     /**
      *
      */
     private def errorHelp(): Unit =
-        error(s"Run '${ansiCyan(SCRIPT_NAME + " " + HELP_CMD.mainName)}' to 
read the manual.")
+        error(s"Run '${c(SCRIPT_NAME + " " + HELP_CMD.mainName)}' to read the 
manual.")
 
     /**
      * Prints out the version and copyright title header.
@@ -759,7 +759,7 @@ object NCCommandLine extends App {
         args.map { arg ⇒
             val parts = arg.split("=")
 
-            def mkError() = new IllegalArgumentException(s"Invalid parameter: 
${ansiCyan(arg)}")
+            def mkError() = new IllegalArgumentException(s"Invalid parameter: 
${c(arg)}")
 
             if (parts.size > 2)
                 throw mkError()
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCliServerBeacon.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCliServerBeacon.scala
new file mode 100644
index 0000000..ffe0e5c
--- /dev/null
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCliServerBeacon.scala
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.nlpcraft.model.tools.cmdline
+
+/**
+ *
+ * @param pid
+ * @param restEndpoint
+ * @param upLink
+ * @param downLink
+ */
+case class NCCliServerBeacon(
+    pid: Long,
+    jdbcUrl: String,
+    restEndpoint: String,
+    upLink: String,
+    downLink: String
+)
+
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlModelGeneratorImpl.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlModelGeneratorImpl.scala
index 6300ecd..a7253ab 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlModelGeneratorImpl.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlModelGeneratorImpl.scala
@@ -741,7 +741,7 @@ object NCSqlModelGeneratorImpl {
         v.toLowerCase match {
             case "true" ⇒ true
             case "false" ⇒ false
-            case _ ⇒ throw new IllegalArgumentException(s"Invalid boolean 
value in: $name $v")
+            case _ ⇒ throw new IllegalArgumentException(s"Invalid boolean 
value: $name $v")
         }
         
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlSchemaBuilderImpl.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlSchemaBuilderImpl.scala
index 4a1793d..0b09fb1 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlSchemaBuilderImpl.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/sqlgen/impl/NCSqlSchemaBuilderImpl.scala
@@ -94,7 +94,7 @@ object NCSqlSchemaBuilderImpl {
                         extraTables = extra,
                         defaultDate = defDateOpt match {
                             case Some(defDate) ⇒
-                                def error() = throw new NCException(s"Invalid 
default date declaration in: $defDate")
+                                def error() = throw new NCException(s"Invalid 
default date declaration: $defDate")
 
                                 val pair = defDate.split("\\.")
 
@@ -111,7 +111,7 @@ object NCSqlSchemaBuilderImpl {
 
                     dfltSort.
                         foreach(s ⇒ {
-                            def error() = throw new NCException(s"Invalid 
default sort declaration in: $s")
+                            def error() = throw new NCException(s"Invalid 
default sort declaration: $s")
 
                             var pair = s.split("\\.")
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/test/impl/NCTestAutoModelValidatorImpl.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/test/impl/NCTestAutoModelValidatorImpl.scala
index ad7f4f9..9f94fc0 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/test/impl/NCTestAutoModelValidatorImpl.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/test/impl/NCTestAutoModelValidatorImpl.scala
@@ -110,7 +110,7 @@ private [test] object NCTestAutoModelValidatorImpl extends 
LazyLogging {
             tbl += (
                 res.modelId,
                 res.intentId,
-                if (res.pass) ansiGreen("OK") else ansiRed("FAIL"),
+                if (res.pass) g("OK") else r("FAIL"),
                 res.text,
                 res.error.getOrElse("")
             )
@@ -119,7 +119,7 @@ private [test] object NCTestAutoModelValidatorImpl extends 
LazyLogging {
         val failCnt = results.count(!_.pass)
         
         logger.info(s"Model auto-validation results: " +
-            s"${ansiGreen("OK")} $passCnt, ${ansiRed("FAIL")} 
$failCnt:\n${tbl.toString}"
+            s"${g("OK")} $passCnt, ${r("FAIL")} $failCnt:\n${tbl.toString}"
         )
         
         failCnt == 0
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelManager.scala
index 4595941..eebe3d9 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelManager.scala
@@ -68,16 +68,16 @@ object NCModelManager extends NCService with 
DecorateAsScala {
                     Seq(
                         s"${mdl.getName}",
                         s"ID: ${ansiBold(mdl.getId)}, ver: ${mdl.getVersion}",
-                        s"Elements: $elmCnt" + (if (elmCnt == 0) s" 
${ansiRed("(!)")}" else ""),
-                        s"Synonyms: $synCnt" + (if (synCnt == 0) s" 
${ansiRed("(!)")}" else ""),
-                        s"Intents: $intentCnt" + (if (intentCnt == 0) s" 
${ansiRed("(!)")}" else "")
+                        s"Elements: $elmCnt" + (if (elmCnt == 0) s" 
${r("(!)")}" else ""),
+                        s"Synonyms: $synCnt" + (if (synCnt == 0) s" 
${r("(!)")}" else ""),
+                        s"Intents: $intentCnt" + (if (intentCnt == 0) s" 
${r("(!)")}" else "")
                     ),
                     w.intents
                         .map(_.toDslString)
                         .flatMap(s ⇒
                             s
-                            .replaceAll("intent=", s"${ansiGreen("intent")}=")
-                            .replaceAll(" term", s"\n  
${ansiCyan("term")}").split("\n")
+                            .replaceAll("intent=", s"${g("intent")}=")
+                            .replaceAll(" term", s"\n  
${c("term")}").split("\n")
                         )
                 )
             })
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
index 2c7eb92..54bc85a 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
@@ -231,19 +231,19 @@ object NCProbeEnrichmentManager extends NCService with 
NCOpenCensusModelStats {
 
         val tbl = NCAsciiTable()
 
-        tbl += (s"${ansiBlueFg}Text$ansiReset", nlpSens.map(s ⇒ 
ansiGreen(s.text)))
-        tbl += (s"${ansiBlueFg}Model ID$ansiReset", mdlId)
-        tbl += (s"${ansiBlueFg}User ID$ansiReset", usrId)
-        tbl += (s"$ansiBlueFg  First Name$ansiReset", 
senMeta.getOrElse("FIRST_NAME", ""))
-        tbl += (s"$ansiBlueFg  Last Name$ansiReset", 
senMeta.getOrElse("LAST_NAME", ""))
-        tbl += (s"$ansiBlueFg  Email$ansiReset", senMeta.getOrElse("EMAIL", 
""))
-        tbl += (s"$ansiBlueFg  Company Name$ansiReset", 
senMeta.getOrElse("COMPANY_NAME", ""))
-        tbl += (s"$ansiBlueFg  Is Admin$ansiReset", 
senMeta.getOrElse("IS_ADMIN", ""))
-        tbl += (s"$ansiBlueFg  Signup Date$ansiReset", new 
Date(java.lang.Long.parseLong(senMeta("SIGNUP_TSTAMP").toString)))
-        tbl += (s"${ansiBlueFg}User Agent$ansiReset", 
senMeta.getOrElse("USER_AGENT", ""))
-        tbl += (s"${ansiBlueFg}Remote Address$ansiReset", 
senMeta.getOrElse("REMOTE_ADDR", ""))
-        tbl += (s"${ansiBlueFg}Server Timestamp$ansiReset", new 
Date(java.lang.Long.parseLong(senMeta("RECEIVE_TSTAMP").toString)))
-        tbl += (s"${ansiBlueFg}Server Request ID$ansiReset", srvReqId)
+        tbl += (s"${b("Text")}", nlpSens.map(s ⇒ g(s.text)))
+        tbl += (s"${b("Model ID$ansiReset")}", mdlId)
+        tbl += (s"${b("User ID$ansiReset")}", usrId)
+        tbl += (s"${b("  First Name$ansiReset")}", 
senMeta.getOrElse("FIRST_NAME", ""))
+        tbl += (s"${b("  Last Name$ansiReset")}", 
senMeta.getOrElse("LAST_NAME", ""))
+        tbl += (s"${b("  Email$ansiReset")}", senMeta.getOrElse("EMAIL", ""))
+        tbl += (s"${b("  Company Name$ansiReset")}", 
senMeta.getOrElse("COMPANY_NAME", ""))
+        tbl += (s"${b("  Is Admin$ansiReset")}", senMeta.getOrElse("IS_ADMIN", 
""))
+        tbl += (s"${b("  Signup Date$ansiReset")}", new 
Date(java.lang.Long.parseLong(senMeta("SIGNUP_TSTAMP").toString)))
+        tbl += (s"${b("User Agent$ansiReset")}", 
senMeta.getOrElse("USER_AGENT", ""))
+        tbl += (s"${b("Remote Address$ansiReset")}", 
senMeta.getOrElse("REMOTE_ADDR", ""))
+        tbl += (s"${b("Server Timestamp$ansiReset")}", new 
Date(java.lang.Long.parseLong(senMeta("RECEIVE_TSTAMP").toString)))
+        tbl += (s"${b("Server Request ID$ansiReset")}", srvReqId)
 
         logger.info(s"New request received from server:\n$tbl")
         
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/NCServer.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/NCServer.scala
index f4f8ba5..290d653 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/NCServer.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/NCServer.scala
@@ -34,6 +34,7 @@ import org.apache.nlpcraft.common.nlp.dict.NCDictionaryManager
 import org.apache.nlpcraft.common.nlp.numeric.NCNumericManager
 import org.apache.nlpcraft.common.opencensus.NCOpenCensusTrace
 import org.apache.nlpcraft.common.version._
+import org.apache.nlpcraft.model.tools.cmdline.NCCliServerBeacon
 import org.apache.nlpcraft.server.company.NCCompanyManager
 import org.apache.nlpcraft.server.feedback.NCFeedbackManager
 import org.apache.nlpcraft.server.geo.NCGeoManager
@@ -62,7 +63,7 @@ import scala.util.control.Exception.{catching, ignoring}
   * NLPCraft server app.
   */
 object NCServer extends App with NCIgniteInstance with LazyLogging with 
NCOpenCensusTrace {
-    private final val PID_PATH = ".nlpcraft/server_pid"
+    private final val BEACON_PATH = ".nlpcraft/server_beacon"
 
     private val startedMgrs = mutable.Buffer.empty[NCService]
 
@@ -194,8 +195,8 @@ object NCServer extends App with NCIgniteInstance with 
LazyLogging with NCOpenCe
         
         asciiLogo()
 
-        storePid()
-        
+        storeBeacon()
+
         val lifecycle = new CountDownLatch(1)
     
         catching(classOf[Throwable]) either startManagers() match {
@@ -228,40 +229,65 @@ object NCServer extends App with NCIgniteInstance with 
LazyLogging with NCOpenCe
     /**
      *
      */
-    private def storePid(): Unit = {
-        val path = new File(SystemUtils.getUserHome, PID_PATH)
+    private def storeBeacon(): Unit = {
+        val path = new File(SystemUtils.getUserHome, BEACON_PATH)
 
         /**
          *
          */
-        def storeInUserHome() =
+        def storeInUserHome() = {
+            final object Config extends NCConfigurable {
+                final private val pre = "nlpcraft.server"
+
+                lazy val restHost = getString(s"$pre.rest.host")
+                lazy val restPort = getInt(s"$pre.rest.port")
+                lazy val upLink =  getString(s"$pre.probe.links.upLink")
+                lazy val downLink =  getString(s"$pre.probe.links.downLink")
+                lazy val jdbcUrl =  getString(s"$pre.database.jdbc.url")
+            }
+
             try {
                 managed(new ObjectOutputStream(new FileOutputStream(path))) 
acquireAndGet { stream ⇒
-                    stream.writeLong(ProcessHandle.current().pid())
+                    stream.writeObject(NCCliServerBeacon(
+                        pid = ProcessHandle.current().pid(),
+                        jdbcUrl = Config.jdbcUrl,
+                        restEndpoint = 
s"${Config.restHost}:${Config.restPort}",
+                        upLink = Config.upLink,
+                        downLink = Config.downLink
+                    ))
                     stream.flush()
                 }
 
+                // Make sure beacon is deleted when server process exits.
                 path.deleteOnExit()
 
-                logger.trace(s"PID stored in: ${path.getAbsolutePath}")
+                logger.info(s"Server beacon saved: ${path.getAbsolutePath}")
             }
             catch {
-                case e: IOException ⇒ U.prettyError(logger, "Failed to store 
server PID.", e)
+                case e: IOException ⇒ U.prettyError(logger, "Failed to save 
server beacon.", e)
             }
+        }
 
         if (path.exists())
             catching(classOf[IOException]) either {
-                managed(new ObjectInputStream(new FileInputStream(path))) 
acquireAndGet { _.readLong() }
+                managed(new ObjectInputStream(new FileInputStream(path))) 
acquireAndGet { _.readObject() }
             } match {
-                case Left(e) ⇒ U.prettyError(logger, s"Failed to read existing 
PID from: ${path.getAbsolutePath}", e)
-                case Right(pid) ⇒
-                    if (ProcessHandle.of(pid).isPresent)
-                        logger.error(s"Cannot store PID file as another local 
server detected [existing-pid=$pid]")
-                    else
+                case Left(e) ⇒ U.prettyError(logger, s"Failed to read existing 
server beacon: ${path.getAbsolutePath}", e)
+                case Right(rawObj) ⇒
+                    val beacon = rawObj.asInstanceOf[NCCliServerBeacon]
+
+                    if (ProcessHandle.of(beacon.pid).isPresent)
+                        logger.error(s"Cannot save server beacon file as 
another live local server detected [pid=${beacon.pid}]")
+                    else {
+                        logger.trace(s"Overriding server beacon for a phantom 
process [pid=${beacon.pid}]")
+
                         storeInUserHome()
+                    }
             }
-        else
+        else {
+            // No existing beacon file detected.
             storeInUserHome()
+        }
     }
 
     NCIgniteRunner.runWith(
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/tools/NCGeoNamesGenerator.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/tools/NCGeoNamesGenerator.scala
index a6b5262..5f254c5 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/tools/NCGeoNamesGenerator.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/tools/NCGeoNamesGenerator.scala
@@ -533,7 +533,7 @@ object NCGeoNamesGenerator extends App {
             usTop
         )
 
-        println(s"Files generated OK in: $outDir.")
+        println(s"Files generated OK: $outDir.")
     }
 
     // Input files.
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/json/NCJson.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/json/NCJson.scala
index 99c5fe6..a213564 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/json/NCJson.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/json/NCJson.scala
@@ -130,9 +130,9 @@ object NCJson {
     private type NCJ = NCJsonException
 
     // Specific control flow exceptions.
-    case class InvalidJson(js: String) extends NCJ(s"Malformed JSON syntax in: 
$js") with LazyLogging {
+    case class InvalidJson(js: String) extends NCJ(s"Malformed JSON syntax: 
$js") with LazyLogging {
         // Log right away.
-        logger.error(s"Malformed JSON syntax in: $js")
+        logger.error(s"Malformed JSON syntax: $js")
     }
 
     case class InvalidJsonField(fn: String, cause: Throwable) extends 
NCJ(s"Invalid '$fn' JSON field <" +
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/mdo/impl/NCAnnotatedMdo.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/mdo/impl/NCAnnotatedMdo.scala
index 6e28258..283a4ab 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/mdo/impl/NCAnnotatedMdo.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/mdo/impl/NCAnnotatedMdo.scala
@@ -36,9 +36,9 @@ import scala.util.control.Exception._
 sealed case class NCMdoEntityAnnotationException(c: Class[_])
     extends NCE(s"Annotated MDO doesn't have 'NCMdoEntity' annotation: $c")
 sealed case class NCMdoFieldAnnotationException(c: Class[_])
-    extends NCE(s"Not all main constructor parameters have 'NCMdoField' 
annotation in: $c")
+    extends NCE(s"Not all main constructor parameters have 'NCMdoField' 
annotation: $c")
 sealed case class NCMdoSqlNotSupportedException(c: Class[_])
-    extends NCE(s"SQL is not supported in: $c")
+    extends NCE(s"SQL is not supported: $c")
 sealed case class NCMdoJsonConverterException(msg: String, c: Class[_], 
mtdName: String)
     extends NCE(s"$msg [name=$mtdName, class=$c]")
 sealed case class NCMdoMissingGetterException(a: NCMdoField, c: Class[_])
@@ -148,21 +148,21 @@ object NCAnnotatedMdo {
                     val col = param.ann.column
 
                     if (col == "")
-                        throw NCMdoCheckException(s"SQL column is not 
specified in: $param.ann")
+                        throw NCMdoCheckException(s"SQL column is not 
specified: $param.ann")
 
                     if (uniqCols.contains(col))
-                        throw NCMdoCheckException(s"Duplicate SQL column in: 
$param.ann")
+                        throw NCMdoCheckException(s"Duplicate SQL column: 
$param.ann")
                     else
                         uniqCols = uniqCols :+ col
 
                     if (param.ann.pk() && pkFound)
-                        throw NCMdoCheckException(s"Duplicate SQL primary key 
in: $param.ann")
+                        throw NCMdoCheckException(s"Duplicate SQL primary key: 
$param.ann")
                     else
                         pkFound = true
                 }
 
                 if (uniqJsons.contains(param.jsonName))
-                    throw NCMdoCheckException(s"Duplicate JSON name in: 
$param.ann")
+                    throw NCMdoCheckException(s"Duplicate JSON name: 
$param.ann")
                 else
                     uniqJsons = uniqJsons :+ param.jsonName
             }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/NCServerEnrichmentManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/NCServerEnrichmentManager.scala
index 94e8468..86b7bee 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/NCServerEnrichmentManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/NCServerEnrichmentManager.scala
@@ -144,7 +144,7 @@ object NCServerEnrichmentManager extends NCService with 
NCIgniteInstance {
             val normTxt = NCPreProcessManager.normalize(txt, spellCheck = 
true, span)
 
             if (normTxt != txt)
-                logger.info(s"Sentence normalized to: $normTxt")
+                logger.info(s"Sentence normalized: $normTxt")
 
             val normEnabledBuiltInToks = enabledBuiltInToks.map(_.toLowerCase)
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
index 0e007b2..aad300e 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
@@ -360,7 +360,7 @@ object NCProbeManager extends NCService {
 
                         srv.bind(new InetSocketAddress(host, port))
                         
-                        logger.info(s"$name server is listening on 
'$host:$port'")
+                        logger.info(s"$name connection is on '$host:$port'")
                         
                         srv.setSoTimeout(Config.soTimeoutMs)
                         
@@ -800,13 +800,13 @@ object NCProbeManager extends NCService {
         tbl += (
             Seq(
                 probe.probeId,
-                s"  ${ansiCyan("guid")}: ${probe.probeGuid}",
-                s"  ${ansiCyan("tok")}: ${probe.probeToken}"
+                s"  ${c("guid")}: ${probe.probeGuid}",
+                s"  ${c("tok")}: ${probe.probeToken}"
             ),
             s"${probe.osName} ver. ${probe.osVersion}",
             s"${probe.tmzAbbr}, ${probe.tmzId}",
             s"${probe.hostName} (${probe.hostAddr})",
-            probe.models.map(m ⇒ s"${ansiBlue(m.id)}, v${m.version}").toSeq
+            probe.models.map(m ⇒ s"${b(m.id)}, v${m.version}").toSeq
         )
         
         tbl
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala
index cbb2415..9b98da6 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala
@@ -264,12 +264,12 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
             startScopedSpan("future", parent, "srvReqId" → srvReqId) { span ⇒
                 val tbl = NCAsciiTable()
 
-                tbl += (s"${ansiBlueFg}Text$ansiReset", ansiGreen(txt0))
-                tbl += (s"${ansiBlueFg}User ID$ansiReset", usr.id)
-                tbl += (s"${ansiBlueFg}Model ID$ansiReset", mdlId)
-                tbl += (s"${ansiBlueFg}Agent$ansiReset", 
usrAgent.getOrElse("<n/a>"))
-                tbl += (s"${ansiBlueFg}Remote Address$ansiReset", 
rmtAddr.getOrElse("<n/a>"))
-                tbl += (s"${ansiBlueFg}Server Request ID$ansiReset", srvReqId)
+                tbl += (s"${b("Text$ansiReset")}", g(txt0))
+                tbl += (s"${b("User ID$ansiReset")}", usr.id)
+                tbl += (s"${b("Model ID$ansiReset")}", mdlId)
+                tbl += (s"${b("Agent$ansiReset")}", 
usrAgent.getOrElse("<n/a>"))
+                tbl += (s"${b("Remote Address$ansiReset")}", 
rmtAddr.getOrElse("<n/a>"))
+                tbl += (s"${b("Server Request ID$ansiReset")}", srvReqId)
 
                 // TODO: need to pretty print data JSON
                 // tbl += (s"${ansiBlueFg}Data$ansiReset", data.getOrElse(""))
@@ -298,7 +298,7 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
             case Success(_) ⇒ // No-op.
 
             case Failure(e: NCE) ⇒
-                logger.error(s"Query processing failed due to: 
${e.getLocalizedMessage}")
+                logger.error(s"Query processing failed: 
${e.getLocalizedMessage}")
 
                 setError(
                     srvReqId,
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCRestManager.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCRestManager.scala
index 7ad716b..91f2d9d 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCRestManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCRestManager.scala
@@ -24,6 +24,7 @@ import akka.stream.Materializer
 import io.opencensus.trace.Span
 import org.apache.nlpcraft.common.config.NCConfigurable
 import org.apache.nlpcraft.common.{NCService, _}
+import org.apache.nlpcraft.common.ansi.NCAnsi._
 
 import scala.concurrent.{ExecutionContextExecutor, Future}
 import scala.util.{Failure, Success}
@@ -86,8 +87,8 @@ object NCRestManager extends NCService {
         bindFut = Http().newServerAt(Config.host, 
Config.port).bind(Route.toFunction(api.getRoute))
 
         bindFut.onComplete {
-            case Success(_) ⇒ logger.info(s"REST server is listening on 
'$url'.")
-            case Failure(_) ⇒ logger.info(s"REST server failed to start on 
'$url'.")
+            case Success(_) ⇒ logger.info(s"REST server is on '${c(url)}'.")
+            case Failure(_) ⇒ logger.info(s"REST server failed to start on 
'${c(url)}'.")
         }
 
         ackStarted()
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sql/NCSql.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sql/NCSql.scala
index a829002..520d820 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sql/NCSql.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sql/NCSql.scala
@@ -25,6 +25,7 @@ import com.typesafe.scalalogging.LazyLogging
 import org.apache.ignite.{Ignite, IgniteAtomicSequence, IgniteJdbcThinDriver}
 import org.apache.ignite.transactions.Transaction
 import org.apache.nlpcraft.common._
+import org.apache.nlpcraft.common.ascii.NCAsciiTable
 import org.apache.nlpcraft.common.config.NCConfigurable
 import org.apache.nlpcraft.server.tx.NCTxManager
 import resource._
@@ -110,8 +111,8 @@ object NCSql extends LazyLogging {
         // c3p0 settings.
         ds.setMaxStatements(Config.maxStmt)
         ds.setMinPoolSize(Config.minPoolSize)
-        ds.setAcquireIncrement(Config.acqInc)
         ds.setMaxPoolSize(Config.maxPoolSize)
+        ds.setAcquireIncrement(Config.acqInc)
         ds.setInitialPoolSize(Config.initPoolSize)
 
         ds.setContextClassLoaderSource("library")
@@ -120,7 +121,18 @@ object NCSql extends LazyLogging {
         ds
     }
 
-    logger.info(s"DB driver initialized: ${Config.driver}")
+    val tbl = new NCAsciiTable
+
+    tbl += ("JDBC URL", Config.url)
+    tbl += ("JDBC driver", Config.driver)
+    tbl += ("C3P0 pool", s"" +
+        s"min=${b(Config.minPoolSize)}, " +
+        s"ini=${b(Config.initPoolSize)}, " +
+        s"max=${b(Config.maxPoolSize)}, " +
+        s"inc=${b(Config.acqInc)}"
+    )
+
+    logger.info(s"Data source initialized:\n${tbl.toString}")
 
     /**
      * Wraps database error.
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala
index b0ea704..0d2fcf2 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala
@@ -30,6 +30,7 @@ import org.apache.nlpcraft.server.ignite.NCIgniteInstance
 import org.apache.nlpcraft.server.mdo.{NCUserMdo, NCUserPropertyMdo}
 import org.apache.nlpcraft.server.sql.{NCSql, NCSqlManager}
 import org.apache.nlpcraft.server.tx.NCTxManager
+import org.apache.nlpcraft.common.ansi.NCAnsi._
 
 import scala.collection.JavaConverters._
 import scala.util.control.Exception._
@@ -180,8 +181,9 @@ object NCUserManager extends NCService with 
NCIgniteInstance {
 
         userLock = ignite.semaphore("userSemaphore", 1, true, true)
 
-        logger.info(s"Access tokens will be scanned for timeout every 
${Config.timeoutScannerFreqMins}m.")
-        logger.info(s"Access tokens inactive for >= 
${Config.accessTokenExpireTimeoutMins}m will be invalidated.")
+        logger.info(s"REST access tokens:")
+        logger.info(s"  ${c("+-")} scanned for timeout every 
${Config.timeoutScannerFreqMins}m.")
+        logger.info(s"  ${c("+-")} invalidated if inactive for >= 
${Config.accessTokenExpireTimeoutMins}m.")
 
         ackStarted()
     }

Reply via email to