Example #1
0
        /// <summary>
        /// Process the request
        /// </summary>
        public override void ExecuteCmdlet()
        {
            base.ExecuteCmdlet();

            siteColumns = new List <SPFieldDefinitionModel>();

            try
            {
                //Load list
                var siteUrl    = this.ClientContext.Url;
                var listInSite = this.ClientContext.Web.Lists.GetByTitle(ListTitle);
                this.ClientContext.Load(listInSite);
                this.ClientContext.ExecuteQuery();

                //#TODO: Provision datamigrated column for holder
                var camlWhereClause = CAML.Neq(CAML.FieldValue("DataMigrated", "Integer", "1"));

                // get ezforms site and query the list for approved requests
                ListItemCollectionPosition ListItemCollectionPosition = null;
                var camlQuery = CamlQuery.CreateAllItemsQuery();
                camlQuery.ViewXml  = string.Format("<View Scope='RecursiveAll'><Query><Where>{0}</Where>", camlWhereClause);
                camlQuery.ViewXml += "<RowLimit>50</RowLimit>";
                camlQuery.ViewXml += "</Query></View>";
                camlQuery.ListItemCollectionPosition = ListItemCollectionPosition;

                var output = new List <object>();

                while (true)
                {
                    camlQuery.ListItemCollectionPosition = ListItemCollectionPosition;
                    var spListItems = listInSite.GetItems(camlQuery);
                    this.ClientContext.Load(spListItems, lti => lti.ListItemCollectionPosition,
                                            lti => lti.IncludeWithDefaultProperties(lnc => lnc.Id, lnc => lnc.ContentType));
                    this.ClientContext.ExecuteQuery();
                    ListItemCollectionPosition = spListItems.ListItemCollectionPosition;

                    foreach (var requestItem in spListItems)
                    {
                        var requestId = requestItem.Id;

                        ListItem _item = listInSite.GetItemById(requestId);
                        //#TODO: add list item column includes for specific columns of operation
                        ClientContext.Load(_item);
                        ClientContext.ExecuteQuery();

                        try
                        {
                            output.Add(ProcessListItem(_item));
                        }
                        catch (Exception e)
                        {
                            LogError(e, "Failed to update list item {0}", e.Message);
                        }
                    }

                    if (ListItemCollectionPosition == null)
                    {
                        break;
                    }
                }

                LogVerbose("Writing objects to memory stream.");
                output.ForEach(s => WriteObject(s));
            }
            catch (Exception ex)
            {
                LogError(ex, "Migrate failed for list items MSG:{0}", ex.Message);
            }
        }
