[longomatch] Add support for arrays of Images and similar property names
- From: Andoni Morales Alastruey <amorales src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [longomatch] Add support for arrays of Images and similar property names
- Date: Wed, 18 Mar 2015 14:45:19 +0000 (UTC)
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]