Esempio n. 1
0
        /// ////////////////////////////////////////////////////////
        protected override CResultAErreur MyExecute(CContexteExecutionAction contexte)
        {
            CBrancheProcess branche = new CBrancheProcess(m_processFils);

            branche.IsModeAsynchrone = false;
            //TESTDBKEYOK
            branche.KeyUtilisateur          = contexte.Branche.KeyUtilisateur;
            branche.ConfigurationImpression = contexte.Branche.ConfigurationImpression;

            CContexteExecutionAction contexteExecution = new CContexteExecutionAction(
                contexte.ProcessEnExecution,
                branche,
                contexte.ObjetCible,
                contexte.ContexteDonnee,
                contexte.IndicateurProgression);

            contexteExecution.SauvegardeContexteExterne = true;

            CAction pointEntree = m_processFils.GetActionDebut();

            CResultAErreur result = CResultAErreur.True;

            result = branche.ExecuteAction(pointEntree, contexteExecution, contexte.ObjetCible, false);
            foreach (CContexteExecutionAction.CParametreServiceALancerALaFin p in contexteExecution.ServicesALancerALaFin)
            {
                contexte.AddServiceALancerALaFin(p);
            }
            contexteExecution.ClearServicesALancerALaFin();
            return(result);
        }
Esempio n. 2
0
        public static CResultAErreur StartProcessClient(
            CProcess leProcessAExecuter,
            object objetCible,
            CContexteDonnee contexte,
            IIndicateurProgression indicateur)
        {
            System.Console.WriteLine("Démarrage process" + leProcessAExecuter.Libelle);
            leProcessAExecuter.ContexteDonnee = contexte;
            //Fin Stef 2/4/08
            CResultAErreur result = CResultAErreur.True;

            if (!leProcessAExecuter.PeutEtreExecuteSurLePosteClient)
            {
                result.EmpileErreur(I.T("Cannot start this process in client mode|20004"));
                return(result);
            }
            CProcessEnExecutionInDb processEnExec = new CProcessEnExecutionInDb(contexte);

            processEnExec.CreateNewInCurrentContexte();
            if (objetCible is CObjetDonneeAIdNumerique)
            {
                processEnExec.ElementLie = (CObjetDonneeAIdNumerique)objetCible;
            }
            else
            {
                processEnExec.ElementLie = null;
            }
            processEnExec.Libelle = leProcessAExecuter.Libelle;
            processEnExec.DbKeyEvennementDeclencheur = leProcessAExecuter.InfoDeclencheur.DbKeyEvenementDeclencheur;
            processEnExec.IdVersionExecution         = contexte.IdVersionDeTravail;

            CBrancheProcess branche = new CBrancheProcess(leProcessAExecuter);

            branche.IsModeAsynchrone           = false;
            branche.ExecutionSurContexteClient = true;
            CSessionClient sessionSource = CSessionClient.GetSessionForIdSession(contexte.IdSession);

            //TESTDBKEYTODO
            branche.KeyUtilisateur          = sessionSource.GetInfoUtilisateur().KeyUtilisateur;
            branche.ConfigurationImpression = sessionSource.ConfigurationsImpression;

            CContexteExecutionAction contexteExecution = new CContexteExecutionAction(
                processEnExec,
                branche,
                objetCible,
                contexte,
                indicateur);
            string strOldContextuel = contexte.IdModificationContextuelle;

            contexteExecution.SauvegardeContexteExterne = true;
            processEnExec.BrancheEnCours = branche;

            CAppelleurFonctionAsynchrone appeleur = new CAppelleurFonctionAsynchrone();
            CResultAErreur defaultResult          = CResultAErreur.True;

            defaultResult.EmpileErreur(I.T("Asynchronous call error @1|20032", "ExecuteAction"));
            result = appeleur.StartFonctionAndWaitAvecCallback(branche.GetType(),
                                                               branche,
                                                               "ExecuteAction",
                                                               "",
                                                               defaultResult,
                                                               leProcessAExecuter.GetActionDebut(), contexteExecution, true) as CResultAErreur;



            //result = branche.ExecuteAction ( leProcessAExecuter.GetActionDebut(), contexteExecution, true );
            if (leProcessAExecuter.VariableDeRetour != null)
            {
                result.Data = leProcessAExecuter.GetValeurChamp(leProcessAExecuter.VariableDeRetour.IdVariable);
            }
            contexte.IdModificationContextuelle = strOldContextuel;
            return(result);
        }
