[gxml/serialization] Fixes to detect node name deserialize.



commit ed206655ffe2cf8f1688f41a82613ab40ce50d61
Author: Daniel Espinosa <esodan gmail com>
Date:   Wed Nov 27 10:48:49 2013 -0600

    Fixes to detect node name deserialize.
    
    * Now properties with cannonical names, chacaracters '-' are removed to
      find nodes names to serialize.
    * SerializableGeeArrayList and  DualKeyMap now throws GLib.Error on
      non Serializable objects types
    * SerializableGeeArrayList, DualKeyMap and TreeMap just deserialize GXml.Element
    * Added new test case for convined Gee Collections

 gxml/Serializable.vala                   |    9 +
 gxml/SerializableGeeArrayList.vala       |   12 +-
 gxml/SerializableGeeDualKeyMap.vala      |   14 +-
 gxml/SerializableGeeTreeMap.vala         |   11 +-
 gxml/SerializableObjectModel.vala        |   14 ++-
 test/GXmlTest.vala                       |    1 +
 test/Makefile.am                         |    1 +
 test/SerializableGeeCollectionsTest.vala |  263 ++++++++++++++++++++++++++++++
 8 files changed, 311 insertions(+), 14 deletions(-)
---
diff --git a/gxml/Serializable.vala b/gxml/Serializable.vala
index 42b5353..9276408 100644
--- a/gxml/Serializable.vala
+++ b/gxml/Serializable.vala
@@ -263,6 +263,15 @@ namespace GXml {
         if (property_use_nick ())
           if (spec.get_nick ().down () == property_name.down ())
             return spec;
+        if ("-" in spec.name) {
+          string[] sp = spec.name.split ("-");
+          string n = "";
+          foreach (string s in sp) {
+            n += @"$(s[0])".up () + @"$(s[1:s.length])";
+          }
+          if (n.down () == property_name.down ())
+            return spec;
+        }
       }
       return null;
     }
diff --git a/gxml/SerializableGeeArrayList.vala b/gxml/SerializableGeeArrayList.vala
index 36c547c..567e7c0 100644
--- a/gxml/SerializableGeeArrayList.vala
+++ b/gxml/SerializableGeeArrayList.vala
@@ -112,13 +112,17 @@ public class GXml.SerializableArrayList<G> : Gee.ArrayList<G>, Serializable
   }
   public GXml.Node? default_deserialize (GXml.Node node)
                     throws GLib.Error
-                    requires (element_type.is_a (typeof (GXml.Serializable)))
   {
+    if (!element_type.is_a (typeof (GXml.Serializable))) {
+      throw new SerializableError.UNSUPPORTED_TYPE ("Value type '%s' is unsupported", element_type.name ());
+    }
     if (node is Element) {
       foreach (GXml.Node n in node.child_nodes) {
-        var obj = (Serializable) Object.new (element_type);
-        obj.deserialize (n);
-        add (obj);
+        if (n is Element) {
+          var obj = (Serializable) Object.new (element_type);
+          obj.deserialize (n);
+          add (obj);
+        }
       }
     }
     return node;
diff --git a/gxml/SerializableGeeDualKeyMap.vala b/gxml/SerializableGeeDualKeyMap.vala
index 6936744..16814e0 100644
--- a/gxml/SerializableGeeDualKeyMap.vala
+++ b/gxml/SerializableGeeDualKeyMap.vala
@@ -196,14 +196,18 @@ public class GXml.SerializableDualKeyMap<P,S,V> : Object, Serializable
   }
   public GXml.Node? default_deserialize (GXml.Node node)
                     throws GLib.Error
-                    requires (value_type.is_a (typeof (GXml.Serializable)))
-                    requires (value_type.is_a (typeof (SerializableMapDualId)))
   {
+    if (!(value_type.is_a (typeof (GXml.Serializable)) &&
+        value_type.is_a (typeof (SerializableMapDualId)))) {
+      throw new SerializableError.UNSUPPORTED_TYPE ("Value type '%s' is unsupported", value_type.name ());
+    }
     if (node is Element) {
       foreach (GXml.Node n in node.child_nodes) {
-        var obj = (SerializableMapDualId<P,S>) Object.new (value_type);
-        ((Serializable) obj).deserialize (n);
-        @set (obj.primary_id (), obj.secondary_id (), obj);
+        if (n is Element) {
+          var obj = (SerializableMapDualId<P,S>) Object.new (value_type);
+          ((Serializable) obj).deserialize (n);
+          @set (obj.primary_id (), obj.secondary_id (), obj);
+        }
       }
     }
     return node;
diff --git a/gxml/SerializableGeeTreeMap.vala b/gxml/SerializableGeeTreeMap.vala
index db3e062..f414e68 100644
--- a/gxml/SerializableGeeTreeMap.vala
+++ b/gxml/SerializableGeeTreeMap.vala
@@ -118,9 +118,14 @@ public class GXml.SerializableTreeMap<K,V> : Gee.TreeMap<K,V>, Serializable
     }
     if (node is Element) {
       foreach (GXml.Node n in node.child_nodes) {
-        var obj = Object.new (value_type);
-        ((Serializable) obj).deserialize (n);
-        @set (((SerializableMapId<K>) obj).id (), obj);
+        if (n is Element) {
+#if DEBUG
+          stdout.printf (@"Node $(node.node_name) for type '$(get_type ().name ())'\n");
+#endif
+          var obj = Object.new (value_type);
+          ((Serializable) obj).deserialize (n);
+          @set (((SerializableMapId<K>) obj).id (), obj);
+        }
       }
     }
     return node;
diff --git a/gxml/SerializableObjectModel.vala b/gxml/SerializableObjectModel.vala
index 5f4c62b..b2eaf70 100644
--- a/gxml/SerializableObjectModel.vala
+++ b/gxml/SerializableObjectModel.vala
@@ -207,18 +207,25 @@ public abstract class GXml.SerializableObjectModel : Object, Serializable
     if (element.node_name.down () != node_name ().down ()) {
       message (@"WARNING: wrong node name is '$(element.node_name.down ())' is different to '$(node_name 
().down ())'");
     }
+#if DEBUG
+    stdout.printf (@"Deserialize Node: $(element.node_name)\n");
+    stdout.printf (@"Node is: $(element)\n\n");
+    stdout.printf (@"Attributes in Node: $(element.node_name)\n");
+#endif
     foreach (Attr attr in element.attributes.get_values ())
     {
       deserialize_property (attr);
     }
-    
+#if DEBUG
+    stdout.printf (@"Elements Nodes in Node: $(element.node_name)\n");
+#endif
     if (element.has_child_nodes ())
     {
       foreach (Node n in element.child_nodes)
       {
         if (n is Text)
           serialized_xml_node_value = n.node_value;
-        else
+        else if (n is Element)
           deserialize_property (n);
       }
     }
