-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathIWritableNode.kt
92 lines (72 loc) · 3.91 KB
/
IWritableNode.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package org.modelix.model.api
import org.modelix.model.data.NodeData
interface IReadableNode {
fun asLegacyNode(): INode
fun getModel(): IModel
fun isValid(): Boolean
fun getNodeReference(): INodeReference
fun getConcept(): IConcept
fun tryGetConcept(): IConcept? = getConceptReference().tryResolve()
fun getConceptReference(): ConceptReference
fun getParent(): IReadableNode?
fun getContainmentLink(): IChildLinkReference
fun getAllChildren(): List<IReadableNode>
fun getChildren(role: IChildLinkReference): List<IReadableNode>
fun getPropertyValue(property: IPropertyReference): String?
fun getPropertyLinks(): List<IPropertyReference>
fun getAllProperties(): List<Pair<IPropertyReference, String>>
/**
* Is allowed to be null, even if getReferenceTargetRef is not null.
*/
fun getReferenceTarget(role: IReferenceLinkReference): IReadableNode?
fun getReferenceTargetRef(role: IReferenceLinkReference): INodeReference?
fun getReferenceLinks(): List<IReferenceLinkReference>
fun getAllReferenceTargets(): List<Pair<IReferenceLinkReference, IReadableNode>>
fun getAllReferenceTargetRefs(): List<Pair<IReferenceLinkReference, INodeReference>>
}
/**
* @return the serialized reference of the source node, if this one was created during an import
*/
fun IReadableNode.getOriginalReference(): String? = getPropertyValue(NodeData.ID_PROPERTY_REF)
?: getPropertyValue(IPropertyReference.fromIdAndName("#mpsNodeId#", "#mpsNodeId#")) // for backwards compatibility
fun IReadableNode.getOriginalOrCurrentReference(): String = getOriginalReference() ?: getNodeReference().serialize()
fun INode.getOriginalOrCurrentReference(): String = getOriginalReference() ?: reference.serialize()
interface IWritableNode : IReadableNode {
override fun asLegacyNode(): INode = WritableNodeAsLegacyNode(this)
override fun getModel(): IMutableModel
override fun getAllChildren(): List<IWritableNode>
override fun getChildren(role: IChildLinkReference): List<IWritableNode>
override fun getReferenceTarget(role: IReferenceLinkReference): IWritableNode?
override fun getAllReferenceTargets(): List<Pair<IReferenceLinkReference, IWritableNode>>
override fun getParent(): IWritableNode?
fun changeConcept(newConcept: ConceptReference): IWritableNode
fun setPropertyValue(property: IPropertyReference, value: String?)
fun moveChild(role: IChildLinkReference, index: Int, child: IWritableNode)
fun removeChild(child: IWritableNode)
fun addNewChild(role: IChildLinkReference, index: Int, concept: ConceptReference): IWritableNode
fun addNewChildren(role: IChildLinkReference, index: Int, concepts: List<ConceptReference>): List<IWritableNode>
fun setReferenceTarget(role: IReferenceLinkReference, target: IWritableNode?)
fun setReferenceTargetRef(role: IReferenceLinkReference, target: INodeReference?)
}
interface ISyncTargetNode : IWritableNode {
fun syncNewChildren(role: IChildLinkReference, index: Int, specs: List<NewNodeSpec>): List<IWritableNode>
}
fun IWritableNode.syncNewChildren(role: IChildLinkReference, index: Int, sourceNodes: List<NewNodeSpec>): List<IWritableNode> {
return when (this) {
is ISyncTargetNode -> syncNewChildren(role, index, sourceNodes)
else -> addNewChildren(role, index, sourceNodes.map { it.conceptRef })
}
}
fun IWritableNode.syncNewChild(role: IChildLinkReference, index: Int, sourceNode: NewNodeSpec): IWritableNode {
return when (this) {
is ISyncTargetNode -> syncNewChildren(role, index, listOf(sourceNode)).single()
else -> addNewChild(role, index, sourceNode.conceptRef)
}
}
class NewNodeSpec(
val conceptRef: ConceptReference,
val node: IReadableNode? = null,
val preferredNodeReference: INodeReference? = null,
) {
constructor(node: IReadableNode) : this(node.getConceptReference(), node, node.getOriginalReference()?.let { NodeReference(it) })
}