[gxml] Ported SerializableTreeMap to post-serialization



commit e10eec3d9f98bf835f889f966e8ec6ee2b30a427
Author: Daniel Espinosa <esodan gmail com>
Date:   Wed Feb 24 14:01:07 2016 -0600

    Ported SerializableTreeMap to post-serialization

 gxml/SerializableGeeTreeMap.vala     |   61 +++++++++++++--------
 test/SerializableGeeHashMapTest.vala |  100 ---------------------------------
 test/SerializableGeeTreeMapTest.vala |  100 +++++++++++++++++++++++++++++++++
 test/TwDocumentTest.vala             |   12 ++--
 test/gxml-performance.vala           |  102 ++++++++++++++++++++++++++++++++++
 5 files changed, 246 insertions(+), 129 deletions(-)
---
diff --git a/gxml/SerializableGeeTreeMap.vala b/gxml/SerializableGeeTreeMap.vala
index 36d931b..3a88f4a 100644
--- a/gxml/SerializableGeeTreeMap.vala
+++ b/gxml/SerializableGeeTreeMap.vala
@@ -29,13 +29,43 @@ using GXml;
 public class GXml.SerializableTreeMap<K,V> : Gee.TreeMap<K,V>, Serializable, SerializableCollection
 {
   GXml.Node _node;
+  bool _deserialized = false;
 
   // SerializableCollection interface
   public virtual bool deserialize_proceed () { return true; }
   public virtual bool deserialized () { return true; }
   public virtual bool is_prepared () { return (_node is GXml.Node); }
-  public virtual bool deserialize_node (GXml.Node node) throws GLib.Error { return false; }
-  public virtual bool deserialize_children () throws GLib.Error { return false; }
+  public virtual bool deserialize_node (GXml.Node node) throws GLib.Error {
+    if (!(value_type.is_a (typeof (GXml.Serializable)) &&
+        value_type.is_a (typeof (SerializableMapKey)))) {
+      throw new SerializableError.UNSUPPORTED_TYPE_ERROR (_("%s: Value type '%s' is unsupported"), 
+                                                    this.get_type ().name (), value_type.name ());
+    }
+    if (node is Element) {
+      var obj = Object.new (value_type);
+      if (node.name.down () == ((Serializable) obj).node_name ().down ()) {
+        ((Serializable) obj).deserialize (node);
+        @set (((SerializableMapKey<K>) obj).get_map_key (), obj);
+      }
+    }
+    return true;
+  }
+  public virtual bool deserialize_children () throws GLib.Error {
+    if (_deserialized) return false;
+    if (_node == null) return false;
+    if (!(value_type.is_a (typeof (GXml.Serializable)) &&
+        value_type.is_a (typeof (SerializableMapKey)))) {
+      throw new SerializableError.UNSUPPORTED_TYPE_ERROR (_("%s: Value type '%s' is unsupported"), 
+                                                    this.get_type ().name (), value_type.name ());
+    }
+    if (_node is Element) {
+      foreach (GXml.Node n in _node.children) {
+        deserialize_node (n);
+      }
+    }
+    _deserialized = true;
+    return true;
+  }
 
        construct { Init.init (); }
 
@@ -116,26 +146,11 @@ public class GXml.SerializableTreeMap<K,V> : Gee.TreeMap<K,V>, Serializable, Ser
   public bool default_deserialize (GXml.Node node)
                     throws GLib.Error
   {
-    if (!(value_type.is_a (typeof (GXml.Serializable)) &&
-        value_type.is_a (typeof (SerializableMapKey)))) {
-      throw new SerializableError.UNSUPPORTED_TYPE_ERROR (_("%s: Value type '%s' is unsupported"), 
-                                                    this.get_type ().name (), value_type.name ());
-    }
-    if (node is Element) {
-      foreach (GXml.Node n in node.children) {
-        if (n is Element) {
-#if DEBUG
-          stdout.printf (@"Node $(node.name) for type '$(get_type ().name ())'\n");
-#endif
-          var obj = Object.new (value_type);
-          if (n.name.down () == ((Serializable) obj).node_name ().down ()) {
-            ((Serializable) obj).deserialize (n);
-            @set (((SerializableMapKey<K>) obj).get_map_key (), obj);
-          }
-        }
-      }
-    }
-    return true;
+    _node = node;
+    _deserialized = false;
+    if (deserialize_proceed ())
+      return deserialize_children ();
+    return false;
   }
   public virtual bool deserialize_property (GXml.Node property_node)
                                             throws GLib.Error
@@ -145,6 +160,6 @@ public class GXml.SerializableTreeMap<K,V> : Gee.TreeMap<K,V>, Serializable, Ser
   public bool default_deserialize_property (GXml.Node property_node)
                                             throws GLib.Error
   {
-    return true;
+    return deserialize_node (property_node);
   }
 }
