[gxml] Ported SerializabeDualKeyMap to post-deserialization



commit 34fd696026ec66ecfd7a69e87edc13faba4947f1
Author: Daniel Espinosa <esodan gmail com>
Date:   Wed Feb 24 14:07:37 2016 -0600

    Ported SerializabeDualKeyMap to post-deserialization

 gxml/SerializableGeeDualKeyMap.vala  |   64 ++++++++++++----------
 test/SerializableGeeTreeMapTest.vala |  100 ----------------------------------
 test/gxml-performance.vala           |  100 ++++++++++++++++++++++++++++++++++
 3 files changed, 135 insertions(+), 129 deletions(-)
---
diff --git a/gxml/SerializableGeeDualKeyMap.vala b/gxml/SerializableGeeDualKeyMap.vala
index 33cf7b4..6e8b2fd 100644
--- a/gxml/SerializableGeeDualKeyMap.vala
+++ b/gxml/SerializableGeeDualKeyMap.vala
@@ -32,13 +32,41 @@ public class GXml.SerializableDualKeyMap<P,S,V> : Object, Gee.Traversable <V>, S
 {
   protected Gee.HashMultiMap<P,HashMap<S,V>> storage;
   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 (SerializableMapDualKey)))) {
+      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 = (SerializableMapDualKey<P,S>) Object.new (value_type);
+      if (node.name.down () == ((Serializable) obj).node_name ().down ()) {
+        ((Serializable) obj).deserialize (node);
+        @set (obj.get_map_primary_key (), obj.get_map_secondary_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 (SerializableMapDualKey)))) {
+      throw new SerializableError.UNSUPPORTED_TYPE_ERROR (_("%s: Value type '%s' is unsupported"), 
+                                                    this.get_type ().name (), value_type.name ());
+    }
+    foreach (GXml.Node n in _node.children) {
+      deserialize_node (n);
+    }
+    _deserialized = true;
+    return true;
+  }
 
        construct { Init.init (); }
 
@@ -197,33 +225,11 @@ public class GXml.SerializableDualKeyMap<P,S,V> : Object, Gee.Traversable <V>, S
                     throws GLib.Error
                     requires (node is Element)
   {
-#if DEBUG
-            GLib.message (@"Deserializing DualKeyMap on Element: $(node.name)");
-#endif
-    if (!(value_type.is_a (typeof (GXml.Serializable)) &&
-        value_type.is_a (typeof (SerializableMapDualKey)))) {
-      throw new SerializableError.UNSUPPORTED_TYPE_ERROR (_("%s: Value type '%s' is unsupported"), 
-                                                    this.get_type ().name (), value_type.name ());
-    }
-    foreach (GXml.Node n in node.children) {
-      if (n is Element) {
-        var obj = (SerializableMapDualKey<P,S>) Object.new (value_type);
-#if DEBUG
-            GLib.message (@"Creating a new Object to add: '$(((Serializable)obj).node_name ())' from Node: 
'$(node.name)'");
-#endif
-        if (n.name.down () == ((Serializable) obj).node_name ().down ()) {
-          ((Serializable) obj).deserialize (n);
-#if DEBUG
-            GLib.message (@"SerializableDualKeyMap: Setting object: '$(((Serializable)obj).node_name ())' 
from Node: '$(node.name)'");
-#endif
-          @set (obj.get_map_primary_key (), obj.get_map_secondary_key (), obj);
-#if DEBUG
-            GLib.message (@"SerializableDualKeyMap: Size = '$(this.size)'");
-#endif
-        }
-      }
-    }
-    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
diff --git a/test/SerializableGeeTreeMapTest.vala b/test/SerializableGeeTreeMapTest.vala
index e50aa01..7c70d59 100644
--- a/test/SerializableGeeTreeMapTest.vala
+++ b/test/SerializableGeeTreeMapTest.vala
@@ -28,24 +28,6 @@ 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; }
@@ -289,87 +271,5 @@ 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/gxml-performance.vala b/test/gxml-performance.vala
index 2d9f65b..1150b9f 100644
--- a/test/gxml-performance.vala
+++ b/test/gxml-performance.vala
@@ -155,7 +155,25 @@ public class Performance
     public override string node_name () { return "HCElement"; }
     public override string to_string () { return "HCElement"; }
   }
+  // TreeMap
   
+  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"; }
+  }
   /**
    * Iterate recursively through all node and children nodes in document.
    */
@@ -477,6 +495,88 @@ public class Performance
         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 ();
+      }
+    });
 #endif
   }
 }


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