public override void VisitObject(object obj, ObjectDescriptor descriptor, bool visitMembers) { // references and base var reference = obj as IReference; if (reference == null) { var attachedReference = AttachedReferenceManager.GetAttachedReference(obj); if (attachedReference != null && attachedReference.IsProxy) { reference = attachedReference; } } if (reference != null) { var isBase = reference is AssetBase; // Don't record base import if (isBase && ((AssetBase)reference).IsRootImport) { return; } dependencies.AddBrokenLinkOut(reference, (isBase ? ContentLinkType.Inheritance : 0) | ContentLinkType.Reference); } else { base.VisitObject(obj, descriptor, visitMembers); } }
public override void VisitObject(object obj, ObjectDescriptor descriptor, bool visitMembers) { // references and base var reference = obj as IReference; if (reference == null) { var attachedReference = AttachedReferenceManager.GetAttachedReference(obj); if (attachedReference != null && attachedReference.IsProxy) { reference = attachedReference; } } if (reference != null) { dependencies.AddBrokenLinkOut(reference, ContentLinkType.Reference); } else { base.VisitObject(obj, descriptor, visitMembers); } }
public IEnumerable <IContentLink> GetDependencies(AssetItem item) { dependencies = new AssetDependencies(item); Visit(item.Asset); // composition inheritances if (item.Asset.BaseParts != null) { foreach (var compositionBase in item.Asset.BaseParts) { dependencies.AddBrokenLinkOut(compositionBase, ContentLinkType.CompositionInheritance); } } return(dependencies.BrokenLinksOut); }
public IEnumerable <IContentLink> GetDependencies(AssetItem item) { dependencies = new AssetDependencies(item); Visit(item.Asset); // composition inheritances var assetComposite = item.Asset as IAssetComposite; if (assetComposite != null) { foreach (var compositionBase in assetComposite.CollectParts().Select(x => x.Base).NotNull()) { dependencies.AddBrokenLinkOut(compositionBase.BasePartAsset, ContentLinkType.CompositionInheritance); } } return(dependencies.BrokenLinksOut); }
private void CollectOutputReferences(AssetDependencies dependencyRoot, AssetId assetId, HashSet <AssetId> visited, bool recursive, ContentLinkType linkTypes, ref int count) { if (visited != null) { if (visited.Contains(assetId)) { return; } visited.Add(assetId); } count++; var dependencies = CalculateDependencies(assetId); if (dependencies == null) { return; } // Add missing references foreach (var missingRef in dependencies.BrokenLinksOut) { dependencyRoot.AddBrokenLinkOut(missingRef); } // Add output references foreach (var child in dependencies.LinksOut) { if ((linkTypes & child.Type) != 0) { dependencyRoot.AddLinkOut(child); if (visited != null && recursive) { CollectOutputReferences(dependencyRoot, child.Item.Id, visited, true, linkTypes, ref count); } } } }
/// <summary> /// Collects all references of an asset dynamically. /// </summary> /// <param name="result">The result.</param> /// <param name="assetResolver">The asset resolver.</param> /// <param name="isRecursive">if set to <c>true</c> collects references recursively.</param> /// <param name="keepParents">Indicate if the parent of the provided <paramref name="result"/> should be kept or not</param> /// <exception cref="System.ArgumentNullException"> /// result /// or /// assetResolver /// </exception> private static void CollectDynamicOutReferences(AssetDependencies result, Func <AssetId, AssetItem> assetResolver, bool isRecursive, bool keepParents) { if (result == null) { throw new ArgumentNullException(nameof(result)); } if (assetResolver == null) { throw new ArgumentNullException(nameof(assetResolver)); } var addedReferences = new HashSet <AssetId>(); var itemsToAnalyze = new Queue <AssetItem>(); var referenceCollector = new DependenciesCollector(); // Reset the dependencies/parts. result.Reset(keepParents); var assetItem = result.Item; // marked as processed to not add it again addedReferences.Add(assetItem.Id); itemsToAnalyze.Enqueue(assetItem); while (itemsToAnalyze.Count > 0) { var item = itemsToAnalyze.Dequeue(); foreach (var link in referenceCollector.GetDependencies(item)) { if (addedReferences.Contains(link.Element.Id)) { continue; } // marked as processed to not add it again addedReferences.Add(link.Element.Id); // add the location to the reference location list var nextItem = assetResolver(link.Element.Id); if (nextItem != null) { result.AddLinkOut(nextItem, link.Type); // add current element to analyze list, to analyze dependencies recursively if (isRecursive) { itemsToAnalyze.Enqueue(nextItem); } } else { result.AddBrokenLinkOut(link); } } if (!isRecursive) { break; } } }
/// <summary> /// Collects all references of an asset dynamically. /// </summary> /// <param name="result">The result.</param> /// <param name="assetResolver">The asset resolver.</param> /// <param name="isRecursive">if set to <c>true</c> collects references recursively.</param> /// <param name="keepParents">Indicate if the parent of the provided <paramref name="result"/> should be kept or not</param> /// <exception cref="System.ArgumentNullException"> /// result /// or /// assetResolver /// </exception> private static void CollectDynamicOutReferences(AssetDependencies result, Func<Guid, AssetItem> assetResolver, bool isRecursive, bool keepParents) { if (result == null) throw new ArgumentNullException("result"); if (assetResolver == null) throw new ArgumentNullException("assetResolver"); var addedReferences = new HashSet<Guid>(); var itemsToAnalyze = new Queue<AssetItem>(); var referenceCollector = new DependenciesCollector(); result.Reset(keepParents); var assetItem = result.Item; // marked as processed to not add it again addedReferences.Add(assetItem.Id); itemsToAnalyze.Enqueue(assetItem); while (itemsToAnalyze.Count > 0) { var item = itemsToAnalyze.Dequeue(); foreach (var link in referenceCollector.GetDependencies(item)) { if (addedReferences.Contains(link.Element.Id)) continue; // marked as processed to not add it again addedReferences.Add(link.Element.Id); // add the location to the reference location list var nextItem = assetResolver(link.Element.Id); if (nextItem != null) { result.AddLinkOut(nextItem, link.Type, false); // add current element to analyze list, to analyze dependencies recursively if (isRecursive) { itemsToAnalyze.Enqueue(nextItem); } } else { result.AddBrokenLinkOut(link); } } if (!isRecursive) { break; } } }
public IEnumerable<IContentLink> GetDependencies(AssetItem item) { dependencies = new AssetDependencies(item); Visit(item.Asset); // composition inheritances var assetComposer = item.Asset as IAssetComposer; if (assetComposer != null) { foreach (var compositionBase in assetComposer.GetCompositionBases()) dependencies.AddBrokenLinkOut(compositionBase, ContentLinkType.CompositionInheritance); } return dependencies.BrokenLinksOut; }
private void CollectOutputReferences(AssetDependencies dependencyRoot, AssetItem assetItem, HashSet<Guid> visited, bool recursive, ref int count) { var assetId = assetItem.Id; if (visited != null) { if (visited.Contains(assetId)) return; visited.Add(assetId); } count++; var dependencies = CalculateDependencies(assetItem); // Add missing references foreach (var missingRef in dependencies.BrokenLinksOut) { dependencyRoot.AddBrokenLinkOut(missingRef); } // Add output references foreach (var child in dependencies.LinksOut) { dependencyRoot.AddLinkOut(child, true); if (visited != null && recursive) { CollectOutputReferences(dependencyRoot, child.Item, visited, true, ref count); } } }
public IEnumerable<IContentLink> GetDependencies(AssetItem item) { dependencies = new AssetDependencies(item); Visit(item.Asset); // composition inheritances if (item.Asset.BaseParts != null) { foreach (var compositionBase in item.Asset.BaseParts) dependencies.AddBrokenLinkOut(compositionBase, ContentLinkType.CompositionInheritance); } return dependencies.BrokenLinksOut; }
public IEnumerable<IContentLink> GetDependencies(AssetItem item) { dependencies = new AssetDependencies(item); Visit(item.Asset); // composition inheritances var assetComposite = item.Asset as IAssetComposite; if (assetComposite != null) { foreach (var compositionBase in assetComposite.CollectParts().Select(x => x.Base).NotNull()) dependencies.AddBrokenLinkOut(compositionBase.BasePartAsset, ContentLinkType.CompositionInheritance); } return dependencies.BrokenLinksOut; }
private void CollectOutputReferences(AssetDependencies dependencyRoot, AssetId assetId, HashSet<AssetId> visited, bool recursive, ContentLinkType linkTypes, ref int count) { if (visited != null) { if (visited.Contains(assetId)) return; visited.Add(assetId); } count++; var dependencies = CalculateDependencies(assetId); if (dependencies == null) return; // Add missing references foreach (var missingRef in dependencies.BrokenLinksOut) { dependencyRoot.AddBrokenLinkOut(missingRef); } // Add output references foreach (var child in dependencies.LinksOut) { if ((linkTypes & child.Type) != 0) { dependencyRoot.AddLinkOut(child); if (visited != null && recursive) { CollectOutputReferences(dependencyRoot, child.Item.Id, visited, true, linkTypes, ref count); } } } }