コード例 #1
0
        void m_recepteurWorkflow_OnReceiveNotification(IDonneeNotification donnee)
        {
            CDonneeNotificationWorkflow dw = donnee as CDonneeNotificationWorkflow;

            if (dw == null)
            {
                return;
            }
            string[] strCodesInteressants = CUtilSession.GetCodesAffectationsEtapeConcernant(CSc2iWin32DataClient.ContexteCourant);
            bool     bPourMoi             = false;

            foreach (string strCode in strCodesInteressants)
            {
                if (dw.CodesAffectations.Contains("~" + strCode + "~"))
                {
                    bPourMoi = true;
                    break;
                }
            }
            if (bPourMoi)
            {
                CSessionClient     session     = CSessionClient.GetSessionForIdSession(dw.IdSessionEnvoyeur);
                CSousSessionClient sousSession = session as CSousSessionClient;
                if (sousSession != null)
                {
                    session = sousSession.RootSession;
                }

                if (session != null &&
                    session.IdSession == CTimosApp.SessionClient.IdSession &&
                    dw.ExecutionAutomatique
                    )
                {
                    m_nIdEtapeToLaunch = dw.IdEtapeSource;
                }
                m_nNbClignotementsWorkflowsRestant += c_nNbClignotementsWorkflow;

                CDonneesActeurUtilisateur user = CUtilSession.GetUserForSession(CSc2iWin32DataClient.ContexteCourant);
                if (user != null)
                {
                    CListeObjetsDonnees lstPourActeur = user.Acteur.GetEtapeWorkflowsEnCours();
                    m_nNbEtapesEnCours = lstPourActeur.Count;
                    if (m_nNbEtapesEnCours > 0)
                    {
                        m_lblNbToDo.Text    = m_nNbEtapesEnCours.ToString();
                        m_lblNbToDo.Visible = true;
                    }
                    else
                    {
                        m_lblNbToDo.Text    = "0";
                        m_lblNbToDo.Visible = false;
                    }
                }
            }
        }
コード例 #2
0
        ///////////////////////////////////////////
        /// <summary>
        /// Retourne l'id de la session qui gère les transaction pour cette session
        /// </summary>
        /// <param name="nIdSession"></param>
        /// <returns></returns>
        private int GetIdSessionForDb(int nIdSession)
        {
            CSessionClient     session     = CSessionClient.GetSessionForIdSession(nIdSession);
            CSousSessionClient sousSession = session as CSousSessionClient;

            if (sousSession != null)
            {
                return(sousSession.RootSession.IdSession);
            }
            return(nIdSession);
        }
コード例 #3
0
        //----------------------------------------------------------------------
        public CResultAErreur UpdateValeurs(CContexteDonnee contexteDeBasePasEnEdition, IIndicateurProgression indicateurProgression)
        {
            if (Count == 0)
            {
                return(CResultAErreur.True);
            }
            CConteneurIndicateurProgression progress = CConteneurIndicateurProgression.GetConteneur(indicateurProgression);
            CResultAErreur result = CResultAErreur.True;
            //Lecture entite par entité pour optimiser la lecture
            Dictionary <CEntiteSnmp, HashSet <CChampCustom> > lstChamps = new Dictionary <CEntiteSnmp, HashSet <CChampCustom> >();

            progress.SetBornesSegment(0, Count);
            foreach (CCoupleEntiteSnmp_Champ couple in this)
            {
                HashSet <CChampCustom> set = null;
                if (!lstChamps.TryGetValue(couple.Entite, out set))
                {
                    set = new HashSet <CChampCustom>();
                    lstChamps[couple.Entite] = set;
                }
                set.Add(couple.ChampCustom);
            }

            CSessionClient session = CSousSessionClient.GetNewSousSession(this[0].Entite.ContexteDonnee.IdSession);

            session.OpenSession(new CAuthentificationSessionSousSession(this[0].Entite.ContexteDonnee.IdSession),
                                "SNMP", ETypeApplicationCliente.Service);
            using (CContexteDonnee ctxModif = new CContexteDonnee(session.IdSession, true, false))
            {
                int nIndex = 1;
                foreach (KeyValuePair <CEntiteSnmp, HashSet <CChampCustom> > kv in lstChamps)
                {
                    CEntiteSnmp        entite       = kv.Key.GetObjetInContexte(ctxModif) as CEntiteSnmp;
                    CInterrogateurSnmp dynamicAgent = new CInterrogateurSnmp();
                    dynamicAgent.Connexion = entite.AgentSnmp.GetNewSnmpConnexion();
                    CEntiteSnmpPourSupervision ettSup = null;
                    foreach (CChampCustom champ in kv.Value)
                    {
                        int nIdChamp = champ.Id;
                        if (entite.ReadChampSnmp(nIdChamp, dynamicAgent, ref ettSup))
                        {
                            entite.CopieValeurSnmpDansValeurChamp(nIdChamp);
                        }
                        progress.SetValue(nIndex++);
                    }
                }
                progress.SetValue(Count);
                ctxModif.SaveAll(true);
                System.Threading.Thread.Sleep(2000);
                session.CloseSession();
            }
            return(result);
        }