diff --git a/test/SerializableGeeHashMapTest.vala b/test/SerializableGeeHashMapTest.vala
index 0afa4d0..3ccff5d 100644
--- a/test/SerializableGeeHashMapTest.vala
+++ b/test/SerializableGeeHashMapTest.vala
@@ -28,24 +28,6 @@ using Gee;
 
 class SerializableGeeHashMapTest : GXmlTest
 {
-  class HElement : SerializableObjectModel, SerializableMapKey<string>
-  {
-    public string name { get; set; }
-    public string get_map_key () { return name; }
-    public override string node_name () { return "HElement"; }
-    public override string to_string () { return "HElement"; }
-    public class HashMap : SerializableHashMap<string,HElement> {
-      public bool enable_deserialize { get; set; default = false; }
-      public override bool deserialize_proceed () { return enable_deserialize; }
-    }
-  }
-  class HCElement : SerializableObjectModel {
-    public HElement.HashMap elements1 { get; set; default = new HElement.HashMap (); }
-    public HElement.HashMap elements2 { get; set; default = new HElement.HashMap (); }
-    public override string node_name () { return "HCElement"; }
-    public override string to_string () { return "HCElement"; }
-  }
-  
   class Space : SerializableObjectModel, SerializableMapKey<string>
   {
     public string get_map_key () { return name; }
@@ -342,87 +324,5 @@ class SerializableGeeHashMapTest : GXmlTest
         assert_not_reached ();
       }
     });
-    Test.add_func ("/gxml/performance/hashmap/post-deserialization/disable",
-    () => {
-      try {
-        double time;
-        Test.message ("Starting generating document...");
-        Test.timer_start ();
-        var d = new TwDocument ();
-        var ce = new HCElement ();
-        for (int i = 0; i < 125000; i++) {
-          var e1 = new HElement ();
-          e1.name = "1E"+i.to_string ();
-          ce.elements1.set (e1.name, e1);
-          var e2 = new HElement ();
-          e2.name = "2E"+i.to_string ();
-          ce.elements2.set (e2.name, e2);
-        }
-        ce.serialize (d);
-        time = Test.timer_elapsed ();
-        Test.minimized_result (time, "Created document: %g seconds", time);
-        Test.message ("Starting deserializing document: Disable collection deserialization...");
-        Test.timer_start ();
-        var cep = new HCElement ();
-        cep.elements1.enable_deserialize = false;
-        cep.elements2.enable_deserialize = false;
-        cep.deserialize (d);
-        time = Test.timer_elapsed ();
-        Test.minimized_result (time, "Disable Deserialize Collection. Deserialized from doc: %g seconds", 
time);
-        assert (cep.elements1.is_prepared ());
-        assert (cep.elements2.is_prepared ());
-        Test.message ("Calling C1 deserialize_children()...");
-        Test.timer_start ();
-        cep.elements1.deserialize_children ();
-        assert (!cep.elements1.deserialize_children ());
-        time = Test.timer_elapsed ();
-        Test.minimized_result (time, "C1: Disable Deserialize Collection. Deserialized from NODE: %g 
seconds", time);
-        Test.message ("Calling C2 deserialize_children()...");
-        Test.timer_start ();
-        cep.elements2.deserialize_children ();
-        assert (!cep.elements2.deserialize_children ());
-        time = Test.timer_elapsed ();
-        Test.minimized_result (time, "C2: Disable Deserialize Collection. Deserialized from NODE: %g 
seconds", time);
-      } catch (GLib.Error e) {
-        GLib.message ("ERROR: "+e.message);
-        assert_not_reached ();
-      }
-    });
-    Test.add_func ("/gxml/performance/hashmap/post-deserialization/enable",
-    () => {
-      try {
-        double time;
-        Test.message ("Starting generating document...");
-        Test.timer_start ();
-        var d = new TwDocument ();
-        var ce = new HCElement ();
-        for (int i = 0; i < 125000; i++) {
-          var e1 = new HElement ();
-          e1.name = "1E"+i.to_string ();
-          ce.elements1.set (e1.name, e1);
-          var e2 = new HElement ();
-          e2.name = "2E"+i.to_string ();
-          ce.elements2.set (e2.name, e2);
-        }
-        ce.serialize (d);
-        time = Test.timer_elapsed ();
-        Test.minimized_result (time, "Created document: %g seconds", time);
-        Test.message ("Starting deserializing document: Enable collection deserialization...");
-        Test.timer_start ();
-        var cep = new HCElement ();
-        cep.elements1.enable_deserialize = true;
-        cep.elements2.enable_deserialize = true;
-        cep.deserialize (d);
-        time = Test.timer_elapsed ();
-        Test.minimized_result (time, "Disable Deserialize Collection. Deserialized from doc: %g seconds", 
time);
-        assert (cep.elements1.is_prepared ());
-        assert (cep.elements2.is_prepared ());
-        assert (!cep.elements1.deserialize_children ());
-        assert (!cep.elements2.deserialize_children ());
-      } catch (GLib.Error e) {
-        GLib.message ("ERROR: "+e.message);
-        assert_not_reached ();
-      }
-    });
   }
 }
