From b3c63593fde17fbed7e5b57432e755123bc3a59b Mon Sep 17 00:00:00 2001 From: Travis Reitter Date: Thu, 11 Aug 2011 13:23:01 +0200 Subject: [PATCH] Support vCard-like parameters for Roles Closes: bug#655921 - Change RoleDetails.roles to support vCard-like arbitrary parameters --- NEWS | 3 ++ backends/tracker/lib/trf-persona-store.vala | 24 ++++++------ backends/tracker/lib/trf-persona.vala | 32 ++++++++------- folks/individual.vala | 15 +++---- folks/role-details.vala | 61 ++++++++++++++++++++++++++++- tests/tracker/add-persona.vala | 24 ++++++------ tests/tracker/role-details-interface.vala | 9 +++-- tests/tracker/set-roles.vala | 26 ++++++------ 8 files changed, 132 insertions(+), 62 deletions(-) diff --git a/NEWS b/NEWS index 9ce3520..618dea6 100644 --- a/NEWS +++ b/NEWS @@ -43,6 +43,8 @@ Bugs fixed: class * Bug 653682 — Change WebServiceDetails.web_service_addresses to support vCard-like arbitrary parameters +* Bug 655921 — Change RoleDetails.roles to support vCard-like arbitrary + parameters API changes: * Swf.Persona retains and exposes its libsocialweb Contact @@ -77,6 +79,7 @@ API changes: * Remove all PhoneDetails functions (obsoleted by PhoneFieldDetails) * Add and use WebServiceFieldDetails for WebServiceFieldDetails.web_service_addresses +* Use RoleFieldDetails for RoleDetails.roles Overview of changes from libfolks 0.5.1 to libfolks 0.5.2 ========================================================= diff --git a/backends/tracker/lib/trf-persona-store.vala b/backends/tracker/lib/trf-persona-store.vala index c5ee25f..31b6bd2 100644 --- a/backends/tracker/lib/trf-persona-store.vala +++ b/backends/tracker/lib/trf-persona-store.vala @@ -554,10 +554,10 @@ public class Trf.PersonaStore : Folks.PersonaStore } else if (k == Folks.PersonaStore.detail_key (PersonaDetail.ROLES)) { - var roles = (Gee.HashSet) v.get_object (); + var roles = (Gee.HashSet) v.get_object (); int roles_cnt = 0; - foreach (var r in roles) + foreach (var role_fd in roles) { var role_affl = "_:role_affl%d".printf (roles_cnt); @@ -565,11 +565,11 @@ public class Trf.PersonaStore : Folks.PersonaStore builder.predicate ("a"); builder.object (Trf.OntologyDefs.NCO_AFFILIATION); builder.predicate (Trf.OntologyDefs.NCO_ROLE); - builder.object_string (r.role); - builder.predicate (Trf.OntologyDefs.NCO_ORG); - builder.object_string (r.organisation_name); + builder.object_string (role_fd.value.role); builder.predicate (Trf.OntologyDefs.NCO_TITLE); - builder.object_string (r.title); + builder.object_string (role_fd.value.title); + builder.predicate (Trf.OntologyDefs.NCO_ORG); + builder.object_string (role_fd.value.organisation_name); builder.subject ("_:p"); builder.predicate (Trf.OntologyDefs.NCO_HAS_AFFILIATION); @@ -2030,7 +2030,7 @@ public class Trf.PersonaStore : Folks.PersonaStore } internal async void _set_roles (Folks.Persona persona, - Set roles) + Set roles) { const string del_t = "DELETE { " + " ?p " + Trf.OntologyDefs.NCO_HAS_AFFILIATION + " ?a " + @@ -2051,7 +2051,7 @@ public class Trf.PersonaStore : Folks.PersonaStore builder.insert_open (null); int i = 0; - foreach (var r in roles) + foreach (var role_fd in roles) { string affl = "_:a%d".printf (i); @@ -2059,11 +2059,11 @@ public class Trf.PersonaStore : Folks.PersonaStore builder.predicate ("a"); builder.object (Trf.OntologyDefs.NCO_AFFILIATION); builder.predicate (Trf.OntologyDefs.NCO_ROLE); - builder.object_string (r.role); - builder.predicate (Trf.OntologyDefs.NCO_ORG); - builder.object_string (r.organisation_name); + builder.object_string (role_fd.value.role); builder.predicate (Trf.OntologyDefs.NCO_TITLE); - builder.object_string (r.title); + builder.object_string (role_fd.value.title); + builder.predicate (Trf.OntologyDefs.NCO_ORG); + builder.object_string (role_fd.value.organisation_name); builder.subject ("?contact"); builder.predicate (Trf.OntologyDefs.NCO_HAS_AFFILIATION); builder.object (affl); diff --git a/backends/tracker/lib/trf-persona.vala b/backends/tracker/lib/trf-persona.vala index 5b97a52..63f94cc 100644 --- a/backends/tracker/lib/trf-persona.vala +++ b/backends/tracker/lib/trf-persona.vala @@ -214,13 +214,13 @@ public class Trf.Persona : Folks.Persona, private set {} } - private HashSet _roles; - private Set _roles_ro; + private HashSet _roles; + private Set _roles_ro; /** * {@inheritDoc} */ - public Set roles + public Set roles { get { return this._roles_ro; } public set @@ -417,8 +417,9 @@ public class Trf.Persona : Folks.Persona, (GLib.HashFunc) EmailFieldDetails.hash, (GLib.EqualFunc) EmailFieldDetails.equal); this._email_addresses_ro = this._email_addresses.read_only_view; - this._roles = new HashSet ((GLib.HashFunc) Role.hash, - (GLib.EqualFunc) Role.equal); + this._roles = new HashSet ( + (GLib.HashFunc) RoleFieldDetails.hash, + (GLib.EqualFunc) RoleFieldDetails.equal); this._roles_ro = this._roles.read_only_view; this._notes = new HashSet ( (GLib.HashFunc) NoteFieldDetails.hash, @@ -756,9 +757,9 @@ public class Trf.Persona : Folks.Persona, return; } - HashSet roles = new HashSet ( - (GLib.HashFunc) Role.hash, - (GLib.EqualFunc) Role.equal); + HashSet role_fds = new HashSet ( + (GLib.HashFunc) RoleFieldDetails.hash, + (GLib.EqualFunc) RoleFieldDetails.equal); string[] roles_a = roles_field.split ("\n"); @@ -772,10 +773,11 @@ public class Trf.Persona : Folks.Persona, var new_role = new Role (title, organisation, tracker_id); new_role.role = role; - roles.add (new_role); + var role_fd = new RoleFieldDetails (new_role); + role_fds.add (role_fd); } - this._roles = roles; + this._roles = role_fds; this._roles_ro = this._roles.read_only_view; } @@ -783,8 +785,8 @@ public class Trf.Persona : Folks.Persona, { var new_role = new Role (title, org, tracker_id); new_role.role = role; - - if (this._roles.add (new_role)) + var role_fd = new RoleFieldDetails (new_role); + if (this._roles.add (role_fd)) { this.notify_property ("roles"); return true; @@ -794,11 +796,11 @@ public class Trf.Persona : Folks.Persona, internal bool _remove_role (string tracker_id) { - foreach (var r in this._roles) + foreach (var role_fd in this._roles) { - if (r.uid == tracker_id) + if (role_fd.value.uid == tracker_id) { - this._roles.remove (r); + this._roles.remove (role_fd); this.notify_property ("roles"); return true; } diff --git a/folks/individual.vala b/folks/individual.vala index 959a612..9c294f6 100644 --- a/folks/individual.vala +++ b/folks/individual.vala @@ -368,13 +368,13 @@ public class Folks.Individual : Object, } } - private HashSet _roles; - private Set _roles_ro; + private HashSet _roles; + private Set _roles_ro; /** * {@inheritDoc} */ - public Set roles + public Set roles { get { return this._roles_ro; } private set @@ -710,8 +710,9 @@ public class Folks.Individual : Object, (GLib.HashFunc) EmailFieldDetails.hash, (GLib.EqualFunc) EmailFieldDetails.equal); this._email_addresses_ro = this._email_addresses.read_only_view; - this._roles = new HashSet - ((GLib.HashFunc) Role.hash, (GLib.EqualFunc) Role.equal); + this._roles = new HashSet ( + (GLib.HashFunc) RoleFieldDetails.hash, + (GLib.EqualFunc) RoleFieldDetails.equal); this._roles_ro = this._roles.read_only_view; this._local_ids = new HashSet (); this._local_ids_ro = this._local_ids.read_only_view; @@ -1422,9 +1423,9 @@ public class Folks.Individual : Object, var role_details = persona as RoleDetails; if (role_details != null) { - foreach (var r in role_details.roles) + foreach (var role_fd in role_details.roles) { - this._roles.add (r); + this._roles.add (role_fd); } } } diff --git a/folks/role-details.vala b/folks/role-details.vala index 8a2c489..16baf24 100644 --- a/folks/role-details.vala +++ b/folks/role-details.vala @@ -16,6 +16,7 @@ * * Authors: * Raul Gutierrez Segales + * Travis Reitter */ using Gee; @@ -127,6 +128,62 @@ public class Folks.Role : Object } /** + * Object representing details of a contact in an organisation which can have + * some parameters associated with it. + * + * See {@link Folks.AbstractFieldDetails}. + * + * @since UNRELEASED + */ +public class Folks.RoleFieldDetails : AbstractFieldDetails +{ + /** + * Create a new RoleFieldDetails. + * + * @param value the {@link Role}} of the field + * @param parameters initial parameters. See + * {@link AbstractFieldDetails.parameters}. A `null` value is equivalent to an + * empty map of parameters. + * + * @return a new RoleFieldDetails + * + * @since UNRELEASED + */ + public RoleFieldDetails (Role value, + MultiMap? parameters = null) + { + this.value = value; + if (parameters != null) + this.parameters = parameters; + } + + /** + * {@inheritDoc} + * + * @since UNRELEASED + */ + public override bool equal (AbstractFieldDetails that) + { + var that_fd = that as RoleFieldDetails; + + if (that_fd == null) + return false; + + return Role.equal (this.value, that_fd.value); + } + + /** + * {@inheritDoc} + * + * @since UNRELEASED + */ + public override uint hash () + { + return str_hash (this.value.to_string ()); + } +} + +/** * This interfaces represents the list of roles a {@link Persona} and * {@link Individual} might have. * @@ -137,7 +194,7 @@ public interface Folks.RoleDetails : Object /** * The roles of the contact. * - * @since 0.5.1 + * @since UNRELEASED */ - public abstract Set roles { get; set; } + public abstract Set roles { get; set; } } diff --git a/tests/tracker/add-persona.vala b/tests/tracker/add-persona.vala index eedb3d3..be42b9f 100644 --- a/tests/tracker/add-persona.vala +++ b/tests/tracker/add-persona.vala @@ -272,11 +272,14 @@ public class AddPersonaTests : Folks.TestCase (owned) v11); Value? v12 = Value (typeof (Set)); - var roles = new HashSet (); - Role r1 = new Role (this._title_1, this._organisation_1); + var role_fds = new HashSet ( + (GLib.HashFunc) RoleFieldDetails.hash, + (GLib.EqualFunc) RoleFieldDetails.equal); + var r1 = new Role (this._title_1, this._organisation_1); r1.role = this._role_1; - roles.add (r1); - v12.set_object (roles); + var role_fd1 = new RoleFieldDetails (r1); + role_fds.add (role_fd1); + v12.set_object (role_fds); details.insert (Folks.PersonaStore.detail_key (PersonaDetail.ROLES), (owned) v12); @@ -474,14 +477,13 @@ public class AddPersonaTests : Folks.TestCase } } - foreach (var r in i.roles) + foreach (var role_fd in i.roles) { - if (r.title == this._title_1 && - r.organisation_name == this._organisation_1 && - r.role == this._role_1) - { - this._properties_found.replace ("role-1", true); - } + var role_expected = new Role (this._title_1, this._organisation_1); + role_expected.role = this._role_1; + var role_fd_expected = new RoleFieldDetails (role_expected); + if (role_fd.equal (role_fd_expected)) + this._properties_found.replace ("role-1", true); } foreach (var pafd in i.postal_addresses) diff --git a/tests/tracker/role-details-interface.vala b/tests/tracker/role-details-interface.vala index d1c3e19..9fa51e9 100644 --- a/tests/tracker/role-details-interface.vala +++ b/tests/tracker/role-details-interface.vala @@ -109,11 +109,12 @@ public class RoleDetailsInterfaceTests : Folks.TestCase { if (i.full_name == this._fullname) { - foreach (var role in i.roles) + foreach (var role_fd in i.roles) { - if (role.title == "boss" && - role.organisation_name == "Company" && - role.role == "Role") + var role_expected = new Role ("boss", "Company"); + role_expected.role = "Role"; + var role_fd_expected = new RoleFieldDetails (role_expected); + if (role_fd.equal (role_fd_expected)) { this._found_role = true; this._main_loop.quit (); diff --git a/tests/tracker/set-roles.vala b/tests/tracker/set-roles.vala index 13858eb..bd20316 100644 --- a/tests/tracker/set-roles.vala +++ b/tests/tracker/set-roles.vala @@ -30,7 +30,7 @@ public class SetRolesTests : Folks.TestCase private IndividualAggregator _aggregator; private string _persona_fullname; private bool _role_found; - private Role _role; + private RoleFieldDetails _role_fd; public SetRolesTests () { @@ -59,8 +59,9 @@ public class SetRolesTests : Folks.TestCase c1.set (Trf.OntologyDefs.NCO_FULLNAME, this._persona_fullname); this._tracker_backend.add_contact (c1); - this._role = new Role ("some title", "some organisation"); - this._role.role = "some role"; + var role = new Role ("some title", "some organisation"); + role.role = "some role"; + this._role_fd = new RoleFieldDetails (role); this._tracker_backend.set_up (); @@ -111,15 +112,18 @@ public class SetRolesTests : Folks.TestCase { i.notify["roles"].connect (this._notify_roles_cb); - Gee.HashSet roles = new HashSet - ((GLib.HashFunc) Role.hash, (GLib.EqualFunc) Role.equal); - var r = new Role ("some title", "some organisation"); - r.role = "some role"; - roles.add ((owned) r); + Gee.HashSet role_fds = + new HashSet + ((GLib.HashFunc) RoleFieldDetails.hash, + (GLib.EqualFunc) RoleFieldDetails.equal); + var role = new Role ("some title", "some organisation"); + role.role = "some role"; + var role_fd = new RoleFieldDetails (role); + role_fds.add ((owned) role_fd); foreach (var p in i.personas) { - ((RoleDetails) p).roles = roles; + ((RoleDetails) p).roles = role_fds; } } } @@ -132,9 +136,9 @@ public class SetRolesTests : Folks.TestCase Folks.Individual i = (Folks.Individual) individual_obj; if (i.full_name == this._persona_fullname) { - foreach (var r in i.roles) + foreach (var role_fd in i.roles) { - if (Role.equal (r, this._role)) + if (role_fd.equal (this._role_fd)) { this._role_found = true; this._main_loop.quit (); -- 2.7.4