示例#1
0
        private void MapProperties(WorkflowAssociationDefinition definition, SPWorkflowAssociation 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;
            }
        }
示例#2
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);
        }
示例#3
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);

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

                existingWorkflowAssotiation = SPWorkflowAssociation.CreateListAssociation(workflowTemplate,
                                                                                          definition.Name,
                                                                                          list.ParentWeb.Lists[definition.TaskListTitle],
                                                                                          list.ParentWeb.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);
                list.Update();
            }
            else
            {
                list.WorkflowAssociations.Update(existingWorkflowAssotiation);
            }
        }
示例#4
0
        private SPWorkflowTemplate GetWorkflowTemplate(object modelHost, WorkflowAssociationDefinition def)
        {
            var targetWeb = GetWebFromModelHost(modelHost);

            return(targetWeb.WorkflowTemplates.GetTemplateByName(def.WorkflowTemplateName, targetWeb.UICulture));
        }
示例#5
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));
            }
            else if (modelHost is WebModelHost)
            {
                var web = (modelHost as WebModelHost).HostWeb;

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

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

                // don't update content type link within list
                if (listContentTypeHost.HostList != null)
                {
                    listContentTypeHost.ShouldUpdateHost = false;
                }

                var contentType = listContentTypeHost.HostContentType;
                var web         = contentType.ParentWeb;

                return(contentType.WorkflowAssociations
                       .GetAssociationByName(def.Name, web.UICulture));
            }
            else if (modelHost is ContentTypeModelHost)
            {
                var contentType = (modelHost as ContentTypeModelHost).HostContentType;
                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()));
            }
        }
        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()));
            }
        }
 public static TModelNode AddWorkflowAssociation <TModelNode>(this TModelNode model, WorkflowAssociationDefinition definition,
                                                              Action <WorkflowAssociationModelNode> action)
     where TModelNode : ModelNode, IWorkflowAssociationHostModelNode, new()
 {
     return(model.AddTypedDefinitionNode(definition, action));
 }
 public static TModelNode AddWorkflowAssociation <TModelNode>(this TModelNode model, WorkflowAssociationDefinition definition)
     where TModelNode : ModelNode, IWorkflowAssociationHostModelNode, new()
 {
     return(AddWorkflowAssociation(model, definition, null));
 }
        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
            {
                // ??
            }
        }
 private void DeployWebWorkflowAssociationDefinition(WebModelHost webModelHost, Microsoft.SharePoint.SPWeb web, WorkflowAssociationDefinition workflowAssociationModel)
 {
     // TODO
 }
        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");
        }
示例#12
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");
        }
示例#13
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();
            }
        }
示例#14
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();
            }
        }