/// <summary>
        /// Method top add a Group object into the container.
        /// </summary>
        /// <param name="group">
        /// A valid group object.
        /// </param>
        public void Add(Group group)
        {
            Debug.Assert(group != null, "Group object is null");

            this.items.Add(group);
        }
        /// <summary>
        /// Method reads groups from storage.
        /// </summary>
        /// <param name="key">Specifies a key to read.</param>
        /// <returns>A Groups object.</returns>
        private static Groups ReadGroups(string key)
        {
            Groups groups = new Groups();

            string value = RelayStorage.GetValue(key);
            if (string.IsNullOrEmpty(value))
            {
                return groups;
            }

            string[] groupsItems = value.Split(
                new string[] { RelayStorage.ObjectSeperator },
                System.StringSplitOptions.RemoveEmptyEntries);

            if (groupsItems == null || groupsItems.Length == 0)
            {
                return groups;
            }

            foreach (string item in groupsItems)
            {
                string[] groupItems = item.Split(
                    new string[] { RelayStorage.ValueSeperator },
                    System.StringSplitOptions.None);

                if (groupItems == null || groupItems.Length != 3)
                {
                    continue;
                }

                Group group = new Group()
                {
                    Name = groupItems[0],
                    RegistrationId = groupItems[1],
                    SecretKey = groupItems[2]
                };

                groups.Add(group);
            }

            return groups;
        }
        /// <summary>
        /// Helper method to initiate the call that deletes a group.
        /// </summary>
        /// <param name="clientId">The adm client Id.</param>
        /// <param name="clientSecret">The adm client secret.</param>
        /// <param name="group">Specifies a group to be deleted.</param>
        /// <param name="onComplete">Specifies an "on complete" delegate callback.</param>
        /// <param name="stateObject">Specifies a user-defined object.</param>
        public static void DeleteGroupAsync(
            string clientId,
            string clientSecret,
            Group group,
            ServiceAgent<GroupResult>.OnCompleteDelegate onComplete,
            object stateObject = null)
        {
            if (string.IsNullOrEmpty(clientId))
            {
                throw new ArgumentNullException("clientId");
            }

            if (string.IsNullOrEmpty(clientSecret))
            {
                throw new ArgumentNullException("clientSecret");
            }

            DeleteGroupAsync(
                new AdmAuthClientIdentity(clientId, clientSecret, RelayService.ServiceScope),
                group,
                onComplete,
                stateObject);
        }
        /// <summary>
        /// Helper method to initiate the call that deletes a group.
        /// </summary>
        /// <param name="clientIdentity">The hawaii client identity.</param>
        /// <param name="group">Specifies a group to be deleted.</param>
        /// <param name="onComplete">Specifies an "on complete" delegate callback.</param>
        /// <param name="stateObject">Specifies a user-defined object.</param>
        private static void DeleteGroupAsync(
            ClientIdentity clientIdentity,
            Group group,
            ServiceAgent<GroupResult>.OnCompleteDelegate onComplete,
            object stateObject = null)
        {
            DeleteGroupAgent agent = new DeleteGroupAgent(
                RelayService.HostName,
                clientIdentity,
                group,
                stateObject);

            agent.ProcessRequest(onComplete);
        }
        /// <summary>
        /// Helper method to initiate the call that deletes a group.
        /// </summary>
        /// <param name="hawaiiAppId">Specifies the Hawaii Application Id.</param>
        /// <param name="group">Specifies a group to be deleted.</param>
        /// <param name="onComplete">Specifies an "on complete" delegate callback.</param>
        /// <param name="stateObject">Specifies a user-defined object.</param>
        public static void DeleteGroupAsync(
            string hawaiiAppId,
            Group group,
            ServiceAgent<GroupResult>.OnCompleteDelegate onComplete,
            object stateObject = null)
        {
            if (string.IsNullOrEmpty(hawaiiAppId))
            {
                throw new ArgumentNullException("hawaiiAppId");
            }

            DeleteGroupAsync(
                new GuidAuthClientIdentity(hawaiiAppId), 
                group, 
                onComplete,
                stateObject);
        }