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(),
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(); }