internal static DataClassificationPresentationObject Create(string ruleIdentifier, XElement ruleElement, XElement resourceElement, ClassificationRuleCollectionPresentationObject rulePackPresentationObject) { ArgumentValidator.ThrowIfNullOrEmpty("ruleIdentifier", ruleIdentifier); ArgumentValidator.ThrowIfNull("ruleElement", ruleElement); ArgumentValidator.ThrowIfNull("resourceElement", resourceElement); return(DataClassificationPresentationObject.Create(ruleIdentifier, XmlProcessingUtils.ReadDefaultRuleMetadata(resourceElement), ruleElement, resourceElement, rulePackPresentationObject)); }
internal static IEnumerable <QueryMatchResult> GetMatchingRulesByName(XDocument rulePackXDocument, IEnumerable <string> ruleNameQueries, NameMatchingOptions matchingOption = NameMatchingOptions.InvariantNameOrLocalizedNameMatch, bool ignoreCase = true) { ArgumentValidator.ThrowIfNull("rulePackXDocument", rulePackXDocument); ArgumentValidator.ThrowIfNull("ruleNameQueries", ruleNameQueries); ArgumentValidator.ThrowIfInvalidValue <NameMatchingOptions>("matchingOption", matchingOption, (NameMatchingOptions nameMatchingOption) => nameMatchingOption == NameMatchingOptions.InvariantNameMatchOnly || NameMatchingOptions.InvariantNameOrLocalizedNameMatch == nameMatchingOption); List <string> ruleNameQueriesList = new List <string>((from query in ruleNameQueries where !string.IsNullOrEmpty(query) select query).OrderBy((string query) => query, ignoreCase ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal)); if (ruleNameQueriesList.Count == 0) { return(Enumerable.Empty <QueryMatchResult>()); } CultureInfo currentThreadCulture = CultureInfo.CurrentCulture; ParallelQuery <QueryMatchResult> parallelQuery; if (matchingOption != NameMatchingOptions.InvariantNameMatchOnly) { parallelQuery = from resourceElement in rulePackXDocument.Descendants(XmlProcessingUtils.GetMceNsQualifiedNodeName("Resource")).AsParallel <XElement>() let queryHitIndex = XmlProcessingUtils.GetInvariantOrLocalizedNameHitIndex(ruleNameQueriesList, resourceElement, currentThreadCulture, ignoreCase) where queryHitIndex >= 0 let ruleIdRef = resourceElement.Attribute("idRef").Value let finalRuleIdRef = string.IsNullOrEmpty(ruleIdRef) ? null : ruleIdRef select new QueryMatchResult { QueryString = ruleNameQueriesList[queryHitIndex], MatchingResourceXElement = resourceElement, MatchingRuleId = finalRuleIdRef, MatchingRuleXElement = null }; } else { parallelQuery = from resourceElement in rulePackXDocument.Descendants(XmlProcessingUtils.GetMceNsQualifiedNodeName("Resource")).AsParallel <XElement>() let invariantLocalizedNameDetails = XmlProcessingUtils.ReadDefaultRuleMetadata(resourceElement) let queryHitIndex = ruleNameQueriesList.BinarySearch(invariantLocalizedNameDetails.Name, StringComparer.Create(invariantLocalizedNameDetails.Culture, ignoreCase)) where queryHitIndex >= 0 let ruleIdRef = resourceElement.Attribute("idRef").Value let finalRuleIdRef = string.IsNullOrEmpty(ruleIdRef) ? null : ruleIdRef select new QueryMatchResult { QueryString = ruleNameQueriesList[queryHitIndex], MatchingResourceXElement = resourceElement, MatchingRuleId = finalRuleIdRef, MatchingRuleXElement = null }; } ParallelQuery <QueryMatchResult> mainQuery = parallelQuery; return(XmlProcessingUtils.ExecuteQueryMatching(mainQuery, (Dictionary <string, QueryMatchResult> queryMatchResultsDictionary) => from ruleElement in rulePackXDocument.Descendants().AsParallel <XElement>() where ClassificationDefinitionConstants.MceRuleElementNames.Contains(ruleElement.Name.LocalName) let ruleId = (string)ruleElement.Attribute("id") let finalRuleId = string.IsNullOrEmpty(ruleId) ? null : ruleId where queryMatchResultsDictionary.ContainsKey(finalRuleId) select new KeyValuePair <string, XElement>(finalRuleId, ruleElement), delegate(Dictionary <string, QueryMatchResult> queryMatchResultsDictionary, KeyValuePair <string, XElement> matchAssociation) { queryMatchResultsDictionary[matchAssociation.Key].MatchingRuleXElement = matchAssociation.Value; }, new Func <string, LocalizedString>(Strings.ClassificationRuleCollectionOrphanedResourceViolation))); }
private static int GetInvariantOrLocalizedNameHitIndex(List <string> ruleNameQueriesList, XElement currentResourceElement, CultureInfo mainThreadCulture, bool ignoreCase) { DataClassificationLocalizableDetails dataClassificationLocalizableDetails = XmlProcessingUtils.ReadDefaultRuleMetadata(currentResourceElement); int num = ruleNameQueriesList.BinarySearch(dataClassificationLocalizableDetails.Name, StringComparer.Create(dataClassificationLocalizableDetails.Culture, ignoreCase)); if (num < 0 && !dataClassificationLocalizableDetails.Culture.Equals(mainThreadCulture)) { Dictionary <CultureInfo, string> dictionary = XmlProcessingUtils.ReadAllRuleNames(currentResourceElement); CultureInfo cultureInfo = mainThreadCulture; string text = null; while (!cultureInfo.Equals(CultureInfo.InvariantCulture) && !dictionary.TryGetValue(cultureInfo, out text)) { cultureInfo = cultureInfo.Parent; } if (text != null && !cultureInfo.Equals(CultureInfo.InvariantCulture)) { num = ruleNameQueriesList.BinarySearch(text, StringComparer.Create(cultureInfo, ignoreCase)); } } return(num); }