示例#1
0
            public void ReverseFinalDocument()
            {
                FinalWFdocument doc  = new FinalWFdocument(editedWf.workflowName);
                FinalWFdocument buff = finalDocument;

                while (buff.Count != 0)
                {
                    doc.Push(buff.Pop());
                }

                finalDocument = doc;
            }
示例#2
0
            /// <summary>
            /// Transit from one state to another, after consider the event verified and which edge verify precondition
            /// </summary>
            /// <param name="evt">The event verified</param>
            /// <param name="data">The actual node</param>
            /// <param name="handler">Validation Handler</param>
            /// <returns></returns>
            public ActionResult ComputeNewStatus(WFeventType evt, XmlDocument data, ValidationEventHandler handler)
            {
                if (evt == WFeventType.TRYGOON)
                {
                    actualState.Value = data.DocumentElement;


                    if (actualState.Validate(handler))
                    {
                        if (editedWf.finalNodes.Contains(actualState))
                        {
                            /*Save data */
                            finalDocument.Push(actualState);

                            actualState = null;
                            return(new ActionResult(true));
                        }

                        /*Compute new status*/
                        List <WFedgeLabel> edges = editedWf.connectionGraph.GetOutgoingEdges(actualState);
                        edges.Sort((x, y) => x.Priority - y.Priority);

                        foreach (WFedgeLabel edgeIdToEval in edges)
                        {
                            //COMMENTATO PER SICUREZZA DI FUNZIONAMENTO
                            WFedgeLabel edgeToEval = edgeIdToEval;
                            if (edgeToEval.VerifyPrecondition(actualState))
                            {
                                /*Save data */
                                finalDocument.Push(actualState);

                                //aggiunto controllo sullo stack di rollback (vuoto / non vuoto)
                                if (rollbackWFnodes.Count != 0)
                                {
                                    WFnode      rollbackNode = rollbackWFnodes.Pop(); //recupero sia il WFnode che la sua istanza dal top dei 2 stack
                                    WFedgeLabel rollbackEdge = editedWf.connectionGraph.GetEdge(actualState, rollbackNode);
                                    if (edgeIdToEval != rollbackEdge)
                                    {
                                        rollbackWFnodes = new Stack <WFnode>();
                                        actualState     = editedWf.connectionGraph.GetDestination(actualState, edgeIdToEval);
                                    }
                                    else
                                    {
                                        actualState = rollbackNode;
                                    }
                                }
                                else
                                {
                                    actualState = editedWf.connectionGraph.GetDestination(actualState, edgeIdToEval);
                                }
                                return(new ActionResult(true));
                            }
                        }
                        Debug.WriteLine("Not avery edges precondition is satisfied");
                        return(new ActionResult(false));
                    }
                    else
                    {
                        actualState.Value = null;
                    }

                    Debug.WriteLine("Passed node is not valid! Validation failed");
                    return(new ActionResult(false));
                }
                else if (evt == WFeventType.ROLLBACK)
                {
                    if (IsInitialState())
                    {
                        Debug.WriteLine("Cannot rollback from initial node!");
                        return(new ActionResult(false));
                    }
                    if (actualState != null)
                    {
                        rollbackWFnodes.Push(actualState);
                    }
                    actualState = finalDocument.Pop();
                    return(new ActionResult(true));
                }
                return(new ActionResult(false));
            }