コード例 #4
0
        /// //////////////////////////////////////////////////
        ///Démarre une étape dans un thread séparé
        public void RunEtapeInThread(int nIdEtape)
        {
            Thread th         = new Thread(StartEtapeInThread);
            int    nIdSession = IdSession;
            //Lance l'étape dans la session root, car la sousSEssion peut être fermée avant que
            //L'étape ne soit lancée !
            CSousSessionClient session = CSessionClient.GetSessionForIdSession(IdSession) as CSousSessionClient;

            if (session != null)
            {
                nIdSession = session.RootSession.IdSession;
            }

            th.Start(new CParametresStartEtape(nIdSession, nIdEtape));
        }
コード例 #5
0
        /// //////////////////////////////////////////////////
        ///Démarre une étape dans un thread séparé
        public static void CalcElementsInThread(CElementsProjetARecalculer lstElements)
        {
            Thread th         = new Thread(DoCalcInThread);
            int    nIdSession = lstElements.IdSession;
            //Lance l'étape dans la session root, car la sousSEssion peut être fermée avant que
            //L'étape ne soit lancée !
            CSousSessionClient session = CSessionClient.GetSessionForIdSession(lstElements.IdSession) as CSousSessionClient;

            if (session != null)
            {
                nIdSession = session.RootSession.IdSession;
            }

            th.Start(lstElements);
        }
コード例 #6
0
        /// //////////////////////////////////////////////////
        public override CResultAErreur TraitementApresSauvegarde(sc2i.data.CContexteDonnee contexte, bool bOperationReussie)
        {
            CResultAErreur result = CResultAErreur.True;

            result = base.TraitementApresSauvegarde(contexte, bOperationReussie);
            if (!result)
            {
                return(result);
            }
            DataTable      table = contexte.Tables[GetNomTable()];
            List <DataRow> lstRowsEtapesADemarrer = table == null ? null : table.ExtendedProperties[c_constEtapesADemarre] as List <DataRow>;

            if (lstRowsEtapesADemarrer != null && lstRowsEtapesADemarrer.Count > 0)
            {
                int?           nIdSessionMain = IdSession;
                CDbKey         keyUtilisateur = null;
                CSessionClient session        = CSessionClient.GetSessionForIdSession(IdSession);
                if (session != null)
                {
                    IInfoUtilisateur info = session.GetInfoUtilisateur();
                    //TESTDBKEYOK
                    if (info != null)
                    {
                        keyUtilisateur = info.KeyUtilisateur;
                    }
                    CSousSessionClient sousSession = session as CSousSessionClient;
                    if (sousSession != null)
                    {
                        nIdSessionMain = sousSession.RootSession.IdSession;
                    }
                }
                List <CParametresStartEtapeInPile> lstToStart = new List <CParametresStartEtapeInPile>();
                foreach (DataRow row in lstRowsEtapesADemarrer)
                {
                    //Ancien mode, avant 13/9/2013
                    //RunEtapeInThread ( (int)row[CEtapeWorkflow.c_champId]);
                    //TESTDBKEYOK
                    lstToStart.Add(new CParametresStartEtapeInPile(
                                       nIdSessionMain, (int)row[CEtapeWorkflow.c_champId], keyUtilisateur));
                }
                CPileExecutionEtapes.AddEtapesADemarrer(lstToStart.ToArray());
            }
            return(result);
        }