Esempio n. 3
0
        /// <summary>
        /// Crée un process fils à partir des actions d'un process.
        /// Les actions listées sont mises dans le process fils
        /// </summary>
        /// <param name="process"></param>
        /// <param name="actions"></param>
        /// <returns>Le data du result contient le process fils créé</returns>
        public static CResultAErreur CreateForSelection(CAction[] actions)
        {
            CResultAErreur result = CResultAErreur.True;

            if (actions.Length == 0)
            {
                result.EmpileErreur(I.T("Can not create action group from empty selection|20035"));
                return(result);
            }
            CProcess process = actions[0].Process;
            //Vérifie qu'il n'y a qu'un seul lien sortant et un seul lien entrant
            HashSet <CAction> dicActionsInSel = new HashSet <CAction>();

            foreach (CAction action in actions)
            {
                dicActionsInSel.Add(action);
            }
            CLienAction lienEntrant  = null;
            Rectangle   rctEnglobant = actions[0].RectangleAbsolu;

            List <CLienAction> liensSortants = new List <CLienAction>();

            foreach (CAction action in actions)
            {
                foreach (CLienAction lien in action.GetLiensArrivant())
                {
                    if (!dicActionsInSel.Contains(lien.ActionDepart))
                    {
                        if (lienEntrant == null)
                        {
                            lienEntrant = lien;
                            break;
                        }
                        else
                        {
                            result.EmpileErreur(I.T("Selection should contains only one ingoing link|20036"));
                            return(result);
                        }
                    }
                    if (!dicActionsInSel.Contains(lien.ActionArrivee))
                    {
                        if (lien.GetType() != typeof(CLienAction))
                        {
                            result.EmpileErreur(I.T("Can not group actions with complex outgoing link|20037"));
                        }
                    }
                }
                foreach (CLienAction lien in action.GetLiensSortant())
                {
                    if (!dicActionsInSel.Contains(lien.ActionArrivee))
                    {
                        liensSortants.Add(lien);
                    }
                }
                CActionProcessFils pf = action as CActionProcessFils;
                if (pf != null)
                {
                    foreach (IVariableDynamique variable in pf.ProcessFils.ListeVariables)
                    {
                        if (!pf.ProcessFils.IsVariableDeProcessParent(variable))
                        {
                            result.EmpileErreur(I.T("Can not group a group with variables|20039"));
                            return(result);
                        }
                    }
                }

                Rectangle rctAction = action.RectangleAbsolu;
                rctEnglobant.Location = new Point(
                    Math.Min(rctEnglobant.Left, rctAction.Left),
                    Math.Min(rctEnglobant.Top, rctAction.Top));
                rctEnglobant.Size = new Size(
                    Math.Max(rctEnglobant.Width, rctAction.Right - rctEnglobant.Left),
                    Math.Max(rctEnglobant.Height, rctAction.Bottom - rctEnglobant.Top));
            }
            //Crée le process fils
            CActionProcessFils actionFils = new CActionProcessFils(process);

            actionFils.Position = new Point(rctEnglobant.Left + (rctEnglobant.Width - actionFils.Size.Width) / 2,
                                            rctEnglobant.Top + (rctEnglobant.Height - actionFils.Size.Height) / 2);
            CProcess processFils = actionFils.ProcessFils;
            Dictionary <CAction, CAction> dicCorrespondanceActions = new Dictionary <CAction, CAction>();
            int nOffsetX = processFils.GetActionDebut().Position.X - rctEnglobant.Left;
            int nOffsetY = processFils.GetActionDebut().Position.Y + 40 - rctEnglobant.Top;

            foreach (CAction action in actions)
            {
                CAction newAction = Activator.CreateInstance(action.GetType(), new object[] { processFils }) as CAction;

                CCloner2iSerializable.CopieTo(action, newAction);
                newAction.Position = new Point(newAction.Position.X + nOffsetX,
                                               newAction.Position.Y + nOffsetY);
                dicCorrespondanceActions[action] = newAction;
                processFils.AddAction(newAction);
            }
            //copie des liens
            HashSet <CLienAction> hashLiens = new HashSet <CLienAction>();

            //Crée la liste de tous les liens
            foreach (CAction action in actions)
            {
                foreach (CLienAction lien in action.GetLiensSortant())
                {
                    if (!liensSortants.Contains(lien) && !hashLiens.Contains(lien))
                    {
                        hashLiens.Add(lien);
                    }
                }
                foreach (CLienAction lien in action.GetLiensArrivant())
                {
                    if (lien != lienEntrant && !hashLiens.Contains(lien))
                    {
                        hashLiens.Add(lien);
                    }
                }
            }
            foreach (CLienAction lien in hashLiens)
            {
                CAction actionDepart  = null;
                CAction actionArrivee = null;
                if (!dicCorrespondanceActions.TryGetValue(lien.ActionDepart, out actionDepart))
                {
                    result.EmpileErreur(I.T("An error occured during grouping process|20038"));
                    return(result);
                }
                if (!dicCorrespondanceActions.TryGetValue(lien.ActionArrivee, out actionArrivee))
                {
                    result.EmpileErreur(I.T("An error occured during grouping process|20038"));
                    return(result);
                }
                CLienAction newLien = Activator.CreateInstance(lien.GetType(), new object[] { processFils }) as CLienAction;
                CCloner2iSerializable.CopieTo(lien, newLien);
                newLien.ActionArrivee = actionArrivee;
                newLien.ActionDepart  = actionDepart;
                processFils.AddLien(newLien);
            }

            //Crée le lien de départ
            if (lienEntrant != null)
            {
                CLienAction newLienDepart = new CLienAction(processFils);
                newLienDepart.ActionDepart  = processFils.GetActionDebut();
                newLienDepart.ActionArrivee = dicCorrespondanceActions[lienEntrant.ActionArrivee];
                processFils.AddLien(newLienDepart);

                CAction action1     = newLienDepart.ActionArrivee;
                CAction actionStart = newLienDepart.ActionDepart;
                actionStart.Position = new Point(
                    action1.Position.X + (action1.Size.Width - actionStart.Size.Width) / 2,
                    actionStart.Position.Y);
            }

            process.AddAction(actionFils);
            //Modifie le lien de départ
            if (lienEntrant != null)
            {
                lienEntrant.ActionArrivee = actionFils;
            }
            foreach (CLienAction lien in liensSortants)
            {
                lien.ActionDepart = actionFils;
            }
            foreach (CAction action in actions)
            {
                process.RemoveAction(action);
            }
            result.Data = actionFils;
            return(result);
        }
