1
1
package org.modelix.client.light
2
2
3
- import io.ktor.client.*
4
- import io.ktor.client.engine.*
5
- import io.ktor.client.plugins.websocket.*
3
+ import io.ktor.client.HttpClient
4
+ import io.ktor.client.engine.HttpClientEngine
5
+ import io.ktor.client.engine.HttpClientEngineFactory
6
+ import io.ktor.client.plugins.websocket.WebSockets
6
7
import kotlinx.coroutines.delay
7
- import org.modelix.model.api.*
8
- import org.modelix.model.area.*
9
- import org.modelix.model.server.api.*
8
+ import org.modelix.model.api.ConceptReference
9
+ import org.modelix.model.api.IBranch
10
+ import org.modelix.model.api.IConcept
11
+ import org.modelix.model.api.IConceptReference
12
+ import org.modelix.model.api.INode
13
+ import org.modelix.model.api.INodeEx
14
+ import org.modelix.model.api.INodeReference
15
+ import org.modelix.model.api.INodeReferenceSerializer
16
+ import org.modelix.model.api.INodeReferenceSerializerEx
17
+ import org.modelix.model.api.NodeReferenceById
18
+ import org.modelix.model.api.SerializedNodeReference
19
+ import org.modelix.model.api.getAncestors
20
+ import org.modelix.model.api.resolve
21
+ import org.modelix.model.area.IArea
22
+ import org.modelix.model.area.IAreaChangeEvent
23
+ import org.modelix.model.area.IAreaChangeList
24
+ import org.modelix.model.area.IAreaListener
25
+ import org.modelix.model.area.IAreaReference
26
+ import org.modelix.model.server.api.AddNewChildNodeOpData
27
+ import org.modelix.model.server.api.ChangeSetId
28
+ import org.modelix.model.server.api.DeleteNodeOpData
29
+ import org.modelix.model.server.api.ExceptionData
30
+ import org.modelix.model.server.api.MessageFromClient
31
+ import org.modelix.model.server.api.MessageFromServer
32
+ import org.modelix.model.server.api.ModelQuery
33
+ import org.modelix.model.server.api.MoveNodeOpData
34
+ import org.modelix.model.server.api.NodeData
35
+ import org.modelix.model.server.api.NodeId
36
+ import org.modelix.model.server.api.NodeUpdateData
37
+ import org.modelix.model.server.api.OperationData
38
+ import org.modelix.model.server.api.QueryRootNode
39
+ import org.modelix.model.server.api.SetPropertyOpData
40
+ import org.modelix.model.server.api.SetReferenceOpData
41
+ import org.modelix.model.server.api.VersionData
42
+ import org.modelix.model.server.api.merge
43
+ import org.modelix.model.server.api.replaceChildren
44
+ import org.modelix.model.server.api.replaceContainment
45
+ import org.modelix.model.server.api.replaceId
46
+ import org.modelix.model.server.api.replaceReferences
47
+ import org.modelix.modelql.client.ModelQLClient
48
+ import org.modelix.modelql.core.IQueryExecutor
49
+ import org.modelix.modelql.untyped.ISupportsModelQL
10
50
import kotlin.jvm.JvmStatic
11
51
import kotlin.time.Duration
12
52
import kotlin.time.Duration.Companion.milliseconds
@@ -18,7 +58,8 @@ class LightModelClient internal constructor(
18
58
val connection : IConnection ,
19
59
private val transactionManager : ITransactionManager ,
20
60
val autoFilterNonLoadedNodes : Boolean ,
21
- val debugName : String = " "
61
+ val debugName : String = " " ,
62
+ val modelQLClient : ModelQLClient ? = null
22
63
) {
23
64
24
65
private val nodes: MutableMap <NodeId , NodeData > = HashMap ()
@@ -324,7 +365,7 @@ class LightModelClient internal constructor(
324
365
}
325
366
}
326
367
327
- inner class NodeAdapter (var nodeId : NodeId ) : INodeEx {
368
+ inner class NodeAdapter (var nodeId : NodeId ) : INodeEx, ISupportsModelQL {
328
369
fun getData () = requiresRead { getNodeData(nodeId) }
329
370
330
371
override fun usesRoleIds (): Boolean = usesRoleIds
@@ -562,6 +603,11 @@ class LightModelClient internal constructor(
562
603
override fun toString (): String {
563
604
return nodeId
564
605
}
606
+
607
+ override fun createQueryExecutor (): IQueryExecutor <INode > {
608
+ val client = modelQLClient ? : throw UnsupportedOperationException (" Connection doesn't support ModelQL: $connection " )
609
+ return client.getNode(SerializedNodeReference (nodeId))
610
+ }
565
611
}
566
612
567
613
inner class Area : IArea {
@@ -732,6 +778,7 @@ abstract class LightModelClientBuilder {
732
778
private var debugName: String = " "
733
779
private var transactionManager: ITransactionManager = ReadWriteLockTransactionManager ()
734
780
private var autoFilterNonLoadedNodes: Boolean = false
781
+ private var modelQLClient: ModelQLClient ? = null
735
782
736
783
protected abstract fun getDefaultEngineFactory (): HttpClientEngineFactory <* >
737
784
@@ -749,7 +796,8 @@ abstract class LightModelClientBuilder {
749
796
),
750
797
transactionManager,
751
798
autoFilterNonLoadedNodes = autoFilterNonLoadedNodes,
752
- debugName = debugName
799
+ debugName = debugName,
800
+ modelQLClient = modelQLClient
753
801
)
754
802
}
755
803
fun autoFilterNonLoadedNodes (value : Boolean = true): LightModelClientBuilder {
@@ -795,6 +843,10 @@ abstract class LightModelClientBuilder {
795
843
this .httpEngineFactory = httpEngineFactory
796
844
return this
797
845
}
846
+ fun modelQLClient (c : ModelQLClient ): LightModelClientBuilder {
847
+ this .modelQLClient = c
848
+ return this
849
+ }
798
850
}
799
851
800
852
class LightClientNodeReference (val nodeId : NodeId ) : INodeReference {
0 commit comments