コード例 #1
0
        private async Task <dynamic> DeleteRolesFromGroup(dynamic parameters)
        {
            try
            {
                this.RequiresClaims(AuthorizationWriteClaim);
                var roleIds = this.Bind <List <RoleIdentifierApiRequest> >();
                if (roleIds == null || roleIds.Count == 0)
                {
                    return(CreateFailureResponse("At least 1 role ID is required.", HttpStatusCode.BadRequest));
                }

                var identityProvider = GetQueryParameter("identityProvider");
                var tenantId         = GetQueryParameter("tenantId");

                GroupIdentifier groupIdentifier = CreateGroupIdentifier(SetIdentityProvider(identityProvider), tenantId, parameters.groupName.ToString());
                var             group           = await _groupService.DeleteRolesFromGroup(groupIdentifier, roleIds.Select(r => r.RoleId));

                return(CreateSuccessfulPostResponse(group.ToGroupRoleApiModel(), HttpStatusCode.OK));
            }
            catch (NotFoundException <Group> ex)
            {
                return(CreateFailureResponse(ex.Message, HttpStatusCode.NotFound));
            }
            catch (NotFoundException <Role> ex)
            {
                return(CreateFailureResponse(ex.Message, HttpStatusCode.NotFound));
            }
        }
コード例 #2
0
        private async Task <dynamic> RemoveChildGroups(dynamic parameters)
        {
            try
            {
                var identityProvider = GetQueryParameter("identityProvider");
                var tenantId         = GetQueryParameter("tenantId");

                GroupIdentifier groupIdentifier = CreateGroupIdentifier(SetIdentityProvider(identityProvider), tenantId, parameters.groupName.ToString());
                var             group           = await _groupService.GetGroup(groupIdentifier);
                await CheckWriteAccess(group);

                var childGroupIdentifierApiRequests = this.Bind <List <GroupIdentifierApiRequest> >();

                var childGroupIdentifiers =
                    childGroupIdentifierApiRequests.Select(g => CreateGroupIdentifier(g.ToGroupIdentifierDomainModel()));

                group = await _groupService.RemoveChildGroups(group, childGroupIdentifiers);

                return(CreateSuccessfulPostResponse(group.Name, group.ToGroupRoleApiModel(), HttpStatusCode.OK));
            }
            catch (NotFoundException <Group> ex)
            {
                return(CreateFailureResponse(ex.Message, HttpStatusCode.NotFound));
            }
        }
コード例 #3
0
        public GroupModule(IGroupRepository groups)
        {
            For <StartGroup>()
            .Validate(new StartGroupValidator())
            .Handle(async(envelope, ct) =>
            {
                var groupId = new GroupIdentifier(envelope.Command.GroupId);
                var group   = await groups.TryLoadById(groupId, ct);
                if (group == null)
                {
                    group = Group.Start(
                        groupId,
                        new GroupName(envelope.Command.Name),
                        new GroupAdministratorIdentifier(envelope.Command.AdministratorId));

                    await groups.Save(group, envelope.CommandId, envelope.CorrelationId, envelope.Metadata, ct);
                }
            });

            For <StopGroup>()
            .Validate(new StopGroupValidator())
            .Handle(async(envelope, ct) =>
            {
                var group = await groups.LoadById(new GroupIdentifier(envelope.Command.GroupId), ct);

                group.Stop(new GroupAdministratorIdentifier(envelope.Command.AdministratorId));

                await groups.Save(group, envelope.CommandId, envelope.CorrelationId, envelope.Metadata, ct);
            });
        }
コード例 #4
0
        public async Task <Group> AddRolesToGroup(IList <Role> rolesToAdd, GroupIdentifier groupIdentifier)
        {
            var group = await _groupStore.Get(groupIdentifier);

            var grainSecurableItems = rolesToAdd.Select(r => new Tuple <string, string>(r.Grain, r.SecurableItem))
                                      .Distinct();
            var existingRoles = new List <Role>();

            foreach (var tuple in grainSecurableItems)
            {
                existingRoles.AddRange(await _roleStore.GetRoles(tuple.Item1, tuple.Item2));
            }

            var exceptions = new List <Exception>();

            foreach (var role in rolesToAdd)
            {
                if (existingRoles.All(r => r.Id != role.Id))
                {
                    exceptions.Add(new NotFoundException <Role>($"The role: {role} with Id: {role.Id} could not be found to add to the group."));
                }
                if (group.Roles.Any(r => r.Id == role.Id))
                {
                    exceptions.Add(
                        new AlreadyExistsException <Role>(
                            $"The role: {role} with Id: {role.Id} already exists for group {groupIdentifier.GroupName}."));
                }
            }
            if (exceptions.Count > 0)
            {
                throw new AggregateException("There was an issue adding roles to the group. Please see the inner exception(s) for details.", exceptions);
            }

            return(await _groupStore.AddRolesToGroup(group, rolesToAdd));
        }
コード例 #5
0
        private async Task <dynamic> AddRolesToGroup(dynamic parameters)
        {
            var apiRoles      = this.Bind <List <RoleApiModel> >();
            var errorResponse = await ValidateRoles(apiRoles);

            if (errorResponse != null)
            {
                return(errorResponse);
            }

            var domainRoles = apiRoles.Select(r => r.ToRoleDomainModel()).ToList();

            await CheckWriteAccess(domainRoles);

            try
            {
                var identityProvider = GetQueryParameter("identityProvider");
                var tenantId         = GetQueryParameter("tenantId");

                GroupIdentifier groupIdentifier = CreateGroupIdentifier(SetIdentityProvider(identityProvider), tenantId, parameters.groupName.ToString());
                var             group           = await _groupService.AddRolesToGroup(domainRoles, groupIdentifier);

                return(CreateSuccessfulPostResponse(group.Name, group.ToGroupRoleApiModel(), HttpStatusCode.OK));
            }
            catch (NotFoundException <Group> )
            {
                return(CreateFailureResponse(
                           $"Group with name {parameters.groupName} was not found",
                           HttpStatusCode.NotFound));
            }
            catch (AggregateException ex)
            {
                return(CreateFailureResponse(ex, HttpStatusCode.BadRequest));
            }
        }
