diff --git a/gxml/Serializable.vala b/gxml/Serializable.vala index 42b535353bc007ee60273630f6b45a2a6a31952c..9276408f9be82b6b42c85dd2b8dabb6fdcff54e0 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 36c547cae523ec2ed009b5a3e4ea6a62ae1e4f53..567e7c030d0aa899e9ff08bef959e00d262e083a 100644 --- a/gxml/SerializableGeeArrayList.vala +++ b/gxml/SerializableGeeArrayList.vala @@ -112,13 +112,17 @@ public class GXml.SerializableArrayList : Gee.ArrayList, 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 69367449105b493c79df9bf26cd4f912d9ee2a07..16814e002889e713d6b59948c3b7eba0f01b44f4 100644 --- a/gxml/SerializableGeeDualKeyMap.vala +++ b/gxml/SerializableGeeDualKeyMap.vala @@ -196,14 +196,18 @@ public class GXml.SerializableDualKeyMap : 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) Object.new (value_type); - ((Serializable) obj).deserialize (n); - @set (obj.primary_id (), obj.secondary_id (), obj); + if (n is Element) { + var obj = (SerializableMapDualId) 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 db3e0625f975ccb4025ec2c659ddeffab04cf09b..f414e68c2a5ecd4deb9b817049c90de8f0ad1d5d 100644 --- a/gxml/SerializableGeeTreeMap.vala +++ b/gxml/SerializableGeeTreeMap.vala @@ -118,9 +118,14 @@ public class GXml.SerializableTreeMap : Gee.TreeMap, 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) 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) obj).id (), obj); + } } } return node; diff --git a/gxml/SerializableObjectModel.vala b/gxml/SerializableObjectModel.vala index 5f4c62bf9d18c94287e0f2b52fb5cb3574575dbe..b2eaf70e224b74eedf6a47f5fc6868dcbb93c315 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 eac03f30f97832d60c46064e6f3bbbd0ec3ae6ec..638def0d714b61271bb4aad00455b45053ff47db 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 b98600ea33de709b633173d0c1a2b13302d6d2e6..c1254ba63c2b31733ae87429d324e255871dcd71 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 0000000000000000000000000000000000000000..1e21b9e379eb24ea4a5e0858aa25ef9bac03f2ea --- /dev/null +++ b/test/SerializableGeeCollectionsTest.vala @@ -0,0 +1,263 @@ +using GXml; +using Gee; + + + +class SerializableGeeCollectionsTest : GXmlTest +{ + class Planet : SerializableObjectModel, SerializableMapId + { + 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 {} + } + class Space : SerializableObjectModel, SerializableMapId + { + 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 {} + } + class Refaction : SerializableObjectModel, SerializableMapDualId + { + 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 {} + } + class SpaceShip : SerializableObjectModel, SerializableMapDualId + { + 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 {} + } + + 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 (""" + + + + + + + + + + + + + + + +"""); + 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 (); + } + }); + } +}