@@ -12,7 +12,7 @@ class ModelImporter(private val root: INode) {
12
12
private lateinit var originalIdToRef: MutableMap <String , INodeReference >
13
13
private lateinit var originalIdToSpec: MutableMap <String , NodeData >
14
14
private lateinit var originalIdToParentSpec: MutableMap <String , NodeData >
15
- private lateinit var existingNodeIds : MutableSet <String >
15
+ private lateinit var originalIdToExisting : MutableMap <String , INode >
16
16
17
17
fun import (jsonFile : File ) {
18
18
require(jsonFile.exists())
@@ -23,8 +23,8 @@ class ModelImporter(private val root: INode) {
23
23
}
24
24
25
25
fun import (data : ModelData ) {
26
- existingNodeIds = mutableSetOf ()
27
- collectExistingNodeIds (root)
26
+ originalIdToExisting = mutableMapOf ()
27
+ buildExistingIndex (root)
28
28
29
29
originalIdToSpec = mutableMapOf ()
30
30
buildSpecIndex(data.root)
@@ -41,9 +41,9 @@ class ModelImporter(private val root: INode) {
41
41
syncAllChildOrders(root, data.root)
42
42
}
43
43
44
- private fun collectExistingNodeIds (root : INode ) {
45
- root.originalId()?.let { existingNodeIds.add(it) }
46
- root.allChildren.forEach { collectExistingNodeIds (it) }
44
+ private fun buildExistingIndex (root : INode ) {
45
+ root.originalId()?.let { originalIdToExisting[it] = root }
46
+ root.allChildren.forEach { buildExistingIndex (it) }
47
47
}
48
48
49
49
private fun buildParentSpecIndex (nodeData : NodeData ) {
@@ -94,7 +94,7 @@ class ModelImporter(private val root: INode) {
94
94
val existingIds = node.allChildren.map { it.originalId() }.toSet()
95
95
val missingNodes = specifiedNodes.filter { ! existingIds.contains(it.originalId()) }
96
96
97
- val toBeMovedHere = missingNodes.filter { existingNodeIds.contains (it.originalId()) }.toSet()
97
+ val toBeMovedHere = missingNodes.filter { originalIdToExisting.containsKey (it.originalId()) }.toSet()
98
98
val toBeAdded = missingNodes.subtract(toBeMovedHere)
99
99
100
100
toBeAdded.forEach {
@@ -104,9 +104,10 @@ class ModelImporter(private val root: INode) {
104
104
}
105
105
106
106
toBeMovedHere.forEach {
107
- val target = originalIdToRef[it.originalId()]?.resolveNode(node.getArea())
108
- if (target != null ) {
109
- node.moveChild(it.role, - 1 , target)
107
+ val actualNode = originalIdToExisting[it.originalId()]
108
+ val targetIndex = it.getIndexWithinRole(nodeData)
109
+ if (actualNode != null ) {
110
+ node.moveChild(it.role, targetIndex, actualNode)
110
111
}
111
112
}
112
113
0 commit comments