示例#1
0
        protected override void InternalHasValidationResult(EntityValidationFacade validationFacade, KeyValuePair <string, List <dynamic> > properties)
        {
            // If there are already critical errors that apply to the property, no further validation is performed.
            if (properties.Value == null ||
                validationFacade.ValidationResults.Any(v => v.Node == validationFacade.RequestResource.Id &&
                                                       v.Path == properties.Key && v.ResultSeverity == ValidationResultSeverity.Violation))
            {
                return;
            }

            foreach (var propertyValue in properties.Value)
            {
                if (propertyValue is Entity propertyEntity)
                {
                    if (!_attachmentService.Exists(propertyEntity.Id.ToString()))
                    {
                        var validationResultProperty = new ValidationResultProperty(validationFacade.RequestResource.Id,
                                                                                    properties.Key, propertyEntity.Id,
                                                                                    string.Format(Common.Constants.Messages.Attachment.NotExists, propertyEntity.Id),
                                                                                    ValidationResultSeverity.Violation);

                        validationFacade.ValidationResults.Add(validationResultProperty);
                    }
                }
            }
            ;
        }
        private IList <ValidationResultProperty> CheckDuplicatesInRepository(Entity resource, string resourceId, string previousVersion)
        {
            var duplicateErrors = new List <ValidationResultProperty>();

            var pidUriResults    = GetDuplicateResultsByIdentifierType(Graph.Metadata.Constants.EnterpriseCore.PidUri, resource, out var pidUri);
            var baseUriResults   = GetDuplicateResultsByIdentifierType(Graph.Metadata.Constants.Resource.BaseUri, resource, out var baseUri);
            var targetUriResults = GetDuplicateResultsByTargetUri(resource, out var targetUri);

            // allow the pidURI to be duplicate when changing resource type
            if (pidUri != null && pidUri != string.Empty)
            {
                if (pidUriResults.Count == 2 && pidUriResults[0].Type != pidUriResults[1].Type && resource.Id != null)
                {
                    pidUriResults.Clear();
                }
            }

            // TODO: Piduri has no entry then duplicate, or if entry/entryDraft is not actual resource
            if (CheckIdentifierIsDuplicate(pidUriResults, resource, resourceId, out bool orphanedPid))
            {
                var message = orphanedPid ? Common.Constants.Validation.DuplicateFieldOrphaned : Common.Constants.Validation.DuplicateField;
                var pidUriValidationResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.EnterpriseCore.PidUri, pidUri, message, ValidationResultSeverity.Violation, ValidationResultPropertyType.DUPLICATE);
                duplicateErrors.Add(pidUriValidationResult);
            }

            if (CheckBaseUriIsDuplicate(baseUriResults, resource, resourceId, pidUri, previousVersion, out bool orphanedBaseUri))
            {
                var message = orphanedBaseUri ? Common.Constants.Validation.DuplicateFieldOrphaned : Common.Constants.Validation.DuplicateField;
                var baseUriValidatioResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.Resource.BaseUri, baseUri, message, ValidationResultSeverity.Violation, ValidationResultPropertyType.DUPLICATE, null);
                duplicateErrors.Add(baseUriValidatioResult);
            }

            if (CheckIdentifierIsDuplicate(targetUriResults, resource, resourceId, out _))
            {
                var targetUriValidationResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.Resource.DistributionEndpoints.HasNetworkAddress, targetUri, Common.Constants.Validation.DuplicateField, ValidationResultSeverity.Info, ValidationResultPropertyType.DUPLICATE);
                duplicateErrors.Add(targetUriValidationResult);
            }

            foreach (var property in resource.Properties)
            {
                // TODO: Check metadata property type is permanent identifier
                if (property.Key != Graph.Metadata.Constants.EnterpriseCore.PidUri && property.Key != Graph.Metadata.Constants.Resource.BaseUri)
                {
                    foreach (var prop in property.Value)
                    {
                        if (DynamicExtension.IsType <Entity>(prop, out Entity entity))
                        {
                            duplicateErrors.AddRange(CheckDuplicatesInRepository(entity, resourceId, string.Empty));
                        }
                    }
                }
            }

            return(duplicateErrors);
        }
        public void InternalHasValidationResult_CriticalValidatioResultExists()
        {
            // Arrange
            var resource = CreateResourceWithConsumerGroup(_activeConsumerGroup.Id);
            var criticalValidationResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.Resource.HasConsumerGroup, "Unique critical mock error", string.Empty, ValidationResultSeverity.Violation);
            var validationFacade         = new EntityValidationFacade(ResourceCrudAction.Create, resource, null, null, _metadata, null);

            validationFacade.ValidationResults.Add(criticalValidationResult);

            //// Act
            _validator.HasValidationResult(validationFacade, GetConsumerGroupProperty(resource));

            //// Assert
            Assert.Contains(Graph.Metadata.Constants.Resource.HasConsumerGroup, validationFacade.RequestResource.Properties);
            Assert.Single(validationFacade.RequestResource.Properties[Graph.Metadata.Constants.Resource.HasConsumerGroup]);
            Assert.Equal(_activeConsumerGroup.Id, validationFacade.RequestResource.Properties[Graph.Metadata.Constants.Resource.HasConsumerGroup].First());

            Assert.Equal(1, validationFacade.ValidationResults.Count);
            Assert.Contains(criticalValidationResult, validationFacade.ValidationResults);
        }
        private IList <ValidationResultProperty> CheckDuplicatesInRepository(Entity resource, string resourceId, string previousVersion)
        {
            var duplicateErrors = new List <ValidationResultProperty>();

            var pidUriResults    = GetDuplicateResultsByIdentifierType(Graph.Metadata.Constants.EnterpriseCore.PidUri, resource, out var pidUri);
            var baseUriResults   = GetDuplicateResultsByIdentifierType(Graph.Metadata.Constants.Resource.BaseUri, resource, out var baseUri);
            var targetUriResults = GetDuplicateResultsByTargetUri(resource, out var targetUri);

            // TODO: Piduri has no entry then duiplicate, or if entry/entryDraft is not actual resource

            if (CheckIdentifierIsDuplicate(pidUriResults, resource, resourceId))
            {
                var pidUriValidationResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.EnterpriseCore.PidUri, pidUri, Common.Constants.Validation.DuplicateField, ValidationResultSeverity.Violation, ValidationResultPropertyType.DUPLICATE);
                duplicateErrors.Add(pidUriValidationResult);
            }

            if (CheckBaseUriIsDuplicate(baseUriResults, resource, resourceId, pidUri, previousVersion))
            {
                var baseUriValidatioResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.Resource.BaseUri, baseUri, Common.Constants.Validation.DuplicateField, ValidationResultSeverity.Violation, ValidationResultPropertyType.DUPLICATE, null);
                duplicateErrors.Add(baseUriValidatioResult);
            }

            if (CheckIdentifierIsDuplicate(targetUriResults, resource, resourceId))
            {
                var targetUriValidationResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.Resource.DistributionEndpoints.HasNetworkAddress, targetUri, Common.Constants.Validation.DuplicateField, ValidationResultSeverity.Info, ValidationResultPropertyType.DUPLICATE);
                duplicateErrors.Add(targetUriValidationResult);
            }

            foreach (var property in resource.Properties)
            {
                foreach (var prop in property.Value)
                {
                    if (DynamicExtension.IsType <Entity>(prop, out Entity parsedProp) && property.Key != Graph.Metadata.Constants.EnterpriseCore.PidUri && property.Key != Graph.Metadata.Constants.Resource.BaseUri)
                    {
                        duplicateErrors.AddRange(CheckDuplicatesInRepository(parsedProp, resourceId, string.Empty));
                    }
                }
            }

            return(duplicateErrors);
        }
