private static ColumnsFactory SelectColumnsFactoryFor(Resource resource)
        {
            WindowsAzureActiveDirectoryGroup group = resource as WindowsAzureActiveDirectoryGroup;

            if (group != null)
            {
                ColumnsFactory result = new GroupColumnsFactory(group);
                return(result);
            }

            Core2EnterpriseUser user = resource as Core2EnterpriseUser;

            if (user != null)
            {
                ColumnsFactory result = new UserColumnsFactory(user);
                return(result);
            }

            DynamicUser dynamicUser = resource as DynamicUser;

            if (dynamicUser != null)
            {
                ColumnsFactory result = new DynamicUserColumnsFactory(dynamicUser);
                return(result);
            }

            string unsupportedSchema =
                string.Join(
                    Environment.NewLine,
                    resource.Schemas);

            throw new NotSupportedException(unsupportedSchema);
        }
        private static IReadOnlyDictionary <string, string> PatchDynamicUser(PatchRequest2 patch, IRow row)
        {
            DynamicUser dynamicUser            = new DynamicUserFactory(row).Create();
            Dictionary <string, string> result =
                new DynamicUserColumnsFactory(dynamicUser)
                .CreateColumns()
                .ToDictionary(
                    (KeyValuePair <string, string> item) =>
                    item.Key,
                    (KeyValuePair <string, string> item) =>
                    item.Value);

            if (null == patch.Operations || !patch.Operations.Any())
            {
                return(result);
            }

            foreach (PatchOperation operation in patch.Operations)
            {
                if (string.IsNullOrWhiteSpace(operation?.Path?.AttributePath))
                {
                    continue;
                }

                string updatedValue = operation.Value.First().Value;

                string originalValue;
                if (!result.TryGetValue(operation.Path.AttributePath, out originalValue))
                {
                    result.Add(operation.Path.AttributePath, updatedValue);
                }
                else
                {
                    result[operation.Path.AttributePath] = updatedValue;
                }
            }

            return(result);
        }