diff --git a/test/SerializableGeeTreeMapTest.vala b/test/SerializableGeeTreeMapTest.vala
index 7c70d59..e50aa01 100644
--- a/test/SerializableGeeTreeMapTest.vala
+++ b/test/SerializableGeeTreeMapTest.vala
@@ -28,6 +28,24 @@ using Gee;
 
 class SerializableGeeTreeMapTest : GXmlTest
 {
+  class HTElement : SerializableObjectModel, SerializableMapKey<string>
+  {
+    public string name { get; set; }
+    public string get_map_key () { return name; }
+    public override string node_name () { return "HElement"; }
+    public override string to_string () { return "HElement"; }
+    public class TreeMap : SerializableTreeMap<string,HTElement> {
+      public bool enable_deserialize { get; set; default = false; }
+      public override bool deserialize_proceed () { return enable_deserialize; }
+    }
+  }
+  class HTCElement : SerializableObjectModel {
+    public HTElement.TreeMap elements1 { get; set; default = new HTElement.TreeMap (); }
+    public HTElement.TreeMap elements2 { get; set; default = new HTElement.TreeMap (); }
+    public override string node_name () { return "HCElement"; }
+    public override string to_string () { return "HCElement"; }
+  }
+  
   class Space : SerializableObjectModel, SerializableMapKey<string>
   {
     public string get_map_key () { return name; }
@@ -271,5 +289,87 @@ class SerializableGeeTreeMapTest : GXmlTest
         assert_not_reached ();
       }
     });
+    Test.add_func ("/gxml/performance/treemap/post-deserialization/disable",
+    () => {
+      try {
+        double time;
+        Test.message ("Starting generating document...");
+        Test.timer_start ();
+        var d = new TwDocument ();
+        var ce = new HTCElement ();
+        for (int i = 0; i < 125000; i++) {
+          var e1 = new HTElement ();
+          e1.name = "1E"+i.to_string ();
+          ce.elements1.set (e1.name, e1);
+          var e2 = new HTElement ();
+          e2.name = "2E"+i.to_string ();
+          ce.elements2.set (e2.name, e2);
+        }
+        ce.serialize (d);
+        time = Test.timer_elapsed ();
+        Test.minimized_result (time, "Created document: %g seconds", time);
+        Test.message ("Starting deserializing document: Disable collection deserialization...");
+        Test.timer_start ();
+        var cep = new HTCElement ();
+        cep.elements1.enable_deserialize = false;
+        cep.elements2.enable_deserialize = false;
+        cep.deserialize (d);
+        time = Test.timer_elapsed ();
+        Test.minimized_result (time, "Disable Deserialize Collection. Deserialized from doc: %g seconds", 
time);
+        assert (cep.elements1.is_prepared ());
+        assert (cep.elements2.is_prepared ());
+        Test.message ("Calling C1 deserialize_children()...");
+        Test.timer_start ();
+        cep.elements1.deserialize_children ();
+        assert (!cep.elements1.deserialize_children ());
+        time = Test.timer_elapsed ();
+        Test.minimized_result (time, "C1: Disable Deserialize Collection. Deserialized from NODE: %g 
seconds", time);
+        Test.message ("Calling C2 deserialize_children()...");
+        Test.timer_start ();
+        cep.elements2.deserialize_children ();
+        assert (!cep.elements2.deserialize_children ());
+        time = Test.timer_elapsed ();
+        Test.minimized_result (time, "C2: Disable Deserialize Collection. Deserialized from NODE: %g 
seconds", time);
+      } catch (GLib.Error e) {
+        GLib.message ("ERROR: "+e.message);
+        assert_not_reached ();
+      }
+    });
+    Test.add_func ("/gxml/performance/treemap/post-deserialization/enable",
+    () => {
+      try {
+        double time;
+        Test.message ("Starting generating document...");
+        Test.timer_start ();
+        var d = new TwDocument ();
+        var ce = new HTCElement ();
+        for (int i = 0; i < 125000; i++) {
+          var e1 = new HTElement ();
+          e1.name = "1E"+i.to_string ();
+          ce.elements1.set (e1.name, e1);
+          var e2 = new HTElement ();
+          e2.name = "2E"+i.to_string ();
+          ce.elements2.set (e2.name, e2);
+        }
+        ce.serialize (d);
+        time = Test.timer_elapsed ();
+        Test.minimized_result (time, "Created document: %g seconds", time);
+        Test.message ("Starting deserializing document: Enable collection deserialization...");
+        Test.timer_start ();
+        var cep = new HTCElement ();
+        cep.elements1.enable_deserialize = true;
+        cep.elements2.enable_deserialize = true;
+        cep.deserialize (d);
+        time = Test.timer_elapsed ();
+        Test.minimized_result (time, "Disable Deserialize Collection. Deserialized from doc: %g seconds", 
time);
+        assert (cep.elements1.is_prepared ());
+        assert (cep.elements2.is_prepared ());
+        assert (!cep.elements1.deserialize_children ());
+        assert (!cep.elements2.deserialize_children ());
+      } catch (GLib.Error e) {
+        GLib.message ("ERROR: "+e.message);
+        assert_not_reached ();
+      }
+    });
   }
 }
