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

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


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

commit 5e5178104c71975df6b5e87b8435d12efe998173
Author: Sergey Kamov <[email protected]>
AuthorDate: Fri Feb 18 11:00:03 2022 +0300

    WIP.
---
 .../conversation/NCConversationManager.scala       |  10 +-
 .../internal/dialogflow/NCDialogFlowManager.scala  |  11 +-
 .../nlpcraft/internal/impl/NCModelClientImpl.scala | 105 +++++++++-----
 ...rocessor.scala => NCModelPipelineManager.scala} | 154 +++++++++------------
 ...NCIntentSolver.scala => NCIntentsManager.scala} |   2 +-
 .../conversation/NCConversationManagerSpec.scala   |   2 +-
 .../dialogflow/NCDialogFlowManagerSpec.scala       |   4 +-
 ...Spec.scala => NCModelPipelineManagerSpec.scala} |  51 +------
 8 files changed, 152 insertions(+), 187 deletions(-)

diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/conversation/NCConversationManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/conversation/NCConversationManager.scala
index a121057..cc6ba84 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/conversation/NCConversationManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/conversation/NCConversationManager.scala
@@ -27,7 +27,7 @@ import scala.jdk.CollectionConverters.*
 /**
   * Conversation manager.
   */
-class NCConversationManager(mdlCfg: NCModelConfig) extends LazyLogging:
+class NCConversationManager(cfg: NCModelConfig) extends LazyLogging:
     case class Value(conv: NCConversationHolder, var tstamp: Long = 0)
     private final val convs: mutable.Map[String, Value] = 
mutable.HashMap.empty[String, Value]
     @volatile private var gc: Thread = _
@@ -37,7 +37,7 @@ class NCConversationManager(mdlCfg: NCModelConfig) extends 
LazyLogging:
       * @return
       */
     def start(): Unit =
