4 using System.Collections.Generic;
7 using SiliconStudio.Assets.Diagnostics;
8 using SiliconStudio.Core.Diagnostics;
9 using SiliconStudio.Core.Reflection;
11 namespace SiliconStudio.Assets.Analysis
24 : base(packageSession)
34 if (log == null)
throw new ArgumentNullException(
"log");
36 ValidateAssetBase(log);
46 var invalidAssets =
new HashSet<Guid>();
47 var validAssets =
new HashSet<Asset>();
49 foreach (var package
in Session.Packages)
51 foreach (var assetItem
in package.Assets)
54 if (invalidAssets.Contains(assetItem.Id))
59 var result = ValidateAssetBase(assetItem);
66 invalidAssets.Add(assetItem.Id);
70 foreach (var baseItem
in result.Value)
72 invalidAssets.Add(baseItem.Id);
77 invalidAssets.Add(logMessage.AssetReference.Id);
82 validAssets.Add(assetItem.Asset);
97 var results =
new LoggerValueResult<List<Asset>>();
98 results.Value.AddRange(ValidateAssetBase(assetItem, results));
113 if (assetItem == null)
throw new ArgumentNullException(
"asset");
114 if (log == null)
throw new ArgumentNullException(
"log");
116 var baseItems =
new List<Asset>();
119 var assetItemFound = Session.FindAsset(assetItem.Id);
120 if (!ReferenceEquals(assetItem.
Asset, assetItemFound.
Asset))
122 var assetReference = assetItem.ToReference();
123 log.Error(assetItem.Package, assetReference, AssetMessageCode.AssetNotFound, assetReference);
128 var currentAsset = assetItem;
129 while (currentAsset.Asset.Base != null)
132 if (baseItems.Contains(currentAsset.Asset))
135 log.Error(assetItem.Package, currentAsset.ToReference(),
AssetMessageCode.InvalidCircularReferences, baseItems.Select(item => item.Id));
143 var baseAssetItem = Session.FindAsset(currentAsset.Asset.Base.Id);
144 if (baseAssetItem == null)
150 var newBaseAsset = Session.FindAsset(currentAsset.Asset.Base.Location);
151 if (newBaseAsset != null)
154 error =
new AssetLogMessage(currentAsset.Package, currentAsset.ToReference(), LogMessageType.Error, AssetMessageCode.BaseChanged, currentAsset.Asset.Base.Location);
155 error.Related.Add(newBaseAsset.ToReference());
160 error =
new AssetLogMessage(currentAsset.Package, currentAsset.ToReference(), LogMessageType.Error, AssetMessageCode.BaseNotFound);
164 error.Member = TypeDescriptorFactory.Default.Find(typeof(
Asset))[
"Base"];
172 if (baseAssetItem.GetType() != assetItem.Asset.GetType())
174 log.Error(currentAsset.Package, currentAsset.ToReference(),
AssetMessageCode.BaseInvalidType, baseAssetItem.GetType(), assetItem.Asset.GetType());
178 currentAsset = baseAssetItem;
179 baseItems.Add(currentAsset.Asset);
186 private readonly
Asset rootAsset;
187 private readonly List<Asset> assets =
new List<Asset>();
190 : base(typeDescriptorFactory)
192 this.rootAsset = rootAsset;
195 public List<Asset> Collect()
201 public override void VisitObject(
object obj,
ObjectDescriptor descriptor,
bool visitMembers)
203 if (obj is Asset && !ReferenceEquals(obj, rootAsset))
205 assets.Add((Asset)obj);
207 base.VisitObject(obj, descriptor, visitMembers);
HashSet< Asset > ValidateAssetBase(ILogger log)
Validates the inheritance of all assets in the package.
List< Asset > ValidateAssetBase(AssetItem assetItem, ILogger log)
Validates the inheritance of an asset by checking base accessibility up to the root base...
override void Run(ILogger log)
Performs a wide package validation analysis.
Default implementation of a ITypeDescriptor.
AssetMessageCode
A message code used by AssetLogMessage to identify an error/warning.
A visitor for serializable data (binary, yaml and editor).
Asset()
Initializes a new instance of the Asset class.
An analysis to validate that all assets in a package have a valid Asset.Base. In order to be valid...
An asset item part of a Package accessible through SiliconStudio.Assets.Package.Assets.
Base class for all Session and Asset integrity analysis.
A session for editing a package.
LoggerValueResult< List< Asset > > ValidateAssetBase(AssetItem assetItem)
Validates the inheritance of an asset by checking base accessibility up to the root base...
Provides a specialized LogMessage to give specific information about an asset.
AssetBaseAnalysis(PackageSession packageSession)
Initializes a new instance of the AssetBaseAnalysis class.
A factory to create an instance of a ITypeDescriptor
Asset Asset
Gets or sets the asset.