Esempio n. 1
0
        // TODO: Cache
        public PidUriTemplateFlattened GetFlatPidUriTemplateByPidUriTemplate(Entity pidUriTemplate)
        {
            var result = new PidUriTemplateFlattened
            {
                Id = pidUriTemplate.Id
            };

            string idTypeProp = pidUriTemplate.Properties.GetValueOrNull(Common.Constants.PidUriTemplate.HasPidUriTemplateIdType, true);

            if (!string.IsNullOrWhiteSpace(idTypeProp))
            {
                result.IdType = _metadataService.GetPrefLabelForEntity(idTypeProp);
            }

            string suffixProp = pidUriTemplate.Properties.GetValueOrNull(Common.Constants.PidUriTemplate.HasPidUriTemplateSuffix, true);

            if (!string.IsNullOrWhiteSpace(suffixProp))
            {
                result.Suffix = _metadataService.GetPrefLabelForEntity(suffixProp);
            }

            result.BaseUrl = pidUriTemplate.Properties.GetValueOrNull(Common.Constants.PidUriTemplate.HasBaseUrl, true) ?? string.Empty;
            result.Route   = pidUriTemplate.Properties.GetValueOrNull(Common.Constants.PidUriTemplate.HasRoute, true) ?? string.Empty;
            int.TryParse(pidUriTemplate.Properties.GetValueOrNull(Common.Constants.PidUriTemplate.HasIdLength, true) ?? "0", out int idLength);
            result.IdLength = idLength;

            return(result);
        }
        /// <summary>
        /// Creates the matching regex for the pid uri template
        /// </summary>
        /// <param name="pidUriTemplateFlattened">the flat pid uri template</param>
        /// <returns>Regex of pid uri template</returns>
        public static string GetRegex(this PidUriTemplateFlattened pidUriTemplateFlattened)
        {
            var prefix = pidUriTemplateFlattened.BaseUrl + pidUriTemplateFlattened.Route;

            if (pidUriTemplateFlattened.IdType == Common.Constants.PidUriTemplateIdType.Guid)
            {
                return("^" + prefix + $"{Common.Constants.Regex.Guid}{pidUriTemplateFlattened.Suffix}$");
            }
            else if (pidUriTemplateFlattened.IdType == Common.Constants.PidUriTemplateIdType.Number)
            {
                return($"^{prefix}(\\d+){pidUriTemplateFlattened.Suffix}$");
            }
            else
            {
                throw new System.Exception($"Unrecognized id type {pidUriTemplateFlattened.IdType}.");
            }
        }
Esempio n. 3
0
        public string FormatPidUriTemplateName(PidUriTemplateFlattened pidUriTemplate)
        {
            var pidUriFormat = "{0}{1}{{{2}:{3}}}{4}";

            return(string.Format(pidUriFormat, pidUriTemplate.BaseUrl, pidUriTemplate.Route, pidUriTemplate.IdType, pidUriTemplate.IdLength, pidUriTemplate.Suffix));
        }
        public string GenerateIdentifierFromTemplate(PidUriTemplateFlattened pidUriTemplateFlat, Entity resource)
        {
            string prefix   = pidUriTemplateFlat.BaseUrl + pidUriTemplateFlat.Route;
            int    idLength = pidUriTemplateFlat.IdLength;
            string id;

            if (pidUriTemplateFlat.IdType == Common.Constants.PidUriTemplateIdType.Guid)
            {
                id = Guid.NewGuid().ToString();
            }
            else if (pidUriTemplateFlat.IdType == Common.Constants.PidUriTemplateIdType.Number)
            {
                var regexForExistingPidUris    = pidUriTemplateFlat.GetRegex();
                var existingPidUrisForTemplate = GetMatchingPidUris(resource, regexForExistingPidUris);

                existingPidUrisForTemplate.AddRange(GeneratedIdentifier.Where(t => Regex.IsMatch(t, regexForExistingPidUris)));

                var pidUriNumbers = existingPidUrisForTemplate
                                    .SelectMany(e => Regex.Matches(e, regexForExistingPidUris).Select(r => r.Groups[1]?.Value))
                                    .Select(s =>
                {
                    long pidUriAsNumber = -1;
                    long.TryParse(s, out pidUriAsNumber);
                    return(pidUriAsNumber);
                })
                                    .OrderBy(d => d);
                long nextFreeNumber = 1;
                foreach (double number in pidUriNumbers)
                {
                    if (number < nextFreeNumber)
                    {
                        // in case we start at negative value
                        continue;
                    }
                    else if (number == nextFreeNumber)
                    {
                        // move forward and check next number
                        nextFreeNumber++;
                    }
                    else if (number > nextFreeNumber)
                    {
                        // found a free spot
                        break;
                    }
                }
                if (idLength > 0)
                {
                    if (nextFreeNumber.ToString().Count() > idLength)
                    {
                        throw new System.Exception($"Next free id number '{nextFreeNumber}' exceeds the defined id length of '{idLength}'.");
                    }
                    var format = "D" + idLength;
                    id = nextFreeNumber.ToString(format);
                }
                else
                {
                    id = nextFreeNumber.ToString();
                }
            }
            else
            {
                throw new System.Exception($"Unrecognized id type {pidUriTemplateFlat.IdType}.");
            }

            var pidUri = prefix + id + pidUriTemplateFlat.Suffix;

            return(pidUri);
        }
        private bool CheckIfPidUriTemplateIsAllowed(EntityValidationFacade validationFacade, PidUriTemplateFlattened pidUriTemplateFlattend)
        {
            if (string.IsNullOrWhiteSpace(validationFacade.ConsumerGroup))
            {
                return(false);
            }

            Entity consumerGroup = _consumerGroupService.GetEntity(validationFacade.ConsumerGroup);

            if (consumerGroup == null)
            {
                return(false);
            }
            ;

            List <dynamic> templates = consumerGroup.Properties.GetValueOrNull(Graph.Metadata.Constants.ConsumerGroup.HasPidUriTemplate, false);

            return(templates.Any(template => template == pidUriTemplateFlattend.Id));
        }
        /// <summary>
        /// Checks if the given string was generated from the pid uri template.
        /// </summary>
        /// <param name="pidUriTemplateFlattend">the flat pid uri template</param>
        /// <param name="str">String to be checked</param>
        /// <returns>true if matched, otherwise false</returns>
        public static bool IsMatch(this PidUriTemplateFlattened pidUriTemplateFlattened, string str)
        {
            var reg = GetRegex(pidUriTemplateFlattened);

            return(Regex.IsMatch(str, reg));
        }