コード例 #7
0
        /// //////////////////////////////////////////////////////////////////////////
        internal static CGestionnaireTransactionsNotification GetGestionnaireTransaction(int nIdSession)
        {
            CGestionnaireTransactionsNotification gestionnaire = (CGestionnaireTransactionsNotification)m_tableGestionnairesTransaction[nIdSession];

            if (gestionnaire == null)
            {
                //Stef, le 03102008, gestion des sous sessions
                CSousSessionClient sousSession = CSessionClient.GetSessionForIdSession(nIdSession) as CSousSessionClient;
                if (sousSession != null)                //C'est une sous session, donc utilise le gestionnaire de transactions de sa session principale
                {
                    gestionnaire = GetGestionnaireTransaction(sousSession.RootSession.IdSession);
                    //Ne stocke pas dans le cache, car
                    //le gestionnaire n'est pas attaché à la sous session,
                    //donc, il ne sera pas supprimé par le OnCloseSession
                    //m_tableGestionnairesTransaction[nIdSession] = gestionnaire;
                }
                else
                {
                    gestionnaire = new CGestionnaireTransactionsNotification(nIdSession);
                    m_tableGestionnairesTransaction[nIdSession] = gestionnaire;
                }
            }
            return(gestionnaire);
        }
コード例 #8
0
        /// //////////////////////////////////////////////////
        public CResultAErreur RepriseProcess(int nIdProcessEnExecution,
                                             int nIdAction,
                                             IIndicateurProgression indicateur)
        {
            using (C2iSponsor sponsor = new C2iSponsor())
            {
                sponsor.Register(indicateur);
                CResultAErreur result = CResultAErreur.True;

                ///Stef, 290808 : ouvre une session spécifique pour le process
                ///Pour pouvoir gérer le changement d'utilisateur proprement
                CSousSessionClient session = CSousSessionClient.GetNewSousSession(IdSession);
                session.OpenSession(new CAuthentificationSessionSousSession(IdSession), "Continue process " + nIdProcessEnExecution, ETypeApplicationCliente.Process);
                CSessionClient sessionOriginale = CSessionClient.GetSessionForIdSession(IdSession);
                //TESTDBKEYTODO
                if (sessionOriginale.GetInfoUtilisateur() != null)
                {
                    session.ChangeUtilisateur(sessionOriginale.GetInfoUtilisateur().KeyUtilisateur);
                }
                try
                {
                    //Stef 08/12/2007 : le contexte ne reçoit plus les notifications
                    using (CContexteDonnee contexteDonnee = new CContexteDonnee(session.IdSession, true, false))
                    {
                        CProcessEnExecutionInDb processEnExecution = new CProcessEnExecutionInDb(contexteDonnee);
                        if (!processEnExecution.ReadIfExists(nIdProcessEnExecution))
                        {
                            result.EmpileErreur(I.T("Current action @1 doesn't exist|30012", nIdProcessEnExecution.ToString()));
                            return(result);
                        }
                        result = contexteDonnee.SetVersionDeTravail(processEnExecution.IdVersionExecution, true);
                        if (!result)
                        {
                            return(result);
                        }
                        CBrancheProcess          branche           = processEnExecution.BrancheEnCours;
                        CContexteExecutionAction contexteExecution = new CContexteExecutionAction(
                            processEnExecution, branche, branche.Process.GetValeurChamp(CProcess.c_strIdVariableElement), contexteDonnee, indicateur);
                        CAction action = branche.Process.GetActionFromId(nIdAction);
                        if (action == null)
                        {
                            result.EmpileErreur(I.T("Impossible to resume the processing : the action @1 doesn't exist|30013", nIdAction.ToString()));
                            return(result);
                        }
                        bool bTrans = false;
                        if (branche.Process.ModeTransactionnel)
                        {
                            session.BeginTrans();
                            bTrans = true;
                        }
                        try
                        {
                            result = branche.ExecuteAction(action, contexteExecution, true);
                        }
                        catch (Exception e)
                        {
                            result.EmpileErreur(new CErreurException(e));
                        }
                        finally
                        {
                            if (bTrans)
                            {
                                if (result)
                                {
                                    result = session.CommitTrans();
                                    if (result)
                                    {
                                        contexteExecution.OnEndProcess();
                                    }
                                }
                                else
                                {
                                    session.RollbackTrans();
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    result.EmpileErreur(new CErreurException(e));
                }
                finally
                {
                    try
                    {
                        session.CloseSession();
                    }
                    catch { }
                }
                return(result);
            }
        }
コード例 #9
0
        /// //////////////////////////////////////////////////
        public CResultAErreur StartProcessMultiples(CValise2iSerializable valiseProcess,
                                                    CReferenceObjetDonnee[] refsCible,
                                                    int?nIdVersion,
                                                    IIndicateurProgression indicateur)
        {
            using (C2iSponsor sponsor = new C2iSponsor())
            {
                sponsor.Register(indicateur);

                CResultAErreur result = CResultAErreur.True;
                //Stef 08/12/2007 : le contexte ne reçoit plus les notifications
                using (CContexteDonnee contexteDeSession = new CContexteDonnee(IdSession, true, false))
                {
                    result = valiseProcess.GetObjet(typeof(CContexteDonnee), contexteDeSession);
                    if (!result)
                    {
                        result.EmpileErreur(I.T("Error while process recovering|30014"));
                        return(result);
                    }
                    CProcess leProcessAExecuter = (CProcess)result.Data;

                    CObjetDonneeAIdNumerique objetCible = null;

                    ///Stef, 290808 : ouvre une session spécifique pour le process
                    ///Pour pouvoir gérer le changement d'utilisateur proprement
                    CSousSessionClient session = CSousSessionClient.GetNewSousSession(contexteDeSession.IdSession);
                    session.OpenSession(new CAuthentificationSessionSousSession(contexteDeSession.IdSession), leProcessAExecuter.Libelle, ETypeApplicationCliente.Process);
                    CSessionClient sessionOriginale = CSessionClient.GetSessionForIdSession(contexteDeSession.IdSession);
                    //TESTDBKEYOK
                    if (sessionOriginale.GetInfoUtilisateur() != null)
                    {
                        session.ChangeUtilisateur(sessionOriginale.GetInfoUtilisateur().KeyUtilisateur);
                    }

                    try
                    {
                        //Charge les éléments pour la nouvelle session;
                        //Stef 08/12/2007 : le contexte ne reçoit plus les notifications
                        using (CContexteDonnee contexte = new CContexteDonnee(session.IdSession, true, false))
                        {
                            result = contexte.SetVersionDeTravail(nIdVersion, true);
                            if (!result)
                            {
                                return(result);
                            }
                            if (leProcessAExecuter.SurTableauDeTypeCible)
                            {
                                ArrayList lst = new ArrayList();
                                foreach (CReferenceObjetDonnee refCibleTmp in refsCible)
                                {
                                    object tmp = refCibleTmp.GetObjet(contexte);
                                    if (tmp != null)
                                    {
                                        lst.Add(tmp);
                                    }
                                }
                                return(ExecuteProcess(session, lst, leProcessAExecuter, contexte, false, indicateur));
                            }
                            try
                            {
                                if (!leProcessAExecuter.ModeAsynchrone)
                                {
                                    session.BeginTrans(IsolationLevel.ReadCommitted);
                                }
                                foreach (CReferenceObjetDonnee refCible in refsCible)
                                {
                                    bool bShouldStart = true;
                                    if (refCible != null)
                                    {
                                        objetCible = (CObjetDonneeAIdNumerique)refCible.GetObjet(contexte);
                                        if (objetCible == null)
                                        {
                                            ///Stef 26/1//2009 : si l'objet n'existe pas, c'est qu'il n'y a rien à déclenché.
                                            ///cela résoud un problème : si un process avant celui-ci a supprimé le targetElement
                                            ///il ne faut pas lancer ce process là !

                                            /*result.EmpileErreur(I.T("Target object @1 does not exist|30015", refCible.ToString()));
                                             * return result;*/
                                            bShouldStart = false;
                                        }
                                    }
                                    if (bShouldStart)
                                    {
                                        result = ExecuteProcess(
                                            session,
                                            objetCible,
                                            leProcessAExecuter,
                                            contexte, true, indicateur);
                                        if (!result)
                                        {
                                            result.EmpileErreur(I.T("Execution error on element @1|30016", objetCible.DescriptionElement));
                                            return(result);
                                        }
                                    }
                                }
                                if (result)
                                {
                                    result = contexte.SaveAll(true);
                                }
                            }
                            catch (Exception e)
                            {
                                result.EmpileErreur(new CErreurException(e));
                            }
                            finally
                            {
                                if (result)
                                {
                                    result = session.CommitTrans();
                                }
                                if (!result)
                                {
                                    session.RollbackTrans();
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        result.EmpileErreur(new CErreurException(e));
                    }
                    finally
                    {
                        try
                        {
                            session.CloseSession();
                        }
                        catch
                        {
                        }
                    }
                    return(result);
                }
            }
        }
コード例 #10
0
        /// //////////////////////////////////////////////////
        ///LE data du result contient la valeur de retour
        public CResultAErreur StartProcess(CValise2iSerializable valiseProcess,
                                           CReferenceObjetDonnee refCible,
                                           int?nIdVersion,
                                           IIndicateurProgression indicateur)
        {
            using (C2iSponsor sponsor = new C2iSponsor())
            {
                sponsor.Register(indicateur);

                CResultAErreur result = CResultAErreur.True;


                //Stef 08/12/2007 : le contexte ne reçoit plus les notifications
                using (CContexteDonnee contexteDeSession = new CContexteDonnee(IdSession, true, false))
                {
                    result = valiseProcess.GetObjet(typeof(CContexteDonnee), contexteDeSession);
                    if (!result)
                    {
                        result.EmpileErreur(I.T("Error while recovering process|30014"));
                        return(result);
                    }
                    CProcess leProcessAExecuter = (CProcess)result.Data;

                    CObjetDonneeAIdNumerique objetCible = null;


                    ///Stef, 290808 : ouvre une session spécifique pour le process
                    ///Pour pouvoir gérer le changement d'utilisateur proprement
                    CSousSessionClient session = CSousSessionClient.GetNewSousSession(contexteDeSession.IdSession);
                    session.OpenSession(new CAuthentificationSessionSousSession(contexteDeSession.IdSession), leProcessAExecuter.Libelle, ETypeApplicationCliente.Process);
                    CSessionClient sessionOriginale = CSessionClient.GetSessionForIdSession(contexteDeSession.IdSession);
                    if (sessionOriginale.GetInfoUtilisateur() != null)
                    {
                        session.ChangeUtilisateur(sessionOriginale.GetInfoUtilisateur().KeyUtilisateur);
                    }

                    try
                    {
                        //Charge les éléments pour la nouvelle session;
                        //Stef 08/12/2007 : le contexte ne reçoit plus les notifications
                        //Stef le 9/2/2011, si, le contexte reçoit les notifications,
                        //sinon, si un sous process modifie quelque chose, on ne le sait pas
                        //et on a des problèmes de violation d'accès concurentiel
                        using (CContexteDonnee contexte = new CContexteDonnee(session.IdSession, true, true))
                        {
                            result = contexte.SetVersionDeTravail(nIdVersion, true);
                            if (!result)
                            {
                                return(result);
                            }
                            if (refCible != null)
                            {
                                objetCible = (CObjetDonneeAIdNumerique)refCible.GetObjet(contexte);
                                if (objetCible == null)
                                {
                                    ///Stef 26/1//2009 : si l'objet n'existe pas, c'est qu'il n'y a rien à déclencher.
                                    ///cela résoud un problème : si un process avant celui-ci a supprimé le targetElement
                                    ///il ne faut pas lancer ce process là !
                                    //result.EmpileErreur(I.T("Target object @1 does not exist|30015",refCible.ToString()));
                                    return(result);
                                }
                            }
                            result = ExecuteProcess(
                                session,
                                objetCible,
                                leProcessAExecuter,
                                contexte, false,
                                indicateur);
                        }
                    }
                    catch (Exception e)
                    {
                        result.EmpileErreur(new CErreurException(e));
                    }
                    finally
                    {
                        try
                        {
                            session.CloseSession();
                        }
                        catch { }
                    }
                }
                return(result);
            }
        }