public void CanDetectAndSuggestOptionsForConflict_SimpleMetadata()
 {
     var conflictsResolver = new ConflictsResolver(
                         new List<RavenJObject> {
                                 new RavenJObject
                                 {
                                     {"@metadata", new RavenJObject()
                                     {
                                         {"Name", "Oren"}
                                     }}
                                 },
                                 new RavenJObject
                                 {
                                     {"@metadata", new RavenJObject()
                                     {
                                         {"Name", "Ayende"}
                                     }}
                                 },
                         });
     Assert.Equal(@"{
     ""Name"": /*>>>> conflict start*/ [
     ""Oren"",
     ""Ayende""
     ]/*<<<< conflict end*/
     }", conflictsResolver.Resolve().Metadata);
 }
		public void CanResolveTwoEmptyArrays()
		{
			var conflictsResolver = new ConflictsResolver(new RavenJObject
			{
				{"Name", new RavenJArray()}
			}, new RavenJObject
			{
				{"Name",new RavenJArray()}
			});
			Assert.Equal(new RavenJObject
			{
				{"Name",new RavenJArray()}
			}.ToString(Formatting.Indented), conflictsResolver.Resolve());
		}
		public void CanResolveIdentical()
		{
			var conflictsResolver = new ConflictsResolver(new RavenJObject
			{
				{"Name", "Oren"}
			}, new RavenJObject
			{
				{"Name","Oren"}
			});
			Assert.Equal(new RavenJObject
			{
				{"Name","Oren"}
			}.ToString(Formatting.Indented), conflictsResolver.Resolve());
		}
		public void CanResolveOneEmptyArraysAndOneWithValue()
		{
			var conflictsResolver = new ConflictsResolver(new RavenJObject
			{
				{"Name", new RavenJArray()}
			}, new RavenJObject
			{
				{"Name",new RavenJArray{1}}
			});
			Assert.Equal(@"{
  ""Name"": /*>>>> auto merged array start*/ [
    1
  ]/*<<<< auto merged array end*/
}", conflictsResolver.Resolve());
		}
		public void CanMergeAdditionalProperties()
		{
			var conflictsResolver = new ConflictsResolver(new RavenJObject
			{
				{"Name", "Oren"}
			}, new RavenJObject
			{
				{"Age",2}
			});
			Assert.Equal(new RavenJObject
			{
				{"Name","Oren"},
				{"Age", 2}
			}.ToString(Formatting.Indented), conflictsResolver.Resolve());
		}
		public void CanDetectAndSuggestOptionsForConflict_SimpleProp()
		{
			var conflictsResolver = new ConflictsResolver(new RavenJObject
			{
				{"Name", "Oren"}
			}, new RavenJObject
			{
					{"Name", "Ayende"}
			});
			Assert.Equal(@"{
  ""Name"": /*>>>> conflict start*/ [
    ""Oren"",
    ""Ayende""
  ]/*<<<< conflict end*/
}", conflictsResolver.Resolve());
		}
		public void CanResolveIdentical()
		{
			var conflictsResolver = new ConflictsResolver(
								new List<RavenJObject> {
								new RavenJObject
								{
										{"Name", "Oren"}
								},
								new RavenJObject
								{
										{"Name","Oren"}
								}
						});
			Assert.Equal(@"{
	""Name"": ""Oren""
}", conflictsResolver.Resolve().Document);
		}
		public void CanResolveTwoEmptyArrays()
		{
			var conflictsResolver = new ConflictsResolver(
								new List<RavenJObject> {
										new RavenJObject
										{
												{"Name", new RavenJArray()}
										}, 
										new RavenJObject
										{
												{"Name",new RavenJArray()}
										}
								});
			Assert.Equal(@"{
	""Name"": []
}", conflictsResolver.Resolve().Document);
		}
		public void CanMergeProperties_Nested()
		{
			var conflictsResolver = new ConflictsResolver(new RavenJObject
			{
				{"Name", new RavenJObject
				{
					{"First", "Oren"}
				}}
			}, new RavenJObject
			{
					{"Name", new RavenJObject
					{
						{"Last", "Eini"}	
					}}
			});
			Assert.Equal(@"{
  ""Name"":{
    ""First"": ""Oren"",
    ""Last"": ""Eini""
  }
}", conflictsResolver.Resolve());
		}
		public void CanResolveEmpty()
		{
			var conflictsResolver = new ConflictsResolver(new List<RavenJObject> { new RavenJObject(), new RavenJObject() });
			Assert.Equal("{}", conflictsResolver.Resolve().Document);
		}
		public void CanMergeArrays_SameStart()
		{
			var conflictsResolver = new ConflictsResolver(new RavenJObject
			{
				{"Comments", new RavenJArray{1,2,4}}
			}, new RavenJObject
			{
				{"Comments", new RavenJArray{1,2,5}}
			});
			Assert.Equal(@"{
  ""Comments"": /*>>>> auto merged array start*/ [
    1,
    2,
    4,
    5
  ]/*<<<< auto merged array end*/
}", conflictsResolver.Resolve());
		}
		public void CanMergeArrays()
		{
			var docs = new List<RavenJObject>
			{
				new RavenJObject
				{
					{"Nicks", new RavenJArray {"Oren"}}
				},
				new RavenJObject
				{
					{"Nicks", new RavenJArray {"Ayende"}}
				}
			};
			foreach (var doc in docs)
			{
				doc.EnsureCannotBeChangeAndEnableSnapshotting();
			}
			var conflictsResolver = new ConflictsResolver(docs);
			Assert.Equal(@"{
	""Nicks"": /*>>>> auto merged array start*/ [
		""Oren"",
		""Ayende""
	]/*<<<< auto merged array end*/
}", conflictsResolver.Resolve().Document);
		}
		public void CanMergeArrays()
		{
			var conflictsResolver = new ConflictsResolver(new RavenJObject
			{
				{"Nicks", new RavenJArray{"Oren"}}
			}, new RavenJObject
			{
				{"Nicks", new RavenJArray{"Ayende"}}
			});
			Assert.Equal(@"{
  ""Nicks"": /*>>>> auto merged array start*/ [
    ""Oren"",
    ""Ayende""
  ]/*<<<< auto merged array end*/
}", conflictsResolver.Resolve());
		}
		public void CanResolveEmptyWithMetadata()
		{
			var conflictsResolver = new ConflictsResolver(new List<RavenJObject>
			{
				new RavenJObject()
				{
					{
						"@metadata", new RavenJObject()
					}
				},
				new RavenJObject()
				{
					{
						"@metadata", new RavenJObject()
					}
				}
			});
			Assert.Equal("{}", conflictsResolver.Resolve().Metadata);
		}
		public void CanResolveEmpty()
		{
			var conflictsResolver = new ConflictsResolver(new RavenJObject(), new RavenJObject());
			Assert.Equal("{}", conflictsResolver.Resolve());
		}
		public void CanResolveTwoEmptyArraysInMetadata()
		{
			var conflictsResolver = new ConflictsResolver(
								new List<RavenJObject> {
										new RavenJObject
										{
											{"@metadata", new RavenJObject()
											{
												{"Bar", new RavenJArray()}
											}}
										}, 
										new RavenJObject
										{
											{"@metadata", new RavenJObject()
											{
												{"Bar", new RavenJArray()}
											}}
										}, 
								});
			Assert.Equal(@"{
	""Bar"": []
}", conflictsResolver.Resolve().Metadata);
		}
        public void CanMergeEmptyArrays()
        {
            var conflictsResolver = new ConflictsResolver(new RavenJObject
			{
				{"Nicks", new RavenJArray()}
			}, new RavenJObject
			{
				{"Nicks", new RavenJArray()}
			});
            Assert.Equal(@"{
  ""Nicks"": []
}", conflictsResolver.Resolve());
        }
