Skip to content
Snippets Groups Projects
Commit ed206655 authored by Daniel Espinosa's avatar Daniel Espinosa
Browse files

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
parent 7b8abd85
Branches
Tags
No related merge requests found
......@@ -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;
}
......
......@@ -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;
......
......@@ -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;
......
......@@ -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;
......
......@@ -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) {
......
......@@ -41,6 +41,7 @@ class GXmlTest {
SerializableGeeTreeMapTest.add_tests ();
SerializableGeeDualKeyMapTest.add_tests ();
SerializableGeeArrayListTest.add_tests ();
SerializableGeeCollectionsTest.add_tests ();
Test.run ();
......
......@@ -41,6 +41,7 @@ gxml_test_SOURCES = \
SerializableGeeTreeMapTest.vala \
SerializableGeeDualKeyMapTest.vala \
SerializableGeeArrayListTest.vala \
SerializableGeeCollectionsTest.vala \
$(NULL)
gxml_test.vala.stamp: $(gxml_test_SOURCES)
......
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 ();
}
});
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment