// 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}."); } }
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)); }