public ServiceProcess Execute(string orgItemId, bool countFolders, bool countComponents, bool countSchemas,
				bool countComponentTemplates, bool countPageTemplates, bool countTemplateBuildingBlocks,
				bool countStructureGroups, bool countPages, bool countCategories, bool countKeywords)
		{
			if (string.IsNullOrEmpty(orgItemId))
			{
				throw new ArgumentNullException("orgItemId");
			}

			CountItemsParameters arguments = new CountItemsParameters
			{
				OrgItemUri = orgItemId,
				CountFolders = countFolders,
				CountComponents = countComponents,
				CountSchemas = countSchemas,
				CountComponentTemplates = countComponentTemplates,
				CountPageTemplates = countPageTemplates,
				CountTemplateBuildingBlocks = countTemplateBuildingBlocks,
				CountStructureGroups = countStructureGroups,
				CountPages = countPages,
				CountCategories = countCategories,
				CountKeywords = countKeywords
			};

			return ExecuteAsync(arguments);
		}
        public ServiceProcess Execute(string orgItemId, bool countFolders, bool countComponents, bool countSchemas,
                                      bool countComponentTemplates, bool countPageTemplates, bool countTemplateBuildingBlocks,
                                      bool countStructureGroups, bool countPages, bool countCategories, bool countKeywords)
        {
            if (string.IsNullOrEmpty(orgItemId))
            {
                throw new ArgumentNullException("orgItemId");
            }

            CountItemsParameters arguments = new CountItemsParameters
            {
                OrgItemUri                  = orgItemId,
                CountFolders                = countFolders,
                CountComponents             = countComponents,
                CountSchemas                = countSchemas,
                CountComponentTemplates     = countComponentTemplates,
                CountPageTemplates          = countPageTemplates,
                CountTemplateBuildingBlocks = countTemplateBuildingBlocks,
                CountStructureGroups        = countStructureGroups,
                CountPages                  = countPages,
                CountCategories             = countCategories,
                CountKeywords               = countKeywords
            };

            return(ExecuteAsync(arguments));
        }
        /// <summary>
        /// Contains actual processing logic: instantiates a CoreService client, queries for item list,
        /// then sets the actual response counts data object, while updating the progress all along.
        /// </summary>
        /// <param name="process">the current ServiceProcess</param>
        /// <param name="arguments">CountItemsParameters arguments</param>
        public override void Process(ServiceProcess process, object arguments)
        {
            CountItemsParameters parameters = (CountItemsParameters)arguments;

            process.SetCompletePercentage(25);
            process.SetStatus("Initializing");

            using (var coreService = Client.GetCoreService())
            {
                ItemsFilterData filter = GetFilter(parameters);
                process.SetCompletePercentage(50);
                process.SetStatus("Retrieving count data");

                XElement listXml = coreService.GetListXml(parameters.OrgItemUri, filter);
                process.SetCompletePercentage(75);
                process.SetStatus("Extracting item counts");

                ProcessCounts(listXml);
                process.Complete("Done");
            }
        }
		/// <summary>
		/// Create an ItemsFilter for the given Organizational Item type by either instantiating a
		/// RepositoryItemsFilterData (for Publication) or OrganizationalItemItemsFilterData (for Folder or SG).
		/// Populates the ItemTypes property with only the types that were requested to improve performance.
		/// </summary>
		private static ItemsFilterData GetFilter(CountItemsParameters parameters)
		{
			ItemsFilterData filter;
			if (parameters.OrgItemUri.EndsWith("-1")) // is Publication
			{
				filter = new RepositoryItemsFilterData();
			}
			else // is Folder or Structure Group
			{
				filter = new OrganizationalItemItemsFilterData();
			}

			filter.Recursive = true;

			List<ItemType> itemTypesList = new List<ItemType>();
			if (parameters.CountFolders) { itemTypesList.Add(ItemType.Folder); }
			if (parameters.CountComponents) { itemTypesList.Add(ItemType.Component); }
			if (parameters.CountSchemas) { itemTypesList.Add(ItemType.Schema); }
			if (parameters.CountComponentTemplates) { itemTypesList.Add(ItemType.ComponentTemplate); }
			if (parameters.CountPageTemplates) { itemTypesList.Add(ItemType.PageTemplate); }
			if (parameters.CountTemplateBuildingBlocks) { itemTypesList.Add(ItemType.TemplateBuildingBlock); }
			if (parameters.CountStructureGroups) { itemTypesList.Add(ItemType.StructureGroup); }
			if (parameters.CountPages) { itemTypesList.Add(ItemType.Page); }
			if (parameters.CountCategories) { itemTypesList.Add(ItemType.Category); }
			if (parameters.CountKeywords) { itemTypesList.Add(ItemType.Keyword); }

			filter.ItemTypes = itemTypesList.ToArray();

			return filter;
		}
        /// <summary>
        /// Create an ItemsFilter for the given Organizational Item type by either instantiating a
        /// RepositoryItemsFilterData (for Publication) or OrganizationalItemItemsFilterData (for Folder or SG).
        /// Populates the ItemTypes property with only the types that were requested to improve performance.
        /// </summary>
        private static ItemsFilterData GetFilter(CountItemsParameters parameters)
        {
            ItemsFilterData filter;

            if (parameters.OrgItemUri.EndsWith("-1"))             // is Publication
            {
                filter = new RepositoryItemsFilterData();
            }
            else             // is Folder or Structure Group
            {
                filter = new OrganizationalItemItemsFilterData();
            }

            filter.Recursive = true;

            List <ItemType> itemTypesList = new List <ItemType>();

            if (parameters.CountFolders)
            {
                itemTypesList.Add(ItemType.Folder);
            }
            if (parameters.CountComponents)
            {
                itemTypesList.Add(ItemType.Component);
            }
            if (parameters.CountSchemas)
            {
                itemTypesList.Add(ItemType.Schema);
            }
            if (parameters.CountComponentTemplates)
            {
                itemTypesList.Add(ItemType.ComponentTemplate);
            }
            if (parameters.CountPageTemplates)
            {
                itemTypesList.Add(ItemType.PageTemplate);
            }
            if (parameters.CountTemplateBuildingBlocks)
            {
                itemTypesList.Add(ItemType.TemplateBuildingBlock);
            }
            if (parameters.CountStructureGroups)
            {
                itemTypesList.Add(ItemType.StructureGroup);
            }
            if (parameters.CountPages)
            {
                itemTypesList.Add(ItemType.Page);
            }
            if (parameters.CountCategories)
            {
                itemTypesList.Add(ItemType.Category);
            }
            if (parameters.CountKeywords)
            {
                itemTypesList.Add(ItemType.Keyword);
            }

            filter.ItemTypes = itemTypesList.ToArray();

            return(filter);
        }