[longomatch] Add support for arrays of Images and similar property names



commit a4517df5bea57eea844f4edc16cafe34ed464763
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date:   Mon Mar 16 12:47:19 2015 +0100

    Add support for arrays of Images and similar property names

 LongoMatch.DB/DocumentsSerializer.cs |   49 ++++++++++++++--------------------
 Tests/DB/TestStorage.cs              |   39 +++++++++++++++++++++-----
 2 files changed, 51 insertions(+), 37 deletions(-)
---
diff --git a/LongoMatch.DB/DocumentsSerializer.cs b/LongoMatch.DB/DocumentsSerializer.cs
index 4ec6b7a..5f9769c 100644
--- a/LongoMatch.DB/DocumentsSerializer.cs
+++ b/LongoMatch.DB/DocumentsSerializer.cs
@@ -75,10 +75,9 @@ namespace LongoMatch.DB
                        settings.Formatting = Formatting.Indented;
                        settings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
                        settings.TypeNameHandling = TypeNameHandling.Objects;
-                       settings.ContractResolver = new ImagePropertiesContractResolver (rev);
                        settings.Converters.Add (new ImageConverter (rev));
                        settings.Converters.Add (new VersionConverter ());
-                       settings.Converters.Add (new DocumentsIDConverter (refTypes));
+                       //settings.Converters.Add (new DocumentsIDConverter (localTypes));
                        settings.Converters.Add (new LongoMatchConverter (false));
                        //settings.ReferenceResolver = new IDReferenceResolver (db);
                        return JsonSerializer.Create (settings);
@@ -86,31 +85,6 @@ namespace LongoMatch.DB
        }
 
 
-       /// <summary>
-       /// Prevents serializing properties with <c>Image</c> objects that should be stored
-       /// as attachments
-       /// </summary>
-       class ImagePropertiesContractResolver : DefaultContractResolver
-       {
-               ImageConverter imgConverter;
-
-               public ImagePropertiesContractResolver (Revision rev)
-               {
-                       imgConverter = new ImageConverter (rev);
-               }
-
-               protected override JsonProperty CreateProperty (MemberInfo member,
-                                                               MemberSerialization memberSerialization)
-               {
-                       JsonProperty property = base.CreateProperty (member, memberSerialization);
-
-                       if (property.PropertyType == typeof(Image)) {
-                               property.ShouldSerialize = d => true;
-                       }
-                       return property;
-               }
-       }
-
        class IdReferenceResolver : IReferenceResolver
        {
                int _references;
@@ -172,17 +146,34 @@ namespace LongoMatch.DB
        {
                Revision rev;
                const string ATTACHMENT = "attachment::";
+               Dictionary<string, int> attachmentNamesCount;
 
                public ImageConverter (Revision rev)
                {
                        this.rev = rev;
+                       attachmentNamesCount = new Dictionary<string, int> ();
+               }
+
+               string GetAttachmentName (JsonWriter writer) {
+                       string propertyName;
+                       if (writer.WriteState == WriteState.Array) {
+                               propertyName = ((writer as JTokenWriter).Token.Last as JProperty).Name;
+                       } else {
+                               propertyName = writer.Path;
+                       }
+                       if (!attachmentNamesCount.ContainsKey (propertyName)) {
+                               attachmentNamesCount [propertyName] = 0;
+                       }
+                       attachmentNamesCount [propertyName] ++;
+                       return string.Format ("{0}_{1}", propertyName, attachmentNamesCount [propertyName]);
                }
 
                public override void WriteJson (JsonWriter writer, object value, JsonSerializer serializer)
                {
-                       (rev as UnsavedRevision).SetAttachment (writer.Path, "image/png",
+                       string attachName = GetAttachmentName (writer);
+                       (rev as UnsavedRevision).SetAttachment (attachName, "image/png",
                                (value as Image).Serialize ());
-                       writer.WriteValue (ATTACHMENT + writer.Path);
+                       writer.WriteValue (ATTACHMENT + attachName);
                }
 
                public override object ReadJson (JsonReader reader, Type objectType,
diff --git a/Tests/DB/TestStorage.cs b/Tests/DB/TestStorage.cs
index 5d5535e..8b84ad6 100644
--- a/Tests/DB/TestStorage.cs
+++ b/Tests/DB/TestStorage.cs
@@ -15,16 +15,17 @@
 //  along with this program; if not, write to the Free Software
 //  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 //
-using NUnit.Framework;
 using System;
-using Couchbase.Lite;
-using LongoMatch.DB;
+using System.Collections.Generic;
 using System.IO;
+using Couchbase.Lite;
 using LongoMatch.Core.Common;
-using LongoMatch.Core.Store.Templates;
-using LongoMatch.Core.Store;
 using LongoMatch.Core.Interfaces;
+using LongoMatch.Core.Store;
+using LongoMatch.Core.Store.Templates;
+using LongoMatch.DB;
 using Newtonsoft.Json.Linq;
+using NUnit.Framework;
 
 namespace Tests.DB
 {
@@ -34,6 +35,7 @@ namespace Tests.DB
                public Guid ID { get; set; }
                public Image Image1 { get; set; }
                public Image Image2 { get; set; }
+               public List<Image> Images { get; set;}
        }
 
        [TestFixture ()]
@@ -85,13 +87,34 @@ namespace Tests.DB
                        UnsavedRevision rev = doc.CreateRevision ();
                        JObject jo = DocumentsSerializer.SerializeObject (t, rev, null);
                        Assert.IsNotNull (jo ["ID"]);
-                       Assert.AreEqual ("attachment::Image1", jo ["Image1"].Value<string>());
-                       Assert.AreEqual ("attachment::Image2", jo ["Image2"].Value<string>());
+                       Assert.AreEqual ("attachment::Image1_1", jo ["Image1"].Value<string> ());
+                       Assert.AreEqual ("attachment::Image2_1", jo ["Image2"].Value<string> ());
+                       int i = 0;
+                       foreach (string name in rev.AttachmentNames) {
+                               i++;
+                               Assert.AreEqual (string.Format ("Image{0}_1", i), name);
+                       }
+               }
+
+               [Test()]
+               public void TestSerializeImagesList () {
+                       Image img = Utils.LoadImageFromFile ();
+                       StorableImageTest t = new StorableImageTest {
+                               Images = new List<Image> {img, img, img},
+                               ID = Guid.NewGuid(),
+                       };
+                       Document doc = db.CreateDocument ();
+                       UnsavedRevision rev = doc.CreateRevision ();
+                       JObject jo = DocumentsSerializer.SerializeObject (t, rev, null);
                        int i = 0;
                        foreach (string name in rev.AttachmentNames) {
                                i++;
-                               Assert.AreEqual ("Image" + i, name);
+                               Assert.AreEqual ("Images_" + i, name);
                        }
+                       Assert.AreEqual (3, i);
+                       Assert.AreEqual ("attachment::Images_1", jo ["Images"][0].Value<string>());
+                       Assert.AreEqual ("attachment::Images_2", jo ["Images"][1].Value<string>());
+                       Assert.AreEqual ("attachment::Images_3", jo ["Images"][2].Value<string>());
                }
 
                [Test()]


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]