Esempio n. 4
0
        /// ////////////////////////////////////////////////////////
        protected override CResultAErreur MyExecute(CContexteExecutionAction contexte)
        {
            CResultAErreur result      = CResultAErreur.False;
            CProcessInDb   processInDB = new CProcessInDb(contexte.ContexteDonnee);

            if (!processInDB.ReadIfExists(m_dbKeyProcess))
            {
                result.EmpileErreur(I.T("The @1 action doesn't exist|194", m_dbKeyProcess.ToString()));
                result.EmpileErreur(I.T("Error in an action execution from an action|195"));
                return(result);
            }

            string strOldContextuel = contexte.ContexteDonnee.IdModificationContextuelle;

            CContexteDonnee contexteDonneeSousAction = contexte.ContexteDonnee;

            if (ModeAsynchrone || LancerDansUnProcessSepare)
            {
                contexteDonneeSousAction = new CContexteDonnee(contexte.IdSession, true, true);
            }

            //Si synchrone, s'execute dans le même contexte de données
            if (!ModeAsynchrone)
            {
                CProcessEnExecutionInDb processEnExec = new CProcessEnExecutionInDb(contexteDonneeSousAction);

                processEnExec.CreateNewInCurrentContexte();

                CProcess process = processInDB.Process;
                process.ContexteDonnee = contexteDonneeSousAction;

                object elementCible = contexte.ObjetCible;

                //Remplit les variables du process
                foreach (string strIdVariable in m_mapVariablesProcessToFormule.Keys)
                {
                    IVariableDynamique variable = process.GetVariable(strIdVariable);
                    //Evalue la formule
                    C2iExpression expression = (C2iExpression)m_mapVariablesProcessToFormule[strIdVariable];
                    CContexteEvaluationExpression contexteEval = new CContexteEvaluationExpression(Process);
                    contexteEval.AttacheObjet(typeof(CContexteDonnee), contexte.ContexteDonnee);
                    result = expression.Eval(contexteEval);
                    if (!result)
                    {
                        result.EmpileErreur(I.T("Error during the variables assignment in sub action|197"));
                        result.EmpileErreur(I.T("@1 variable error|196", variable.Nom));
                        return(result);
                    }
                    CObjetDonnee objDonnee = result.Data as CObjetDonnee;
                    if (objDonnee != null)
                    {
                        result.Data = objDonnee.GetObjetInContexte(contexteDonneeSousAction);
                    }
                    process.SetValeurChamp(variable.IdVariable, result.Data);
                    if (variable.IdVariable == CProcess.c_strIdVariableElement && result.Data is CObjetDonneeAIdNumerique)
                    {
                        elementCible = result.Data;
                    }
                }

                if (elementCible is CObjetDonneeAIdNumerique)
                {
                    processEnExec.ElementLie = (CObjetDonneeAIdNumerique)elementCible;
                }
                else
                {
                    processEnExec.ElementLie = null;
                }
                processEnExec.Libelle = process.Libelle;

                CBrancheProcess branche = new CBrancheProcess(process);
                branche.IsModeAsynchrone = ModeAsynchrone;
                //TESTDBKEYOK
                branche.KeyUtilisateur          = contexte.Branche.KeyUtilisateur;
                branche.ConfigurationImpression = contexte.Branche.ConfigurationImpression;

                CContexteExecutionAction contexteExecution = new CContexteExecutionAction(
                    processEnExec,
                    branche,
                    elementCible,
                    ModeAsynchrone ? null : contexteDonneeSousAction, contexte.IndicateurProgression);

                CAction pointEntree = null;
                if (IdPointEntree >= 0)
                {
                    pointEntree = process.GetActionFromId(IdPointEntree);
                    if (pointEntree == null)
                    {
                        result.EmpileErreur(I.T("Can not find entry point|20018"));
                        return(result);
                    }
                }
                else
                {
                    pointEntree = process.GetActionDebut();
                }

                if (!ModeAsynchrone)
                {
                    contexteExecution.SauvegardeContexteExterne = !m_bLancerDansContexteSepare;

                    result = branche.ExecuteAction(pointEntree, contexteExecution, elementCible, true);
                    foreach (CContexteExecutionAction.CParametreServiceALancerALaFin s in contexteExecution.ServicesALancerALaFin)
                    {
                        contexte.AddServiceALancerALaFin(s);
                    }
                    contexteExecution.ClearServicesALancerALaFin();
                    if (m_bSansTrace)
                    {
                        processEnExec.Table.Rows.Remove(processEnExec.Row.Row);
                    }
                    if (VariableResultat != null && process.VariableDeRetour != null)
                    {
                        object valeur = process.GetValeurChamp(process.VariableDeRetour);
                        if (valeur != null)
                        {
                            valeur = valeur.ToString();
                        }
                        Process.SetValeurChamp(VariableResultat.IdVariable, valeur.ToString());
                    }
                }
                else
                {
                    //Ouvre une nouvelle session pour éxecuter le process
                    CSessionProcessServeurSuivi sessionAsync = new CSessionProcessServeurSuivi();
                    result = sessionAsync.OpenSession(new CAuthentificationSessionProcess(),
                                                      I.T("Process @1|198", processInDB.Libelle),
                                                      CSessionClient.GetSessionForIdSession(contexte.IdSession));
                    if (!result)
                    {
                        return(result);
                    }
                    contexteExecution.ChangeIdSession(sessionAsync.IdSession);
                    contexteExecution.HasSessionPropre = true;
                    m_brancheToExecute         = branche;
                    m_actionToExecute          = pointEntree;
                    m_elementCible             = elementCible;
                    m_contexteExecutionProcess = contexteExecution;
                    Thread th = new Thread(new ThreadStart(DemarreProcess));
                    th.Start();
                    return(result);
                }
            }
            contexte.ContexteDonnee.IdModificationContextuelle = strOldContextuel;
            return(result);
        }