Example #1
0
        public async Task <HttpResponseMessage> ApplyConflict(string filename, long remoteVersion, string remoteServerId, string remoteServerUrl)
        {
            var canonicalFilename = FileHeader.Canonize(filename);

            var localMetadata = Synchronizations.GetLocalMetadata(canonicalFilename);

            if (localMetadata == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }

            var contentStream = await Request.Content.ReadAsStreamAsync().ConfigureAwait(false);

            var current = new HistoryItem
            {
                ServerId = Storage.Id.ToString(),
                Version  = localMetadata.Value <long>(SynchronizationConstants.RavenSynchronizationVersion)
            };

            var currentConflictHistory = Historian.DeserializeHistory(localMetadata);

            currentConflictHistory.Add(current);

            var remote = new HistoryItem
            {
                ServerId = remoteServerId,
                Version  = remoteVersion
            };

            var remoteMetadata = RavenJObject.Load(new JsonTextReader(new StreamReader(contentStream)));

            var remoteConflictHistory = Historian.DeserializeHistory(remoteMetadata);

            remoteConflictHistory.Add(remote);

            var conflict = new ConflictItem
            {
                CurrentHistory  = currentConflictHistory,
                RemoteHistory   = remoteConflictHistory,
                FileName        = canonicalFilename,
                RemoteServerUrl = Uri.UnescapeDataString(remoteServerUrl)
            };

            ConflictArtifactManager.Create(canonicalFilename, conflict);

            Publisher.Publish(new ConflictNotification
            {
                FileName         = filename,
                SourceServerUrl  = remoteServerUrl,
                Status           = ConflictStatus.Detected,
                RemoteFileHeader = new FileHeader(canonicalFilename, remoteMetadata)
            });

            if (Log.IsDebugEnabled)
            {
                Log.Debug("Conflict applied for a file '{0}' (remote version: {1}, remote server id: {2}).", filename, remoteVersion, remoteServerId);
            }

            return(GetEmptyMessage(HttpStatusCode.NoContent));
        }
Example #2
0
        public async Task <HttpResponseMessage> ResolutionStrategyFromServerResolvers()
        {
            var conflict = await ReadJsonObjectAsync <ConflictItem>();

            var localMetadata = Synchronizations.GetLocalMetadata(conflict.FileName);

            if (localMetadata == null)
            {
                throw new InvalidOperationException(string.Format("Could not find the medatada of the file: {0}", conflict.FileName));
            }

            var sourceMetadata = GetFilteredMetadataFromHeaders(ReadInnerHeaders);

            ConflictResolutionStrategy strategy;

            if (ConflictResolver.TryResolveConflict(conflict.FileName, conflict, localMetadata, sourceMetadata, out strategy))
            {
                return(GetMessageWithObject(strategy));
            }

            return(GetMessageWithObject(ConflictResolutionStrategy.NoResolution));
        }