@@ -35,7 +35,7 @@ class CLTree : ITree, IBulkTree {
35
35
constructor (hash: String? , store: IDeserializingKeyValueStore ) : this (if (hash == null ) null else store.get<CPTree >(hash) { CPTree .deserialize(it) }, store)
36
36
constructor (store: IDeserializingKeyValueStore ) : this (null as CPTree ? , store)
37
37
constructor (data: CPTree ? , store_: IDeserializingKeyValueStore ) : this (data, null as RepositoryId ? , store_)
38
- private constructor (data: CPTree ? , repositoryId_: RepositoryId ? , store_: IDeserializingKeyValueStore ) {
38
+ private constructor (data: CPTree ? , repositoryId_: RepositoryId ? , store_: IDeserializingKeyValueStore , useRoleIds : Boolean = false ) {
39
39
var repositoryId = repositoryId_
40
40
var store = store_
41
41
if (data == null ) {
@@ -55,7 +55,7 @@ class CLTree : ITree, IBulkTree {
55
55
arrayOf()
56
56
)
57
57
val idToHash = storeElement(root, CLHamtInternal .createEmpty(store))
58
- this .data = CPTree (repositoryId.id, KVEntryReference (idToHash.getData()), true )
58
+ this .data = CPTree (repositoryId.id, KVEntryReference (idToHash.getData()), useRoleIds )
59
59
} else {
60
60
this .data = data
61
61
}
@@ -113,33 +113,33 @@ class CLTree : ITree, IBulkTree {
113
113
get() = resolveElement(ITree .ROOT_ID )
114
114
115
115
override fun setProperty (nodeId : Long , role : String , value : String? ): ITree {
116
- checkRoleId (nodeId, role)
116
+ checkPropertyRoleId (nodeId, role)
117
117
var newIdToHash = nodesMap
118
118
val newNodeData = resolveElement(nodeId)!! .getData().withPropertyValue(role, value)
119
119
newIdToHash = newIdToHash!! .put(newNodeData)
120
120
return CLTree (data.id, newIdToHash!! , store, data.usesRoleIds)
121
121
}
122
122
123
123
override fun addNewChild (parentId : Long , role : String? , index : Int , childId : Long , concept : IConceptReference ? ): ITree {
124
- checkRoleId (parentId, role)
124
+ checkChildRoleId (parentId, role)
125
125
if (containsNode(childId)) {
126
126
throw DuplicateNodeId (" Node ID already exists: ${childId.toString(16 )} " )
127
127
}
128
128
return createNewNode(childId, concept).addChild(parentId, role, index, childId)
129
129
}
130
130
131
131
override fun addNewChild (parentId : Long , role : String? , index : Int , childId : Long , concept : IConcept ? ): ITree {
132
- checkRoleId (parentId, role)
132
+ checkChildRoleId (parentId, role)
133
133
return addNewChild(parentId, role, index, childId, concept?.getReference())
134
134
}
135
135
136
136
override fun addNewChildren (parentId : Long , role : String? , index : Int , newIds : LongArray , concepts : Array <IConcept ?>): ITree {
137
- checkRoleId (parentId, role)
137
+ checkChildRoleId (parentId, role)
138
138
throw UnsupportedOperationException (" Not implemented yet" )
139
139
}
140
140
141
141
override fun addNewChildren (parentId : Long , role : String? , index : Int , newIds : LongArray , concepts : Array <IConceptReference ?>): ITree {
142
- checkRoleId (parentId, role)
142
+ checkChildRoleId (parentId, role)
143
143
TODO (" Not yet implemented" )
144
144
}
145
145
@@ -219,7 +219,7 @@ class CLTree : ITree, IBulkTree {
219
219
}
220
220
221
221
override fun setReferenceTarget (sourceId : Long , role : String , target : INodeReference ? ): ITree {
222
- checkRoleId (sourceId, role)
222
+ checkReferenceRoleId (sourceId, role)
223
223
val source = resolveElement(sourceId)!!
224
224
val refData: CPNodeRef ? = when (target) {
225
225
null -> null
@@ -303,7 +303,7 @@ class CLTree : ITree, IBulkTree {
303
303
}
304
304
305
305
override fun getChildren (parentId : Long , role : String? ): Iterable <Long > {
306
- checkRoleId (parentId, role)
306
+ checkChildRoleId (parentId, role)
307
307
val parent = resolveElement(parentId)
308
308
val children = parent!! .getChildren(BulkQuery (store)).execute()
309
309
return children
@@ -340,7 +340,7 @@ class CLTree : ITree, IBulkTree {
340
340
}
341
341
342
342
override fun getProperty (nodeId : Long , role : String ): String? {
343
- checkRoleId (nodeId, role)
343
+ checkPropertyRoleId (nodeId, role)
344
344
val node = resolveElement(nodeId)
345
345
return node!! .getData().getPropertyValue(role)
346
346
}
@@ -356,7 +356,7 @@ class CLTree : ITree, IBulkTree {
356
356
}
357
357
358
358
override fun getReferenceTarget (sourceId : Long , role : String ): INodeReference ? {
359
- checkRoleId (sourceId, role)
359
+ checkReferenceRoleId (sourceId, role)
360
360
val node = resolveElement(sourceId)!!
361
361
val targetRef = node.getData().getReferenceTarget(role)
362
362
return when {
@@ -373,7 +373,7 @@ class CLTree : ITree, IBulkTree {
373
373
}
374
374
375
375
override fun moveChild (targetParentId : Long , targetRole : String? , targetIndex_ : Int , childId : Long ): ITree {
376
- checkRoleId (targetParentId, targetRole)
376
+ checkChildRoleId (targetParentId, targetRole)
377
377
if (childId == ITree .ROOT_ID ) throw RuntimeException (" Moving the root node is not allowed" )
378
378
var ancestor = targetParentId
379
379
while (ancestor != ITree .ROOT_ID ) {
@@ -556,13 +556,45 @@ class CLTree : ITree, IBulkTree {
556
556
return " CLTree[$hash ]"
557
557
}
558
558
559
- private fun checkRoleId (nodeId : Long , role : String? ) {
560
- if (role != null && usesRoleIds() && role.matches(roleNamePattern) && getConceptReference(nodeId) != null ) {
561
- throw IllegalArgumentException (" A role UID is expected, but this looks like a name: $role " )
559
+ private fun checkChildRoleId (nodeId : Long , role : String? ) = checkRoleId(nodeId, role) { it.getAllChildLinks() }
560
+ private fun checkReferenceRoleId (nodeId : Long , role : String? ) = checkRoleId(nodeId, role) { it.getAllReferenceLinks() }
561
+ private fun checkPropertyRoleId (nodeId : Long , role : String? ) = checkRoleId(nodeId, role) { it.getAllProperties() }
562
+ private fun checkRoleId (nodeId : Long , role : String? , rolesGetter : (IConcept ) -> Iterable <IRole >) {
563
+ if (role != null && usesRoleIds()) {
564
+ val concept = getConceptReference(nodeId)?.tryResolve()
565
+ if (concept != null && rolesGetter(concept).any { it.getSimpleName() == role }) {
566
+ throw IllegalArgumentException (" A role UID is expected, but a name was provided: $role " )
567
+ }
562
568
}
563
569
}
564
570
565
571
companion object {
566
- var roleNamePattern: Regex = Regex (""" [a-zA-Z]+""" )
572
+ fun builder (store : IDeserializingKeyValueStore ) = Builder (store)
573
+ }
574
+
575
+ class Builder (var store : IDeserializingKeyValueStore ) {
576
+ private var repositoryId: RepositoryId ? = null
577
+ private var useRoleIds: Boolean = false
578
+
579
+ fun useRoleIds (value : Boolean = true): Builder {
580
+ this .useRoleIds = value
581
+ return this
582
+ }
583
+
584
+ fun repositoryId (id : RepositoryId ): Builder {
585
+ this .repositoryId = id
586
+ return this
587
+ }
588
+
589
+ fun repositoryId (id : String ): Builder = repositoryId(RepositoryId (id))
590
+
591
+ fun build (): CLTree {
592
+ return CLTree (
593
+ data = null as CPTree ? ,
594
+ repositoryId_ = repositoryId ? : RepositoryId .random(),
595
+ store_ = store,
596
+ useRoleIds = useRoleIds
597
+ )
598
+ }
567
599
}
568
600
}
0 commit comments