Beispiel #1
0
        /// <summary>
        /// Write role permissions
        /// </summary>
        /// <param name="model"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        private async Task WriteRolePermissionsAsync(BaseNodeVertexModel model, DataValue value)
        {
            var rolePermissions = value.GetValueOrDefault <RolePermissionTypeCollection>();

            if (rolePermissions != null)
            {
                foreach (var permission in rolePermissions)
                {
                    var roleId = permission.RoleId.AsString(_codec.Context);
                    await _loader.AddEdgeAsync(model,
                                               new RolePermissionEdgeModel {
                        Id          = _source.CreateEdgeId(model.NodeId, roleId),
                        SourceId    = _source.Id,
                        Revision    = _revision,
                        Permissions = ((PermissionType)permission.Permissions).ToServiceType()
                    }, _source.CreateVertexId(roleId),
                                               AddressSpaceElementNames.Variable, roleId);
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Write reference. Since the stream contains forward and backward
        /// references we will write at least the reference vertex and
        /// reference type edge twice.
        /// </summary>
        /// <param name="vertex"></param>
        /// <param name="reference"></param>
        /// <returns></returns>
        private async Task WriteReferenceAsync(BaseNodeVertexModel vertex,
                                               IReference reference)
        {
            var originId = vertex.NodeId;
            var typeId   = reference.ReferenceTypeId.AsString(_codec.Context);
            var targetId = reference.TargetId.AsString(_codec.Context);

            // Create address space reference node
            var rid = AddressSpaceEx.CreateAddressSpaceReferenceNodeId(
                reference.IsInverse, originId, typeId, targetId);
            var referenceVertex = new ReferenceNodeVertexModel {
                SourceId        = _source.Id,
                OriginId        = reference.IsInverse ? targetId : originId,
                ReferenceTypeId = typeId,
                TargetId        = reference.IsInverse ? originId : targetId,
                Revision        = _revision,
                NodeId          = rid,
                Id = _source.CreateVertexId(rid)
            };

            // 1. Add the edge to the vertex
            if (reference.IsInverse)
            {
                await _loader.AddEdgeAsync(referenceVertex,
                                           new TargetEdgeModel {
                    Id       = _source.CreateEdgeId(rid, targetId),
                    Revision = _revision,
                    SourceId = _source.Id
                }, vertex);
            }
            else
            {
                await _loader.AddEdgeAsync(referenceVertex,
                                           new OriginEdgeModel {
                    Id       = _source.CreateEdgeId(rid, originId),
                    Revision = _revision,
                    SourceId = _source.Id
                }, vertex);
            }

            // TODO: Should we?  This could be dangling...

            // 2. Add reference type edge
            await _loader.AddEdgeAsync(referenceVertex,
                                       new ReferenceTypeEdgeModel {
                Id       = _source.CreateEdgeId(rid, typeId),
                Revision = _revision,
                SourceId = _source.Id
            }, _source.CreateVertexId(typeId),
                                       AddressSpaceElementNames.ReferenceType, typeId);

            // 3. Add reference vertex
            await _loader.AddVertexAsync(referenceVertex);

            await _loader.AddEdgeAsync(referenceVertex,
                                       new AddressSpaceSourceEdgeModel {
                Id       = _source.CreateEdgeId(rid, _source.Id),
                Revision = _revision,
                SourceId = _source.Id
            }, _source);
        }