コード例 #1
0
        protected SPWorkflowAssociation FindExistringWorkflowAssotiation(object modelHost, WorkflowAssociationDefinition def)
        {
            if (modelHost is ListModelHost)
            {
                var list = (modelHost as ListModelHost).HostList;

                return list.WorkflowAssociations
                          .GetAssociationByName(def.Name, list.ParentWeb.UICulture);
            }
            if (modelHost is WebModelHost)
            {
                var web = (modelHost as WebModelHost).HostWeb;

                return web.WorkflowAssociations
                          .GetAssociationByName(def.Name, web.UICulture);
            }
            if (modelHost is SPContentType)
            {
                var contentType = (modelHost as SPContentType);
                var web = contentType.ParentWeb;

                return contentType.WorkflowAssociations
                                  .GetAssociationByName(def.Name, web.UICulture);
            }
            else
            {
                throw new SPMeta2NotImplementedException(
                    string.Format("Unsupported model host: WorkflowAssociation under {0} is not implemented yet",
                        modelHost.GetType()));
            }
        }
コード例 #2
0
        private void DeployListWorkflowAssociationDefinition(ListModelHost modelHost, SPList list, WorkflowAssociationDefinition definition)
        {
            var existingWorkflowAssotiation = FindExistringWorkflowAssotiation(modelHost, definition);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model = null,
                EventType = ModelEventType.OnProvisioning,
                Object = existingWorkflowAssotiation,
                ObjectType = typeof(SPWorkflowAssociation),
                ObjectDefinition = definition,
                ModelHost = modelHost
            });

            bool isNew = false;

            if (existingWorkflowAssotiation == null)
            {
                var workflowTemplate = GetWorkflowTemplate(modelHost, definition);

                existingWorkflowAssotiation = SPWorkflowAssociation.CreateListAssociation(workflowTemplate,
                           definition.Name,
                           list.Lists[definition.TaskListTitle],
                           list.Lists[definition.HistoryListTitle]);

                isNew = true;
            }

            MapProperties(definition, existingWorkflowAssotiation);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model = null,
                EventType = ModelEventType.OnProvisioned,
                Object = existingWorkflowAssotiation,
                ObjectType = typeof(SPWorkflowAssociation),
                ObjectDefinition = definition,
                ModelHost = modelHost
            });

            if (isNew)
            {
                list.WorkflowAssociations.Add(existingWorkflowAssotiation);
            }
            else
            {
                // ??
            }
        }
コード例 #3
0
        protected SPWorkflowAssociation FindExistringWorkflowAssotiation(object modelHost, WorkflowAssociationDefinition def)
        {
            if (modelHost is ListModelHost)
            {
                var list = (modelHost as ListModelHost).HostList;

                return list.WorkflowAssociations
                           .GetAssociationByName(def.Name, list.ParentWeb.UICulture);
            }

            if (modelHost is WebModelHost)
            {
                throw new SPMeta2NotImplementedException("todo");
            }

            throw new SPMeta2NotSupportedException("model host should be of type ListModelHost or WebModelHost");
        }
コード例 #4
0
        protected WorkflowAssociation FindExistringWorkflowAssotiation(object modelHost, WorkflowAssociationDefinition def)
        {
            if (modelHost is ListModelHost)
            {
                var list = (modelHost as ListModelHost).HostList;
                var context = list.Context;

                var defName = def.Name;

                var res = context.LoadQuery(list.WorkflowAssociations.Where(w => w.Name == defName));
                context.ExecuteQueryWithTrace();

                return res.FirstOrDefault();
            }

            if (modelHost is WebModelHost)
            {
                var web = (modelHost as WebModelHost).HostWeb;
                var context = web.Context;

                var defName = def.Name;

                var res = context.LoadQuery(web.WorkflowAssociations.Where(w => w.Name == defName));
                context.ExecuteQueryWithTrace();

                return res.FirstOrDefault();
            }

            if (modelHost is ModelHostContext)
            {
                var contentType = (modelHost as ModelHostContext).ContentType;
                var context = contentType.Context;

                var defName = def.Name;

                var res = context.LoadQuery(contentType.WorkflowAssociations.Where(w => w.Name == defName));
                context.ExecuteQueryWithTrace();

                return res.FirstOrDefault();
            }

            throw new SPMeta2NotSupportedException("model host should be of type ListModelHost or WebModelHost");
        }
コード例 #5
0
        private void MapProperties(WorkflowAssociationDefinition definition, WorkflowAssociation association)
        {
            if (!string.IsNullOrEmpty(definition.Description))
                association.Description = definition.Description;

            if (!string.IsNullOrEmpty(definition.AssociationData))
                association.AssociationData = definition.AssociationData;

            if (definition.AllowManual.HasValue)
                association.AllowManual = definition.AllowManual.Value;

            if (definition.AutoStartChange.HasValue)
                association.AutoStartChange = definition.AutoStartChange.Value;

            if (definition.AutoStartCreate.HasValue)
                association.AutoStartCreate = definition.AutoStartCreate.Value;

            if (definition.Enabled.HasValue)
                association.Enabled = definition.Enabled.Value;
        }