Exemple #18
0
        private void WriteConflictResolver(string name, JsonTextWriter documentWriter, JsonTextWriter metadataWriter, ConflictsResolver resolver, int indent)
        {
            MergeResult result = resolver.Resolve(indent);

            if (resolver.isMetadataResolver)
            {
                if (name != "@metadata")
                {
                    metadataWriter.WritePropertyName(name);
                }

                WriteRawData(metadataWriter, result.Document, indent);
            }
            else
            {
                documentWriter.WritePropertyName(name);
                WriteRawData(documentWriter, result.Document, indent);
            }
        }
Exemple #19
0
        private void WriteConflictResolver(string name, JsonTextWriter documentWriter, JsonTextWriter metadataWriter, ConflictsResolver resolver, int indent)
        {
            MergeResult result = resolver.Resolve(indent);

            if (resolver.isMetadataResolver)
            {
                if(name != "@metadata")
                    metadataWriter.WritePropertyName(name);

                WriteRawData(metadataWriter, result.Document, indent);
            }
            else
            {
                documentWriter.WritePropertyName(name);
                WriteRawData(documentWriter, result.Document, indent);
            }
        }
		public void CanMergeAdditionalMetadata()
		{
			var conflictsResolver = new ConflictsResolver(
								new List<RavenJObject> {
										new RavenJObject
										{
											{"@metadata", new RavenJObject()
											{
												{"Name", "Oren"}
											}}
										}, 
										new RavenJObject
										{
											{"@metadata", new RavenJObject()
											{
												{"Age", 2}
											}}
										}, 
								});
			Assert.Equal(@"{
	""Name"": ""Oren"",
	""Age"": 2
}", conflictsResolver.Resolve().Metadata);
		}
		public void CanResolveOneEmptyArraysAndOneWithValueInMetadata()
		{
			var conflictsResolver = new ConflictsResolver(
								new List<RavenJObject> {
										new RavenJObject
										{
											{"@metadata", new RavenJObject()
											{
												{"Bar", new RavenJArray(1)}
											}}
										}, 
										new RavenJObject
										{
											{"@metadata", new RavenJObject()
											{
												{"Bar", new RavenJArray()}
											}}
										}, 
								});
			Assert.Equal(@"{
	""Bar"": /*>>>> auto merged array start*/ [
		1
	]/*<<<< auto merged array end*/
}", conflictsResolver.Resolve().Metadata);
		}
		public override void LoadModelParameters(string parameters)
		{
			var url = new UrlParser(UrlUtil.Url);
			documentIdManager.Clear();

			if (url.GetQueryParam("mode") == "new")
			{
				Mode = DocumentMode.New;
				InitialiseDocument();
				Navigator = null;
				CurrentIndex = 0;
				TotalItems = 0;
				SetCurrentDocumentKey(null);
				ParentPathSegments.Clear();
				ParentPathSegments.Add(new PathSegment() { Name = "Documents", Url = "/documents" });
				return;
			}

			var database = url.GetQueryParam("databaseid");
			if(database != null)
			{
				EditDatabaseDocument(database);
				return;
			}

			Navigator = DocumentNavigator.FromUrl(url);

			Navigator.GetDocument().ContinueOnSuccessInTheUIThread(
				result =>
				{
					if (result.Document == null)
					{
						HandleDocumentNotFound();
						return;
					}

					if (string.IsNullOrEmpty(result.Document.Key))
					{
						Mode = DocumentMode.Projection;
						LocalId = Guid.NewGuid().ToString();
					}
					else
					{
						Mode = DocumentMode.DocumentWithId;
						result.Document.Key = Uri.UnescapeDataString(result.Document.Key);
						LocalId = result.Document.Key;
						SetCurrentDocumentKey(result.Document.Key);
					}

					urlForFirst = result.UrlForFirst;
					urlForPrevious = result.UrlForPrevious;
					urlForLast = result.UrlForLast;
					urlForNext = result.UrlForNext;

					IsLoaded = true;
					document.Value = result.Document;
					CurrentIndex = (int)result.Index;
					TotalItems = (int)result.TotalDocuments;

					ParentPathSegments.Clear();
					ParentPathSegments.AddRange(result.ParentPath);

					WhenParsingComplete(dataSection.Document)
						.ContinueOnUIThread(t => ApplyOutliningMode());

					HandleDocumentChanged();
				})
				.Catch(exception =>
				{
					var conflictExeption = exception.GetBaseException() as ConflictException;

					if (conflictExeption != null)
					{
						ApplicationModel.Current.Server.Value.SelectedDatabase.Value
							.AsyncDatabaseCommands
							.GetAsync(conflictExeption.ConflictedVersionIds, null)
							.ContinueOnSuccessInTheUIThread(doc =>
							{
								var docs = new List<RavenJObject>();
								var metadatas = new List<RavenJObject>();
								foreach (var result in doc.Results)
								{
									metadatas.Add(result.Value<RavenJObject>("@metadata"));
									result.Remove("@metadata");
									docs.Add(result);
								}

								ClearMetadatas(metadatas);

								var docsConflictsResolver = new ConflictsResolver(docs.ToArray());
								var metadataConflictsResolver = new ConflictsResolver(metadatas.ToArray());

								Key = url.GetQueryParam("id");
								DocumentKey = Key;
								OnPropertyChanged(() => DisplayId);
								Etag = conflictExeption.Etag;
	
								ResolvingConflict = true;

								dataSection.Document.DeleteText(TextChangeTypes.Custom, 0, dataSection.Document.CurrentSnapshot.Length);
								dataSection.Document.AppendText(TextChangeTypes.Custom, docsConflictsResolver.Resolve());

								metaDataSection.Document.DeleteText(TextChangeTypes.Custom, 0, metaDataSection.Document.CurrentSnapshot.Length);
								metaDataSection.Document.AppendText(TextChangeTypes.Custom, metadataConflictsResolver.Resolve());

								OnPropertyChanged(() => dataSection);
								OnPropertyChanged(() => document);
							});
						return true;
					}

					return false;
				});
		}
		public void CanDetectConflict_DifferentValues()
		{
			var conflictsResolver = new ConflictsResolver(new RavenJObject
			{
				{"Name", new RavenJObject
				{
					{"First", "Oren"}
				}}
			}, new RavenJObject
			{
					{"Name",  "Eini"}
			});
			Assert.Equal(@"{
  ""Name"": /*>>>> conflict start*/ [
    {
      ""First"": ""Oren""
    },
    ""Eini""
  ]/*<<<< conflict end*/
}", conflictsResolver.Resolve());
		}
		public override void LoadModelParameters(string parameters)
		{
			var url = new UrlParser(UrlUtil.Url);
			documentIdManager.Clear();

			if (url.GetQueryParam("mode") == "new")
			{
				Mode = DocumentMode.New;
				InitializeDocument();
				Navigator = null;
				CurrentIndex = 0;
				TotalItems = 0;
			    ResolvingConflict = false;
				SetCurrentDocumentKey(null);
				ParentPathSegments.Clear();
				ParentPathSegments.Add(new PathSegment { Name = "Documents", Url = "/documents" });
				return;
			}

			var database = url.GetQueryParam("databaseid");
			if (database != null)
			{
				EditDatabaseDocument(database);
				return;
			}

			Navigator = DocumentNavigator.FromUrl(url);

			Navigator.GetDocument().ContinueOnSuccessInTheUIThread(
				result =>
				{
				    if (result.IsConflicted)
				    {
                        ApplicationModel.Current.Server.Value.SelectedDatabase.Value
                                             .AsyncDatabaseCommands
                                             .GetAsync(result.ConflictingVersionIds.ToArray(), null)
                                             .ContinueOnSuccessInTheUIThread(loadResult =>
                                             {
                                                 var docs = new List<RavenJObject>();
                                                 var metadatas = new List<RavenJObject>();
                                                 foreach (var doc in loadResult.Results)
                                                 {
                                                     metadatas.Add(doc.Value<RavenJObject>("@metadata"));
                                                     doc.Remove("@metadata");
                                                     docs.Add(doc);
                                                 }

                                                 ClearMetadatas(metadatas);

                                                 var docsConflictsResolver = new ConflictsResolver(docs.ToArray());
                                                 var metadataConflictsResolver = new ConflictsResolver(metadatas.ToArray());

                                                 SetCurrentDocumentKey(result.ConflictDocumentId);

                                                 OnPropertyChanged(() => DisplayId);
                                                 Etag = result.ConflictEtag;

                                                 ResolvingConflict = true;

                                                 JsonData = docsConflictsResolver.Resolve();
                                                 JsonMetadata = metadataConflictsResolver.Resolve();

                                                 HasUnsavedChanges = false;

                                                 OnPropertyChanged(() => dataSection);
                                                 OnPropertyChanged(() => document);
                                             });
				    }
				    else
				    {
				        if (result.Document == null)
				        {
				            HandleDocumentNotFound();
				            return;
				        }

				        ResolvingConflict = false;

				        if (string.IsNullOrEmpty(result.Document.Key))
				        {
				            Mode = DocumentMode.Projection;
				            LocalId = Guid.NewGuid().ToString();
				        }
				        else
				        {
				            AssertNoPropertyBeyondSize(result.Document.DataAsJson, 500*1000);
				            var recentQueue = ApplicationModel.Current.Server.Value.SelectedDatabase.Value.RecentDocuments;
				            ApplicationModel.Current.Server.Value.RawUrl = "databases/" +
				                                                           ApplicationModel.Current.Server.Value.SelectedDatabase
				                                                                           .Value.Name +
				                                                           "/docs/" + result.Document.Key;
				            recentQueue.Add(result.Document.Key);
				            Mode = DocumentMode.DocumentWithId;
				            result.Document.Key = Uri.UnescapeDataString(result.Document.Key);
				            LocalId = result.Document.Key;
				            SetCurrentDocumentKey(result.Document.Key);
				            var expiration = result.Document.Metadata["Raven-Expiration-Date"];
				            if (expiration != null)
				            {
				                ExpireAt.Value = DateTime.Parse(expiration.ToString());
				                EnableExpiration.Value = true;
				                HasExpiration = true;
				            }
				            else
				            {
				                HasExpiration = false;
				            }
				        }

                        document.Value = result.Document;
                        
                        WhenParsingComplete(dataSection.Document)
                            .ContinueOnUIThread(t => ApplyOutliningMode());

                        HandleDocumentChanged();
				    }

				    urlForFirst = result.UrlForFirst;
					urlForPrevious = result.UrlForPrevious;
					urlForLast = result.UrlForLast;
					urlForNext = result.UrlForNext;

					CurrentIndex = (int) result.Index;
					TotalItems = (int) result.TotalDocuments;

					ParentPathSegments.Clear();
					ParentPathSegments.AddRange(result.ParentPath);

				})
			    .Catch();
		}
		public void CanResolveIdenticalMetadata()
		{
			var conflictsResolver = new ConflictsResolver(new List<RavenJObject>
			{
				new RavenJObject()
				{
					{
						"@metadata", new RavenJObject()
						{
							{
								"Foo", "Bar"
							}
						}
					}
				},
				new RavenJObject()
				{
					{
						"@metadata", new RavenJObject()
						{
							{
								"Foo", "Bar"
							}
						}

					}
				}
			});
			Assert.Equal(@"{
	""Foo"": ""Bar""
}", conflictsResolver.Resolve().Metadata);
		}
 public Task<HttpResponseMessage> ResolveMerge(string documentId)
 {
     int nextPage = 0;
     var docs = Database.Documents.GetDocumentsWithIdStartingWith(documentId + "/conflicts", null, null, 0, 1024, CancellationToken.None, ref nextPage);
     var conflictsResolver = new ConflictsResolver(docs.Values<RavenJObject>());
     return GetMessageWithObjectAsTask(conflictsResolver.Resolve());
 }
		public void CanMergeAdditionalProperties()
		{
			var conflictsResolver = new ConflictsResolver(
								new List<RavenJObject> { 
										new RavenJObject
										{
												{"Name", "Oren"}
										},
										new RavenJObject
										{
												{"Age",2}
										}
								});
			Assert.Equal(@"{
	""Name"": ""Oren"",
	""Age"": 2
}", conflictsResolver.Resolve().Document);
		}