[gxml/serialization] Fixes to detect node name deserialize.
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml/serialization] Fixes to detect node name deserialize.
- Date: Thu, 28 Nov 2013 19:43:44 +0000 (UTC)
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]