コード例 #6
0
        private WorkflowTemplate GetWorkflowTemplate(object modelHost, WorkflowAssociationDefinition def)
        {
            var targetWeb = GetWebFromModelHost(modelHost);
            var context = targetWeb.Context;

            var result = targetWeb.WorkflowTemplates.GetByName(def.WorkflowTemplateName);

            context.Load(result);
            context.ExecuteQueryWithTrace();

            return result;
        }
コード例 #7
0
        private void DeployWebWorkflowAssociationDefinition(WebModelHost modelHost, Web web, WorkflowAssociationDefinition definition)
        {
            var context = web.Context;
            var existingWorkflowAssotiation = FindExistringWorkflowAssotiation(modelHost, definition);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model = null,
                EventType = ModelEventType.OnProvisioning,
                Object = existingWorkflowAssotiation,
                ObjectType = typeof(WorkflowAssociation),
                ObjectDefinition = definition,
                ModelHost = modelHost
            });

            if (existingWorkflowAssotiation == null
                ||
                (existingWorkflowAssotiation.ServerObjectIsNull.HasValue &&
                 existingWorkflowAssotiation.ServerObjectIsNull.Value))
            {
                var workflowTemplate = GetWorkflowTemplate(modelHost, definition);

                if (workflowTemplate == null ||
                    (workflowTemplate.ServerObjectIsNull.HasValue && workflowTemplate.ServerObjectIsNull.Value))
                {
                    throw new SPMeta2Exception(
                        string.Format("Cannot find workflow template by definition:[{0}]", definition));
                }

                var historyList = web.QueryAndGetListByTitle(definition.HistoryListTitle);
                var taskList = web.QueryAndGetListByTitle(definition.TaskListTitle);

                var newWorkflowAssotiation = web.WorkflowAssociations.Add(new WorkflowAssociationCreationInformation
                {
                    Name = definition.Name,
                    Template = workflowTemplate,
                    HistoryList = historyList,
                    TaskList = taskList
                });

                MapProperties(definition, newWorkflowAssotiation);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model = null,
                    EventType = ModelEventType.OnProvisioned,
                    Object = newWorkflowAssotiation,
                    ObjectType = typeof(WorkflowAssociation),
                    ObjectDefinition = definition,
                    ModelHost = modelHost
                });

                web.Update();
                context.ExecuteQueryWithTrace();
            }
            else
            {
                MapProperties(definition, existingWorkflowAssotiation);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model = null,
                    EventType = ModelEventType.OnProvisioned,
                    Object = existingWorkflowAssotiation,
                    ObjectType = typeof(WorkflowAssociation),
                    ObjectDefinition = definition,
                    ModelHost = modelHost
                });

                // no update
                // gives weird null ref exception

                // Enhance WorkflowAssociationDefinition - add more tests on updatability #871
                // https://github.com/SubPointSolutions/spmeta2/issues/871

                //existingWorkflowAssotiation.Update();
                //web.Update();
                context.ExecuteQueryWithTrace();
            }
        }
コード例 #8
0
        private void DeployListWorkflowAssociationDefinition(ListModelHost modelHost, List list, WorkflowAssociationDefinition definition)
        {
            var context = list.Context;
            var existingWorkflowAssotiation = FindExistringWorkflowAssotiation(modelHost, definition);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model = null,
                EventType = ModelEventType.OnProvisioning,
                Object = existingWorkflowAssotiation,
                ObjectType = typeof(WorkflowAssociation),
                ObjectDefinition = definition,
                ModelHost = modelHost
            });

            if (existingWorkflowAssotiation == null
                ||
                (existingWorkflowAssotiation.ServerObjectIsNull.HasValue &&
                 existingWorkflowAssotiation.ServerObjectIsNull.Value))
            {
                var workflowTemplate = GetWorkflowTemplate(modelHost, definition);

                if (workflowTemplate == null ||
                    (workflowTemplate.ServerObjectIsNull.HasValue && workflowTemplate.ServerObjectIsNull.Value))
                {
                    throw new SPMeta2Exception(
                        string.Format("Cannot find workflow template by definition:[{0}]", definition));
                }

                var historyList = list.ParentWeb.QueryAndGetListByTitle(definition.HistoryListTitle);
                var taskList = list.ParentWeb.QueryAndGetListByTitle(definition.TaskListTitle);

                var newWorkflowAssotiation = list.WorkflowAssociations.Add(new WorkflowAssociationCreationInformation
                 {
                     Name = definition.Name,
                     Template = workflowTemplate,
                     HistoryList = historyList,
                     TaskList = taskList
                 });

                MapProperties(definition, newWorkflowAssotiation);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model = null,
                    EventType = ModelEventType.OnProvisioned,
                    Object = newWorkflowAssotiation,
                    ObjectType = typeof(WorkflowAssociation),
                    ObjectDefinition = definition,
                    ModelHost = modelHost
                });

                newWorkflowAssotiation.Update();

                context.ExecuteQueryWithTrace();
            }
            else
            {
                MapProperties(definition, existingWorkflowAssotiation);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model = null,
                    EventType = ModelEventType.OnProvisioned,
                    Object = existingWorkflowAssotiation,
                    ObjectType = typeof(WorkflowAssociation),
                    ObjectDefinition = definition,
                    ModelHost = modelHost
                });

                existingWorkflowAssotiation.Update();
                context.ExecuteQueryWithTrace();
            }
        }