Example #2
0
        /// <summary>
        /// Process the request
        /// </summary>
        public override void ExecuteCmdlet()
        {
            base.ExecuteCmdlet();

            siteColumns = new List <SPFieldDefinitionModel>();

            try
            {
                //Load list
                var siteUrl    = this.ClientContext.Url;
                var listInSite = this.ClientContext.Web.Lists.GetByTitle(ListTitle);
                this.ClientContext.Load(listInSite);
                this.ClientContext.ExecuteQuery();

                //#TODO: Provision datamigrated column for holder
                var camlWhereClause = CAML.Neq(CAML.FieldValue("DataMigrated", "Integer", "1"));

                var camlViewFields = CAML.ViewFields((new string[] { "Modified", "", "", "Id" }).Select(s => CAML.FieldRef(s)).ToArray());

                // get site and query the list for approved requests
                ListItemCollectionPosition ListItemCollectionPosition = null;
                var camlQuery = new CamlQuery()
                {
                    ViewXml = CAML.ViewQuery(ViewScope.RecursiveAll, CAML.Where(camlWhereClause), string.Empty, camlViewFields, 50)
                };


                var output = new List <object>();

                while (true)
                {
                    camlQuery.ListItemCollectionPosition = ListItemCollectionPosition;
                    var spListItems = listInSite.GetItems(camlQuery);
                    this.ClientContext.Load(spListItems, lti => lti.ListItemCollectionPosition,
                                            lti => lti.IncludeWithDefaultProperties(lnc => lnc.Id, lnc => lnc.ContentType));
                    this.ClientContext.ExecuteQuery();
                    ListItemCollectionPosition = spListItems.ListItemCollectionPosition;

                    foreach (var requestItem in spListItems)
                    {
                        var requestId = requestItem.Id;

                        ListItem _item = listInSite.GetItemById(requestId);
                        ClientContext.Load(_item);
                        ClientContext.ExecuteQueryRetry();

                        try
                        {
                            output.Add(ProcessListItem(_item));
                        }
                        catch (Exception e)
                        {
                            LogError(e, "Failed to update list item {0}", e.Message);
                        }
                    }

                    if (ListItemCollectionPosition == null)
                    {
                        break;
                    }
                }

                LogVerbose("Writing objects to memory stream.");
                output.ForEach(s => WriteObject(s));
            }
            catch (Exception ex)
            {
                LogError(ex, "Migrate failed for list items MSG:{0}", ex.Message);
            }
        }
        public override void ExecuteCmdlet()
        {
            base.ExecuteCmdlet();

            var SelectedWeb = this.ClientContext.Web;

            ilogger = new DefaultUsageLogger(
                (string msg, object[] margs) =>
            {
                LogDebugging(msg, margs);
            },
                (string msg, object[] margs) =>
            {
                LogWarning(msg, margs);
            },
                (Exception ex, string msg, object[] margs) =>
            {
                LogError(ex, msg, margs);
            });

            var list = List.GetList(SelectedWeb);

            SelectedWeb.Context.Load(list, lctx => lctx.Id);
            SelectedWeb.Context.ExecuteQueryRetry();

            var workflowSubscriptionId = default(Nullable <Guid>);

            if (!string.IsNullOrEmpty(WorkflowName))
            {
                var servicesManager     = new WorkflowServicesManager(ClientContext, SelectedWeb);
                var subscriptionService = servicesManager.GetWorkflowSubscriptionService();
                var subscriptions       = subscriptionService.EnumerateSubscriptionsByList(list.Id);
                //foreach (WorkflowSubscription subs1 in subscriptions)
                //{
                //    if (subs1.Name == WorkflowName) { ClientContext.Load(subs1); }
                //}
                ClientContext.Load(subscriptions);
                ClientContext.ExecuteQueryRetry();
                if (subscriptions.Any(subs => subs.Name == WorkflowName))
                {
                    var subscription = subscriptions.FirstOrDefault(subs => subs.Name == WorkflowName);
                    workflowSubscriptionId = subscription.Id;
                }
            }

            // Check if the field exists
            var viewFields     = new string[] { "Id", "Title", WorkflowColumnName };
            var viewFieldXml   = CAML.ViewFields(viewFields.Select(s => CAML.FieldRef(s)).ToArray());
            var internalFields = new List <string>();

            internalFields.AddRange(viewFields);

            try
            {
                var checkFields = list.GetFields(internalFields.ToArray());
            }
            catch (Exception ex)
            {
                LogError(ex, $"Failed to retreive the fields {string.Join(";", viewFields)} with Msg {ex.Message}");
                return;
            }


            var itemIds  = new List <int>();
            var viewCaml = new CamlQuery()
            {
                ViewXml = CAML.ViewQuery(
                    ViewScope.RecursiveAll,
                    CAML.Where(CAML.Neq(CAML.FieldValue(WorkflowColumnName, FieldType.WorkflowStatus.ToString("f"), WorkflowStatus.Completed.ToString("D")))),
                    string.Empty,
                    viewFieldXml,
                    100)
            };
            ListItemCollectionPosition itemPosition = null;

            while (true)
            {
                viewCaml.ListItemCollectionPosition = itemPosition;
                var items = list.GetItems(viewCaml);
                list.Context.Load(items);
                list.Context.ExecuteQueryRetry();
                itemPosition = items.ListItemCollectionPosition;

                foreach (var item in items)
                {
                    itemIds.Add(item.Id);
                }

                if (itemPosition == null)
                {
                    break;
                }
            }

            // Workflow status to re-start!
            var workflowStati = new List <Microsoft.SharePoint.Client.WorkflowServices.WorkflowStatus>()
            {
                Microsoft.SharePoint.Client.WorkflowServices.WorkflowStatus.Started,
                Microsoft.SharePoint.Client.WorkflowServices.WorkflowStatus.Suspended,
                Microsoft.SharePoint.Client.WorkflowServices.WorkflowStatus.Invalid
            };

            foreach (var itemId in itemIds)
            {
                // Retreive the ListItem
                var item = list.GetItemById("" + itemId);
                list.Context.Load(item, ictx => ictx.Id, ictx => ictx.ParentList.Id);
                list.Context.ExecuteQueryRetry();

                // Variables for processing
                var subscriptionIds      = new List <Guid>();
                var allinstances         = SelectedWeb.GetWorkflowInstances(item);
                var terminationInstances = allinstances.Where(instance => workflowStati.Any(ws => ws == instance.Status) &&
                                                              (!workflowSubscriptionId.HasValue || (!workflowSubscriptionId.HasValue && instance.WorkflowSubscriptionId == workflowSubscriptionId))).ToList();

                // Cancel the existing failed workflow instances
                foreach (var instance in terminationInstances)
                {
                    var instanceId = instance.Id;
                    subscriptionIds.Add(instance.WorkflowSubscriptionId);

                    var msg = string.Format("List Item {0} => Cancelling subscription {1} instance Id {2}", itemId, instance.WorkflowSubscriptionId, instanceId);
                    if (ShouldProcess(msg))
                    {
                        instance.CancelWorkFlow();
                        LogWarning("List Item {0} => Cancelled subscription {1} instance Id {2}", itemId, instance.WorkflowSubscriptionId, instanceId);
                    }
                }

                // Instantiate the workflow subscription
                foreach (var subscriptionId in subscriptionIds)
                {
                    var msg = string.Format("List Item {0} => Start workflow subscription id {1}", itemId, subscriptionId);
                    if (ShouldProcess(msg))
                    {
                        var instanceId = item.StartWorkflowInstance(subscriptionId, new Dictionary <string, object>());
                        LogWarning("List Item {0} => Successfully restarted subscription {1} with new instance Id {2}", itemId, subscriptionId, instanceId);
                    }
                }

                // Retreive the Item workflow instances and print to the console
                var instances = SelectedWeb.GetWorkflowInstances(item);
                foreach (var instance in instances)
                {
                    LogVerbose("List Item {0} => Instance {1} => Status {2} => WF Status {3} => Created {4} => LastUpdated {5} => Subscription {6}", itemId, instance.Id, instance.Status, instance.UserStatus, instance.InstanceCreated, instance.LastUpdated, instance.WorkflowSubscriptionId);
                }
            }
        }