public void ReverseFinalDocument() { FinalWFdocument doc = new FinalWFdocument(editedWf.workflowName); FinalWFdocument buff = finalDocument; while (buff.Count != 0) { doc.Push(buff.Pop()); } finalDocument = doc; }
/// <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)); }