private DataMatch MatchObjects(object left, object right) { Console.WriteLine("---"); var diff1 = DataVisitNodeBuilder.Run(AssetRegistry.TypeDescriptorFactory, left); var diff2 = DataVisitNodeBuilder.Run(AssetRegistry.TypeDescriptorFactory, right); var matcher = new DataMatcher(AssetRegistry.TypeDescriptorFactory); return(matcher.Match(diff1, diff2)); }
/// <summary> /// Computes the diff3 between <see cref="BaseAsset" />, <see cref="Asset1" /> and <see cref="Asset2" />. /// </summary> /// <param name="forceRecompute">if set to <c>true</c> force to recompute the diff.</param> /// <returns>The result of the diff. This result is cached so next call will return it directly.</returns> public Diff3Node Compute(bool forceRecompute = false) { if (computed != null && !forceRecompute) { return(computed); } var baseNodes = DataVisitNodeBuilder.Run(TypeDescriptorFactory.Default, baseAsset); var asset1Nodes = DataVisitNodeBuilder.Run(TypeDescriptorFactory.Default, asset1); var asset2Nodes = DataVisitNodeBuilder.Run(TypeDescriptorFactory.Default, asset2); computed = DiffNode(baseNodes, asset1Nodes, asset2Nodes); return(computed); }
/// <summary> /// Computes the diff3 between <see cref="BaseAsset" />, <see cref="Asset1" /> and <see cref="Asset2" />. /// </summary> /// <param name="forceRecompute">if set to <c>true</c> force to recompute the diff.</param> /// <returns>The result of the diff. This result is cached so next call will return it directly.</returns> public Diff3Node Compute(bool forceRecompute = false) { if (computed != null && !forceRecompute) { return(computed); } // If asset implement IDiffResolver, run callback if (baseAsset is IDiffResolver) { ((IDiffResolver)baseAsset).BeforeDiff(baseAsset, asset1, asset2); } var baseNodes = DataVisitNodeBuilder.Run(TypeDescriptorFactory.Default, baseAsset); var asset1Nodes = DataVisitNodeBuilder.Run(TypeDescriptorFactory.Default, asset1); var asset2Nodes = DataVisitNodeBuilder.Run(TypeDescriptorFactory.Default, asset2); computed = DiffNode(baseNodes, asset1Nodes, asset2Nodes); return(computed); }
private void FixReferencesToEntities(EntityDesign newEntityDesign, Dictionary <GroupPartKey, Guid> mapBaseIdToNewId) { var newEntity = newEntityDesign.Entity; // We need to visit all references to entities/components in order to fix references // (e.g entities removed, entity added from base referencing an entity from base that we have to redirect to the new child entity...) // Suppose for example that: // // base newBase newAsset // EA EA EA' // EB EB EB' // EC EC EC' // ED (+link to EA via script or whather) ED' + link to EA' (we need to change from EA to EA') // // So in the example above, when merging ED into newAsset, all references to entities declared in newBase are not automatically // remapped to the new entities in newAsset. This is the purpose of this whole method var entityVisitor = new SingleLevelVisitor(typeof(Entity), true); var entityComponentVisitor = new SingleLevelVisitor(typeof(EntityComponent), true); DataVisitNodeBuilder.Run(TypeDescriptorFactory.Default, newEntity, new List <IDataCustomVisitor>() { entityVisitor, entityComponentVisitor }); // Fix Entity and EntityComponent references foreach (var idNodes in entityVisitor.References.Concat(entityComponentVisitor.References)) { var id = idNodes.Key; var nodes = idNodes.Value; // If entity id is not in the current list, it is more likely that it was a link to a base entity if (!newAsset.Hierarchy.Entities.ContainsKey(id)) { var groupKey = new GroupPartKey(newEntityDesign.Design.BasePartInstanceId, id); // We are trying to remap the base id to the new id from known entities from newAsset Guid newId; if (mapBaseIdToNewId.TryGetValue(groupKey, out newId)) { var linkedEntity = newAsset.Hierarchy.Entities[newId].Entity; foreach (var node in nodes) { var entityComponent = node.Instance as EntityComponent; if (entityComponent != null) { // TODO: In case of a DataVisitMember node, we need to set an OverrideType to New if we are actually removing a base value var newEntityComponent = (EntityComponent)linkedEntity.Components.Get(entityComponent.GetDefaultKey()); node.SetValue(newEntityComponent); } else { // TODO: In case of a DataVisitMember node, we need to set an OverrideType to New if we are actually removing a base value // Else the node applies to an entity node.SetValue(linkedEntity); } } } else { // TODO: In case of a DataVisitMember node, we need to set an OverrideType to New if we are actually removing a base value // If we are trying to link to an entity/component that was removed, we need to remove it foreach (var node in nodes) { node.RemoveValue(); } } } } }