-        gc = NCUtils.mkThread("conv-mgr-gc", mdlCfg.getId) { t =>
+        gc = NCUtils.mkThread("conv-mgr-gc", cfg.getId) { t =>
             while (!t.isInterrupted)
                 try
                     convs.synchronized {
@@ -55,7 +55,7 @@ class NCConversationManager(mdlCfg: NCModelConfig) extends 
LazyLogging:
     /**
       *
       */
-    def stop(): Unit =
+    def close(): Unit =
         NCUtils.stopThread(gc)
         gc = null
         convs.clear()
@@ -70,7 +70,7 @@ class NCConversationManager(mdlCfg: NCModelConfig) extends 
LazyLogging:
         val delKeys = mutable.HashSet.empty[String]
 
         for ((key, value) <- convs)
-            if value.tstamp < now - mdlCfg.getConversationTimeout then
+            if value.tstamp < now - cfg.getConversationTimeout then
                 val data = value.conv.getUserData
 
                 data.synchronized { 
data.keysSet().asScala.foreach(data.remove) }
@@ -93,7 +93,7 @@ class NCConversationManager(mdlCfg: NCModelConfig) extends 
LazyLogging:
         convs.synchronized {
             val v = convs.getOrElseUpdate(
                 usrId,
-                Value(NCConversationHolder(usrId, mdlCfg.getId, 
mdlCfg.getConversationTimeout, mdlCfg.getConversationDepth))
+                Value(NCConversationHolder(usrId, cfg.getId, 
cfg.getConversationTimeout, cfg.getConversationDepth))
             )
 
             v.tstamp = NCUtils.nowUtcMs()
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManager.scala
index ca99c0d..7181c17 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManager.scala
@@ -33,7 +33,7 @@ import java.time.format.DateTimeFormatter
 /**
  * Dialog flow manager.
  */
-case class NCDialogFlowManager(mdlCfg: NCModelConfig) extends LazyLogging:
+class NCDialogFlowManager(cfg: NCModelConfig) extends LazyLogging:
     private final val flow = mutable.HashMap.empty[String, 
mutable.ArrayBuffer[NCDialogFlowItem]]
 
     @volatile private var gc: Thread = _
@@ -43,7 +43,7 @@ case class NCDialogFlowManager(mdlCfg: NCModelConfig) extends 
LazyLogging:
       * @return
       */
     def start(): Unit =
-        gc = NCUtils.mkThread("dialog-mgr-gc", mdlCfg.getId) { t =>
+        gc = NCUtils.mkThread("dialog-mgr-gc", cfg.getId) { t =>
             while (!t.isInterrupted)
                 try
                     flow.synchronized {
@@ -59,11 +59,10 @@ case class NCDialogFlowManager(mdlCfg: NCModelConfig) 
extends LazyLogging:
         }
 
         gc.start()
-
     /**
      *
      */
-    def stop(): Unit =
+    def close(): Unit =
         NCUtils.stopThread(gc)
         gc = null
         flow.clear()
@@ -121,7 +120,7 @@ case class NCDialogFlowManager(mdlCfg: NCModelConfig) 
extends LazyLogging:
             )
         }
 
-        logger.info(s"""Current dialog flow (oldest first) for 
[mdlId=${mdlCfg.getId}, usrId=$usrId]\n${tbl.toString()}""")
+        logger.info(s"""Current dialog flow (oldest first) for 
[mdlId=${cfg.getId}, usrId=$usrId]\n${tbl.toString()}""")
 
     /**
      *  Gets next clearing time.
@@ -129,7 +128,7 @@ case class NCDialogFlowManager(mdlCfg: NCModelConfig) 
extends LazyLogging:
     private def clearForTimeout(): Long =
         require(Thread.holdsLock(flow))
 
-        val timeout = mdlCfg.getConversationTimeout
+        val timeout = cfg.getConversationTimeout
         val bound = NCUtils.now() - timeout
         var next = Long.MaxValue
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelClientImpl.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelClientImpl.scala
index 308ec71..541e8e0 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelClientImpl.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelClientImpl.scala
@@ -20,31 +20,59 @@ package org.apache.nlpcraft.internal.impl
 import com.typesafe.scalalogging.LazyLogging
 import org.apache.nlpcraft.*
 import org.apache.nlpcraft.internal.*
+import org.apache.nlpcraft.internal.dialogflow.NCDialogFlowManager
+import org.apache.nlpcraft.internal.intent.matcher.NCIntentsManager
 import org.apache.nlpcraft.internal.util.*
 
 import java.util.concurrent.*
 import java.util.concurrent.atomic.AtomicReference
-import java.util.{Objects, List as JList, Map as JMap, Collections as JColls}
+import java.util.{Objects, Collections as JColls, List as JList, Map as JMap}
 import scala.collection.mutable
 import scala.concurrent.ExecutionContext
 import scala.jdk.CollectionConverters.*
+import org.apache.nlpcraft.*
+import org.apache.nlpcraft.internal.dialogflow.NCDialogFlowManager
+import org.apache.nlpcraft.internal.conversation.*
+import org.apache.nlpcraft.internal.impl.*
+import org.apache.nlpcraft.internal.intent.matcher.{NCIntentsManager, 
NCIntentSolverInput}
+import org.apache.nlpcraft.internal.util.*
+
+import scala.jdk.CollectionConverters.*
+import java.util
+import java.util.concurrent.*
+import java.util.concurrent.atomic.*
+import java.util.function.Predicate
+import java.util.{ArrayList, UUID, List as JList, Map as JMap}
+import scala.collection.immutable
+import scala.jdk.OptionConverters.*
+import scala.concurrent.ExecutionContext
+import scala.jdk.CollectionConverters.*
 
 /**
   *
   * @param mdl
   */
 class NCModelClientImpl(mdl: NCModel) extends LazyLogging:
-    private val plProc = NCModelPipelineProcessor(mdl)
-    private var plSrvs: Seq[NCLifecycle] = _
+    verify()
+
+    private val mdlIntents = NCModelScanner.scan(mdl)
 
-    init(mdl.getConfig, mdl.getPipeline)
+    private val pipelineMgr = new NCModelPipelineManager(mdl.getConfig, 
mdl.getPipeline)
+    private val convMgr = NCConversationManager(mdl.getConfig)
+    private val dialogMgr = NCDialogFlowManager(mdl.getConfig)
+    private val intentsMgr = NCIntentsManager(dialogMgr, mdlIntents.map(p => 
p.intent -> p.function).toMap)
 
     /**
       *
       * @param cfg
       * @param pipeline
       */
-    private def init(cfg: NCModelConfig, pipeline: NCModelPipeline): Unit =
+    private def verify(): Unit =
+        Objects.requireNonNull(mdl, "Model cannot be null.")
+
+        val cfg = mdl.getConfig
+        val pipeline = mdl.getPipeline
+
         Objects.requireNonNull(cfg.getId, "Model ID cannot be null.")
         Objects.requireNonNull(cfg.getName, "Model name cannot be null.")
         Objects.requireNonNull(cfg.getVersion, "Model version cannot be null.")
@@ -52,32 +80,34 @@ class NCModelClientImpl(mdl: NCModel) extends LazyLogging:
         Objects.requireNonNull(pipeline.getEntityParsers, "List of entity 
parsers in the pipeline cannot be null.")
         if pipeline.getEntityParsers.isEmpty then E(s"At least one entity 
parser must be specified in the pipeline.")
 
-        val buf = mutable.ArrayBuffer.empty[NCLifecycle] ++ 
pipeline.getEntityParsers.asScala
-
-        def add[T <: NCLifecycle](list: JList[T]): Unit = if list != null then 
buf ++= list.asScala
-
-        add(pipeline.getTokenEnrichers)
-        add(pipeline.getTokenValidators)
-        add(pipeline.getEntityEnrichers)
-        add(pipeline.getEntityParsers)
-        add(pipeline.getEntityValidators)
-        if pipeline.getVariantFilter.isPresent then 
add(JColls.singletonList(pipeline.getVariantFilter.get()))
-
-        plSrvs = buf.toSeq
-        processServices(_.onStart(cfg), "started")
-
     /**
       *
-      * @param act
-      * @param actVerb
+      * @param data
+      * @return
       */
-    private def processServices(act: NCLifecycle => Unit, actVerb: String): 
Unit =
-        NCUtils.execPar(plSrvs.map(p =>
-            () => {
-                act(p)
-                logger.info(s"Service $actVerb: '${p.getClass.getName}'")
-            }
-        )*)(ExecutionContext.Implicits.global)
+    private def matchVariants(data: NCPipelineVariants): NCResult =
+        val userId = data.request.getUserId
+        val convHldr = convMgr.getConversation(userId)
+        val allEnts = data.variants.flatMap(_.getEntities.asScala)
+
+        val conv: NCConversation =
+            new NCConversation:
+                override val getSession: NCPropertyMap = convHldr.getUserData
+                override val getStm: JList[NCEntity] = convHldr.getEntities
+                override val getDialogFlow: JList[NCDialogFlowItem] = 
dialogMgr.getDialogFlow(userId).asJava
+                override def clearStm(filter: Predicate[NCEntity]): Unit = 
convHldr.clearEntities(filter)
+                override def clearDialog(filter: Predicate[String]): Unit = 
dialogMgr.clearForPredicate(userId, (s: String) => filter.test(s))
+
+        val ctx: NCContext =
+            new NCContext:
+                override def isOwnerOf(ent: NCEntity): Boolean = 
allEnts.contains(ent)
+                override val getModelConfig: NCModelConfig = mdl.getConfig
+                override val getRequest: NCRequest = data.request
+                override val getConversation: NCConversation = conv
+                override val getVariants: util.Collection[NCVariant] = 
data.variants.asJava
+                override val getTokens: JList[NCToken] = data.tokens
+
+        intentsMgr.solve(NCIntentSolverInput(ctx, mdl))
 
     /**
       *
@@ -87,7 +117,13 @@ class NCModelClientImpl(mdl: NCModel) extends LazyLogging:
       * @return
       */
     def ask(txt: String, data: JMap[String, AnyRef], usrId: String): 
CompletableFuture[NCResult] =
-        plProc.ask(txt, data, usrId)
+        val fut = new CompletableFuture[NCResult]
+        val check = () => if fut.isCancelled then
+            E(s"Asynchronous ask is interrupted [txt=$txt, usrId=$usrId]")
+
+        fut.completeAsync(() => matchVariants(pipelineMgr.prepare(txt, data, 
usrId, Option(check))))
+
+
 
     /**
       *
@@ -97,23 +133,24 @@ class NCModelClientImpl(mdl: NCModel) extends LazyLogging:
       * @return
       */
     def askSync(txt: String, data: JMap[String, AnyRef], usrId: String): 
NCResult =
-        plProc.askSync(txt, data, usrId)
+        matchVariants(pipelineMgr.prepare(txt, data, usrId))
 
     /**
       *
       * @param usrId
       */
-    def clearConversation(usrId: String): Unit = ???
+    def clearConversation(usrId: String): Unit = convMgr.getConversation(usrId)
 
     /**
       *
       * @param usrId
       */
-    def clearDialog(usrId: String): Unit = ???
+    def clearDialog(usrId: String): Unit = dialogMgr.clear(usrId)
 
     /**
       *
       */
     def close(): Unit =
-        plProc.close()
-        processServices(_.onStop(mdl.getConfig), "stopped")
+        if pipelineMgr != null then pipelineMgr.close()
+        if convMgr != null then convMgr.close()
+        if dialogMgr != null then dialogMgr.close()
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineProcessor.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManager.scala
similarity index 54%
rename from 
nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineProcessor.scala
rename to 
nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManager.scala
index 460a45d..d56c04e 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineProcessor.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManager.scala
@@ -18,87 +18,93 @@
 package org.apache.nlpcraft.internal.impl
 
 import com.typesafe.scalalogging.LazyLogging
-import org.apache.nlpcraft.*
-import org.apache.nlpcraft.internal.dialogflow.NCDialogFlowManager
+import org.apache.nlpcraft.{NCModelConfig, NCModelPipeline, *}
 import org.apache.nlpcraft.internal.conversation.*
+import org.apache.nlpcraft.internal.dialogflow.NCDialogFlowManager
 import org.apache.nlpcraft.internal.impl.*
-import org.apache.nlpcraft.internal.intent.matcher.{NCIntentSolver, 
NCIntentSolverInput}
+import org.apache.nlpcraft.internal.intent.matcher.*
 import org.apache.nlpcraft.internal.util.*
 
-import scala.jdk.CollectionConverters.*
 import java.util
 import java.util.concurrent.*
 import java.util.concurrent.atomic.*
 import java.util.function.Predicate
-import java.util.{ArrayList, UUID, List as JList, Map as JMap}
-import scala.collection.immutable
-import scala.jdk.OptionConverters.*
+import java.util.{ArrayList, Objects, UUID, Collections as JColls, List as 
JList, Map as JMap}
+import scala.collection.{immutable, mutable}
 import scala.concurrent.ExecutionContext
 import scala.jdk.CollectionConverters.*
+import scala.jdk.OptionConverters.*
 
 /**
   *
-  * @param mdl
+  * @param request
+  * @param variants
+  * @param tokens
+  * @param checkCancel
   */
-class NCModelPipelineProcessor(mdl: NCModel) extends LazyLogging:
-    case class VariantsHolder(request: NCRequest, variants: Seq[NCVariant], 
tokens: JList[NCToken], checkCancel: Option[() => Unit])
-
-    require(mdl != null)
-    require(mdl.getPipeline.getTokenParser != null)
-    require(mdl.getPipeline.getEntityParsers != null)
-    require(!mdl.getPipeline.getEntityParsers.isEmpty)
+case class NCPipelineVariants(request: NCRequest, variants: Seq[NCVariant], 
tokens: JList[NCToken], checkCancel: Option[() => Unit])
 
-    private val pipeline = mdl.getPipeline
+/**
+  *
+  * @param cfg
+  * @param pipeline
+  */
+class NCModelPipelineManager(cfg: NCModelConfig, pipeline: NCModelPipeline) 
extends LazyLogging:
     private val pool = new java.util.concurrent.ForkJoinPool()
-    private val cfg = mdl.getConfig
     private val tokParser = pipeline.getTokenParser
     private val tokEnrichers = nvl(pipeline.getTokenEnrichers)
     private val entEnrichers = nvl(pipeline.getEntityEnrichers)
     private val entParsers = nvl(pipeline.getEntityParsers)
     private val tokVals = nvl(pipeline.getTokenValidators)
     private val entVals = nvl(pipeline.getEntityValidators)
-    private val varFilter = pipeline.getVariantFilter.toScala
+    private val varFilterOpt = pipeline.getVariantFilter.toScala
 
-    private val convMgr = NCConversationManager(mdl.getConfig)
-    private val dialogMgr = NCDialogFlowManager(mdl.getConfig)
-    private val mdlIntents = NCModelScanner.scan(mdl)
-    private val solver = NCIntentSolver(dialogMgr, mdlIntents.map(p => 
p.intent -> p.function).toMap)
+    private var allSrvs: Seq[NCLifecycle] =
+        tokEnrichers ++ entEnrichers ++ entParsers ++ tokVals ++ entVals ++ 
varFilterOpt.toSeq
+
+    processServices(_.onStart(cfg), "started")
 
     /**
       *
-      * @param list
-      * @tparam T
-      * @return
+      * @param cfg
+      * @param pipeline
       */
-    private def nvl[T](list: JList[T]): Seq[T] = if list == null then 
Seq.empty else list.asScala.toSeq
+    private def init(): Unit =
+        val buf = mutable.ArrayBuffer.empty[NCLifecycle] ++ 
pipeline.getEntityParsers.asScala
+
+        def add[T <: NCLifecycle](list: JList[T]): Unit = if list != null then 
buf ++= list.asScala
+
+        add(pipeline.getTokenEnrichers)
+        add(pipeline.getTokenValidators)
+        add(pipeline.getEntityEnrichers)
+        add(pipeline.getEntityParsers)
+        add(pipeline.getEntityValidators)
+        if pipeline.getVariantFilter.isPresent then 
add(JColls.singletonList(pipeline.getVariantFilter.get()))
+
+        allSrvs = buf.toSeq
+
+        processServices(_.onStart(cfg), "started")
+
+    /**
+      *
+      * @param act
+      * @param actVerb
+      */
+    private def processServices(act: NCLifecycle => Unit, actVerb: String): 
Unit =
+        NCUtils.execPar(allSrvs.map(p =>
+            () => {
+                act(p)
+                logger.info(s"Service $actVerb: '${p.getClass.getName}'")
+            }
+        )*)(ExecutionContext.Implicits.global)
 
     /**
       *
-      * @param h
+      * @param list
+      * @tparam T
       * @return
       */
-    private def matchIntent(h: VariantsHolder): NCResult =
-        val userId = h.request.getUserId
-        val convHldr = convMgr.getConversation(userId)
-        val allEnts = h.variants.flatMap(_.getEntities.asScala)
-
-        val conv =
-            new NCConversation:
-                override val getSession: NCPropertyMap = convHldr.getUserData
-                override val getStm: JList[NCEntity] = convHldr.getEntities
-                override val getDialogFlow: JList[NCDialogFlowItem] = 
dialogMgr.getDialogFlow(userId).asJava
-                override def clearStm(filter: Predicate[NCEntity]): Unit = 
convHldr.clearEntities(filter)
-                override def clearDialog(filter: Predicate[String]): Unit = 
dialogMgr.clearForPredicate(userId, (s: String) => filter.test(s))
-
-        val ctx = new NCContext:
-            override def isOwnerOf(ent: NCEntity): Boolean = 
allEnts.contains(ent)
-            override val getModelConfig: NCModelConfig = mdl.getConfig
-            override val getRequest: NCRequest = h.request
-            override val getConversation: NCConversation = conv
-            override val getVariants: util.Collection[NCVariant] = 
h.variants.asJava
-            override val getTokens: JList[NCToken] = h.tokens
-
-        solver.solve(NCIntentSolverInput(ctx, mdl))
+    private def nvl[T](list: JList[T]): Seq[T] = if list == null then 
Seq.empty else list.asScala.toSeq
 
     /**
       *
@@ -108,12 +114,7 @@ class NCModelPipelineProcessor(mdl: NCModel) extends 
LazyLogging:
       * @param checkCancel
       * @return
       */
-    private[internal] def prepVariants(
-        txt: String,
-        data: JMap[String, AnyRef],
-        usrId: String,
-        checkCancel: Option[() => Unit] = None
-    ): VariantsHolder =
+    def prepare(txt: String, data: JMap[String, AnyRef], usrId: String, 
checkCancel: Option[() => Unit] = None): NCPipelineVariants =
         require(txt != null && usrId != null)
 
         /**
@@ -172,48 +173,23 @@ class NCModelPipelineProcessor(mdl: NCModel) extends 
LazyLogging:
 
         var variants: JList[NCVariant] =
             if overlapEnts.nonEmpty then
-                
NCModelPipelineHelper.findCombinations(overlapEnts.map(_.asJava).asJava, pool)
-                    .asScala.map(_.asScala).map(delComb =>
+                NCModelPipelineHelper.
+                    findCombinations(overlapEnts.map(_.asJava).asJava, pool).
+                    asScala.map(_.asScala).map(delComb =>
                         val delSet = delComb.toSet
                         newVariant(entities.filter(!delSet.contains(_)))
                     ).asJava
             else
                 Seq(newVariant(entities)).asJava
 
-        if varFilter.isDefined then
+        if varFilterOpt.isDefined then
             check()
-            variants = varFilter.get.filter(req, cfg, variants)
-
-        VariantsHolder(req, variants.asScala.toSeq, toks, checkCancel)
-
-    /**
-      *
-      * @param txt
-      * @param data
-      * @param usrId
-      * @return
-      * @throws NCRejection
-      * @throws NCCuration
-      * @throws NCException
-      */
-    def askSync(txt: String, data: JMap[String, AnyRef], usrId: String): 
NCResult = matchIntent(prepVariants(txt, data, usrId))
-
-    /**
-      * TODO: explain all exceptions that are thrown by the future.
-      *
-      * @param txt
-      * @param data
-      * @param usrId
-      * @return
-      */
-    def ask(txt: String, data: JMap[String, AnyRef], usrId: String): 
CompletableFuture[NCResult] =
-        val fut = new CompletableFuture[NCResult]
-        val check = () => if fut.isCancelled then
-            E(s"Asynchronous ask is interrupted [txt=$txt, usrId=$usrId]")
-
-        fut.completeAsync(() => matchIntent(prepVariants(txt, data, usrId, 
Option(check))))
+            variants = varFilterOpt.get.filter(req, cfg, variants)
 
+        NCPipelineVariants(req, variants.asScala.toSeq, toks, checkCancel)
     /**
       *
       */
-    def close(): Unit = NCUtils.shutdownPool(pool)
+    def close(): Unit =
+        processServices(_.onStop(cfg), "stopped")
+        NCUtils.shutdownPool(pool)
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolver.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentsManager.scala
similarity index 99%
rename from 
nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolver.scala
rename to 
nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentsManager.scala
index 734fe40..37525e5 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolver.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentsManager.scala
@@ -34,7 +34,7 @@ import scala.language.postfixOps
 /**
  * Intent solver that finds the best matching intent given user sentence.
  */
-case class NCIntentSolver(dialog: NCDialogFlowManager, intents: 
Map[NCIDLIntent, NCIntentMatch => NCResult]) extends LazyLogging:
+class NCIntentsManager(dialog: NCDialogFlowManager, intents: Map[NCIDLIntent, 
NCIntentMatch => NCResult]) extends LazyLogging:
     /**
      * NOTE: not thread-safe.
      */
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/conversation/NCConversationManagerSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/conversation/NCConversationManagerSpec.scala
index 61af791..4a3de41 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/conversation/NCConversationManagerSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/conversation/NCConversationManagerSpec.scala
@@ -91,5 +91,5 @@ class NCConversationManagerSpec:
             Thread.sleep(timeout * 2)
             checkSize(0)
         finally
-            mgr.stop()
+            mgr.close()
 
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManagerSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManagerSpec.scala
index ef93002..cf0e371 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManagerSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManagerSpec.scala
@@ -75,7 +75,7 @@ class NCDialogFlowManagerSpec:
       *
       */
     @AfterEach
-    def cleanUp(): Unit = if mgr != null then mgr.stop()
+    def cleanUp(): Unit = if mgr != null then mgr.close()
 
     @Test
     def test(): Unit =
@@ -128,5 +128,5 @@ class NCDialogFlowManagerSpec:
         Thread.sleep(delay * 5)
         check("user1" -> 1, "user2" -> 0)
 
-        mgr.stop()
+        mgr.close()
         check("user1" -> 0, "user2" -> 0)
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineProcessorSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManagerSpec.scala
similarity index 59%
rename from 
nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineProcessorSpec.scala
rename to 
nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManagerSpec.scala
index c9eb33c..76371c0 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineProcessorSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManagerSpec.scala
@@ -18,7 +18,6 @@
 package org.apache.nlpcraft.internal.impl
 
 import org.apache.nlpcraft.*
-import org.apache.nlpcraft.internal.impl.NCModelPipelineProcessor
 import org.apache.nlpcraft.nlp.entity.parser.nlp.impl.NCNLPEntityParserImpl
 import org.apache.nlpcraft.nlp.entity.parser.semantic.*
 import 
org.apache.nlpcraft.nlp.entity.parser.semantic.impl.en.NCEnSemanticPorterStemmer
@@ -36,7 +35,7 @@ import scala.jdk.CollectionConverters.*
 /**
   *
   */
-class NCModelPipelineProcessorSpec:
+class NCModelPipelineManagerSpec:
     /**
       *
       */
@@ -49,7 +48,7 @@ class NCModelPipelineProcessorSpec:
             pipeline.getEntityParsers.clear()
             pipeline.getEntityParsers.add(parser)
 
-            val res = new NCModelPipelineProcessor(new NCModelAdapter(CFG, 
pipeline)).prepVariants(txt, null, "userId")
+            val res = new NCModelPipelineManager(CFG, pipeline).prepare(txt, 
null, "userId")
 
             println(s"Variants count: ${res.variants.size}")
             for ((v, idx) <- res.variants.zipWithIndex)
@@ -61,49 +60,3 @@ class NCModelPipelineProcessorSpec:
         test("t1 t2", 4, NCSemanticTestElement("t1", "t2"), 
NCSemanticTestElement("t2", "t1"))
         test("t1 t2", 2, NCSemanticTestElement("t1", "t2"), 
NCSemanticTestElement("t2"))
 
-    /**
-      *
-      * @param delayMs
-      * @param iterCnt
-      * @return
-      */
-    private def mkSlowPipelineProcessor(delayMs: Long, iterCnt: Int): 
NCModelPipelineProcessor =
-        val pipeline = EN_PIPELINE.clone()
-
-        pipeline.getEntityParsers.clear()
-
-        def mkSlowParser(i: Int) =
-            new NCEntityParser:
-                override def parse(req: NCRequest, cfg: NCModelConfig, toks: 
JList[NCToken]): JList[NCEntity] =
-                    println(s"Parser called: $i")
-                    Thread.sleep(delayMs)
-                    java.util.Collections.emptyList()
-
-        (0 until iterCnt).foreach(i => 
pipeline.getEntityParsers.add(mkSlowParser(i)))
-
-        NCModelPipelineProcessor(new NCModelAdapter(CFG, pipeline))
-
-    /**
-      *
-      */
-    @Test
-    def testCancel(): Unit =
-        val fut = mkSlowPipelineProcessor(1, 10000).ask("any", null, "userId")
-
-        Thread.sleep(20)
-        require(fut.cancel(true))
-        Thread.sleep(20)
-
-        Assertions.assertThrows(classOf[CancellationException], () => fut.get)
-
-    /**
-      *
-      */
-    @Test
-    def testTimeout(): Unit =
-        val fut = mkSlowPipelineProcessor(1, 10000).ask("any", null, "userId")
-
-        Thread.sleep(20)
-
-        try Assertions.assertThrows(classOf[TimeoutException], () => 
fut.get(1, TimeUnit.MILLISECONDS))
-        finally fut.cancel(true)

Reply via email to