Skip to content

Commit 485daf4

Browse files
committed
fix(model-sync-lib): fixed parameter type of model importer/exporter, fixed import
1 parent 60a1cf1 commit 485daf4

File tree

5 files changed

+46
-38
lines changed

5 files changed

+46
-38
lines changed

model-sync-lib/build.gradle.kts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ plugins {
22
kotlin("jvm")
33
}
44

5-
group = "org.modelix"
6-
75
repositories {
86
mavenCentral()
97
}

model-sync-lib/src/main/kotlin/org/modelix/model/sync/ModelExporter.kt

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,19 @@
11
package org.modelix.model.sync
22

3-
import org.modelix.model.api.IBranch
43
import org.modelix.model.api.INode
5-
import org.modelix.model.api.getRootNode
64
import org.modelix.model.api.serialize
75
import org.modelix.model.data.ModelData
86
import org.modelix.model.data.NodeData
97
import org.modelix.model.data.associateWithNotNull
108
import java.io.File
119

12-
class ModelExporter(private val branch: IBranch) {
10+
class ModelExporter(private val root: INode) {
1311

1412
fun export(outputFile: File) {
15-
lateinit var modelData: ModelData
16-
branch.runRead {
17-
val root = branch.getRootNode()
18-
modelData = ModelData(root = root.asExported())
19-
}
13+
val modelData = ModelData(root = root.asExported())
2014
outputFile.parentFile.mkdirs()
2115
outputFile.writeText(modelData.toJson())
2216
}
23-
24-
2517
}
2618

2719
fun INode.asExported() : NodeData {

model-sync-lib/src/main/kotlin/org/modelix/model/sync/ModelImporter.kt

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package org.modelix.model.sync
22

3-
import org.modelix.model.api.*
3+
import org.modelix.model.api.ConceptReference
4+
import org.modelix.model.api.INode
5+
import org.modelix.model.api.INodeReference
46
import org.modelix.model.data.ModelData
57
import org.modelix.model.data.NodeData
68
import java.io.File
79

8-
class ModelImporter(private val branch: IBranch) {
10+
class ModelImporter(private val root: INode) {
911

1012
private lateinit var originalIdToRef: MutableMap<String, INodeReference>
13+
private lateinit var originalIdToSpec: MutableMap<String, NodeData>
1114

1215
fun import(jsonFile: File) {
1316
require(jsonFile.exists())
@@ -19,59 +22,72 @@ class ModelImporter(private val branch: IBranch) {
1922

2023
fun import(data: ModelData) {
2124
originalIdToRef = mutableMapOf()
22-
branch.runWrite {
23-
val rootNode = branch.getRootNode()
24-
if (rootNode.allChildren.none()) {
25-
data.load(branch)
26-
return@runWrite
27-
}
28-
buildRefIndex(rootNode)
29-
syncNode(rootNode, data.root)
30-
}
25+
originalIdToSpec = mutableMapOf()
26+
buildSpecIndex(data.root)
27+
syncNode(root, data.root)
28+
buildRefIndex(root)
29+
syncAllReferences(root, data.root)
3130
}
3231

3332
private fun buildRefIndex(node: INode) {
3433
node.originalId()?.let { originalIdToRef[it] = node.reference }
3534
node.allChildren.forEach { buildRefIndex(it) }
3635
}
3736

37+
private fun buildSpecIndex(nodeData: NodeData) {
38+
nodeData.originalId()?.let { originalIdToSpec[it] = nodeData }
39+
nodeData.children.forEach { buildSpecIndex(it) }
40+
}
41+
3842
private fun syncNode(node: INode, nodeData: NodeData) {
3943
syncProperties(node, nodeData)
40-
syncReferences(node, nodeData)
4144
syncChildNodes(node, nodeData)
4245
}
4346

4447
private fun syncProperties(node: INode, nodeData: NodeData) {
4548
nodeData.properties.forEach { node.setPropertyValue(it.key, it.value) }
49+
val toBeRemoved = node.getPropertyRoles().toSet()
50+
.subtract(nodeData.properties.keys)
51+
.filter { it != NodeData.idPropertyKey }
52+
toBeRemoved.forEach { node.setPropertyValue(it, null) }
53+
}
54+
55+
private fun syncAllReferences(root: INode, rootData: NodeData) {
56+
syncReferences(root, rootData)
57+
for ((node, data) in root.allChildren.zip(rootData.children)) {
58+
syncAllReferences(node, data)
59+
}
4660
}
4761

4862
private fun syncReferences(node: INode, nodeData: NodeData) {
4963
nodeData.references.forEach { node.setReferenceTarget(it.key, originalIdToRef[it.value]) }
64+
val toBeRemoved = node.getReferenceRoles().toSet().subtract(nodeData.references.keys)
65+
toBeRemoved.forEach { node.setPropertyValue(it, null) }
5066
}
5167

5268
private fun syncChildNodes(node: INode, nodeData: NodeData) {
5369
val toBeRemoved = mutableSetOf<INode>()
54-
val existingIds = mutableSetOf<String>()
70+
val existingIds = node.allChildren.map { it.originalId() }
71+
72+
val toBeAdded = nodeData.children.filter { !existingIds.contains(it.id) }
73+
74+
toBeAdded.forEach {
75+
val index = nodeData.children.indexOf(it)
76+
val createdNode = node.addNewChild(it.role, index, it.concept?.let { s -> ConceptReference(s) })
77+
createdNode.setPropertyValue(NodeData.idPropertyKey, it.originalId())
78+
}
5579

5680
for (child in node.allChildren) {
57-
child.originalId()?.let { existingIds.add(it) }
58-
val foundChildData: NodeData? = nodeData.children.find { it.id == child.originalId() }
81+
val foundChildData: NodeData? = originalIdToSpec[child.originalId()]
5982
if (foundChildData != null) {
6083
syncNode(child, foundChildData)
6184
} else {
6285
toBeRemoved.add(child)
6386
}
6487
}
6588

66-
val toBeAdded = nodeData.children.filter { !existingIds.contains(it.id) }
67-
68-
toBeAdded.forEach {
69-
val index = nodeData.children.indexOf(it)
70-
val createdNode = node.addNewChild(it.role, index, it.concept?.let { s -> ConceptReference(s) })
71-
createdNode.setPropertyValue(NodeData.idPropertyKey, it.originalId())
72-
}
7389
toBeRemoved.forEach { node.removeChild(it) }
74-
syncChildOrder(node, nodeData)
90+
syncChildOrder(node, nodeData)
7591
}
7692

7793
private fun syncChildOrder(node: INode, nodeData: NodeData) {

model-sync-lib/src/test/kotlin/org/modelix/model/sync/ModelExporterTest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ class ModelExporterTest {
3838
fun `can export`() {
3939
val outputFile = File("build/test/model-export/model.json")
4040
assertDoesNotThrow {
41-
ModelExporter(branch).export(outputFile)
41+
branch.runRead {
42+
ModelExporter(branch.getRootNode()).export(outputFile)
43+
}
4244
}
4345

4446
branch.runRead {

model-sync-lib/src/test/kotlin/org/modelix/model/sync/ModelImporterTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class ModelImporterTest {
3737
model.load(branch)
3838
// println("PRE-SPEC ${model.toJson()}")
3939
// println("PRE-LOADED ${branch.getRootNode().toJson()}")
40-
ModelImporter(branch).import(newModelFile)
40+
ModelImporter(branch.getRootNode()).import(newModelFile)
4141
// println("POST-SPEC ${newModel.root.toJson()}")
4242
// println("POST-LOADED ${branch.getRootNode().toJson()}")
4343
}
@@ -84,7 +84,7 @@ class ModelImporterTest {
8484
val tempBranch = PBranch(tree, IdGenerator.getInstance(1))
8585
tempBranch.runWrite {
8686
assertDoesNotThrow {
87-
ModelImporter(tempBranch).import(newModel)
87+
ModelImporter(tempBranch.getRootNode()).import(newModel)
8888
}
8989
val children = tempBranch.getRootNode().allChildren.toList()
9090
assertEquals(newModel.root.children.size, children.size)

0 commit comments

Comments
 (0)