/// <summary> /// Action for this SharePoint term group /// </summary> public override void Process() { RunningManager.Logger.Debug($"TermGroupRunner Process() - {ActiveReceivers.Count} active receivers"); Context.Load(Element, g => g.Name); Context.ExecuteQuery(); RunningManager.Logger.Debug($"TermGroup | Name: {Element.Name}"); // OnTermGroupRunningStart RunningManager.Logger.Debug("TermGroupRunner OnTermGroupRunningStart()"); ActiveReceivers.ForEach(r => r.OnTermGroupRunningStart(Element)); // If at least one receiver run term sets or deeper if (Manager.Receivers.Any(r => r.IsReceiverCalledOrDeeper(RunningLevel.TermSet))) { // Crawl term sets Context.Load(Element.TermSets); Context.ExecuteQuery(); List <TermSetRunner> termSetRunners = new List <TermSetRunner>(); foreach (TermSet set in Element.TermSets) { termSetRunners.Add(new TermSetRunner(Manager, Context, set)); } termSetRunners.ForEach(r => r.Process()); } // OnTermGroupRunningEnd RunningManager.Logger.Debug("TermGroupRunner OnTermGroupRunningEnd()"); ActiveReceivers.ForEach(r => r.OnTermGroupRunningEnd(Element)); }
/// <summary> /// Action for this SharePoint tenant /// </summary> public override void Process() { RunningManager.Logger.Debug($"TenantRunner Process() - {ActiveReceivers.Count} active receivers"); Context.Load(Element, t => t.RootSiteUrl); Context.ExecuteQuery(); RunningManager.Logger.Debug($"Tenant | URL: {Element.RootSiteUrl}"); // OnTenantRunningStart RunningManager.Logger.Debug("TenantRunner OnTenantRunningStart()"); ActiveReceivers.ForEach(r => r.OnTenantRunningStart(Element)); // If at least one receiver run term stores or deeper if (Manager.Receivers.Any(r => r.IsReceiverCalledOrDeeper(RunningLevel.TermStore))) { // Open taxonomy session TaxonomySession taxSession = TaxonomySession.GetTaxonomySession(Context); // Crawl term stores Context.Load(taxSession, s => s.TermStores); Context.ExecuteQuery(); List <TermStoreRunner> termStoreRunners = new List <TermStoreRunner>(); foreach (TermStore store in taxSession.TermStores) { termStoreRunners.Add(new TermStoreRunner(Manager, Context, store)); } termStoreRunners.ForEach(r => r.Process()); } // If at least one receiver run site collections or deeper if (Manager.Receivers.Any(r => r.IsReceiverCalledOrDeeper(RunningLevel.SiteCollection))) { // Get site collections URLs SPOSitePropertiesEnumerable properties = Element.GetSiteProperties(0, true); Context.Load(properties); Context.ExecuteQuery(); // Crawl among site collections List <string> siteCollectionUrls = properties.Select(p => p.Url).ToList(); List <SiteCollectionRunner> siteCollectionRunners = new List <SiteCollectionRunner>(); foreach (string siteCollectionUrl in siteCollectionUrls) { ClientContext ctx = new ClientContext(siteCollectionUrl) { Credentials = Context.Credentials }; siteCollectionRunners.Add(new SiteCollectionRunner(Manager, ctx, ctx.Site)); } siteCollectionRunners.ForEach(r => r.Process()); } // OnTenantRunningEnd RunningManager.Logger.Debug("TenantRunner OnTenantRunningEnd()"); ActiveReceivers.ForEach(r => r.OnTenantRunningEnd(Element)); }
/// <summary> /// Action for this SharePoint term /// </summary> public override void Process() { RunningManager.Logger.Debug($"TermRunner Process() - {ActiveReceivers.Count} active receivers"); Context.Load(Element, t => t.Name); Context.ExecuteQuery(); RunningManager.Logger.Debug($"Term | Name: {Element.Name}"); // OnTermRunningStart RunningManager.Logger.Debug("TermRunner OnTermRunningStart()"); ActiveReceivers.ForEach(r => r.OnTermRunningStart(Element)); // Crawl sub terms Context.Load(Element.Terms); Context.ExecuteQuery(); List <TermRunner> termRunners = new List <TermRunner>(); foreach (Term term in Element.Terms) { termRunners.Add(new TermRunner(Manager, Context, term)); } termRunners.ForEach(r => r.Process()); // OnTermRunningEnd RunningManager.Logger.Debug("TermRunner OnTermRunningEnd()"); ActiveReceivers.ForEach(r => r.OnTermRunningEnd(Element)); }
/// <summary> /// Action for this SharePoint list item /// </summary> public override void Process() { RunningManager.Logger.Debug($"ListItemRunner Process() - {ActiveReceivers.Count} active receivers"); Context.Load(Element, li => li.DisplayName); Context.ExecuteQuery(); RunningManager.Logger.Debug($"ListItem | DisplayName: {Element.DisplayName}"); // OnListItemRunning RunningManager.Logger.Debug("ListItemRunner OnListItemRunning()"); ActiveReceivers.ForEach(r => r.OnListItemRunning(Element)); // If at least one receiver run files if (Manager.Receivers.Any(r => r.IsReceiverCalledOrDeeper(RunningLevel.File))) { Context.Load(Element, li => li.FileSystemObjectType); Context.ExecuteQuery(); // If there is a file if (Element.FileSystemObjectType == FileSystemObjectType.File) { // Run file on current list item FileRunner fileRunner = new FileRunner(Manager, Context, Element.File); fileRunner.Process(); } } }
/// <summary> /// Action for this SharePoint view /// </summary> public override void Process() { RunningManager.Logger.Debug($"ViewRunner Process() - {ActiveReceivers.Count} active receivers"); Context.Load(Element, v => v.Title, v => v.ServerRelativeUrl); Context.ExecuteQuery(); RunningManager.Logger.Debug($"View | Title: {Element.Title} / URL: {Element.ServerRelativeUrl}"); // OnViewRunning RunningManager.Logger.Debug("ViewRunner OnViewRunning()"); ActiveReceivers.ForEach(r => r.OnViewRunning(Element)); }
/// <summary> /// Action for this SharePoint file /// </summary> public override void Process() { RunningManager.Logger.Debug($"FileRunner Process() - {ActiveReceivers.Count} active receivers"); Context.Load(Element, f => f.Name, f => f.ServerRelativeUrl); Context.ExecuteQuery(); RunningManager.Logger.Debug($"File | Name: {Element.Name} / URL: {Element.ServerRelativeUrl}"); // OnFileRunning RunningManager.Logger.Debug("FileRunner OnFileRunning()"); ActiveReceivers.ForEach(r => r.OnFileRunning(Element)); }
/// <summary> /// Action for this SharePoint group /// </summary> public override void Process() { RunningManager.Logger.Debug($"GroupRunner Process() - {ActiveReceivers.Count} active receivers"); Context.Load(Element, f => f.Id, f => f.Title); Context.ExecuteQuery(); RunningManager.Logger.Debug($"Group | Id: {Element.Id} / Title: {Element.Title}"); // OnGroupRunning RunningManager.Logger.Debug("GroupRunner OnGroupRunning()"); ActiveReceivers.ForEach(r => r.OnGroupRunning(Element)); }
/// <summary> /// Action for this SharePoint site collection /// </summary> public override void Process() { RunningManager.Logger.Debug($"SiteCollectionRunner Process() - {ActiveReceivers.Count} active receivers"); Context.Load(Element, s => s.Url, s => s.RootWeb); Context.ExecuteQuery(); RunningManager.Logger.Debug($"SiteCollection | URL: {Element.Url}"); // OnSiteCollectionRunningStart RunningManager.Logger.Debug("SiteCollectionRunner OnSiteCollectionRunningStart()"); ActiveReceivers.ForEach(r => r.OnSiteCollectionRunningStart(Element, Element.RootWeb)); // If at least one receiver run groups if (Manager.Receivers.Any(r => r.IsReceiverCalledOrDeeper(RunningLevel.Group))) { // Crawl groups Context.Load(Element.RootWeb.SiteGroups); Context.ExecuteQuery(); List <GroupRunner> groupRunners = new List <GroupRunner>(); foreach (Group group in Element.RootWeb.SiteGroups) { groupRunners.Add(new GroupRunner(Manager, Context, group)); } groupRunners.ForEach(r => r.Process()); } // If at least one receiver run sites or deeper if (Manager.Receivers.Any(r => r.IsReceiverCalledOrDeeper(RunningLevel.Site))) { // Run site on current root site SiteRunner siteRunner = new SiteRunner(Manager, Context, Element.RootWeb); siteRunner.Process(); } // OnSiteCollectionRunningEnd RunningManager.Logger.Debug("SiteCollectionRunner OnSiteCollectionRunningEnd()"); ActiveReceivers.ForEach(r => r.OnSiteCollectionRunningEnd(Element, Element.RootWeb)); }
/// <summary> /// Action for this SharePoint site /// </summary> public override void Process() { RunningManager.Logger.Debug($"SiteRunner Process() - {ActiveReceivers.Count} active receivers"); Context.Load(Element, s => s.Title, s => s.Url); Context.ExecuteQuery(); RunningManager.Logger.Debug($"Site | Title: {Element.Title} / URL: {Element.Url}"); // OnSiteRunningStart RunningManager.Logger.Debug("SiteRunner OnSiteRunningStart()"); ActiveReceivers.ForEach(r => r.OnSiteRunningStart(Element)); // If at least one receiver run lists or deeper if (Manager.Receivers.Any(r => r.IsReceiverCalledOrDeeper(RunningLevel.List))) { // Crawl Lists Context.Load(Element.Lists, coll => coll.Include( l => l.Hidden)); Context.ExecuteQuery(); List <ListRunner> listRunners = new List <ListRunner>(); IEnumerable <List> lists; if (Manager.Receivers.Any(r => r.IncludeHiddenLists)) { lists = Element.Lists; } else { lists = Element.Lists.Where(l => !l.Hidden); } foreach (List list in lists) { listRunners.Add(new ListRunner(Manager, Context, list)); } listRunners.ForEach(r => r.Process()); } // OnSiteRunningEnd RunningManager.Logger.Debug("SiteRunner OnSiteRunningEnd()"); ActiveReceivers.ForEach(r => r.OnSiteRunningEnd(Element)); // If at least one receiver run subsites if (Manager.Receivers.Any(r => r.IncludeSubSites)) { // Crawl Subsites Context.Load(Element.Webs); Context.ExecuteQuery(); List <SiteRunner> siteRunners = new List <SiteRunner>(); foreach (Web subWeb in Element.Webs) { siteRunners.Add(new SiteRunner(Manager, Context, subWeb, true)); } siteRunners.ForEach(r => r.Process()); // OnSiteRunningEndAfterSubSites RunningManager.Logger.Debug("SiteRunner OnSiteRunningEndAfterSubSites()"); ActiveReceivers.ForEach(r => r.OnSiteRunningEndAfterSubSites(Element)); } }
/// <summary> /// Action for this SharePoint folder /// </summary> public override void Process() { RunningManager.Logger.Debug($"FolderRunner Process() - {ActiveReceivers.Count} active receivers"); Context.Load(Element, f => f.Name, f => f.ServerRelativeUrl, f => f.ListItemAllFields["FileRef"], f => f.ListItemAllFields.ParentList.ItemCount); Context.ExecuteQuery(); RunningManager.Logger.Debug($"Folder | Name: {Element.Name} / URL: {Element.ServerRelativeUrl}"); // OnFolderRunningStart RunningManager.Logger.Debug("FolderRunner OnFolderRunningStart()"); ActiveReceivers.ForEach(r => r.OnFolderRunningStart(Element)); // If at least one receiver run list items of deeper if (Manager.Receivers.Any(r => r.IsReceiverCalledOrDeeper(RunningLevel.ListItem))) { List <ListItem> items = new List <ListItem>(); if (Element.ListItemAllFields.ParentList.ItemCount > 5000) { // Manage large lists int count = 0; int inter = 1000; int countList = Element.ListItemAllFields.ParentList.ItemCount; while (count < countList) { CamlQuery itemsQuery = new CamlQuery() { FolderServerRelativeUrl = Element.ListItemAllFields["FileRef"].ToString(), ViewXml = $"<View><Query><Where><And><Gt><FieldRef Name='ID'/><Value Type='Counter'>{count}</Value></Gt><Leq><FieldRef Name='ID'/><Value Type='Counter'>{count + inter}</Value></Leq></And></Where><OrderBy Override='TRUE'><FieldRef Name='ID'/></OrderBy></Query></View><RowLimit>{inter}</RowLimit>" }; ListItemCollection itemsResult = Element.ListItemAllFields.ParentList.GetItems(itemsQuery); Context.Load(itemsResult); Context.ExecuteQuery(); items.AddRange(itemsResult); count += inter; } } else { CamlQuery itemsQuery = new CamlQuery() { FolderServerRelativeUrl = Element.ListItemAllFields["FileRef"].ToString(), ViewXml = "<View><Query></Query></View>" }; ListItemCollection itemsResult = Element.ListItemAllFields.ParentList.GetItems(itemsQuery); Context.Load(itemsResult); Context.ExecuteQuery(); items = itemsResult.ToList(); } List <ListItemRunner> itemRunners = new List <ListItemRunner>(); foreach (ListItem item in items) { itemRunners.Add(new ListItemRunner(Manager, Context, item)); } itemRunners.ForEach(r => r.Process()); } // OnFolderRunningEnd RunningManager.Logger.Debug("FolderRunner OnFolderRunningEnd()"); ActiveReceivers.ForEach(r => r.OnFolderRunningEnd(Element)); List <ListItem> subFolders = new List <ListItem>(); if (Element.ListItemAllFields.ParentList.ItemCount > 5000) { // Manage large lists int count = 0; int inter = 1000; int countList = Element.ListItemAllFields.ParentList.ItemCount; while (count < countList) { CamlQuery subFoldersQuery = new CamlQuery() { FolderServerRelativeUrl = Element.ListItemAllFields["FileRef"].ToString(), ViewXml = $"<View><Query><Where><And><And><Gt><FieldRef Name='ID'/><Value Type='Counter'>{count}</Value></Gt><Leq><FieldRef Name='ID'/><Value Type='Counter'>{count + inter}</Value></Leq></And><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>1</Value></Eq></And></Where><OrderBy Override='TRUE'><FieldRef Name='ID'/></OrderBy></Query></View><RowLimit>{inter}</RowLimit>" }; ListItemCollection subFoldersResult = Element.ListItemAllFields.ParentList.GetItems(subFoldersQuery); Context.Load(subFoldersResult); Context.ExecuteQuery(); subFolders.AddRange(subFoldersResult); count += inter; } } else { CamlQuery subFoldersQuery = new CamlQuery() { FolderServerRelativeUrl = Element.ListItemAllFields["FileRef"].ToString(), ViewXml = "<View><Query><Where><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>1</Value></Eq></Where></Query></View>" }; // Crawl sub folders ListItemCollection subFoldersResult = Element.ListItemAllFields.ParentList.GetItems(subFoldersQuery); Context.Load(subFoldersResult, coll => coll.Include( f => f.Folder)); Context.ExecuteQuery(); subFolders = subFoldersResult.ToList(); } List <FolderRunner> folderRunners = new List <FolderRunner>(); foreach (ListItem folder in subFolders) { folderRunners.Add(new FolderRunner(Manager, Context, folder.Folder)); } folderRunners.ForEach(r => r.Process()); // OnFolderRunningEndAfterSubFolders RunningManager.Logger.Debug("FolderRunner OnFolderRunningEndAfterSubFolders()"); ActiveReceivers.ForEach(r => r.OnFolderRunningEndAfterSubFolders(Element)); }
/// <summary> /// Action for this SharePoint list /// </summary> public override void Process() { RunningManager.Logger.Debug($"ListRunner Process() - {ActiveReceivers.Count} active receivers"); Context.Load(Element, l => l.Title, l => l.RootFolder.ServerRelativeUrl); Context.ExecuteQuery(); RunningManager.Logger.Debug($"List | Title: {Element.Title} / URL: {Element.RootFolder.ServerRelativeUrl}"); // OnListRunningStart RunningManager.Logger.Debug("ListRunner OnListRunningStart()"); ActiveReceivers.ForEach(r => r.OnListRunningStart(Element)); // If at least one receiver run views if (Manager.Receivers.Any(r => r.IsReceiverCalledOrDeeper(RunningLevel.View))) { // Crawl views Context.Load(Element.Views); Context.ExecuteQuery(); List <ViewRunner> viewRunners = new List <ViewRunner>(); foreach (View view in Element.Views) { viewRunners.Add(new ViewRunner(Manager, Context, view)); } viewRunners.ForEach(r => r.Process()); } // If at least one receiver run folders or deeper if (Manager.Receivers.Any(r => r.IsReceiverCalledOrDeeper(RunningLevel.Folder))) { List <ListItem> folders = new List <ListItem>(); if (Element.ItemCount > 5000) { // Manage large lists int count = 0; int inter = 1000; int countList = Element.ItemCount; while (count < countList) { CamlQuery foldersQuery = new CamlQuery() { ViewXml = $"<View><Query><Where><And><And><Gt><FieldRef Name='ID'/><Value Type='Counter'>{count}</Value></Gt><Leq><FieldRef Name='ID'/><Value Type='Counter'>{count + inter}</Value></Leq></And><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>1</Value></Eq></And></Where><OrderBy Override='TRUE'><FieldRef Name='ID'/></OrderBy></Query></View><RowLimit>{inter}</RowLimit>" }; ListItemCollection foldersResult = Element.GetItems(foldersQuery); Context.Load(foldersResult); Context.ExecuteQuery(); folders.AddRange(foldersResult); count += inter; } } else { CamlQuery foldersQuery = new CamlQuery() { ViewXml = "<View><Query><Where><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>1</Value></Eq></Where></Query></View>" }; ListItemCollection foldersResult = Element.GetItems(foldersQuery); Context.Load(foldersResult, coll => coll.Include( f => f.Folder)); Context.ExecuteQuery(); folders = foldersResult.ToList(); } List <FolderRunner> folderRunners = new List <FolderRunner>(); foreach (ListItem folder in folders) { folderRunners.Add(new FolderRunner(Manager, Context, folder.Folder)); } folderRunners.ForEach(r => r.Process()); } else if (Manager.Receivers.Any(r => r.IsReceiverCalledOrDeeper(RunningLevel.ListItem))) { List <ListItem> items = new List <ListItem>(); if (Element.ItemCount > 5000) { // Manage large lists int count = 0; int inter = 1000; int countList = Element.ItemCount; while (count < countList) { CamlQuery itemsQuery = new CamlQuery() { ViewXml = $"<View Scope='RecursiveAll'><Query><Where><And><Gt><FieldRef Name='ID'/><Value Type='Counter'>{count}</Value></Gt><Leq><FieldRef Name='ID'/><Value Type='Counter'>{count + inter}</Value></Leq></And></Where><OrderBy Override='TRUE'><FieldRef Name='ID'/></OrderBy></Query></View><RowLimit>{inter}</RowLimit>" }; ListItemCollection itemsResult = Element.GetItems(itemsQuery); Context.Load(itemsResult); Context.ExecuteQuery(); items.AddRange(itemsResult); count += inter; } } else { CamlQuery itemsQuery = new CamlQuery() { ViewXml = "<View Scope='RecursiveAll'><Query></Query></View>" }; ListItemCollection itemsResult = Element.GetItems(itemsQuery); Context.Load(itemsResult); Context.ExecuteQuery(); items = itemsResult.ToList(); } List <ListItemRunner> itemRunners = new List <ListItemRunner>(); foreach (ListItem item in items) { itemRunners.Add(new ListItemRunner(Manager, Context, item)); } itemRunners.ForEach(r => r.Process()); } // OnListRunningEnd RunningManager.Logger.Debug("ListRunner OnListRunningEnd()"); ActiveReceivers.ForEach(r => r.OnListRunningEnd(Element)); }