Exemple #1
0
        public PreviewResult PreviewChanges(XDocument document, WorkflowModel model)
        {
            var oldTasks = this.pools.Values.SelectMany(p => p.GetAllActivities()).Select(a => a.Entity);
            var oldIntermediateEvents = this.pools.Values.SelectMany(p => p.GetLanes().SelectMany(l => l.GetEvents().Where(e => e.Entity.Type == WorkflowEventType.IntermediateTimer))).Select(a => a.Entity);
            var oldNodes = oldTasks.Cast <IWorkflowNodeEntity>().Concat(oldIntermediateEvents.Cast <IWorkflowNodeEntity>()).ToDictionary(node => node.BpmnElementId);

            var newNodes = document.Descendants().Where(a => LaneBuilder.WorkflowActivityTypes.Values.Contains(a.Name.LocalName) || a.Name.LocalName == LaneBuilder.WorkflowEventTypes[WorkflowEventType.IntermediateTimer])
                           .ToDictionary(a => a.Attribute("id").Value);

            var entities = model.Entities.ToDictionaryEx(a => a.BpmnElementId);

            return(new PreviewResult
            {
                Model = new WorkflowReplacementModel
                {
                    Replacements = oldNodes.Where(kvp => !newNodes.ContainsKey(kvp.Key) && kvp.Value.CaseActivities().Any())
                                   .Select(a => new WorkflowReplacementItemEmbedded
                    {
                        OldNode = a.Value.ToLite(),
                        SubWorkflow = (a.Value as WorkflowActivityEntity)?.SubWorkflow?.Workflow.ToLite()
                    })
                                   .ToMList(),
                },
                NewTasks = newNodes.Select(kvp => new PreviewTask
                {
                    BpmnId = kvp.Key,
                    Name = kvp.Value.Attribute("name")?.Value !,
                    SubWorkflow = (entities.GetOrThrow(kvp.Key).Model as WorkflowActivityModel)?.SubWorkflow?.Workflow.ToLite()
                }).ToList(),
Exemple #2
0
        public void ApplyChanges(WorkflowModel model, WorkflowReplacementModel replacements)
        {
            var document = XDocument.Parse(model.DiagramXml);

            var participants    = document.Descendants(bpmn + "collaboration").Elements(bpmn + "participant").ToDictionaryEx(a => a.Attribute("id").Value);
            var processElements = document.Descendants(bpmn + "process").ToDictionaryEx(a => a.Attribute("id").Value);
            var diagramElements = document.Descendants(bpmndi + "BPMNPlane").Elements().ToDictionaryEx(a => a.Attribute("bpmnElement").Value, "bpmnElement");

            if (participants.Count != processElements.Count)
            {
                throw new InvalidOperationException(WorkflowValidationMessage.ParticipantsAndProcessesAreNotSynchronized.NiceToString());
            }

            Locator locator  = new Workflow.Locator(this, diagramElements, model, replacements);
            var     oldPools = this.pools.Values.ToDictionaryEx(a => a.pool.bpmnElementId, "pools");

            Synchronizer.Synchronize(participants, oldPools,
                                     (id, pa) =>
            {
                var wp = new WorkflowPoolEntity {
                    Xml = new WorkflowXmlEmbedded(), Workflow = this.workflow
                }.ApplyXml(pa, locator);
                var pb = new PoolBuilder(wp, Enumerable.Empty <LaneBuilder>(), Enumerable.Empty <XmlEntity <WorkflowConnectionEntity> >());
                this.pools.Add(wp.ToLite(), pb);
                pb.ApplyChanges(processElements.GetOrThrow(pa.Attribute("processRef").Value), locator);
            },
                                     (id, pb) =>
            {
                this.pools.Remove(pb.pool.Entity.ToLite());
                pb.DeleteAll(locator);
            },
                                     (id, pa, pb) =>
            {
                var wp = pb.pool.Entity.ApplyXml(pa, locator);
                pb.ApplyChanges(processElements.GetOrThrow(pa.Attribute("processRef").Value), locator);
            });

            var messageFlows    = document.Descendants(bpmn + "collaboration").Elements(bpmn + "messageFlow").ToDictionaryEx(a => a.Attribute("id").Value);
            var oldMessageFlows = this.messageFlows.ToDictionaryEx(a => a.bpmnElementId, "messageFlows");

            Synchronizer.Synchronize(messageFlows, oldMessageFlows,
                                     (id, mf) =>
            {
                var wc = new WorkflowConnectionEntity {
                    Xml = new WorkflowXmlEmbedded()
                }.ApplyXml(mf, locator);
                this.messageFlows.Add(new XmlEntity <WorkflowConnectionEntity>(wc));
            },
                                     (id, omf) =>
            {
                this.messageFlows.Remove(omf);
                omf.Entity.Delete(WorkflowConnectionOperation.Delete);
            },
                                     (id, mf, omf) =>
            {
                omf.Entity.ApplyXml(mf, locator);
            });
        }
        public static void ApplyDocument(WorkflowEntity workflow, WorkflowModel model, WorkflowReplacementModel replacements)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }


            var wb = new WorkflowBuilder(workflow);

            if (workflow.IsNew)
            {
                workflow.Save();
            }

            wb.ApplyChanges(model, replacements);
            wb.ValidateGraph();
            workflow.FullDiagramXml = new WorkflowXmlEmbedded {
                DiagramXml = wb.GetXDocument().ToString()
            };
            workflow.Save();
        }