diff --git a/test/TwDocumentTest.vala b/test/TwDocumentTest.vala
index f64674d..1a41e47 100644
--- a/test/TwDocumentTest.vala
+++ b/test/TwDocumentTest.vala
@@ -166,7 +166,7 @@ class TwDocumentTest : GXmlTest {
                                        assert_not_reached ();
                                }
                        });
-               Test.add_func ("/gxml/tw-document/save/root/childs", () => {
+               Test.add_func ("/gxml/tw-document/save/root/children", () => {
                                try {
                                        var f = GLib.File.new_for_path 
(GXmlTestConfig.TEST_SAVE_DIR+"/tw-test.xml");
                                        if (f.query_exists ()) f.delete ();
@@ -205,9 +205,9 @@ class TwDocumentTest : GXmlTest {
                                        assert_not_reached ();
                                }
                        });
-               Test.add_func ("/gxml/tw-document/root/childs-childs", () => {
+               Test.add_func ("/gxml/tw-document/root/children-children", () => {
 #if DEBUG
-                               GLib.message (@"TwDocument root childs/childs...");
+                               GLib.message (@"TwDocument root children/children...");
 #endif
                        try {
 #if DEBUG
@@ -268,9 +268,9 @@ class TwDocumentTest : GXmlTest {
                                assert_not_reached ();
                        }
                });
-               Test.add_func ("/gxml/tw-document/save/childs-childs", () => {
+               Test.add_func ("/gxml/tw-document/save/children-children", () => {
 #if DEBUG
-                               GLib.message (@"TwDocument root childs/childs...");
+                               GLib.message (@"TwDocument root children/children...");
 #endif
                        try {
 #if DEBUG
@@ -291,7 +291,7 @@ class TwDocumentTest : GXmlTest {
                                var r = (GXml.Element) d.root;
                                r.set_attr ("name","The Great Book");
 #if DEBUG
-                               GLib.message (@"Creating childs...");
+                               GLib.message (@"Creating children...");
 #endif
                                for (int i = 0; i < 30000; i++){
                                        var b = (GXml.Element) d.create_element ("book");
diff --git a/test/gxml-performance.vala b/test/gxml-performance.vala
index e8c2c55..2d9f65b 100644
--- a/test/gxml-performance.vala
+++ b/test/gxml-performance.vala
@@ -136,6 +136,26 @@ public class Performance
     public override string node_name () { return "CElement"; }
     public override string to_string () { return "CElement"; }
   }
+  // HashMap
+  
+  class HElement : SerializableObjectModel, SerializableMapKey<string>
+  {
+    public string name { get; set; }
+    public string get_map_key () { return name; }
+    public override string node_name () { return "HElement"; }
+    public override string to_string () { return "HElement"; }
+    public class HashMap : SerializableHashMap<string,HElement> {
+      public bool enable_deserialize { get; set; default = false; }
+      public override bool deserialize_proceed () { return enable_deserialize; }
+    }
+  }
+  class HCElement : SerializableObjectModel {
+    public HElement.HashMap elements1 { get; set; default = new HElement.HashMap (); }
+    public HElement.HashMap elements2 { get; set; default = new HElement.HashMap (); }
+    public override string node_name () { return "HCElement"; }
+    public override string to_string () { return "HCElement"; }
+  }
+  
   /**
    * Iterate recursively through all node and children nodes in document.
    */
@@ -375,6 +395,88 @@ public class Performance
         assert_not_reached ();
       }
     });
+    Test.add_func ("/gxml/performance/hashmap/post-deserialization/disable",
+    () => {
+      try {
+        double time;
+        Test.message ("Starting generating document...");
+        Test.timer_start ();
+        var d = new TwDocument ();
+        var ce = new HCElement ();
+        for (int i = 0; i < 125000; i++) {
+          var e1 = new HElement ();
+          e1.name = "1E"+i.to_string ();
+          ce.elements1.set (e1.name, e1);
+          var e2 = new HElement ();
+          e2.name = "2E"+i.to_string ();
+          ce.elements2.set (e2.name, e2);
+        }
+        ce.serialize (d);
+        time = Test.timer_elapsed ();
+        Test.minimized_result (time, "Created document: %g seconds", time);
+        Test.message ("Starting deserializing document: Disable collection deserialization...");
+        Test.timer_start ();
+        var cep = new HCElement ();
+        cep.elements1.enable_deserialize = false;
+        cep.elements2.enable_deserialize = false;
+        cep.deserialize (d);
+        time = Test.timer_elapsed ();
+        Test.minimized_result (time, "Disable Deserialize Collection. Deserialized from doc: %g seconds", 
time);
+        assert (cep.elements1.is_prepared ());
+        assert (cep.elements2.is_prepared ());
+        Test.message ("Calling C1 deserialize_children()...");
+        Test.timer_start ();
+        cep.elements1.deserialize_children ();
+        assert (!cep.elements1.deserialize_children ());
+        time = Test.timer_elapsed ();
+        Test.minimized_result (time, "C1: Disable Deserialize Collection. Deserialized from NODE: %g 
seconds", time);
+        Test.message ("Calling C2 deserialize_children()...");
+        Test.timer_start ();
+        cep.elements2.deserialize_children ();
+        assert (!cep.elements2.deserialize_children ());
+        time = Test.timer_elapsed ();
+        Test.minimized_result (time, "C2: Disable Deserialize Collection. Deserialized from NODE: %g 
seconds", time);
+      } catch (GLib.Error e) {
+        GLib.message ("ERROR: "+e.message);
+        assert_not_reached ();
+      }
+    });
+    Test.add_func ("/gxml/performance/hashmap/post-deserialization/enable",
+    () => {
+      try {
+        double time;
+        Test.message ("Starting generating document...");
+        Test.timer_start ();
+        var d = new TwDocument ();
+        var ce = new HCElement ();
+        for (int i = 0; i < 125000; i++) {
+          var e1 = new HElement ();
+          e1.name = "1E"+i.to_string ();
+          ce.elements1.set (e1.name, e1);
+          var e2 = new HElement ();
+          e2.name = "2E"+i.to_string ();
+          ce.elements2.set (e2.name, e2);
+        }
+        ce.serialize (d);
+        time = Test.timer_elapsed ();
+        Test.minimized_result (time, "Created document: %g seconds", time);
+        Test.message ("Starting deserializing document: Enable collection deserialization...");
+        Test.timer_start ();
+        var cep = new HCElement ();
+        cep.elements1.enable_deserialize = true;
+        cep.elements2.enable_deserialize = true;
+        cep.deserialize (d);
+        time = Test.timer_elapsed ();
+        Test.minimized_result (time, "Disable Deserialize Collection. Deserialized from doc: %g seconds", 
time);
+        assert (cep.elements1.is_prepared ());
+        assert (cep.elements2.is_prepared ());
+        assert (!cep.elements1.deserialize_children ());
+        assert (!cep.elements2.deserialize_children ());
+      } catch (GLib.Error e) {
+        GLib.message ("ERROR: "+e.message);
+        assert_not_reached ();
+      }
+    });
 #endif
   }
 }


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