コード例 #6
0
        private async Task <dynamic> UpdateGroup(dynamic parameters)
        {
            this.RequiresClaims(AuthorizationWriteClaim);

            try
            {
                var groupPatchApiRequest = this.Bind <GroupPatchApiRequest>();
                var identityProvider     = GetQueryParameter("identityProvider");
                var tenantId             = GetQueryParameter("tenantId");

                GroupIdentifier groupIdentifier = CreateGroupIdentifier(SetIdentityProvider(identityProvider), tenantId, parameters.groupName.ToString());
                var             existingGroup   = await _groupService.GetGroup(groupIdentifier);

                existingGroup.DisplayName = groupPatchApiRequest.DisplayName;
                existingGroup.Description = groupPatchApiRequest.Description;

                var group = await _groupService.UpdateGroup(existingGroup);

                return(CreateSuccessfulPatchResponse(group.ToGroupRoleApiModel()));
            }
            catch (NotFoundException <Group> ex)
            {
                Logger.Error(ex, ex.Message, parameters.groupName);
                return(CreateFailureResponse(ex.Message, HttpStatusCode.NotFound));
            }
        }
コード例 #7
0
        public async Task <Group> GetGroup(GroupIdentifier groupIdentifier, string clientId)
        {
            var group = await _groupStore.Get(groupIdentifier);

            var clientRoles = (await _roleService.GetRoles(clientId)).ToList();

            group.Roles = clientRoles.Intersect(group.Roles).ToList();
            return(group);
        }
コード例 #8
0
        public Task <bool> Exists(GroupIdentifier groupIdentifier)
        {
            var groups = AuthorizationDbContext.Groups
                         .Where(g => !g.IsDeleted &&
                                g.Name == groupIdentifier.GroupName).Select(e => e.ToModel()).ToList();

            return(Task.FromResult(groups.Any(g => g.SourceEquals(GroupConstants.CustomSource) ||
                                              (g.SourceEquals(GroupConstants.DirectorySource) &&
                                               g.IdentityProviderEquals(groupIdentifier.IdentityProvider) &&
                                               g.TenantIdEquals(groupIdentifier.TenantId)))));
        }
コード例 #9
0
        public async Task <Group> AddUsersToGroup(GroupIdentifier groupIdentifier, IList <User> usersToAdd)
        {
            var group = await _groupStore.Get(groupIdentifier);

            var customGroupChildUserWithSameName = (await _groupStore.Get(
                                                        usersToAdd.Select(u => new GroupIdentifier {
                GroupName = u.IdentityProviderUserPrincipalName
            }), true)).ToList();

            if (customGroupChildUserWithSameName.Any())
            {
                throw new AlreadyExistsException <Group>(
                          $"The associated user or group name should not be the same as an existing custom group: {string.Join(", ", customGroupChildUserWithSameName.Select(g => g.Name))}");
            }

            // only add users to a custom group
            if (!string.Equals(group.Source, GroupConstants.CustomSource, StringComparison.OrdinalIgnoreCase))
            {
                throw new BadRequestException <Group>("The group to which you are attempting to add a user is not specified as a 'Custom' group. Only 'Custom' groups allow associations with users.");
            }

            var exceptions = new List <Exception>();

            foreach (var user in usersToAdd)
            {
                if (!group.Users.Any(u =>
                                     string.Equals(u.SubjectId, user.SubjectId, StringComparison.OrdinalIgnoreCase) &&
                                     string.Equals(u.IdentityProvider, user.IdentityProvider, StringComparison.OrdinalIgnoreCase)))
                {
                    try
                    {
                        // check if the user exists in the DB - if not, create it
                        await _userStore.Get($"{user.SubjectId}:{user.IdentityProvider}");
                    }
                    catch (NotFoundException <User> )
                    {
                        await _userStore.Add(new User(user.SubjectId, user.IdentityProvider)
                                             { IdentityProviderUserPrincipalName = user.IdentityProviderUserPrincipalName });
                    }
                }
                else
                {
                    exceptions.Add(new AlreadyExistsException <User>($"The user {user.IdentityProvider}:{user.SubjectId} has already been added to the group {groupIdentifier}."));
                }
            }

            if (exceptions.Count > 0)
            {
                throw new AggregateException("There was an issue adding users to the group. Please see the inner exception(s) for details.", exceptions);
            }

            return(await _groupStore.AddUsersToGroup(group, usersToAdd));
        }
コード例 #10
0
        public async Task <Group> GetGroup(GroupIdentifier groupIdentifier, string clientId)
        {
            var group = await _groupStore.Get(groupIdentifier);

            if (!string.Equals(clientId, AccessControl.ClientId, StringComparison.OrdinalIgnoreCase))
            {
                var clientRoles = (await _roleService.GetRoles(clientId)).ToList();
                group.Roles = clientRoles.Intersect(group.Roles).ToList();
            }

            return(group);
        }
コード例 #11
0
        public async Task <Group> DeleteUserFromGroup(GroupIdentifier groupIdentifier, string subjectId, string identityProvider)
        {
            var group = await _groupStore.Get(groupIdentifier);

            var user = await _userStore.Get($"{subjectId}:{identityProvider}");

            var groupUser = group.Users.FirstOrDefault(u => u.Id == user.Id);

            if (groupUser != null)
            {
                group.Users.Remove(groupUser);
            }

            return(await _groupStore.DeleteUserFromGroup(group, user));
        }
コード例 #12
0
        private async Task <dynamic> AddUsersToGroup(dynamic parameters)
        {
            try
            {
                var identityProvider = GetQueryParameter("identityProvider");
                var tenantId         = GetQueryParameter("tenantId");

                GroupIdentifier groupIdentifier = CreateGroupIdentifier(SetIdentityProvider(identityProvider), tenantId, parameters.groupName.ToString());
                var             group           = await _groupService.GetGroup(groupIdentifier);
                await CheckWriteAccess(group);

                var userApiRequests  = this.Bind <List <UserApiRequest> >();
                var validationResult = await ValidateGroupUserRequests(userApiRequests);

                if (validationResult != null)
                {
                    return(validationResult);
                }

                group = await _groupService.AddUsersToGroup(groupIdentifier, userApiRequests.Select(u => u.ToUserDomainModel()).ToList());

                return(CreateSuccessfulPostResponse(group.Name, group.ToGroupUserApiModel(), HttpStatusCode.OK));
            }
            catch (NotFoundException <Group> ex)
            {
                return(CreateFailureResponse(ex.Message, HttpStatusCode.NotFound));
            }
            catch (NotFoundException <User> ex)
            {
                return(CreateFailureResponse(ex.Message, HttpStatusCode.NotFound));
            }
            catch (BadRequestException <Group> ex)
            {
                return(CreateFailureResponse(ex.Message, HttpStatusCode.BadRequest));
            }
            catch (AggregateException ex)
            {
                return(CreateFailureResponse(ex, HttpStatusCode.BadRequest));
            }
            catch (AlreadyExistsException <Group> ex)
            {
                return(CreateFailureResponse(ex.Message, HttpStatusCode.Conflict));
            }
        }
