Skip to content

Commit 2f2afaa

Browse files
committed
feat(model-sync-lib): added ModelExporter
1 parent 8822dd8 commit 2f2afaa

File tree

3 files changed

+100
-1
lines changed

3 files changed

+100
-1
lines changed

model-api/src/commonMain/kotlin/org/modelix/model/data/ModelData.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ data class ModelData(
1818
val createdNodes = HashMap<String, Long>()
1919
val pendingReferences = ArrayList<() -> Unit>()
2020
val parentId = ITree.ROOT_ID
21+
if (root.id != null) {
22+
createdNodes[root.id] = parentId
23+
}
2124
setOriginalId(root, t, parentId)
2225
for (nodeData in root.children) {
2326
loadNode(nodeData, t, parentId, createdNodes, pendingReferences)
@@ -94,6 +97,6 @@ fun INode.asData(): NodeData = NodeData(
9497
children = allChildren.map { it.asData() }
9598
)
9699

97-
public inline fun <K, V : Any> Iterable<K>.associateWithNotNull(valueSelector: (K) -> V?): Map<K, V> {
100+
inline fun <K, V : Any> Iterable<K>.associateWithNotNull(valueSelector: (K) -> V?): Map<K, V> {
98101
return associateWith { valueSelector(it) }.filterValues { it != null } as Map<K, V>
99102
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.modelix.model.sync
2+
3+
import org.modelix.model.api.IBranch
4+
import org.modelix.model.api.INode
5+
import org.modelix.model.api.getRootNode
6+
import org.modelix.model.api.serialize
7+
import org.modelix.model.data.ModelData
8+
import org.modelix.model.data.NodeData
9+
import org.modelix.model.data.associateWithNotNull
10+
import java.io.File
11+
12+
class ModelExporter(private val branch: IBranch) {
13+
companion object {
14+
const val idRole = "originalId"
15+
}
16+
17+
fun export(outputFile: File) {
18+
lateinit var modelData: ModelData
19+
branch.runRead {
20+
val root = branch.getRootNode()
21+
modelData = ModelData(root = root.asExported())
22+
}
23+
outputFile.parentFile.mkdirs()
24+
outputFile.writeText(modelData.toJson())
25+
}
26+
27+
28+
}
29+
30+
fun INode.asExported() : NodeData {
31+
return NodeData(
32+
id = getPropertyValue(ModelExporter.idRole) ?: reference.serialize(),
33+
concept = concept?.getUID(),
34+
role = roleInParent,
35+
properties = getPropertyRoles().associateWithNotNull { getPropertyValue(it) }.filterKeys { it != ModelExporter.idRole },
36+
references = getReferenceRoles().associateWithNotNull {
37+
getReferenceTarget(it)?.let { node ->
38+
node.getPropertyValue(ModelExporter.idRole) ?: node.reference.serialize()
39+
}
40+
},
41+
children = allChildren.map { it.asExported() }
42+
)
43+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.modelix.model.sync
2+
3+
import org.junit.jupiter.api.Assertions.assertEquals
4+
import org.junit.jupiter.api.BeforeAll
5+
import org.junit.jupiter.api.Test
6+
import org.junit.jupiter.api.assertDoesNotThrow
7+
import org.modelix.model.api.IBranch
8+
import org.modelix.model.api.PBranch
9+
import org.modelix.model.api.getRootNode
10+
import org.modelix.model.client.IdGenerator
11+
import org.modelix.model.data.ModelData
12+
import org.modelix.model.lazy.CLTree
13+
import org.modelix.model.lazy.ObjectStoreCache
14+
import org.modelix.model.persistent.MapBaseStore
15+
import java.io.File
16+
17+
class ModelExporterTest {
18+
19+
companion object {
20+
lateinit var model: ModelData
21+
lateinit var branch: IBranch
22+
23+
@JvmStatic
24+
@BeforeAll
25+
fun `initialize model and branch`(): Unit {
26+
model = ModelData.fromJson(File("src/test/resources/newmodel.json").readText())
27+
28+
val tree = CLTree(ObjectStoreCache(MapBaseStore()))
29+
branch = PBranch(tree, IdGenerator.getInstance(1))
30+
31+
branch.runWrite {
32+
model.load(branch)
33+
}
34+
}
35+
}
36+
37+
@Test
38+
fun `can export`() {
39+
val outputFile = File("build/test/model-export/model.json")
40+
assertDoesNotThrow {
41+
ModelExporter(branch).export(outputFile)
42+
}
43+
44+
branch.runRead {
45+
for (child in branch.getRootNode().allChildren) {
46+
println(child.getReferenceRoles())
47+
}
48+
}
49+
50+
assert(outputFile.exists())
51+
assertEquals(model, ModelData.fromJson(outputFile.readText()))
52+
}
53+
}

0 commit comments

Comments
 (0)