[gxml] GomCollection: Added new generic append()
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml] GomCollection: Added new generic append()
- Date: Mon, 7 Nov 2016 23:57:07 +0000 (UTC)
commit 60f987a9330d26e7ac2854bab618f36db28f0b5c
Author: Daniel Espinosa <esodan gmail com>
Date: Mon Nov 7 17:55:28 2016 -0600
GomCollection: Added new generic append()
gxml/GomCollections.vala | 10 +++++++-
gxml/GomObject.vala | 3 +-
gxml/XParser.vala | 45 +++++++++++++++++++++++++++++++--------
test/GomSerializationTest.vala | 22 +++++++++---------
4 files changed, 56 insertions(+), 24 deletions(-)
---
diff --git a/gxml/GomCollections.vala b/gxml/GomCollections.vala
index 6b00997..222afce 100644
--- a/gxml/GomCollections.vala
+++ b/gxml/GomCollections.vala
@@ -76,6 +76,12 @@ public interface GXml.GomCollection : Object
return (DomElement?) e;
}
/**
+ * Adds a {@link DomElement} node to this collection. Depending on type of
+ * collection, this method will take information from node to initialize
+ * how to find it.
+ */
+ public abstract void append (DomElement node) throws GLib.Error;
+ /**
* Number of items referenced in {@link nodes_index}
*/
public virtual int length { get { return (int) nodes_index.get_length (); } }
@@ -122,7 +128,7 @@ public class GXml.GomArrayList : Object, GomCollection {
* Adds an {@link DomElement} of type {@link GomObject} as a child of
* {@link element}
*/
- public void add (DomElement node) throws GLib.Error {
+ public void append (DomElement node) throws GLib.Error {
if (!(node is GomElement))
throw new DomError.INVALID_NODE_TYPE_ERROR
(_("Invalid atempt to add unsupported type. Only GXmlGomElement is supported"));
@@ -203,7 +209,7 @@ public class GXml.GomHashMap : Object, GomCollection {
* {@link element}, requires new item to have defined an string attribute
* to be used as key. Attribute should have the name: {@link attribute_key}
*/
- public new void set (DomElement node) throws GLib.Error {
+ public void append (DomElement node) throws GLib.Error {
if (!(node is GomElement))
throw new DomError.INVALID_NODE_TYPE_ERROR
(_("Invalid atempt to set unsupported type. Only GXmlGomElement is supported"));
diff --git a/gxml/GomObject.vala b/gxml/GomObject.vala
index 847070f..4449186 100644
--- a/gxml/GomObject.vala
+++ b/gxml/GomObject.vala
@@ -94,7 +94,8 @@ public interface GXml.GomObject : GLib.Object,
public virtual List<ParamSpec> get_property_element_list () {
var l = new List<ParamSpec> ();
foreach (ParamSpec spec in this.get_class ().list_properties ()) {
- if (spec.value_type.is_a (typeof (GomObject))) {
+ if (spec.value_type.is_a (typeof (GomObject))
+ || spec.value_type.is_a (typeof (GomCollection))) {
GLib.message ("Object Name: "+spec.name+ " Nick: "+spec.get_nick ());
l.append (spec);
}
diff --git a/gxml/XParser.vala b/gxml/XParser.vala
index da48475..5e4674e 100644
--- a/gxml/XParser.vala
+++ b/gxml/XParser.vala
@@ -144,17 +144,42 @@ public class GXml.XParser : Object, GXml.Parser {
tr.const_local_name ());
foreach (ParamSpec pspec in
(node as GomObject).get_property_element_list ()) {
- var obj = Object.new (pspec.value_type,
- "owner-document", node.owner_document);
- if ((obj as DomElement).local_name.down ()
- == tr.const_local_name ().down ()) {
- Value v = Value (pspec.value_type);
+ if (pspec.value_type.is_a (typeof (GomCollection))) {
+ GomCollection col;
+ Value vc = Value (pspec.value_type);
+ get_property (pspec.name, ref vc);
+ col = vc.get_object () as GomCollection;
+ if (col == null) {
+ col = Object.new (pspec.value_type) as GomCollection;
+ vc.set_object (col);
+ node.set_property (pspec.name, vc);
+ }
+ if (col.items_type == GLib.Type.INVALID
+ || col.items_type.is_a (typeof (GomObject))) {
+ GLib.warning (_("Invalid object type set to Collection"));
+ continue;
+ }
+ if (col.items_name == "" || col.items_name == null) {
+ GLib.warning (_("Invalid DomElement name for objects in Collection"));
+ continue;
+ }
+ var obj = Object.new (col.items_type,
+ "owner-document", node.owner_document);
read_current_node (obj as DomNode, true, true);
- node.append_child (obj as DomNode);
- v.set_object (obj);
- node.set_property (pspec.name, v);
- isproperty = true;
- break;
+ col.append (obj as DomElement);
+ } else {
+ var obj = Object.new (pspec.value_type,
+ "owner-document", node.owner_document);
+ if ((obj as DomElement).local_name.down ()
+ == tr.const_local_name ().down ()) {
+ Value v = Value (pspec.value_type);
+ read_current_node (obj as DomNode, true, true);
+ node.append_child (obj as DomNode);
+ v.set_object (obj);
+ node.set_property (pspec.name, v);
+ isproperty = true;
+ break;
+ }
}
}
}
diff --git a/test/GomSerializationTest.vala b/test/GomSerializationTest.vala
index 3922ea6..93d5a58 100644
--- a/test/GomSerializationTest.vala
+++ b/test/GomSerializationTest.vala
@@ -214,22 +214,22 @@ class GomSerializationTest : GXmlTest {
GLib.message ("DOC:"+s);
assert ("<BookStand Classification=\"Science\"/>" in s);
try {
- bs.registers.add (br);
+ bs.registers.append (br);
assert_not_reached ();
} catch {}
br = new BookRegister.document (bs.owner_document);
br.year = 2016;
- bs.registers.add (br);
+ bs.registers.append (br);
s = bs.to_string ();
assert (s != null);
GLib.message ("DOC:"+s);
assert ("<BookStand Classification=\"Science\"><BookRegister Year=\"2016\"/></BookStand>" in s);
var br2 = new BookRegister.document (bs.owner_document);
- bs.registers.add (br2);
+ bs.registers.append (br2);
br2.year = 2010;
bs.append_child (bs.owner_document.create_element ("Test"));
var br3 = new BookRegister.document (bs.owner_document);
- bs.registers.add (br3);
+ bs.registers.append (br3);
br3.year = 2000;
s = bs.to_string ();
assert (s != null);
@@ -253,27 +253,27 @@ class GomSerializationTest : GXmlTest {
GLib.message ("DOC:"+s);
assert ("<BookStore/>" in s);
try {
- bs.books.set (b);
+ bs.books.append (b);
assert_not_reached ();
} catch {}
b = new Book.document (bs.owner_document);
try {
- bs.books.set (b);
+ bs.books.append (b);
assert_not_reached ();
} catch {}
b.name = "Title1";
- bs.books.set (b);
+ bs.books.append (b);
s = bs.to_string ();
assert (s != null);
GLib.message ("DOC:"+s);
assert ("<BookStore><Book Name=\"Title1\"/></BookStore>" in s);
var b2 = new Book.document (bs.owner_document);
b2.name = "Title2";
- bs.books.set (b2);
+ bs.books.append (b2);
bs.append_child (bs.owner_document.create_element ("Test"));
var b3 = new Book.document (bs.owner_document);
b3.name = "Title3";
- bs.books.set (b3);
+ bs.books.append (b3);
s = bs.to_string ();
assert (s != null);
GLib.message ("DOC:"+s);
@@ -382,7 +382,7 @@ class GomSerializationTest : GXmlTest {
assert ("/>" in s);
});
Test.add_func ("/gxml/gom-serialization/read/property-arraylist", () => {
- var bs = new BookStand ();
+ /*var bs = new BookStand ();
string s = bs.to_string ();
GLib.message ("doc:"+s);
assert ("<BookStand Classification=\"Science\"/>" in s);
@@ -407,7 +407,7 @@ class GomSerializationTest : GXmlTest {
//assert (bs.registers.get_item (2) is BookRegister);
//assert ((bs.registers.get_item (0) as BookRegister).year == 2016);
//assert ((bs.registers.get_item (1) as BookRegister).year == 2010);
- //assert ((bs.registers.get_item (2) as BookRegister).year == 2000);
+ //assert ((bs.registers.get_item (2) as BookRegister).year == 2000);*/
});
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]