コード例 #13
0
        private async Task <dynamic> GetChildGroups(dynamic parameters)
        {
            try
            {
                this.RequiresClaims(AuthorizationReadClaim);

                var identityProvider = GetQueryParameter("identityProvider");
                var tenantId         = GetQueryParameter("tenantId");

                GroupIdentifier groupIdentifier = CreateGroupIdentifier(SetIdentityProvider(identityProvider), tenantId, parameters.groupName.ToString());
                var             group           = await _groupService.GetGroup(groupIdentifier, ClientId);

                return(group.Children.Select(g => g.ToGroupRoleApiModel()));
            }
            catch (NotFoundException <Group> ex)
            {
                return(CreateFailureResponse(ex.Message, HttpStatusCode.NotFound));
            }
        }
コード例 #14
0
        private async Task <dynamic> DeleteGroup(dynamic parameters)
        {
            try
            {
                this.RequiresClaims(AuthorizationWriteClaim);

                var identityProvider = GetQueryParameter("identityProvider");
                var tenantId         = GetQueryParameter("tenantId");

                GroupIdentifier groupIdentifier = CreateGroupIdentifier(SetIdentityProvider(identityProvider), tenantId, parameters.groupName.ToString());
                var             group           = await _groupService.GetGroup(groupIdentifier, ClientId);

                await _groupService.DeleteGroup(group);

                return(HttpStatusCode.NoContent);
            }
            catch (NotFoundException <Group> ex)
            {
                return(CreateFailureResponse(ex.Message, HttpStatusCode.NotFound));
            }
        }
コード例 #15
0
        private async Task <dynamic> SyncGroupIdentityRoles(dynamic param)
        {
            CheckInternalAccess();

            var             identityProvider = GetQueryParameter("identityProvider");
            var             tenantId         = GetQueryParameter("tenantId");
            GroupIdentifier groupIdentifier  = CreateGroupIdentifier(SetIdentityProvider(identityProvider), tenantId, param.groupName.ToString());

            try
            {
                var group = await _groupService.GetGroup(groupIdentifier);

                foreach (var groupUser in group.Users)
                {
                    if (groupUser.IdentityProvider.Equals(IdentityConstants.ActiveDirectory, StringComparison.OrdinalIgnoreCase))
                    {
                        try
                        {
                            var user = await _userService.GetUser(groupUser.SubjectId, groupUser.IdentityProvider);

                            await _syncService.RefreshDosAdminRolesAsync(user);
                        }
                        catch (NotFoundException <User> )
                        {
                            return(CreateFailureResponse(
                                       $"The user: {groupUser.SubjectId} for identity provider: {groupUser.IdentityProvider} was not found.",
                                       HttpStatusCode.NotFound));
                        }
                    }
                }

                return(HttpStatusCode.NoContent);
            }
            catch (NotFoundException <Group> )
            {
                return(CreateFailureResponse($"The group: {groupIdentifier} was not found",
                                             HttpStatusCode.NotFound));
            }
        }
コード例 #16
0
ファイル: Frame.cs プロジェクト: ARSFI/TNCKissInterface
            public Int32 Decode(Byte[] buf, Int32 ptr, out String s)
            {
                String r = "";

                formatID = (FormatIdentifier)buf[ptr++];
                groupID  = (GroupIdentifier)buf[ptr++];
                PLVLen   = (buf[ptr++] << 8) | buf[ptr++];

                s = "|" + formatID.ToString() +
                    "|" + groupID.ToString() +
                    "|len:" + PLVLen.ToString();

                while (PLVLen > 0)
                {
                    PLV tmpPLV = new PLV();
                    ptr = tmpPLV.Decode(buf, ptr, out r);
                    s  += r;
                    PLVList.Add(tmpPLV);
                    PLVLen -= (tmpPLV.PL + 2);
                }

                return(ptr);
            }
コード例 #17
0
        public override IDeepCopyable CopyTo(IDeepCopyable other)
        {
            var dest = other as DeviceRequest;

            if (dest == null)
            {
                throw new ArgumentException("Can only copy to an object of the same type", "other");
            }

            base.CopyTo(dest);
            if (Identifier != null)
            {
                dest.Identifier = new List <Hl7.Fhir.Model.Identifier>(Identifier.DeepCopy());
            }
            if (InstantiatesCanonicalElement != null)
            {
                dest.InstantiatesCanonicalElement = new List <Hl7.Fhir.Model.Canonical>(InstantiatesCanonicalElement.DeepCopy());
            }
            if (InstantiatesUriElement != null)
            {
                dest.InstantiatesUriElement = new List <Hl7.Fhir.Model.FhirUri>(InstantiatesUriElement.DeepCopy());
            }
            if (BasedOn != null)
            {
                dest.BasedOn = new List <Hl7.Fhir.Model.ResourceReference>(BasedOn.DeepCopy());
            }
            if (PriorRequest != null)
            {
                dest.PriorRequest = new List <Hl7.Fhir.Model.ResourceReference>(PriorRequest.DeepCopy());
            }
            if (GroupIdentifier != null)
            {
                dest.GroupIdentifier = (Hl7.Fhir.Model.Identifier)GroupIdentifier.DeepCopy();
            }
            if (StatusElement != null)
            {
                dest.StatusElement = (Code <Hl7.Fhir.Model.RequestStatus>)StatusElement.DeepCopy();
            }
            if (IntentElement != null)
            {
                dest.IntentElement = (Code <Hl7.Fhir.Model.RequestIntent>)IntentElement.DeepCopy();
            }
            if (PriorityElement != null)
            {
                dest.PriorityElement = (Code <Hl7.Fhir.Model.RequestPriority>)PriorityElement.DeepCopy();
            }
            if (Code != null)
            {
                dest.Code = (Hl7.Fhir.Model.CodeableReference)Code.DeepCopy();
            }
            if (Parameter != null)
            {
                dest.Parameter = new List <Hl7.Fhir.Model.DeviceRequest.ParameterComponent>(Parameter.DeepCopy());
            }
            if (Subject != null)
            {
                dest.Subject = (Hl7.Fhir.Model.ResourceReference)Subject.DeepCopy();
            }
            if (Encounter != null)
            {
                dest.Encounter = (Hl7.Fhir.Model.ResourceReference)Encounter.DeepCopy();
            }
            if (Occurrence != null)
            {
                dest.Occurrence = (Hl7.Fhir.Model.Element)Occurrence.DeepCopy();
            }
            if (AuthoredOnElement != null)
            {
                dest.AuthoredOnElement = (Hl7.Fhir.Model.FhirDateTime)AuthoredOnElement.DeepCopy();
            }
            if (Requester != null)
            {
                dest.Requester = (Hl7.Fhir.Model.ResourceReference)Requester.DeepCopy();
            }
            if (PerformerType != null)
            {
                dest.PerformerType = (Hl7.Fhir.Model.CodeableConcept)PerformerType.DeepCopy();
            }
            if (Performer != null)
            {
                dest.Performer = (Hl7.Fhir.Model.ResourceReference)Performer.DeepCopy();
            }
            if (Reason != null)
            {
                dest.Reason = new List <Hl7.Fhir.Model.CodeableReference>(Reason.DeepCopy());
            }
            if (Insurance != null)
            {
                dest.Insurance = new List <Hl7.Fhir.Model.ResourceReference>(Insurance.DeepCopy());
            }
            if (SupportingInfo != null)
            {
                dest.SupportingInfo = new List <Hl7.Fhir.Model.ResourceReference>(SupportingInfo.DeepCopy());
            }
            if (Note != null)
            {
                dest.Note = new List <Hl7.Fhir.Model.Annotation>(Note.DeepCopy());
            }
            if (RelevantHistory != null)
            {
                dest.RelevantHistory = new List <Hl7.Fhir.Model.ResourceReference>(RelevantHistory.DeepCopy());
            }
            return(dest);
        }