示例#5
0
 private void AssertValidationResult(ValidationResultProperty validationResult, string taxonomyId)
 {
     Assert.Equal(string.Format(RegistrationService.Common.Constants.Messages.Taxonomy.InvalidSelection, taxonomyId), validationResult.Message);
     Assert.Equal(ValidationResultSeverity.Violation, validationResult.ResultSeverity);
 }
        protected override void InternalHasValidationResult(EntityValidationFacade validationFacade, KeyValuePair <string, List <dynamic> > properties)
        {
            // Create temporary validation error
            var validationResult = new ValidationResultProperty(validationFacade.RequestResource.Id, Graph.Metadata.Constants.Resource.HasVersion, null, null, ValidationResultSeverity.Violation);

            // Get version
            string newVersion = properties.Value.FirstOrDefault();

            // Check if version is given
            if (!string.IsNullOrWhiteSpace(newVersion))
            {
                // Check if version match version regex. Only numbers with points are allowed.
                if (!Regex.IsMatch(newVersion, Common.Constants.Regex.Version))
                {
                    validationResult.Message     = "The version does not have the correct format. Only numbers and points are allowed. For example: 1 , 1.2 , 1.2.1";
                    validationResult.ResultValue = newVersion;
                    validationFacade.ValidationResults.Add(validationResult);
                    return;
                }

                // If the entry is new, search the version list for previous entry
                string pidUriString;

                if (validationFacade.ResourcesCTO.IsEmpty)
                {
                    if (string.IsNullOrWhiteSpace(validationFacade.PreviousVersion))
                    {
                        return;
                    }

                    pidUriString = validationFacade.PreviousVersion;
                }
                else
                {
                    // Get repo version
                    string repoVersion = validationFacade.ResourcesCTO.GetDraftOrPublishedVersion().Properties.GetValueOrNull(Graph.Metadata.Constants.Resource.HasVersion, true);

                    // If repo version is equal to actual version, then everything is okay.
                    if (repoVersion == newVersion)
                    {
                        return;
                    }

                    pidUriString = validationFacade.ResourcesCTO.GetDraftOrPublishedVersion().Properties.GetValueOrNull(Graph.Metadata.Constants.EnterpriseCore.PidUri, true)?.Id;
                }

                if (!Uri.TryCreate(pidUriString, UriKind.Absolute, out var pidUri))
                {
                    return;
                }
                var graphList = new HashSet <Uri>();
                graphList.Add(_metadataService.GetInstanceGraph(PIDO.PidConcept));
                graphList.Add(_metadataService.GetInstanceGraph("draft"));
                var versions = _resourceRepository.GetAllVersionsOfResourceByPidUri(pidUri, graphList).ToArray();

                if (versions.IsNullOrEmpty())
                {
                    return;
                }

                // Check if actual version is already in list
                if (versions.Any(r => r.Version.CompareVersionTo(newVersion) == 0))
                {
                    validationResult.Message = $"The new version already exists in the list, the last version is {versions.Last().Version}.";
                    validationFacade.ValidationResults.Add(validationResult);
                    return;
                }

                // If no entry with same pid uri in list, a new resource will be created
                if (!versions.Any(r => r.PidUri == validationFacade.RequestResource.PidUri?.ToString()))
                {
                    return;
                }

                // Check if entry is already in list and check if the current version is still between the two linked neighbors.
                // -> case: if someone changes the version of an already linked resource.
                // Get index of actual version
                var index = Array.FindIndex(versions, r => r.PidUri == validationFacade.RequestResource.PidUri.ToString());

                // If actual entry is not last entry
                if (versions.Last().PidUri != validationFacade.RequestResource.PidUri.ToString())
                {
                    // Check if actual version is lower than the version of the next entry
                    if (versions[index + 1].Version.CompareVersionTo(newVersion) <= 0)
                    {
                        validationResult.Message = $"The new version is larger than the later entry in the list (must be < {versions[index + 1].Version}).";
                        validationFacade.ValidationResults.Add(validationResult);
                        return;
                    }
                }
                // If actual entry is not first entry
                if (versions.First().PidUri != validationFacade.RequestResource.PidUri.ToString())
                {
                    // Check if actual version is higher than the version of the previous entry
                    if (versions[index - 1].Version.CompareVersionTo(newVersion) >= 0)
                    {
                        validationResult.Message = $"The new version is smaller than the previous entry in the list (must be > {versions[index - 1].Version}).";
                        validationFacade.ValidationResults.Add(validationResult);
                        return;
                    }
                }
            }
        }
 private bool IsWarningSeverity(ValidationResultProperty property, ResourceCrudAction resourceCrudAction)
 {
     return(property.ResultSeverity == ValidationResultSeverity.Violation &&
            !Common.Constants.Validation.CriticalProperties.Contains(property.Path) &&
            resourceCrudAction != ResourceCrudAction.Publish);
 }