9using System.Collections.Generic;
10using System.Collections.ObjectModel;
17 internal sealed class RelationshipCatalog
19 private readonly List<RelationshipInfo> relationships =
new List<RelationshipInfo>();
20 private readonly List<RelationshipDiscoveryIssue> issues =
new List<RelationshipDiscoveryIssue>();
21 private readonly Dictionary<string, Dictionary<string, RelationshipInfo>> relationshipsBySource
22 =
new Dictionary<string, Dictionary<string, RelationshipInfo>>(StringComparer.Ordinal);
23 private readonly ReadOnlyCollection<RelationshipInfo> readOnlyRelationships;
24 private readonly ReadOnlyCollection<RelationshipDiscoveryIssue> readOnlyIssues;
29 public IReadOnlyList<RelationshipInfo> Relationships {
get {
return readOnlyRelationships; } }
34 public IReadOnlyList<RelationshipDiscoveryIssue> Issues {
get {
return readOnlyIssues; } }
39 public bool IsComplete {
get {
return issues.Count == 0; } }
44 public RelationshipCatalog()
46 readOnlyRelationships = relationships.AsReadOnly();
47 readOnlyIssues = issues.AsReadOnly();
55 public bool TryAdd(RelationshipInfo relationship)
57 string sourcePartPath = relationship.SourcePartPath ??
string.Empty;
58 if (!relationshipsBySource.TryGetValue(sourcePartPath, out Dictionary<string, RelationshipInfo> sourceRelationships))
60 sourceRelationships =
new Dictionary<string, RelationshipInfo>(StringComparer.Ordinal);
61 relationshipsBySource.Add(sourcePartPath, sourceRelationships);
63 if (sourceRelationships.ContainsKey(relationship.Id))
67 sourceRelationships.Add(relationship.Id, relationship);
68 relationships.Add(relationship);
76 public void AddIssue(RelationshipDiscoveryIssue issue)
87 public RelationshipInfo GetBySourceAndId(
string sourcePartPath,
string relationshipId)
89 string normalizedSourcePartPath = sourcePartPath ??
string.Empty;
90 if (relationshipsBySource.TryGetValue(normalizedSourcePartPath, out Dictionary<string, RelationshipInfo> sourceRelationships)
91 && relationshipId !=
null
92 && sourceRelationships.TryGetValue(relationshipId, out RelationshipInfo relationship))
103 public IReadOnlyList<RelationshipInfo> GetByType(
string documentType)
105 List<RelationshipInfo> matches =
new List<RelationshipInfo>();
106 foreach (RelationshipInfo relationship
in relationships)
108 if (
string.Equals(relationship.Type, documentType, StringComparison.Ordinal))
110 matches.Add(relationship);
113 return matches.AsReadOnly();