internal static void MergeEntityDescriptorInfo(EntityDescriptor trackedEntityDescriptor, EntityDescriptor entityDescriptorFromMaterializer, bool mergeInfo, MergeOption mergeOption) { if (!object.ReferenceEquals(trackedEntityDescriptor, entityDescriptorFromMaterializer)) { if ((entityDescriptorFromMaterializer.ETag != null) && (mergeOption != MergeOption.AppendOnly)) { trackedEntityDescriptor.ETag = entityDescriptorFromMaterializer.ETag; } if (mergeInfo) { if (entityDescriptorFromMaterializer.SelfLink != null) { trackedEntityDescriptor.SelfLink = entityDescriptorFromMaterializer.SelfLink; } if (entityDescriptorFromMaterializer.EditLink != null) { trackedEntityDescriptor.EditLink = entityDescriptorFromMaterializer.EditLink; } foreach (LinkInfo info in entityDescriptorFromMaterializer.LinkInfos) { trackedEntityDescriptor.MergeLinkInfo(info); } foreach (StreamDescriptor descriptor in entityDescriptorFromMaterializer.StreamDescriptors) { trackedEntityDescriptor.MergeStreamDescriptor(descriptor); } trackedEntityDescriptor.ServerTypeName = entityDescriptorFromMaterializer.ServerTypeName; } if (entityDescriptorFromMaterializer.ReadStreamUri != null) { trackedEntityDescriptor.ReadStreamUri = entityDescriptorFromMaterializer.ReadStreamUri; } if (entityDescriptorFromMaterializer.EditStreamUri != null) { trackedEntityDescriptor.EditStreamUri = entityDescriptorFromMaterializer.EditStreamUri; } if ((entityDescriptorFromMaterializer.ReadStreamUri != null) || (entityDescriptorFromMaterializer.EditStreamUri != null)) { trackedEntityDescriptor.StreamETag = entityDescriptorFromMaterializer.StreamETag; } } }
internal static void MergeEntityDescriptorInfo(EntityDescriptor trackedEntityDescriptor, EntityDescriptor entityDescriptorFromMaterializer, bool mergeInfo, MergeOption mergeOption) { if (!object.ReferenceEquals(trackedEntityDescriptor, entityDescriptorFromMaterializer)) { if ((entityDescriptorFromMaterializer.ETag != null) && (mergeOption != MergeOption.AppendOnly)) { trackedEntityDescriptor.ETag = entityDescriptorFromMaterializer.ETag; } if (mergeInfo) { if (entityDescriptorFromMaterializer.SelfLink != null) { trackedEntityDescriptor.SelfLink = entityDescriptorFromMaterializer.SelfLink; } if (entityDescriptorFromMaterializer.EditLink != null) { trackedEntityDescriptor.EditLink = entityDescriptorFromMaterializer.EditLink; } foreach (LinkInfo info in entityDescriptorFromMaterializer.LinkInfos) { trackedEntityDescriptor.MergeLinkInfo(info); } foreach (StreamDescriptor descriptor in entityDescriptorFromMaterializer.StreamDescriptors) { trackedEntityDescriptor.MergeStreamDescriptor(descriptor); } trackedEntityDescriptor.ServerTypeName = entityDescriptorFromMaterializer.ServerTypeName; } if (entityDescriptorFromMaterializer.ReadStreamUri != null) { trackedEntityDescriptor.ReadStreamUri = entityDescriptorFromMaterializer.ReadStreamUri; } if (entityDescriptorFromMaterializer.EditStreamUri != null) { trackedEntityDescriptor.EditStreamUri = entityDescriptorFromMaterializer.EditStreamUri; } if ((entityDescriptorFromMaterializer.ReadStreamUri != null) || (entityDescriptorFromMaterializer.EditStreamUri != null)) { trackedEntityDescriptor.StreamETag = entityDescriptorFromMaterializer.StreamETag; } } }
internal static void MergeEntityDescriptorInfo(EntityDescriptor trackedEntityDescriptor, EntityDescriptor entityDescriptorFromMaterializer, bool mergeInfo, MergeOption mergeOption) { Debug.Assert(trackedEntityDescriptor != null, "trackedEntityDescriptor != null"); Debug.Assert(entityDescriptorFromMaterializer != null, "entityDescriptorFromMaterializer != null"); // In this function, we need to handle 2 cases: // 1> Either the 2 function entity descriptors are the same, in which case // we just have to convert the relative uri's into absolute uri's if any // 2> If the entity descriptor are not the same, then we need to update the etag // If the merge option is not AppendOnly and merge all entity descriptor if specified if (!Object.ReferenceEquals(trackedEntityDescriptor, entityDescriptorFromMaterializer)) { // Keeping the old behavior - merging etags only when the mergeOption is something other than AppendOnly if (entityDescriptorFromMaterializer.ETag != null && mergeOption != MergeOption.AppendOnly) { trackedEntityDescriptor.ETag = entityDescriptorFromMaterializer.ETag; } if (mergeInfo) { // We need to merge the rest of the metadata irrespective of the MergeOption if (entityDescriptorFromMaterializer.SelfLink != null) { trackedEntityDescriptor.SelfLink = entityDescriptorFromMaterializer.SelfLink; } if (entityDescriptorFromMaterializer.EditLink != null) { trackedEntityDescriptor.EditLink = entityDescriptorFromMaterializer.EditLink; } foreach (LinkInfo linkInfo in entityDescriptorFromMaterializer.LinkInfos) { trackedEntityDescriptor.MergeLinkInfo(linkInfo); } foreach (StreamDescriptor streamInfo in entityDescriptorFromMaterializer.StreamDescriptors) { trackedEntityDescriptor.MergeStreamDescriptor(streamInfo); } trackedEntityDescriptor.ServerTypeName = entityDescriptorFromMaterializer.ServerTypeName; } // An entity might show actions conditionally based on each request, so get whatever sent by server // Refer Defect 1333275 : OperationDescriptor not refreshed with OverwriteChanges if (entityDescriptorFromMaterializer.OperationDescriptors != null) { trackedEntityDescriptor.ClearOperationDescriptors(); trackedEntityDescriptor.AppendOperationalDescriptors(entityDescriptorFromMaterializer.OperationDescriptors); } // TODO: ideally, we should also merge this only based on the merge context, but since for MLE we do POST // and PUT as part of the same request, we need to merge it always to make the insert case of MLE work. // Once we fix that issue, this also should be moved within the above if statement if (entityDescriptorFromMaterializer.ReadStreamUri != null) { trackedEntityDescriptor.ReadStreamUri = entityDescriptorFromMaterializer.ReadStreamUri; } if (entityDescriptorFromMaterializer.EditStreamUri != null) { trackedEntityDescriptor.EditStreamUri = entityDescriptorFromMaterializer.EditStreamUri; } if (entityDescriptorFromMaterializer.ReadStreamUri != null || entityDescriptorFromMaterializer.EditStreamUri != null) { trackedEntityDescriptor.StreamETag = entityDescriptorFromMaterializer.StreamETag; } } }