コード例 #9
0
        private void DeployContentTypeWorkflowAssociationDefinition(SPContentType modelHost, SPContentType contentType, WorkflowAssociationDefinition definition)
        {
            var existingWorkflowAssotiation = FindExistringWorkflowAssotiation(modelHost, definition);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model = null,
                EventType = ModelEventType.OnProvisioning,
                Object = existingWorkflowAssotiation,
                ObjectType = typeof(SPWorkflowAssociation),
                ObjectDefinition = definition,
                ModelHost = modelHost
            });

            bool isNew = false;

            if (existingWorkflowAssotiation == null)
            {
                var workflowTemplate = GetWorkflowTemplate(modelHost, definition);

                if (workflowTemplate == null)
                {
                    throw new SPMeta2Exception(
                        string.Format("Cannot find workflow template by definition:[{0}]", definition));
                }

                existingWorkflowAssotiation = SPWorkflowAssociation.CreateWebContentTypeAssociation(workflowTemplate,
                           definition.Name,
                           definition.TaskListTitle,
                           definition.HistoryListTitle);

                isNew = true;
            }

            MapProperties(definition, existingWorkflowAssotiation);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model = null,
                EventType = ModelEventType.OnProvisioned,
                Object = existingWorkflowAssotiation,
                ObjectType = typeof(SPWorkflowAssociation),
                ObjectDefinition = definition,
                ModelHost = modelHost
            });

            if (isNew)
            {
                contentType.WorkflowAssociations.Add(existingWorkflowAssotiation);
                contentType.UpdateWorkflowAssociationsOnChildren(false,
                                                                 true,
                                                                 true,
                                                                 false);
            }
            else
            {
                contentType.WorkflowAssociations.Update(existingWorkflowAssotiation);
                contentType.UpdateWorkflowAssociationsOnChildren(false,
                                                                 true,
                                                                 true,
                                                                 false);
            }
        }
コード例 #10
0
 private SPWorkflowTemplate GetWorkflowTemplate(object modelHost, WorkflowAssociationDefinition def)
 {
     var targetWeb = GetWebFromModelHost(modelHost);
     return targetWeb.WorkflowTemplates.GetTemplateByName(def.WorkflowTemplateName, targetWeb.UICulture);
 }
コード例 #11
0
        private void DeployWebWorkflowAssociationDefinition(WebModelHost modelHost, Microsoft.SharePoint.SPWeb web, WorkflowAssociationDefinition definition)
        {
            var existingWorkflowAssotiation = FindExistringWorkflowAssotiation(modelHost, definition);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model = null,
                EventType = ModelEventType.OnProvisioning,
                Object = existingWorkflowAssotiation,
                ObjectType = typeof(SPWorkflowAssociation),
                ObjectDefinition = definition,
                ModelHost = modelHost
            });

            bool isNew = false;

            if (existingWorkflowAssotiation == null)
            {
                var workflowTemplate = GetWorkflowTemplate(modelHost, definition);

                if (workflowTemplate == null)
                {
                    throw new SPMeta2Exception(
                        string.Format("Cannot find workflow template by definition:[{0}]", definition));
                }

                existingWorkflowAssotiation = SPWorkflowAssociation.CreateListAssociation(workflowTemplate,
                           definition.Name,
                           web.Lists[definition.TaskListTitle],
                           web.Lists[definition.HistoryListTitle]);

                isNew = true;
            }

            MapProperties(definition, existingWorkflowAssotiation);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model = null,
                EventType = ModelEventType.OnProvisioned,
                Object = existingWorkflowAssotiation,
                ObjectType = typeof(SPWorkflowAssociation),
                ObjectDefinition = definition,
                ModelHost = modelHost
            });

            if (isNew)
            {
                web.WorkflowAssociations.Add(existingWorkflowAssotiation);
                web.Update();
            }
            else
            {
                web.WorkflowAssociations.Update(existingWorkflowAssotiation);
            }
        }
コード例 #12
0
 private void DeployWebWorkflowAssociationDefinition(WebModelHost webModelHost, Microsoft.SharePoint.SPWeb web, WorkflowAssociationDefinition workflowAssociationModel)
 {
     // TODO
 }