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

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

commit c4f2dd69f3880b9a669bfab6b0cd258413085874
Author: Sergey Kamov <[email protected]>
AuthorDate: Fri Apr 16 14:04:18 2021 +0300

    WIP.
---
 .../apache/nlpcraft/common/debug/NCLogHolder.scala |  17 ++-
 .../nlpcraft/probe/mgrs/cmd/NCCommandManager.scala |   2 +-
 .../probe/mgrs/nlp/NCProbeEnrichmentManager.scala  |  18 +--
 .../nlpcraft/server/mdo/NCQueryStateMdo.scala      |   2 +-
 .../nlpcraft/server/probe/NCProbeManager.scala     |  12 +-
 .../nlpcraft/server/query/NCQueryManager.scala     |  42 +++---
 .../nlpcraft/server/rest/NCBasicRestApi.scala      |   6 +-
 .../apache/nlpcraft/common/debug/NCLogSpec.scala   | 159 +++++++++++++++++++++
 .../apache/nlpcraft/model/meta/NCMetaSpec.scala    |  81 +----------
 .../{NCMetaSpec.scala => NCMetaSpecAdapter.scala}  |  75 ++--------
 .../apache/nlpcraft/server/rest/NCRestSpec.scala   |   2 +-
 11 files changed, 226 insertions(+), 190 deletions(-)

diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/debug/NCLogHolder.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/debug/NCLogHolder.scala
index 1131c3a..f630229 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/debug/NCLogHolder.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/debug/NCLogHolder.scala
@@ -36,8 +36,9 @@ import org.apache.nlpcraft.common.debug.NCLogHolder._
   * Log data holder.
   */
 class NCLogHolder extends Serializable {
-    private val intents = new util.ArrayList[IntentJson]()
-    private var queryContext: ContextJson = _
+    // Level set for test reasons.
+    private[debug] val intents = new util.ArrayList[IntentJson]()
+    private[debug] var queryContext: ContextJson = _
 
     case class TokenJson(
         metadata: util.Map[String, Object],
@@ -48,7 +49,7 @@ class NCLogHolder extends Serializable {
         groups: util.List[String]
     )
     
-    case class UserJson( // TODO: add metadata
+    case class UserJson(
         id: Long,
         firstName: String,
         lastName: String,
@@ -56,10 +57,10 @@ class NCLogHolder extends Serializable {
         avatarUrl: String,
         isAdmin: Boolean,
         signupTimestamp: Long,
-        meta: JavaMeta // TODO: remove.
+        meta: JavaMeta
     )
     
-    case class CompanyJson( // TODO: add metadata
+    case class CompanyJson(
         id: Long,
         name: String,
         website: String,
@@ -67,7 +68,8 @@ class NCLogHolder extends Serializable {
         city: String,
         region: String,
         postalCode: String,
-        address: String
+        address: String,
+        meta: JavaMeta
     )
 
     case class RequestJson(
@@ -171,7 +173,8 @@ class NCLogHolder extends Serializable {
             region = comp.getRegion.orElse(null),
             address = comp.getAddress.orElse(null),
             city = comp.getCity.orElse(null),
-            postalCode = comp.getPostalCode.orElse(null)
+            postalCode = comp.getPostalCode.orElse(null),
+            meta = comp.getMetadata
         )
 
         val reqJs = RequestJson(
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/cmd/NCCommandManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/cmd/NCCommandManager.scala
index 4206a11..9831e94 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/cmd/NCCommandManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/cmd/NCCommandManager.scala
@@ -101,7 +101,7 @@ object NCCommandManager extends NCService {
                             usrId = msg.data[Long]("userId"),
                             senMeta = msg.data[java.util.Map[String, 
JSerializable]]("senMeta").asScala,
                             mdlId = msg.data[String]("mdlId"),
-                            logEnable = msg.data[Boolean]("logEnable"),
+                            enableLog = msg.data[Boolean]("enableLog"),
                             span
                     )
 
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 aab00ed..8b9258b 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
@@ -144,7 +144,7 @@ object NCProbeEnrichmentManager extends NCService with 
NCOpenCensusModelStats {
       * @param usrId User ID.
       * @param senMeta Sentence meta data.
       * @param mdlId Model ID.
-      * @param logEnable Log enabled flag.
+      * @param enableLog Log enabled flag.
       * @param parent Optional parent span.
       */
     @throws[NCE]
@@ -155,7 +155,7 @@ object NCProbeEnrichmentManager extends NCService with 
NCOpenCensusModelStats {
         usrId: Long,
         senMeta: Map[String, Serializable],
         mdlId: String,
-        logEnable: Boolean,
+        enableLog: Boolean,
         parent: Span = null
     ): Unit = {
         val span = startSpan("ask", parent,
@@ -166,7 +166,7 @@ object NCProbeEnrichmentManager extends NCService with 
NCOpenCensusModelStats {
         )
 
         startMs.set(System.currentTimeMillis())
-    
+
         try
             ask0(
                 srvReqId,
@@ -175,7 +175,7 @@ object NCProbeEnrichmentManager extends NCService with 
NCOpenCensusModelStats {
                 usrId,
                 senMeta,
                 mdlId,
-                logEnable,
+                enableLog,
                 span
             )
         catch {
@@ -213,7 +213,7 @@ object NCProbeEnrichmentManager extends NCService with 
NCOpenCensusModelStats {
       * @param usrId User ID.
       * @param senMeta Sentence meta data.
       * @param mdlId Model ID.
-      * @param logEnable Log enable flag.
+      * @param enableLog Log enable flag.
       */
     @throws[NCE]
     private def ask0(
@@ -223,7 +223,7 @@ object NCProbeEnrichmentManager extends NCService with 
NCOpenCensusModelStats {
         usrId: Long,
         senMeta: Map[String, Serializable],
         mdlId: String,
-        logEnable: Boolean,
+        enableLog: Boolean,
         span: Span
     ): Unit = {
         require(nlpSens.nonEmpty)
@@ -248,7 +248,7 @@ object NCProbeEnrichmentManager extends NCService with 
NCOpenCensusModelStats {
         tbl += (s"${b("Server Request ID")}", m(srvReqId))
 
         logger.info(s"New request received from server:\n$tbl")
-        
+
         /**
           *
           * @param code Pre or post checker error code.
@@ -337,7 +337,7 @@ object NCProbeEnrichmentManager extends NCService with 
NCOpenCensusModelStats {
             NCConnectionManager.send(msg, span)
 
             val durMs = System.currentTimeMillis() - startMs.get
-            
+
             if (errMsg.isEmpty)
                 logger.info(s"" +
                     s"\n" +
@@ -580,7 +580,7 @@ object NCProbeEnrichmentManager extends NCService with 
NCOpenCensusModelStats {
         conv.updateTokens(span)
 
         var logKey: String = null
-        val logHldr = if (logEnable) new NCLogHolder else null
+        val logHldr = if (enableLog) new NCLogHolder else null
         
         // Create model query context.
         val ctx: NCContext = new NCContext {
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/mdo/NCQueryStateMdo.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/mdo/NCQueryStateMdo.scala
index 7419aed..27f440a 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/mdo/NCQueryStateMdo.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/mdo/NCQueryStateMdo.scala
@@ -39,7 +39,7 @@ case class NCQueryStateMdo(
     @NCMdoField createTstamp: Timestamp, // Creation timestamp.
     @NCMdoField var updateTstamp: Timestamp, // Last update timestamp.
     @NCMdoField var status: String,
-    @NCMdoField enabledLog: Boolean,
+    @NCMdoField enableLog: Boolean,
     @NCMdoField var logJson: Option[String] = None,
     @NCMdoField var intentId: Option[String] = None,
     // Query OK.
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 36c1385..34b654b 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
@@ -835,7 +835,7 @@ object NCProbeManager extends NCService {
       * @param data
       * @param usrMeta
       * @param companyMeta
-      * @param logEnable
+      * @param enableLog
       * @param parent
       */
     @throws[NCE]
@@ -851,7 +851,7 @@ object NCProbeManager extends NCService {
         data: Option[String],
         usrMeta: Option[Map[String, String]],
         companyMeta: Option[Map[String, String]],
-        logEnable: Boolean,
+        enableLog: Boolean,
         parent: Span = null): Unit = {
         startScopedSpan("askProbe", parent, "srvReqId" → srvReqId, "usrId" → 
usr.id, "mdlId" → mdlId, "txt" → txt) { span ⇒
             def convertMeta(metaOpt: Option[Map[String, String]]): 
util.HashMap[String, String] =
@@ -860,13 +860,13 @@ object NCProbeManager extends NCService {
                         val map = new util.HashMap[String, String]()
 
                         meta.foreach { case (k, v) ⇒ map.put(k, v) }
-    
+
                         map
                     case None ⇒ null
                 }
 
             val senMeta = new util.HashMap[String, java.io.Serializable]()
-    
+
             Map(
                 "NORMTEXT" → nlpSen.text,
                 "USER_AGENT" → usrAgent.orNull,
@@ -893,7 +893,7 @@ object NCProbeManager extends NCService {
             ).
                 filter(_._2 != null).
                 foreach(p ⇒ senMeta.put(p._1, 
p._2.asInstanceOf[java.io.Serializable]))
-            
+
             getProbeForModelId(mdlId) match {
                 case Some(holder) ⇒
                     sendToProbe(
@@ -907,7 +907,7 @@ object NCProbeManager extends NCService {
                             "senMeta" → senMeta,
                             "userId" → usr.id,
                             "mdlId" → mdlId,
-                            "logEnable" → logEnable
+                            "enableLog" → enableLog
                         ),
                         span
                     )
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 572ecfb..ad6fdb1 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
@@ -112,7 +112,7 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
       * @param usrAgent
       * @param rmtAddr
       * @param data
-      * @param enabledLog
+      * @param enableLog
       * @return
       */
     @throws[NCE]
@@ -123,25 +123,25 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
         usrAgent: Option[String],
         rmtAddr: Option[String],
         data: Option[String],
-        enabledLog: Boolean,
+        enableLog: Boolean,
         parent: Span = null
     ): Future[NCQueryStateMdo] = {
         val srvReqId = U.genGuid()
-    
+
         startScopedSpan("syncAsk", parent,
             "srvReqId" → srvReqId,
             "usrId" → usrId,
             "txt" → txt,
             "mdlId" → mdlId,
-            "enableLog" → enabledLog,
+            "enableLog" → enableLog,
             "usrAgent" → usrAgent.orNull,
             "rmtAddr" → rmtAddr.orNull
         ) { span ⇒
             val promise = Promise[NCQueryStateMdo]()
-    
+
             asyncAsks.put(srvReqId, promise)
-            
-            spawnAskFuture(srvReqId, usrId, txt, mdlId, usrAgent, rmtAddr, 
data, enabledLog, span)
+
+            spawnAskFuture(srvReqId, usrId, txt, mdlId, usrAgent, rmtAddr, 
data, enableLog, span)
             
             promise.future
         }
@@ -156,7 +156,7 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
       * @param usrAgent
       * @param rmtAddr
       * @param data
-      * @param enabledLog
+      * @param enableLog
       * @return Server request ID for newly submitted request.
       */
     @throws[NCE]
@@ -167,7 +167,7 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
         usrAgent: Option[String],
         rmtAddr: Option[String],
         data: Option[String],
-        enabledLog: Boolean,
+        enableLog: Boolean,
         parent: Span = null
     ): String = {
         val srvReqId = U.genGuid()
@@ -177,10 +177,10 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
             "usrId" → usrId,
             "txt" → txt,
             "mdlId" → mdlId,
-            "enableLog" → enabledLog,
+            "enableLog" → enableLog,
             "usrAgent" → usrAgent.orNull,
             "rmtAddr" → rmtAddr.orNull) { span ⇒
-            spawnAskFuture(srvReqId, usrId, txt, mdlId, usrAgent, rmtAddr, 
data, enabledLog, span)
+            spawnAskFuture(srvReqId, usrId, txt, mdlId, usrAgent, rmtAddr, 
data, enableLog, span)
             
             srvReqId
         }
@@ -199,7 +199,7 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
       * @param usrAgent
       * @param rmtAddr
       * @param data
-      * @param enabledLog
+      * @param enableLog
       * @return
       */
     @throws[NCE]
@@ -211,13 +211,13 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
         usrAgent: Option[String],
         rmtAddr: Option[String],
         data: Option[String],
-        enabledLog: Boolean,
+        enableLog: Boolean,
         parent: Span = null
     ): Unit = {
         val txt0 = txt.trim()
-        
+
         val rcvTstamp = U.nowUtcTs()
-        
+
         val usr = NCUserManager.getUserById(usrId, parent).getOrElse(throw new 
NCE(s"Unknown user ID: $usrId"))
         val company = NCCompanyManager.getCompany(usr.companyId, 
parent).getOrElse(throw new NCE(s"Unknown company ID: ${usr.companyId}"))
 
@@ -236,7 +236,7 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
         // Check input length.
         if (txt0.split(" ").length > MAX_WORDS)
             throw new NCE(s"User input is too long (max is $MAX_WORDS words).")
-        
+
         catching(wrapIE) {
             // Enlist for tracking.
             cache += srvReqId → NCQueryStateMdo(
@@ -246,7 +246,7 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
                 companyId = company.id,
                 email = usr.email,
                 status = QRY_ENLISTED, // Initial status.
-                enabledLog = enabledLog,
+                enableLog = enableLog,
                 text = txt0,
                 userAgent = usrAgent,
                 remoteAddress = rmtAddr,
@@ -254,7 +254,7 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
                 updateTstamp = rcvTstamp
             )
         }
-        
+
         // Add processing log.
         NCProcessLogManager.newEntry(
             usrId,
@@ -268,7 +268,7 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
             data.orNull,
             parent
         )
-        
+
         Future {
             startScopedSpan("future", parent, "srvReqId" → srvReqId) { span ⇒
                 val tbl = NCAsciiTable()
@@ -284,7 +284,7 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
                 logger.info(s"New request received:\n$tbl")
 
                 val enabledBuiltInToks = NCProbeManager.getModel(mdlId, 
span).enabledBuiltInTokens
-                
+
                 // Enrich the user input and send it to the probe.
                 NCProbeManager.askProbe(
                     srvReqId,
@@ -298,7 +298,7 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
                     data,
                     usrMeta,
                     compMeta,
-                    enabledLog,
+                    enableLog,
                     span
                 )
             }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala
index bfd8d2a..a681a8f 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala
@@ -91,7 +91,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with 
NCOpenCensusTrace w
         usrAgent: Option[String],
         rmtAddr: Option[String],
         data: Option[String],
-        enabledLog: Boolean,
+        enableLog: Boolean,
         parent: Span
     )
 
@@ -603,7 +603,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging 
with NCOpenCensusTrace w
                     h.usrAgent,
                     h.rmtAddr,
                     h.data,
-                    h.enabledLog,
+                    h.enableLog,
                     h.parent
                 )
 
@@ -634,7 +634,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging 
with NCOpenCensusTrace w
                     h.usrAgent,
                     h.rmtAddr,
                     h.data,
-                    h.enabledLog,
+                    h.enableLog,
                     h.parent
                 )
 
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/common/debug/NCLogSpec.scala 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/common/debug/NCLogSpec.scala
new file mode 100644
index 0000000..8bfd78c
--- /dev/null
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/common/debug/NCLogSpec.scala
@@ -0,0 +1,159 @@
+/*
+ * 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.common.debug
+
+import com.google.gson.reflect.TypeToken
+import com.google.gson.{GsonBuilder, JsonElement}
+import org.apache.http.HttpResponse
+import org.apache.http.client.methods.HttpPost
+import org.apache.http.entity.StringEntity
+import org.apache.http.impl.client.HttpClients
+import org.apache.http.util.EntityUtils
+import org.apache.nlpcraft.NCTestEnvironment
+import org.apache.nlpcraft.common.JavaMeta
+import org.apache.nlpcraft.model.meta.NCMetaSpecAdapter
+import org.apache.nlpcraft.model.tools.test.NCTestClientBuilder._
+import org.apache.nlpcraft.model.{NCIntent, NCIntentMatch, NCModelAdapter, 
NCResult}
+import org.junit.jupiter.api.Test
+
+import java.lang.Boolean.TRUE
+import java.lang.reflect.Type
+import java.util
+import scala.collection.JavaConverters._
+import scala.language.implicitConversions
+
+object NCLogSpecModel {
+    val MDL_ID = "nlpcraft.any.model.test"
+    val RESULT = "OK"
+}
+
+import org.apache.nlpcraft.common.debug.NCLogSpecModel._
+
+/**
+  */
+class NCLogSpecModel extends NCModelAdapter(MDL_ID, "IDL Test Model", "1.0") {
+    @NCIntent("intent=i term(a)={tok_id()=='nlpcraft:nlp'}")
+    private def callback(ctx: NCIntentMatch): NCResult = NCResult.text(RESULT)
+}
+
+/**
+  * Log test.
+  */
+@NCTestEnvironment(model = classOf[NCLogSpecModel], startClient = false)
+class NCLogSpec extends NCMetaSpecAdapter {
+    private val CLIENT = HttpClients.createDefault
+    private val GSON = new GsonBuilder().setPrettyPrinting().create
+    private val TYPE_RESP = new TypeToken[util.HashMap[String, AnyRef]]() 
{}.getType
+    private val TYPE_LOG = new TypeToken[NCLogHolder]() {}.getType
+
+    private def postHttp(url: String, params: (String, AnyRef)*): String = {
+        val post = new HttpPost(DFLT_BASEURL + url)
+
+        try {
+            post.setHeader("Content-Type", "application/json")
+            post.setEntity(new StringEntity(GSON.toJson(params.toMap.asJava), 
"UTF-8"))
+
+            CLIENT.execute(
+                post,
+                (resp: HttpResponse) ⇒ {
+                    val code = resp.getStatusLine.getStatusCode
+                    val entity = resp.getEntity
+
+                    code match {
+                        case 200 ⇒ EntityUtils.toString(entity)
+                        case _ ⇒ throw new Exception(s"Unexpected response 
[code=$code, entity=$entity]")
+                    }
+                }
+            )
+        }
+        finally
+            post.releaseConnection()
+    }
+
+    private def extract[T](js: JsonElement, t: Type): T = GSON.fromJson(js, t)
+    private def getField[T](m: util.Map[String, AnyRef], fn: String): T = 
m.get(fn).asInstanceOf[T]
+
+    private def ask(txt: String): Map[String, Any] = {
+        require(tkn != null)
+
+        val res: java.util.HashMap[String, Any] = extract(
+            GSON.toJsonTree(
+                getField(
+                    GSON.fromJson(
+                        postHttp("ask/sync", "acsTok" → tkn, "txt" → txt, 
"mdlId" → MDL_ID, "enableLog" → TRUE),
+                        TYPE_RESP
+                    ),
+                    "state"
+                )
+            ),
+            classOf[java.util.HashMap[String, Any]]
+        )
+
+        val m = res.asScala.toMap
+
+        require(m("resBody") == RESULT, s"Unexpected result: ${m("resBody")}")
+
+        m
+    }
+
+    private def check(meta: MetaHolder): Unit = {
+        val data = ask("test")
+
+        val log: NCLogHolder =
+            
GSON.fromJson(GSON.toJson(data("logHolder").asInstanceOf[JavaMeta]), TYPE_LOG)
+
+        val ctx = log.queryContext
+
+        println(s"Company meta=${ctx.request.company.meta}")
+        println(s"User meta=${ctx.request.user.meta}")
+
+        def norm(m: JavaMeta): JavaMeta = if (m != null && m.isEmpty) null 
else m
+
+        require(
+            norm(ctx.request.company.meta) == norm(meta.companyMeta),
+            s"Unexpected company meta [expected=${meta.companyMeta}, 
meta=${ctx.request.company.meta}"
+        )
+        require(
+            norm(ctx.request.user.meta) == norm(meta.userMeta),
+            s"Unexpected user meta [expected=${meta.userMeta}, 
meta=${ctx.request.user.meta}"
+        )
+    }
+
+    @Test
+    def testLogMeta(): Unit = {
+        val meta = getMeta()
+
+        try {
+            check(meta)
+
+            def mkMeta(k: String, v: Object): JavaMeta = Map(k → v).asJava
+
+            val newMeta = MetaHolder(userMeta = mkMeta("userKey", "v1"), 
companyMeta = mkMeta("compKey", "v2"))
+
+            setMeta(newMeta)
+
+            check(newMeta)
+        }
+        finally {
+            setMeta(meta)
+
+            check(meta)
+        }
+    }
+}
+
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/meta/NCMetaSpec.scala 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/meta/NCMetaSpec.scala
index b851629..a1b4e2c 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/meta/NCMetaSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/meta/NCMetaSpec.scala
@@ -19,7 +19,6 @@ package org.apache.nlpcraft.model.meta
 
 import org.apache.nlpcraft.model.`abstract`.NCAbstractTokensModel
 import org.apache.nlpcraft.model.{NCElement, NCIntent, NCIntentMatch, NCResult}
-import org.apache.nlpcraft.server.rest.NCRestSpec
 import org.apache.nlpcraft.{NCTestElement, NCTestEnvironment}
 import org.junit.jupiter.api.Test
 
@@ -46,90 +45,20 @@ class NcMetaModel extends NCAbstractTokensModel {
 }
 
 @NCTestEnvironment(model = classOf[NcMetaModel], startClient = true)
-class NCMetaSpec extends NCRestSpec {
-    type Meta = java.util.Map[String, String]
-    case class MetaHolder(userMeta: Meta, companyMeta: Meta)
-
-    private def get(): MetaHolder = {
-        var userMeta: Meta = null
-        var companyMeta: Meta = null
-
-        post("user/get")(
-            ("$.properties", (props: java.util.Map[String, String]) ⇒ userMeta 
= props)
-        )
-
-        post("company/get")(
-            ("$.properties", (props: java.util.Map[String, String]) ⇒ 
companyMeta = props)
-        )
-
-        MetaHolder(userMeta, companyMeta)
-    }
-
-    private def runTest(h: MetaHolder): Unit = {
-        def convert(m: Meta): Meta = if (m == null) 
util.Collections.emptyMap() else m
-
-        // 1. We have to save all existing company's fields for following 
updates.
-        var compName: String = null
-        var compWebsite: String = null
-        var compCountry: String = null
-        var compRegion: String = null
-        var compCity: String = null
-        var compAddress: String = null
-        var compPostalCode: String = null
-
-        post("company/get")(
-            ("$.name", (v: String) ⇒ compName = v),
-            ("$.website", (v: String) ⇒ compWebsite = v),
-            ("$.country", (v: String) ⇒ compCountry = v),
-            ("$.region", (v: String) ⇒ compRegion = v),
-            ("$.city", (v: String) ⇒ compCity = v),
-            ("$.address", (v: String) ⇒ compAddress = v),
-            ("$.postalCode", (v: String) ⇒ compPostalCode = v)
-        )
-
-        post("company/update",
-            "name" → compName,
-            "website" → compWebsite,
-            "country" → compCountry,
-            "region" → compRegion,
-            "city" → compCity,
-            "address" → compAddress,
-            "postalCode" → compPostalCode,
-            "properties" → convert(h.companyMeta)
-        )()
-
-        // 2. We have to save all existing user's fields for following updates.
-        var usrFirstName: String = null
-        var usrLastName: String = null
-        var usrAvatarUrl: String = null
-
-        post("user/get")(
-            ("$.firstName", (v: String) ⇒ usrFirstName = v),
-            ("$.lastName", (v: String) ⇒ usrLastName = v),
-            ("$.avatarUrl", (v: String) ⇒ usrAvatarUrl = v)
-        )
-
-        post("user/update",
-        "firstName" → usrFirstName,
-            "lastName" → usrLastName,
-            "avatarUrl" → usrAvatarUrl,
-            "properties" → convert(h.userMeta)
-        )()
-    }
-
+class NCMetaSpec extends NCMetaSpecAdapter {
     @Test
     def testWithoutMeta(): Unit = require(getClient.ask("a").isFailed)
 
     @Test
     def testWithMeta(): Unit = {
-        val currUserCompMeta = get()
+        val currUserCompMeta = getMeta()
         val sys = new SystemProperties
 
-        val m = Map("k1" → "v1").asJava
+        val m = Map("k1" → "v1".asInstanceOf[Object]).asJava
 
         try {
             // Sets company and user metadata.
-            runTest(MetaHolder(m, m))
+            setMeta(MetaHolder(m, m))
 
             // It is not enough.
             require(getClient.ask("a").isFailed)
@@ -143,7 +72,7 @@ class NCMetaSpec extends NCRestSpec {
         finally {
             sys.remove("k1")
 
-            runTest(currUserCompMeta)
+            setMeta(currUserCompMeta)
         }
     }
 }
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/meta/NCMetaSpec.scala 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/meta/NCMetaSpecAdapter.scala
similarity index 56%
copy from 
nlpcraft/src/test/scala/org/apache/nlpcraft/model/meta/NCMetaSpec.scala
copy to 
nlpcraft/src/test/scala/org/apache/nlpcraft/model/meta/NCMetaSpecAdapter.scala
index b851629..d5705ca 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/meta/NCMetaSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/meta/NCMetaSpecAdapter.scala
@@ -17,56 +17,31 @@
 
 package org.apache.nlpcraft.model.meta
 
-import org.apache.nlpcraft.model.`abstract`.NCAbstractTokensModel
-import org.apache.nlpcraft.model.{NCElement, NCIntent, NCIntentMatch, NCResult}
+import org.apache.nlpcraft.common.JavaMeta
 import org.apache.nlpcraft.server.rest.NCRestSpec
-import org.apache.nlpcraft.{NCTestElement, NCTestEnvironment}
-import org.junit.jupiter.api.Test
 
 import java.util
-import scala.collection.JavaConverters._
-import scala.sys.SystemProperties
 
-/**
-  * Model for test following meta usage: company, user and system.
-  */
-class NcMetaModel extends NCAbstractTokensModel {
-    override def getElements: util.Set[NCElement] = Set(NCTestElement("a", 
"a"))
+abstract class NCMetaSpecAdapter extends NCRestSpec {
+    case class MetaHolder(userMeta: JavaMeta, companyMeta: JavaMeta)
 
-    @NCIntent(
-        "intent=i " +
-        "  term(t)={" +
-        "      tok_id() == 'a' && " +
-        "      meta_user('k1') == 'v1' && " +
-        "      meta_company('k1') == 'v1' && " +
-        "      meta_sys('k1') == 'v1'" +
-        "  }"
-    )
-    def onIntent(ctx: NCIntentMatch): NCResult = NCResult.text("OK")
-}
-
-@NCTestEnvironment(model = classOf[NcMetaModel], startClient = true)
-class NCMetaSpec extends NCRestSpec {
-    type Meta = java.util.Map[String, String]
-    case class MetaHolder(userMeta: Meta, companyMeta: Meta)
-
-    private def get(): MetaHolder = {
-        var userMeta: Meta = null
-        var companyMeta: Meta = null
+    protected def getMeta(): MetaHolder = {
+        var userMeta: JavaMeta = null
+        var companyMeta: JavaMeta = null
 
         post("user/get")(
-            ("$.properties", (props: java.util.Map[String, String]) ⇒ userMeta 
= props)
+            ("$.properties", (props: JavaMeta) ⇒ userMeta = props)
         )
 
         post("company/get")(
-            ("$.properties", (props: java.util.Map[String, String]) ⇒ 
companyMeta = props)
+            ("$.properties", (props: JavaMeta) ⇒ companyMeta = props)
         )
 
         MetaHolder(userMeta, companyMeta)
     }
 
-    private def runTest(h: MetaHolder): Unit = {
-        def convert(m: Meta): Meta = if (m == null) 
util.Collections.emptyMap() else m
+    protected def setMeta(h: MetaHolder): Unit = {
+        def convert(m: JavaMeta): JavaMeta = if (m == null) 
util.Collections.emptyMap() else m
 
         // 1. We have to save all existing company's fields for following 
updates.
         var compName: String = null
@@ -116,34 +91,4 @@ class NCMetaSpec extends NCRestSpec {
             "properties" → convert(h.userMeta)
         )()
     }
-
-    @Test
-    def testWithoutMeta(): Unit = require(getClient.ask("a").isFailed)
-
-    @Test
-    def testWithMeta(): Unit = {
-        val currUserCompMeta = get()
-        val sys = new SystemProperties
-
-        val m = Map("k1" → "v1").asJava
-
-        try {
-            // Sets company and user metadata.
-            runTest(MetaHolder(m, m))
-
-            // It is not enough.
-            require(getClient.ask("a").isFailed)
-
-            // Sets sys metadata.
-            sys.put("k1", "v1")
-
-            // Ok.
-            require(getClient.ask("a").isOk)
-        }
-        finally {
-            sys.remove("k1")
-
-            runTest(currUserCompMeta)
-        }
-    }
 }
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestSpec.scala 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestSpec.scala
index 47b6f95..9aaba98 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestSpec.scala
@@ -127,7 +127,7 @@ class NCRestSpec extends NCTestContext {
     type ResponseList = java.util.List[ResponseContent]
     type JList[T] = java.util.List[T]
 
-    private var tkn: String = _
+    protected var tkn: String = _
 
     /**
       *

Reply via email to