コード例 #18
0
 public async Task <Group> GetGroup(GroupIdentifier groupIdentifier)
 {
     return(await _groupStore.Get(groupIdentifier));
 }
コード例 #19
0
        public override IDeepCopyable CopyTo(IDeepCopyable other)
        {
            var dest = other as CommunicationRequest;

            if (dest == null)
            {
                throw new ArgumentException("Can only copy to an object of the same type", "other");
            }

            base.CopyTo(dest);
            if (Identifier != null)
            {
                dest.Identifier = new List <Hl7.Fhir.Model.Identifier>(Identifier.DeepCopy());
            }
            if (BasedOn != null)
            {
                dest.BasedOn = new List <Hl7.Fhir.Model.ResourceReference>(BasedOn.DeepCopy());
            }
            if (Replaces != null)
            {
                dest.Replaces = new List <Hl7.Fhir.Model.ResourceReference>(Replaces.DeepCopy());
            }
            if (GroupIdentifier != null)
            {
                dest.GroupIdentifier = (Hl7.Fhir.Model.Identifier)GroupIdentifier.DeepCopy();
            }
            if (StatusElement != null)
            {
                dest.StatusElement = (Code <Hl7.Fhir.Model.RequestStatus>)StatusElement.DeepCopy();
            }
            if (Category != null)
            {
                dest.Category = new List <Hl7.Fhir.Model.CodeableConcept>(Category.DeepCopy());
            }
            if (PriorityElement != null)
            {
                dest.PriorityElement = (Code <Hl7.Fhir.Model.RequestPriority>)PriorityElement.DeepCopy();
            }
            if (Medium != null)
            {
                dest.Medium = new List <Hl7.Fhir.Model.CodeableConcept>(Medium.DeepCopy());
            }
            if (Subject != null)
            {
                dest.Subject = (Hl7.Fhir.Model.ResourceReference)Subject.DeepCopy();
            }
            if (Recipient != null)
            {
                dest.Recipient = new List <Hl7.Fhir.Model.ResourceReference>(Recipient.DeepCopy());
            }
            if (Topic != null)
            {
                dest.Topic = new List <Hl7.Fhir.Model.ResourceReference>(Topic.DeepCopy());
            }
            if (Context != null)
            {
                dest.Context = (Hl7.Fhir.Model.ResourceReference)Context.DeepCopy();
            }
            if (Payload != null)
            {
                dest.Payload = new List <Hl7.Fhir.Model.CommunicationRequest.PayloadComponent>(Payload.DeepCopy());
            }
            if (Occurrence != null)
            {
                dest.Occurrence = (Hl7.Fhir.Model.Element)Occurrence.DeepCopy();
            }
            if (AuthoredOnElement != null)
            {
                dest.AuthoredOnElement = (Hl7.Fhir.Model.FhirDateTime)AuthoredOnElement.DeepCopy();
            }
            if (Sender != null)
            {
                dest.Sender = (Hl7.Fhir.Model.ResourceReference)Sender.DeepCopy();
            }
            if (Requester != null)
            {
                dest.Requester = (Hl7.Fhir.Model.CommunicationRequest.RequesterComponent)Requester.DeepCopy();
            }
            if (ReasonCode != null)
            {
                dest.ReasonCode = new List <Hl7.Fhir.Model.CodeableConcept>(ReasonCode.DeepCopy());
            }
            if (ReasonReference != null)
            {
                dest.ReasonReference = new List <Hl7.Fhir.Model.ResourceReference>(ReasonReference.DeepCopy());
            }
            if (Note != null)
            {
                dest.Note = new List <Hl7.Fhir.Model.Annotation>(Note.DeepCopy());
            }
            return(dest);
        }