@@ -233,6 +240,9 @@ public abstract class GXml.SerializableObjectModel : Object, Serializable
   public bool default_deserialize_property (GXml.Node property_node)
                                             throws GLib.Error
   {
+#if DEBUG
+    stdout.printf (@"Deserialize Property Node: $(property_node.node_name)\n");
+#endif
     bool ret = false;
     var prop = find_property_spec (property_node.node_name);
     if (prop == null) {
diff --git a/test/GXmlTest.vala b/test/GXmlTest.vala
index eac03f3..638def0 100644
--- a/test/GXmlTest.vala
+++ b/test/GXmlTest.vala
@@ -41,6 +41,7 @@ class GXmlTest {
                SerializableGeeTreeMapTest.add_tests ();
                SerializableGeeDualKeyMapTest.add_tests ();
                SerializableGeeArrayListTest.add_tests ();
+               SerializableGeeCollectionsTest.add_tests ();
 
                Test.run ();
 
diff --git a/test/Makefile.am b/test/Makefile.am
index b98600e..c1254ba 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -41,6 +41,7 @@ gxml_test_SOURCES = \
        SerializableGeeTreeMapTest.vala \
        SerializableGeeDualKeyMapTest.vala \
        SerializableGeeArrayListTest.vala \
+       SerializableGeeCollectionsTest.vala \
        $(NULL)
 
 gxml_test.vala.stamp: $(gxml_test_SOURCES)
diff --git a/test/SerializableGeeCollectionsTest.vala b/test/SerializableGeeCollectionsTest.vala
new file mode 100644
index 0000000..1e21b9e
--- /dev/null
+++ b/test/SerializableGeeCollectionsTest.vala
@@ -0,0 +1,263 @@
+using GXml;
+using Gee;
+
+
+
+class SerializableGeeCollectionsTest : GXmlTest
+{
+  class Planet : SerializableObjectModel, SerializableMapId<string>
+  {
+    public string id () { return name; }
+    public string name { get; set; }
+    public Planet.named (string name) { this.name = name; }
+    public override string node_name () { return "planet"; }
+    public override string to_string () { return name; }
+
+    public class Collection : SerializableTreeMap<string,Planet> {}
+  }
+  class Space : SerializableObjectModel, SerializableMapId<string>
+  {
+    public string id () { return name; }
+    public string name { get; set; }
+    public Planet.Collection planets { get; set; }
+    
+    public Space.named (string name) { this.name = name; }
+    
+    public override string node_name () { return "space"; }
+    public override string to_string () { return name; }
+    public override GXml.Node? deserialize (GXml.Node node)
+                                    throws GLib.Error
+                                    requires (node is GXml.Element)
+    {
+      Element element = (Element) node;
+      if (element.has_child_nodes ()) {
+        if (planets == null)
+          planets = new Planet.Collection ();
+        planets.deserialize (element);
+      }
+      return default_deserialize (node);
+    }
+
+    public class Collection : SerializableTreeMap<string,Space> {}
+  }
+  class Refaction : SerializableObjectModel, SerializableMapDualId<string,string>
+  {
+    public string model { get; set; }
+    public string manufacturer { get; set; }
+    public SpaceShip.Collection spaceships { get; set; }
+
+    public Refaction.named (string manufacturer, string model)
+    {
+      this.manufacturer = manufacturer;
+      this.model = model;
+    }
+    
+    public string primary_id () { return manufacturer; }
+    public string secondary_id () { return model; }
+    
+    public override string node_name () { return "refaction"; }
+    public override string to_string () { return model; }
+    public override GXml.Node? deserialize (GXml.Node node)
+                                    throws GLib.Error
+                                    requires (node is GXml.Element)
+    {
+      Element element = (Element) node;
+      if (element.has_child_nodes ()) {
+        if (spaceships == null)
+          spaceships = new SpaceShip.Collection ();
+        spaceships.deserialize (element);
+      }
+      return default_deserialize (node);
+    }
+
+    public class Collection : SerializableDualKeyMap<string,string,Refaction> {}
+  }
+  class SpaceShip : SerializableObjectModel, SerializableMapDualId<string,string>
+  {
+    public string model { get; set; }
+    public string manufacturer { get; set; }
+    public Space.Collection tested { get; set; }
+
+    public SpaceShip.named (string manufacturer, string model)
+    {
+      this.manufacturer = manufacturer;
+      this.model = model;
+    }
+    
+    public string primary_id () { return manufacturer; }
+    public string secondary_id () { return model; }
+    
+    public override string node_name () { return "ship"; }
+    public override string to_string () { return model; }
+    public override GXml.Node? deserialize (GXml.Node node)
+                                    throws GLib.Error
+                                    requires (node is GXml.Element)
+    {
+      Element element = (Element) node;
+      if (element.has_child_nodes ()) {
+        if (tested == null)
+          tested = new Space.Collection ();
+        tested.deserialize (element);
+      }
+      return default_deserialize (node);
+    }
+
+    public class Collection : SerializableDualKeyMap<string,string,SpaceShip> {}
+  }
+  
+  class ChargeZone : SerializableObjectModel
+  {
+    public string name { get; set; }
+    public SpaceShip.Collection spaceships { get; set; }
+    
+    public override string node_name () { return "ChargeZone"; }
+    public override string to_string () { return name; }
+    public override GXml.Node? deserialize (GXml.Node node)
+                                    throws GLib.Error
+                                    requires (node is Element)
+    {
+      var element = (Element) node;
+      if (element.has_child_nodes ()) {
+        if (spaceships == null)
+          spaceships = new SpaceShip.Collection ();
+        spaceships.deserialize (element);
+      }
+      return default_deserialize (node);
+    }
+  }
+  class Storage : SerializableObjectModel
+  {
+    public string name { get; set; }
+    public Refaction.Collection refactions { get; set; }
+    
+    public override string node_name () { return "storage"; }
+    public override string to_string () { return name; }
+    public override GXml.Node? deserialize (GXml.Node node)
+                                    throws GLib.Error
+                                    requires (node is Element)
+    {
+      var element = (Element) node;
+      if (element.has_child_nodes ()) {
+        if (refactions == null)
+          refactions = new Refaction.Collection ();
+        refactions.deserialize (element);
+      }
+      return default_deserialize (node);
+    }
+  }
+
+  class SpaceBase : SerializableObjectModel
+  {
+    public string name { get; set; }
+    public ChargeZone charge_zone { get; set; }
+    public Storage storage { get; set; }
+    public override string node_name () { return "base"; }
+    public override string to_string () { return name; }
+  }
+  public static void add_tests ()
+  {
+    Test.add_func ("/gxml/serializable/convined_gee_containers/deserialize",
+    () => {
+      try {
+        var doc = new Document.from_string ("""<?xml version="1.0"?>
+<base name="AlphaOne" >
+  <chargezone name="A1-1">
+    <ship manufacturer="MacToy" model="A1234">
+      <space name="Alpha Centaury">
+        <planet name="Earth" />
+        <planet name="Platon" />
+      </space>
+    </ship>
+  </chargezone>
+  <storage name="B4-A4">
+    <refaction manufacturer="MacToy" model="Fly045">
+      <ship manufacturer="MacToy" model="A1234" />
+      <ship manufacturer="MegaTrench" model="G045-1" />
+    </refaction>
+  </storage>
+</base>""");
+        var b = new SpaceBase ();
+        b.deserialize (doc);
+        // Storage
+        if (b.storage == null) {
+          stdout.printf (@"ERROR: no storage exists:\n$(doc)\n");
+          assert_not_reached ();
+        }
+        var storage = b.storage;
+        if (storage.refactions == null) {
+          stdout.printf (@"ERROR: no refactions exists:\n$(doc)\n");
+          assert_not_reached ();
+        }
+        if (storage.refactions.size != 1) {
+          stdout.printf (@"ERROR: Storage: incorrect size must be 1 got : 
$(storage.refactions.size)\n$(doc)\n");
+          assert_not_reached ();
+        }
+        var refaction = storage refactions  get ("MacToy", "Fly045");
+        if (refaction == null) {
+          stdout.printf (@"ERROR: no refaction MacToy / Fly045 exists:\n$(doc)\n");
+          assert_not_reached ();
+        }
+        if (refaction.spaceships.size != 2) {
+          stdout.printf (@"ERROR: Refaction: incorrect size must be 2 got : 
$(refaction.spaceships.size)\n$(doc)\n");
+          assert_not_reached ();
+        }
+        var ship1 = refaction spaceships  get ("MacToy", "A1234");
+        if (ship1 == null) {
+          stdout.printf (@"ERROR: no refaction for Ship MacToy / A1234 exists:\n$(doc)\n");
+          assert_not_reached ();
+        }
+        var ship2 = refaction spaceships  get ("MegaTrench", "G045-1");
+        if (ship2 == null) {
+          stdout.printf (@"ERROR: no refaction for Ship MegaTrench / G045-1 exists:\n$(doc)\n");
+          assert_not_reached ();
+        }
+        // ChargeZone
+        if (b.charge_zone == null) {
+          stdout.printf (@"ERROR: no charge_zone exists:\n$(doc)\n");
+          assert_not_reached ();
+        }
+        var charge = b.charge_zone;
+        if (charge.spaceships == null) {
+          stdout.printf (@"ERROR: no spaceships exists:\n$(doc)\n");
+          assert_not_reached ();
+        }
+        if (charge.spaceships.size != 1) {
+          stdout.printf (@"ERROR: SpaceShips: incorrect size must be 1 got: 
$(charge.spaceships.size)\n$(doc)\n");
+          assert_not_reached ();
+        }
+        var ship = charge spaceships  get ("MacToy", "A1234");
+        if (ship == null) {
+          stdout.printf (@"ERROR: Ship MacToy/A1234 not found:\n$(doc)\n");
+          assert_not_reached ();
+        }
+        if (ship.tested.size != 1) {
+          stdout.printf (@"ERROR: Ship: incorrect size must be 1 got : $(ship.tested.size)\n$(doc)\n");
+          assert_not_reached ();
+        }
+        var space = ship tested  get ("Alpha Centaury");
+        if (space == null) {
+          stdout.printf (@"ERROR: Space Alpha Centaury not found:\n$(doc)\n");
+          assert_not_reached ();
+        }
+        if (space.planets.size != 2) {
+          stdout.printf (@"ERROR: Space size incorrect, must be 2 got:$(space.planets.size)\n$(doc)\n");
+          assert_not_reached ();
+        }
+        var earth = space planets  get("Earth");
+        if (earth == null) {
+          stdout.printf (@"ERROR: Planet Earth not found:\n$(doc)\n");
+          assert_not_reached ();
+        }
+        var platon = space planets  get("Platon");
+        if (platon == null) {
+          stdout.printf (@"ERROR: Planet Platon not found:\n$(doc)\n");
+          assert_not_reached ();
+        }
+      }
+      catch (GLib.Error e) {
+        stdout.printf (@"ERROR: $(e.message)");
+        assert_not_reached ();
+      }
+    });
+  }
+}


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