private void ConvertFromXMLForFlows(WorkflowProcess process, XElement element)
        {
            // Get list SequenceFlows
            IEnumerable <XElement> flowsList = element.Descendants(XMLNodeName.sequenceFlow.ToString());

            foreach (XElement xFlow in flowsList)
            {
                // Convertor
                WorkflowSequenceFlow Sequenceflow = _workflowFlowsConvertor.ConvertFromString(xFlow.ToString());
                process.AddFlow(Sequenceflow);
            }
        }
Example #2
0
        public ResultOperation Update(Guid processID, WorkflowProcess _WorkflowProcess)
        {
            ResultOperation       resultOperation = new ResultOperation();
            List <sysBpmsGateway> listGateway     = this.GetList(processID);
            ElementService        elementService  = new ElementService(this.UnitOfWork);
            List <Guid>           listDeleted     = new List <Guid>();

            //Delete gateways that are not in diagram xml element.
            foreach (sysBpmsGateway item in listGateway.Where(c =>
                                                              !_WorkflowProcess.ExclusiveGateways.Any(d => d.ID == c.ElementID) &&
                                                              !_WorkflowProcess.InclusiveGateways.Any(d => d.ID == c.ElementID) &&
                                                              !_WorkflowProcess.ParallelGateways.Any(d => d.ID == c.ElementID)))
            {
                resultOperation = this.Delete(item.ID);
                listDeleted.Add(item.ID);
                if (!resultOperation.IsSuccess)
                {
                    return(resultOperation);
                }
            }
            listGateway = listGateway.Where(c => !listDeleted.Contains(c.ID)).ToList();
            //ExclusiveGateway
            foreach (WorkflowExclusiveGateway item in _WorkflowProcess.ExclusiveGateways)
            {
                sysBpmsGateway      gateway         = listGateway.FirstOrDefault(c => c.ElementID == item.ID);
                sysBpmsSequenceFlow newSequenceFlow = null;
                //if SequenceFlow did not add before and item.Default is not empty add it
                if (!string.IsNullOrWhiteSpace(item.Default))
                {
                    sysBpmsSequenceFlow currentDefualt = new SequenceFlowService(this.UnitOfWork).GetInfo(item.Default, processID);
                    if (currentDefualt == null)
                    {
                        WorkflowSequenceFlow _WorkflowSequenceFlow = _WorkflowProcess.SequenceFlows.FirstOrDefault(c => c.ID == item.Default);
                        newSequenceFlow = new sysBpmsSequenceFlow()
                        {
                            TargetElementID = _WorkflowSequenceFlow.TargetRef,
                            SourceElementID = _WorkflowSequenceFlow.SourceRef,
                            Name            = _WorkflowSequenceFlow.Name,
                            ElementID       = _WorkflowSequenceFlow.ID,
                            Element         = new sysBpmsElement()
                            {
                                ID        = _WorkflowSequenceFlow.ID,
                                Name      = _WorkflowSequenceFlow.Name,
                                ProcessID = processID,
                                TypeLU    = (int)sysBpmsElement.e_TypeLU.Sequence,
                            },
                            ID        = Guid.NewGuid(),
                            ProcessID = processID,
                        };
                    }
                    else if (gateway != null)
                    {
                        gateway.DefaultSequenceFlowID = currentDefualt.ID;
                    }
                }
                if (gateway != null)
                {
                    if (newSequenceFlow != null)
                    {
                        gateway.SequenceFlow = newSequenceFlow;
                    }
                    gateway.TypeLU  = (int)sysBpmsGateway.e_TypeLU.ExclusiveGateWay;
                    resultOperation = this.Update(gateway);
                    if (!resultOperation.IsSuccess)
                    {
                        return(resultOperation);
                    }
                    gateway.Element.Name = item.Name;
                    elementService.Update(gateway.Element);
                }
                else
                {
                    gateway = new sysBpmsGateway()
                    {
                        ID           = Guid.NewGuid(),
                        ElementID    = item.ID,
                        ProcessID    = processID,
                        SequenceFlow = newSequenceFlow,
                        TypeLU       = (int)sysBpmsGateway.e_TypeLU.ExclusiveGateWay,
                        Element      = new sysBpmsElement()
                        {
                            ID        = item.ID,
                            Name      = item.Name,
                            ProcessID = processID,
                            TypeLU    = (int)sysBpmsElement.e_TypeLU.Gateway,
                        }
                    };
                    resultOperation = this.Add(gateway);
                }
                if (!resultOperation.IsSuccess)
                {
                    return(resultOperation);
                }
            }

            //InclusiveGateway
            foreach (WorkflowInclusiveGateway item in _WorkflowProcess.InclusiveGateways)
            {
                sysBpmsGateway gateway = listGateway.FirstOrDefault(c => c.ElementID == item.ID);

                sysBpmsSequenceFlow newSequenceFlow = null;
                //if SequenceFlow did not add before and item.Default is not empty add it
                if (!string.IsNullOrWhiteSpace(item.Default))
                {
                    sysBpmsSequenceFlow currentDefualt = new SequenceFlowService(this.UnitOfWork).GetInfo(item.Default, processID);
                    if (currentDefualt == null)
                    {
                        WorkflowSequenceFlow _WorkflowSequenceFlow = _WorkflowProcess.SequenceFlows.FirstOrDefault(c => c.ID == item.Default);
                        newSequenceFlow = new sysBpmsSequenceFlow()
                        {
                            TargetElementID = _WorkflowSequenceFlow.TargetRef,
                            SourceElementID = _WorkflowSequenceFlow.SourceRef,
                            Name            = _WorkflowSequenceFlow.Name,
                            ElementID       = _WorkflowSequenceFlow.ID,
                            Element         = new sysBpmsElement()
                            {
                                ID        = _WorkflowSequenceFlow.ID,
                                Name      = _WorkflowSequenceFlow.Name,
                                ProcessID = processID,
                                TypeLU    = (int)sysBpmsElement.e_TypeLU.Sequence,
                            },
                            ID        = Guid.NewGuid(),
                            ProcessID = processID,
                        };
                    }
                    else if (gateway != null)
                    {
                        gateway.DefaultSequenceFlowID = currentDefualt.ID;
                    }
                }

                if (gateway != null)
                {
                    if (newSequenceFlow != null)
                    {
                        gateway.SequenceFlow = newSequenceFlow;
                    }
                    gateway.TypeLU  = (int)sysBpmsGateway.e_TypeLU.InclusiveGateWay;
                    resultOperation = this.Update(gateway);
                    if (!resultOperation.IsSuccess)
                    {
                        return(resultOperation);
                    }
                    gateway.Element.Name = item.Name;
                    elementService.Update(gateway.Element);
                }
                else
                {
                    gateway = new sysBpmsGateway()
                    {
                        ID           = Guid.NewGuid(),
                        ElementID    = item.ID,
                        ProcessID    = processID,
                        SequenceFlow = newSequenceFlow,
                        TypeLU       = (int)sysBpmsGateway.e_TypeLU.InclusiveGateWay,
                        Element      = new sysBpmsElement()
                        {
                            ID        = item.ID,
                            Name      = item.Name,
                            ProcessID = processID,
                            TypeLU    = (int)sysBpmsElement.e_TypeLU.Gateway,
                        }
                    };
                    resultOperation = this.Add(gateway);
                }
                if (!resultOperation.IsSuccess)
                {
                    return(resultOperation);
                }
            }

            //ParallelGateway
            foreach (WorkflowParallelGateway item in _WorkflowProcess.ParallelGateways)
            {
                sysBpmsGateway gateway = listGateway.FirstOrDefault(c => c.ElementID == item.ID);
                if (gateway != null)
                {
                    gateway.TypeLU  = (int)sysBpmsGateway.e_TypeLU.ParallelGateWay;
                    resultOperation = this.Update(gateway);
                    if (!resultOperation.IsSuccess)
                    {
                        return(resultOperation);
                    }
                    gateway.Element.Name = item.Name;
                    elementService.Update(gateway.Element);
                }
                else
                {
                    gateway = new sysBpmsGateway()
                    {
                        ID        = Guid.NewGuid(),
                        ElementID = item.ID,
                        ProcessID = processID,
                        TypeLU    = (int)sysBpmsGateway.e_TypeLU.ParallelGateWay,
                        Element   = new sysBpmsElement()
                        {
                            ID        = item.ID,
                            Name      = item.Name,
                            ProcessID = processID,
                            TypeLU    = (int)sysBpmsElement.e_TypeLU.Gateway,
                        }
                    };
                    resultOperation = this.Add(gateway);
                }
                if (!resultOperation.IsSuccess)
                {
                    return(resultOperation);
                }
            }

            return(resultOperation);
        }