コード例 #20
0
        public async Task <Group> Get(GroupIdentifier groupIdentifier)
        {
            var groupEntities = AuthorizationDbContext.Groups
                                .Include(g => g.GroupRoles)
                                .ThenInclude(gr => gr.Role)
                                .ThenInclude(r => r.RolePermissions)
                                .ThenInclude(rp => rp.Permission)
                                .ThenInclude(p => p.SecurableItem)
                                .Include(g => g.GroupUsers)
                                .ThenInclude(gu => gu.User)
                                .ThenInclude(u => u.UserPermissions)
                                .ThenInclude(up => up.Permission)
                                .Include(g => g.GroupRoles)
                                .ThenInclude(gr => gr.Role)
                                .ThenInclude(r => r.SecurableItem)
                                .Include(g => g.ParentGroups)
                                .ThenInclude(cg => cg.Parent)
                                .Include(g => g.ChildGroups)
                                .ThenInclude(cg => cg.Child)
                                .ThenInclude(cg => cg.GroupRoles)
                                .ThenInclude(gr => gr.Role)
                                .AsNoTracking()
                                .Where(g => !g.IsDeleted && g.Name == groupIdentifier.GroupName)
                                .ToList();

            EntityModels.Group groupEntity = null;
            if (groupEntities.Count == 0)
            {
                throw new NotFoundException <Group>($"Could not find {typeof(Group).Name} entity with Identifier {groupIdentifier}");
            }

            if (groupEntities.Count == 1)
            {
                if (string.Equals(groupEntities[0].Source, GroupConstants.CustomSource, StringComparison.OrdinalIgnoreCase))
                {
                    groupEntity = groupEntities[0];
                }
                else
                {
                    groupEntity = groupEntities.FirstOrDefault(g =>
                                                               string.Equals(g.IdentityProvider, groupIdentifier.IdentityProvider, StringComparison.OrdinalIgnoreCase) &&
                                                               string.Equals(g.TenantId, groupIdentifier.TenantId, StringComparison.OrdinalIgnoreCase));
                }
            }
            else
            {
                if (!string.IsNullOrWhiteSpace(groupIdentifier.TenantId))
                {
                    groupEntity = groupEntities.FirstOrDefault(g =>
                                                               string.Equals(g.IdentityProvider, groupIdentifier.IdentityProvider, StringComparison.OrdinalIgnoreCase) &&
                                                               string.Equals(g.TenantId, groupIdentifier.TenantId, StringComparison.OrdinalIgnoreCase));
                }
                else
                {
                    groupEntity = groupEntities.FirstOrDefault(g =>
                                                               string.Equals(g.Source, GroupConstants.CustomSource, StringComparison.OrdinalIgnoreCase) ||
                                                               (string.Equals(g.IdentityProvider, groupIdentifier.IdentityProvider, StringComparison.OrdinalIgnoreCase) &&
                                                                string.Equals(g.TenantId, groupIdentifier.TenantId, StringComparison.OrdinalIgnoreCase)));
                }
            }

            if (groupEntity == null)
            {
                throw new NotFoundException <Group>($"Could not find {typeof(Group).Name} entity with Identifier {groupIdentifier}");
            }

            groupEntity.GroupRoles = groupEntity.GroupRoles.Where(gr => !gr.IsDeleted).ToList();
            foreach (var groupRole in groupEntity.GroupRoles)
            {
                groupRole.Role.RolePermissions = groupRole.Role.RolePermissions.Where(rp => !rp.IsDeleted).ToList();
            }

            groupEntity.GroupUsers = groupEntity.GroupUsers.Where(gu => !gu.IsDeleted).ToList();
            foreach (var groupUser in groupEntity.GroupUsers)
            {
                groupUser.User.UserPermissions = groupUser.User.UserPermissions.Where(up => !up.IsDeleted).ToList();
            }

            groupEntity.ChildGroups  = groupEntity.ChildGroups.Where(cg => !cg.IsDeleted).ToList();
            groupEntity.ParentGroups = groupEntity.ParentGroups.Where(pg => !pg.IsDeleted).ToList();

            return(groupEntity.ToModel());
        }
コード例 #21
0
        public async Task <Group> DeleteRolesFromGroup(GroupIdentifier groupIdentifier, IEnumerable <Guid> roleIdsToDelete)
        {
            var group = await _groupStore.Get(groupIdentifier);

            return(await _groupStore.DeleteRolesFromGroup(group, roleIdsToDelete));
        }
コード例 #22
0
        public override IDeepCopyable CopyTo(IDeepCopyable other)
        {
            var dest = other as ReferralRequest;

            if (dest == null)
            {
                throw new ArgumentException("Can only copy to an object of the same type", "other");
            }

            base.CopyTo(dest);
            if (Identifier != null)
            {
                dest.Identifier = new List <Hl7.Fhir.Model.Identifier>(Identifier.DeepCopy());
            }
            if (Definition != null)
            {
                dest.Definition = new List <Hl7.Fhir.Model.ResourceReference>(Definition.DeepCopy());
            }
            if (BasedOn != null)
            {
                dest.BasedOn = new List <Hl7.Fhir.Model.ResourceReference>(BasedOn.DeepCopy());
            }
            if (Replaces != null)
            {
                dest.Replaces = new List <Hl7.Fhir.Model.ResourceReference>(Replaces.DeepCopy());
            }
            if (GroupIdentifier != null)
            {
                dest.GroupIdentifier = (Hl7.Fhir.Model.Identifier)GroupIdentifier.DeepCopy();
            }
            if (StatusElement != null)
            {
                dest.StatusElement = (Code <Hl7.Fhir.Model.RequestStatus>)StatusElement.DeepCopy();
            }
            if (IntentElement != null)
            {
                dest.IntentElement = (Code <Hl7.Fhir.Model.RequestIntent>)IntentElement.DeepCopy();
            }
            if (Type != null)
            {
                dest.Type = (Hl7.Fhir.Model.CodeableConcept)Type.DeepCopy();
            }
            if (PriorityElement != null)
            {
                dest.PriorityElement = (Code <Hl7.Fhir.Model.RequestPriority>)PriorityElement.DeepCopy();
            }
            if (ServiceRequested != null)
            {
                dest.ServiceRequested = new List <Hl7.Fhir.Model.CodeableConcept>(ServiceRequested.DeepCopy());
            }
            if (Subject != null)
            {
                dest.Subject = (Hl7.Fhir.Model.ResourceReference)Subject.DeepCopy();
            }
            if (Context != null)
            {
                dest.Context = (Hl7.Fhir.Model.ResourceReference)Context.DeepCopy();
            }
            if (Occurrence != null)
            {
                dest.Occurrence = (Hl7.Fhir.Model.Element)Occurrence.DeepCopy();
            }
            if (AuthoredOnElement != null)
            {
                dest.AuthoredOnElement = (Hl7.Fhir.Model.FhirDateTime)AuthoredOnElement.DeepCopy();
            }
            if (Requester != null)
            {
                dest.Requester = (Hl7.Fhir.Model.ReferralRequest.RequesterComponent)Requester.DeepCopy();
            }
            if (Specialty != null)
            {
                dest.Specialty = (Hl7.Fhir.Model.CodeableConcept)Specialty.DeepCopy();
            }
            if (Recipient != null)
            {
                dest.Recipient = new List <Hl7.Fhir.Model.ResourceReference>(Recipient.DeepCopy());
            }
            if (ReasonCode != null)
            {
                dest.ReasonCode = new List <Hl7.Fhir.Model.CodeableConcept>(ReasonCode.DeepCopy());
            }
            if (ReasonReference != null)
            {
                dest.ReasonReference = new List <Hl7.Fhir.Model.ResourceReference>(ReasonReference.DeepCopy());
            }
            if (DescriptionElement != null)
            {
                dest.DescriptionElement = (Hl7.Fhir.Model.FhirString)DescriptionElement.DeepCopy();
            }
            if (SupportingInfo != null)
            {
                dest.SupportingInfo = new List <Hl7.Fhir.Model.ResourceReference>(SupportingInfo.DeepCopy());
            }
            if (Note != null)
            {
                dest.Note = new List <Hl7.Fhir.Model.Annotation>(Note.DeepCopy());
            }
            if (RelevantHistory != null)
            {
                dest.RelevantHistory = new List <Hl7.Fhir.Model.ResourceReference>(RelevantHistory.DeepCopy());
            }
            return(dest);
        }
コード例 #23
0
        /// <summary>
        /// Serialize to a JSON object
        /// </summary>
        public new void SerializeJson(Utf8JsonWriter writer, JsonSerializerOptions options, bool includeStartObject = true)
        {
            if (includeStartObject)
            {
                writer.WriteStartObject();
            }

            if (!string.IsNullOrEmpty(ResourceType))
            {
                writer.WriteString("resourceType", (string)ResourceType !);
            }


            ((Fhir.R4.Models.DomainResource) this).SerializeJson(writer, options, false);

            if ((Identifier != null) && (Identifier.Count != 0))
            {
                writer.WritePropertyName("identifier");
                writer.WriteStartArray();

                foreach (Identifier valIdentifier in Identifier)
                {
                    valIdentifier.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if ((BasedOn != null) && (BasedOn.Count != 0))
            {
                writer.WritePropertyName("basedOn");
                writer.WriteStartArray();

                foreach (Reference valBasedOn in BasedOn)
                {
                    valBasedOn.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if ((Replaces != null) && (Replaces.Count != 0))
            {
                writer.WritePropertyName("replaces");
                writer.WriteStartArray();

                foreach (Reference valReplaces in Replaces)
                {
                    valReplaces.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if (GroupIdentifier != null)
            {
                writer.WritePropertyName("groupIdentifier");
                GroupIdentifier.SerializeJson(writer, options);
            }

            if (!string.IsNullOrEmpty(Status))
            {
                writer.WriteString("status", (string)Status !);
            }

            if (_Status != null)
            {
                writer.WritePropertyName("_status");
                _Status.SerializeJson(writer, options);
            }

            if (StatusReason != null)
            {
                writer.WritePropertyName("statusReason");
                StatusReason.SerializeJson(writer, options);
            }

            if ((Category != null) && (Category.Count != 0))
            {
                writer.WritePropertyName("category");
                writer.WriteStartArray();

                foreach (CodeableConcept valCategory in Category)
                {
                    valCategory.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if (!string.IsNullOrEmpty(Priority))
            {
                writer.WriteString("priority", (string)Priority !);
            }

            if (_Priority != null)
            {
                writer.WritePropertyName("_priority");
                _Priority.SerializeJson(writer, options);
            }

            if (DoNotPerform != null)
            {
                writer.WriteBoolean("doNotPerform", (bool)DoNotPerform !);
            }

            if ((Medium != null) && (Medium.Count != 0))
            {
                writer.WritePropertyName("medium");
                writer.WriteStartArray();

                foreach (CodeableConcept valMedium in Medium)
                {
                    valMedium.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if (Subject != null)
            {
                writer.WritePropertyName("subject");
                Subject.SerializeJson(writer, options);
            }

            if ((About != null) && (About.Count != 0))
            {
                writer.WritePropertyName("about");
                writer.WriteStartArray();

                foreach (Reference valAbout in About)
                {
                    valAbout.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if (Encounter != null)
            {
                writer.WritePropertyName("encounter");
                Encounter.SerializeJson(writer, options);
            }

            if ((Payload != null) && (Payload.Count != 0))
            {
                writer.WritePropertyName("payload");
                writer.WriteStartArray();

                foreach (CommunicationRequestPayload valPayload in Payload)
                {
                    valPayload.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if (!string.IsNullOrEmpty(OccurrenceDateTime))
            {
                writer.WriteString("occurrenceDateTime", (string)OccurrenceDateTime !);
            }

            if (_OccurrenceDateTime != null)
            {
                writer.WritePropertyName("_occurrenceDateTime");
                _OccurrenceDateTime.SerializeJson(writer, options);
            }

            if (OccurrencePeriod != null)
            {
                writer.WritePropertyName("occurrencePeriod");
                OccurrencePeriod.SerializeJson(writer, options);
            }

            if (!string.IsNullOrEmpty(AuthoredOn))
            {
                writer.WriteString("authoredOn", (string)AuthoredOn !);
            }

            if (_AuthoredOn != null)
            {
                writer.WritePropertyName("_authoredOn");
                _AuthoredOn.SerializeJson(writer, options);
            }

            if (Requester != null)
            {
                writer.WritePropertyName("requester");
                Requester.SerializeJson(writer, options);
            }

            if ((Recipient != null) && (Recipient.Count != 0))
            {
                writer.WritePropertyName("recipient");
                writer.WriteStartArray();

                foreach (Reference valRecipient in Recipient)
                {
                    valRecipient.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if (Sender != null)
            {
                writer.WritePropertyName("sender");
                Sender.SerializeJson(writer, options);
            }

            if ((ReasonCode != null) && (ReasonCode.Count != 0))
            {
                writer.WritePropertyName("reasonCode");
                writer.WriteStartArray();

                foreach (CodeableConcept valReasonCode in ReasonCode)
                {
                    valReasonCode.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if ((ReasonReference != null) && (ReasonReference.Count != 0))
            {
                writer.WritePropertyName("reasonReference");
                writer.WriteStartArray();

                foreach (Reference valReasonReference in ReasonReference)
                {
                    valReasonReference.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if ((Note != null) && (Note.Count != 0))
            {
                writer.WritePropertyName("note");
                writer.WriteStartArray();

                foreach (Annotation valNote in Note)
                {
                    valNote.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if (includeStartObject)
            {
                writer.WriteEndObject();
            }
        }
コード例 #24
0
        /// <summary>
        /// Serialize to a JSON object
        /// </summary>
        public new void SerializeJson(Utf8JsonWriter writer, JsonSerializerOptions options, bool includeStartObject = true)
        {
            if (includeStartObject)
            {
                writer.WriteStartObject();
            }
            if (!string.IsNullOrEmpty(ResourceType))
            {
                writer.WriteString("resourceType", (string)ResourceType !);
            }


            ((fhirCsR4.Models.DomainResource) this).SerializeJson(writer, options, false);

            if ((Identifier != null) && (Identifier.Count != 0))
            {
                writer.WritePropertyName("identifier");
                writer.WriteStartArray();

                foreach (Identifier valIdentifier in Identifier)
                {
                    valIdentifier.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if ((InstantiatesCanonical != null) && (InstantiatesCanonical.Count != 0))
            {
                writer.WritePropertyName("instantiatesCanonical");
                writer.WriteStartArray();

                foreach (string valInstantiatesCanonical in InstantiatesCanonical)
                {
                    writer.WriteStringValue(valInstantiatesCanonical);
                }

                writer.WriteEndArray();
            }

            if ((_InstantiatesCanonical != null) && (_InstantiatesCanonical.Count != 0))
            {
                writer.WritePropertyName("_instantiatesCanonical");
                writer.WriteStartArray();

                foreach (Element val_InstantiatesCanonical in _InstantiatesCanonical)
                {
                    val_InstantiatesCanonical.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if ((InstantiatesUri != null) && (InstantiatesUri.Count != 0))
            {
                writer.WritePropertyName("instantiatesUri");
                writer.WriteStartArray();

                foreach (string valInstantiatesUri in InstantiatesUri)
                {
                    writer.WriteStringValue(valInstantiatesUri);
                }

                writer.WriteEndArray();
            }

            if ((_InstantiatesUri != null) && (_InstantiatesUri.Count != 0))
            {
                writer.WritePropertyName("_instantiatesUri");
                writer.WriteStartArray();

                foreach (Element val_InstantiatesUri in _InstantiatesUri)
                {
                    val_InstantiatesUri.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if ((BasedOn != null) && (BasedOn.Count != 0))
            {
                writer.WritePropertyName("basedOn");
                writer.WriteStartArray();

                foreach (Reference valBasedOn in BasedOn)
                {
                    valBasedOn.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if ((PriorRequest != null) && (PriorRequest.Count != 0))
            {
                writer.WritePropertyName("priorRequest");
                writer.WriteStartArray();

                foreach (Reference valPriorRequest in PriorRequest)
                {
                    valPriorRequest.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if (GroupIdentifier != null)
            {
                writer.WritePropertyName("groupIdentifier");
                GroupIdentifier.SerializeJson(writer, options);
            }

            if (!string.IsNullOrEmpty(Status))
            {
                writer.WriteString("status", (string)Status !);
            }

            if (_Status != null)
            {
                writer.WritePropertyName("_status");
                _Status.SerializeJson(writer, options);
            }

            if (!string.IsNullOrEmpty(Intent))
            {
                writer.WriteString("intent", (string)Intent !);
            }

            if (_Intent != null)
            {
                writer.WritePropertyName("_intent");
                _Intent.SerializeJson(writer, options);
            }

            if (!string.IsNullOrEmpty(Priority))
            {
                writer.WriteString("priority", (string)Priority !);
            }

            if (_Priority != null)
            {
                writer.WritePropertyName("_priority");
                _Priority.SerializeJson(writer, options);
            }

            if (CodeReference != null)
            {
                writer.WritePropertyName("codeReference");
                CodeReference.SerializeJson(writer, options);
            }

            if (CodeCodeableConcept != null)
            {
                writer.WritePropertyName("codeCodeableConcept");
                CodeCodeableConcept.SerializeJson(writer, options);
            }

            if ((Parameter != null) && (Parameter.Count != 0))
            {
                writer.WritePropertyName("parameter");
                writer.WriteStartArray();

                foreach (DeviceRequestParameter valParameter in Parameter)
                {
                    valParameter.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if (Subject != null)
            {
                writer.WritePropertyName("subject");
                Subject.SerializeJson(writer, options);
            }

            if (Encounter != null)
            {
                writer.WritePropertyName("encounter");
                Encounter.SerializeJson(writer, options);
            }

            if (!string.IsNullOrEmpty(OccurrenceDateTime))
            {
                writer.WriteString("occurrenceDateTime", (string)OccurrenceDateTime !);
            }

            if (_OccurrenceDateTime != null)
            {
                writer.WritePropertyName("_occurrenceDateTime");
                _OccurrenceDateTime.SerializeJson(writer, options);
            }

            if (OccurrencePeriod != null)
            {
                writer.WritePropertyName("occurrencePeriod");
                OccurrencePeriod.SerializeJson(writer, options);
            }

            if (OccurrenceTiming != null)
            {
                writer.WritePropertyName("occurrenceTiming");
                OccurrenceTiming.SerializeJson(writer, options);
            }

            if (!string.IsNullOrEmpty(AuthoredOn))
            {
                writer.WriteString("authoredOn", (string)AuthoredOn !);
            }

            if (_AuthoredOn != null)
            {
                writer.WritePropertyName("_authoredOn");
                _AuthoredOn.SerializeJson(writer, options);
            }

            if (Requester != null)
            {
                writer.WritePropertyName("requester");
                Requester.SerializeJson(writer, options);
            }

            if (PerformerType != null)
            {
                writer.WritePropertyName("performerType");
                PerformerType.SerializeJson(writer, options);
            }

            if (Performer != null)
            {
                writer.WritePropertyName("performer");
                Performer.SerializeJson(writer, options);
            }

            if ((ReasonCode != null) && (ReasonCode.Count != 0))
            {
                writer.WritePropertyName("reasonCode");
                writer.WriteStartArray();

                foreach (CodeableConcept valReasonCode in ReasonCode)
                {
                    valReasonCode.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if ((ReasonReference != null) && (ReasonReference.Count != 0))
            {
                writer.WritePropertyName("reasonReference");
                writer.WriteStartArray();

                foreach (Reference valReasonReference in ReasonReference)
                {
                    valReasonReference.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if ((Insurance != null) && (Insurance.Count != 0))
            {
                writer.WritePropertyName("insurance");
                writer.WriteStartArray();

                foreach (Reference valInsurance in Insurance)
                {
                    valInsurance.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if ((SupportingInfo != null) && (SupportingInfo.Count != 0))
            {
                writer.WritePropertyName("supportingInfo");
                writer.WriteStartArray();

                foreach (Reference valSupportingInfo in SupportingInfo)
                {
                    valSupportingInfo.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if ((Note != null) && (Note.Count != 0))
            {
                writer.WritePropertyName("note");
                writer.WriteStartArray();

                foreach (Annotation valNote in Note)
                {
                    valNote.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if ((RelevantHistory != null) && (RelevantHistory.Count != 0))
            {
                writer.WritePropertyName("relevantHistory");
                writer.WriteStartArray();

                foreach (Reference valRelevantHistory in RelevantHistory)
                {
                    valRelevantHistory.SerializeJson(writer, options, true);
                }

                writer.WriteEndArray();
            }

            if (includeStartObject)
            {
                writer.WriteEndObject();
            }
        }
コード例 #25
0
ファイル: ListSection.cs プロジェクト: CecleCW/ProductMan
        /// <summary>
        /// Returns the number of items in the list adjusted for the group items.
        /// This method will also create a bit array of types <seealso cref="_positionTypes"/>
        /// </summary>
        /// <returns></returns>
        private int CalculateListItems()
        {
            using( new EnforceLazyLayout( this ) )
            {
                if( _rowInformation == null )
                {
                    PositionedRowIdentifier[] trackableItems = new PositionedRowIdentifier[3];
                    trackableItems[0] = _focusedItem;

                    if( _lastCalculatedRowInformation != null )
                    {
                        if( FocusedItem != null )
                        {
                            if( LineStart < _lastCalculatedRowInformation.Count )
                            {
                                trackableItems[1] = new PositionedRowIdentifier( _lastCalculatedRowInformation[LineStart], LineStart );
                            }
                            RowIdentifier nextValidRow = locateNearestRowThatsStillValid( FocusedItem, ItemList, _lastCalculatedRowInformation );
                            if( nextValidRow != null )
                            {
                                trackableItems[2] = new PositionedRowIdentifier( nextValidRow, 0 );
                            }
                        }
                    }

                    Column[] groupColumns = ListControl.Columns.GroupedItems.ToArray();
                    object lastItem = null;
                    _lastCalculatedRowInformation = _rowInformation = new List<RowIdentifier>( ItemList.Count );
                    int hideRowGroupIndex = -1;
                    List<PositionedRowIdentifier> newSelection = new List<PositionedRowIdentifier>();

                    GroupIdentifier[] activeGroups = new GroupIdentifier[groupColumns.Length];
                    object[] listItems = ItemList.ToArray();
                    for( int i = 0; i < ItemList.Count; i++ )
                    {
                        object item = ItemList[i];

                        int groupIndex = ItemInNewGroup( groupColumns, item, lastItem );
                        if( groupIndex != -1 )
                        {
                            for( int iGroup = groupIndex; iGroup < groupColumns.Length; iGroup++ )
                            {
                                GroupIdentifier gi = new GroupIdentifier( i, listItems, Columns, iGroup, item );
                                int hideGroupIndex = hideRowGroupIndex;
                                if( hideRowGroupIndex == -1 || iGroup <= hideRowGroupIndex )
                                {
                                    if( GetGroupState( gi ) == GroupState.Collapsed )
                                    {
                                        hideGroupIndex = iGroup;
                                        if( groupIndex <= hideRowGroupIndex )
                                        {
                                            hideRowGroupIndex = -1;
                                        }
                                    }
                                    else
                                    {
                                        hideRowGroupIndex = hideGroupIndex = -1;
                                    }
                                }

                                if( hideRowGroupIndex == -1 )
                                {
                                    HandleSyncing( gi, _rowInformation.Count, trackableItems, newSelection );
                                    _rowInformation.Add( gi );
                                }
                                if( activeGroups[iGroup] != null )
                                {
                                    activeGroups[iGroup].End = i;
                                }
                                activeGroups[iGroup] = gi;
                                hideRowGroupIndex = hideGroupIndex;
                            }
                        }
                        if( hideRowGroupIndex == -1 )
                        {
                            RowIdentifier ri = new NonGroupRow( item );
                            HandleSyncing( ri, _rowInformation.Count, trackableItems, newSelection );
                            _rowInformation.Add( ri );
                        }
                        lastItem = item;
                    }

                    foreach( GroupIdentifier gi in activeGroups )
                    {
                        if( gi != null )
                        {
                            gi.End = ItemList.Count;
                        }
                    }
                    if( VerticalScrollbarVisible )
                    {
                        int newMax = _rowInformation.Count == 0 ? 0 : _rowInformation.Count - 1;
                        if( VScrollbar.Value >= newMax )
                        {
                            VScrollbar.Value = newMax;
                        }
                        VScrollbar.Maximum = newMax;
                    }

                    if( trackableItems[1] != null )
                    {
                        LineStart = trackableItems[1].Position;
                    }
                    if( _focusedItem != null && !IsSelectedItemValid( _focusedItem ) )
                    {
                        if( trackableItems[2] != null && IsSelectedItemValid( trackableItems[2] ) )
                        {
                            PositionedRowIdentifier oldFocusedItem = _focusedItem;
                            if( _focusedItem != trackableItems[2] )
                            {
                                _focusedItem = trackableItems[2];
                                ListControl.FireFocusChanged( oldFocusedItem == null ? null : oldFocusedItem.RowIdentifier,
                                                                                         _focusedItem == null ? null : _focusedItem.RowIdentifier );
                            }
                            newSelection.Add( _focusedItem );
                        }
                        else
                        {
                            int newPosition;
                            if( _focusedItem.Position >= _rowInformation.Count )
                            {
                                newPosition = _rowInformation.Count - 1;
                            }
                            else
                            {
                                newPosition = _focusedItem.Position;
                            }
                            if( newPosition >= 0 )
                            {
                                PositionedRowIdentifier si = new PositionedRowIdentifier( _rowInformation[newPosition], newPosition );
                                FocusedItem = si;
                                newSelection.Add( _focusedItem );
                            }
                            else
                            {
                                FocusedItem = null;
                            }
                        }
                    }
                    RowIdentifier[] rowItemsToSelect = new RowIdentifier[newSelection.Count];
                    int j = 0;
                    foreach( PositionedRowIdentifier pri in newSelection )
                    {
                        rowItemsToSelect[j++] = pri.RowIdentifier;
                    }
                    SelectedItems.ClearAndAdd( rowItemsToSelect );
                    if( SelectedItems.Count == 0 && FocusedItem == null && VScrollbar != null && VScrollbar.Visible )
                    {
                        VScrollbar.Value = 0;
                    }
                }
                _mapOfPositions = null;
            }
            ListControl.OnCalculatedGroupRows( EventArgs.Empty );
            return _rowInformation.Count;
        }
コード例 #26
0
 protected GroupIdentifier CreateGroupIdentifier(GroupIdentifier groupIdentifier)
 {
     groupIdentifier.IdentityProvider = SetIdentityProvider(groupIdentifier.IdentityProvider);
     return(groupIdentifier);
 }