Exemplo n.º 1
0
        //----------------------------------------------------------------------------------------------
        public CBasePourVueAnimee(CContexteDonnee contexteDonnee, bool bAvecNotifications)
        {
            if (bAvecNotifications)
            {
                m_recepteurNotifications = new CRecepteurNotification(contexteDonnee.IdSession, typeof(CDonneeNotificationAlarmes));
                m_recepteurNotifications.OnReceiveNotification += new NotificationEventHandler(m_recepteurAlarme_Notification);
            }
            m_contexteDonnee = contexteDonnee;
            m_baseGraphes    = new CBaseGraphesReseau();

            m_timerRefresh.Elapsed += new ElapsedEventHandler(m_timerRefresh_Elapsed);
        }
Exemplo n.º 2
0
        public CResultAErreur CalculeArbre(
            CSchemaReseau schema,
            ESensAllerRetourLienReseau sens,
            CBaseGraphesReseau baseGraphes)
        {
            CResultAErreur result = CResultAErreur.True;

            if (baseGraphes == null)
            {
                baseGraphes = new CBaseGraphesReseau();
            }

            CGrapheReseau graphe = baseGraphes.GetGrapheExistant(schema, sens);

            if (graphe == null)
            {
                graphe = new CGrapheReseau(baseGraphes);
                result = graphe.CalculeGraphe(schema, sens);
                if (!result)
                {
                    return(result);
                }
                baseGraphes.AddGrapheReseau(schema.Id, sens, graphe);
            }

            switch (schema.ModeOperationnel.Code)
            {
            case EModeOperationnelSchema.AllMandatory:
                return(CalculArbreTousNecessaires(schema, graphe));

            case EModeOperationnelSchema.AutomaticRedundancy:
                return(CalculArbreRedondanceAuto(schema, graphe));

            case EModeOperationnelSchema.Custom:
                result.EmpileErreur("For future use");
                return(result);

            default:
                break;
            }

            return(result);
        }
Exemplo n.º 3
0
        //////////////////////////////////////////////////////////////////
        private static void SynchroSchemaToSpv(
            CContexteDonnee contexte,
            Hashtable tableData,
            ref CResultAErreur result)
        {
            if (!result)
            {
                return;
            }
            //Empèche de passer plusieurs fois
            if (tableData.ContainsKey(typeof(CSynchroniseurSchemaEtGraphe)))
            {
                return;
            }
            //Pour empecher de passer plusieurs fois
            tableData[typeof(CSynchroniseurSchemaEtGraphe)] = true;

            //S'assure que les liens sont biens créés et que leurs schémas aussi !
            CSpvLiaiServeur.PropagerCLienReseau(contexte, tableData, ref result);
            if (!result)
            {
                return;
            }
            //Crée les services correspondants aux schémas modifiés

            //Toute modification d'un schéma est une modification du schéma auquel il appartient
            CListeObjetsDonnees lstSchemas = new CListeObjetsDonnees(contexte, typeof(CSchemaReseau), false);

            lstSchemas.InterditLectureInDB = true;
            foreach (CSchemaReseau schema in lstSchemas.ToArrayList())
            {
                CSchemaReseau tmp = schema;
                while (tmp != null && tmp.Row.RowState == DataRowState.Modified)
                {
                    tmp = tmp.SchemaParent;
                    if (tmp != null)
                    {
                        tmp.ForceChangementSyncSession();
                    }
                }
            }

            DataTable table = contexte.Tables[CSchemaReseau.c_nomTable];

            if (table == null)
            {
                //S'il n'y a pas de schéma, mais qu'il y a des éléments de schéma,
                //force la vérification des schémas

                if (contexte.Tables.Contains(CElementDeSchemaReseau.c_nomTable))
                {
                    table = contexte.GetTableSafe(CSchemaReseau.c_nomTable);
                }
            }
            if (table != null)
            {
                #region Recherche des schémas modifiés
                ArrayList lst = new ArrayList(table.Rows);
                //Cherche les schémas à vérifier
                Dictionary <DataRow, bool> dicSchemasAVerifier = new Dictionary <DataRow, bool>();
                foreach (DataRow row in lst)
                {
                    if (row.RowState == DataRowState.Modified || row.RowState == DataRowState.Added)
                    {
                        dicSchemasAVerifier[row] = true;
                    }
                }
                DataTable tableElts = contexte.Tables[CElementDeSchemaReseau.c_nomTable];
                if (tableElts != null)
                {
                    lst = new ArrayList(tableElts.Rows);
                    foreach (DataRow row in lst)
                    {
                        if (row.RowState == DataRowState.Added || row.RowState == DataRowState.Modified || row.RowState == DataRowState.Deleted)
                        {
                            CElementDeSchemaReseau elt = new CElementDeSchemaReseau(row);
                            if (row.RowState == DataRowState.Deleted)
                            {
                                elt.VersionToReturn = DataRowVersion.Original;
                            }
                            CSchemaReseau schema = elt.SchemaReseau;
                            if (schema != null && schema.IsValide())
                            {
                                dicSchemasAVerifier[schema.Row] = true;
                            }
                            while (schema != null && schema.IsValide() && schema.SchemaParent != null)
                            {
                                dicSchemasAVerifier[schema.SchemaParent.Row] = true;
                                schema = schema.SchemaParent;
                            }
                        }
                    }
                }
                #endregion

                //Passe sur tous les schémas modifiés
                foreach (DataRow row in dicSchemasAVerifier.Keys)
                {
                    #region Création du service, création des cablages
                    CSchemaReseau schema = new CSchemaReseau(row);
                    //Synchronisation du service avec le schéma
                    CSpvSchemaReseau spvSchema = CSpvSchemaReseau.GetObjetSpvFromObjetTimosAvecCreation(schema);

                    //Si le schéma correspond à un lien, force la modification de ce lien
                    //Pour passer dans le traitement avant sauvegarde du lien
                    if (schema.LienReseau != null)
                    {
                        if (schema.LienReseau.Row.RowState == DataRowState.Unchanged)
                        {
                            schema.LienReseau.ForceChangementSyncSession();//Force la modification du lien pour qu'il soit resynchronisé
                        }
                    }
                    #endregion
                }
            }



            //Pour tous les schémas qui ont des éléments modifiés, s'assure que les
            //Graphes des services concernés sont à jour
            //Id de schéma -> true
            Dictionary <int, bool> schemasAGrapheObsolete = new Dictionary <int, bool>();
            table = contexte.Tables[CElementDeSchemaReseau.c_nomTable];
            if (table != null)
            {
                ArrayList lstRows = new ArrayList(table.Rows);
                foreach (DataRow row in lstRows)
                {
                    if (row.RowState == DataRowState.Added || row.RowState == DataRowState.Deleted)
                    {
                        CElementDeSchemaReseau elt     = new CElementDeSchemaReseau(row);
                        DataRowVersion         version = DataRowVersion.Current;
                        if (row.RowState == DataRowState.Deleted)
                        {
                            version = DataRowVersion.Original;
                        }
                        schemasAGrapheObsolete[(int)row[CElementDeSchemaReseau.c_champIdSchemaReseauAuquelJappartiens, version]] = true;
                    }
                }
            }
            table = contexte.Tables[CSchemaReseau.c_nomTable];
            if (table != null)
            {
                ArrayList lstRows = new ArrayList(table.Rows);
                foreach (DataRow row in lstRows)
                {
                    if (row.RowState == DataRowState.Added || row.RowState == DataRowState.Modified)
                    {
                        schemasAGrapheObsolete[(int)row[CSchemaReseau.c_champId]] = true;
                    }
                }
            }

            CBaseGraphesReseau baseGraphes = new CBaseGraphesReseau();
            foreach (int nIdSchema in schemasAGrapheObsolete.Keys)
            {
                CSchemaReseau schema = new CSchemaReseau(contexte);
                if (
                    schema.ReadIfExists(nIdSchema) &&
                    schema.IsValide() &&
                    (schema.SchemaParent == null || schema.SiteApparenance != null)) //Ne calcule pas les graphes des schémas fils, ils sont déjà integrés dans le graphe du schéma parent!
                {
                    CSpvSchemaReseau spvSchema = CSpvSchemaReseau.GetObjetSpvFromObjetTimosAvecCreation(schema);
                    if (spvSchema != null)
                    {
                        result = spvSchema.RecalculeArbreOperationnelInContexte(baseGraphes);
                        if (!result)
                        {
                            return;
                        }
                    }
                }
            }
        }
Exemplo n.º 4
0
        //-----------------------------------------------------------------
        /// <summary>
        /// recalcule l'arbre opérationnel
        /// </summary>
        /// <param name="baseGraphes"></param>
        /// <returns></returns>
        public CResultAErreur RecalculeArbreOperationnelInContexte(CBaseGraphesReseau baseGraphes)
        {
            if (baseGraphes == null)
            {
                baseGraphes = new CBaseGraphesReseau();
            }
            CResultAErreur result = CResultAErreur.True;
            CSchemaReseau  schema = ObjetTimosAssocie;

            //Supprime toutes les dépendances à des elements de graphe
            result = CObjetDonneeAIdNumerique.Delete(ElementsDeGraphe, true);
            if (!result)
            {
                return(result);
            }

            foreach (ESensAllerRetourLienReseau sens in Enum.GetValues(typeof(ESensAllerRetourLienReseau)))
            {
                ESensAllerRetourLienReseau?sensRetenu = null;
                if (schema.LienReseau == null)
                {
                    sensRetenu = sens;
                }
                //Calcule le graphe
                CGrapheReseau graphe = baseGraphes.GetGrapheExistant(schema, sensRetenu);
                if (graphe == null)
                {
                    graphe = new CGrapheReseau(baseGraphes);
                    result = graphe.CalculeGraphe(schema, sensRetenu);
                    if (!result)
                    {
                        return(result);
                    }
                }
                CArbreOperationnel arbre = new CArbreOperationnel();
                result = arbre.CalculArbreRedondanceAuto(schema, graphe);
                if (!result)
                {
                    return(result);
                }
                result = CSpvElementDeGraphe.CreateFromElementDeArbreOperationnel(this, arbre.ElementRacine, sensRetenu);
                if (!result)
                {
                    return(result);
                }
                if (schema.LienReseau != null)
                {
                    break;
                }
            }

            //Recalcule les éléments de graphe qui utilisent ce schéma
            CListeObjetsDonnees lstEltsUtilisantLeSchema = new CListeObjetsDonnees(ContexteDonnee, typeof(CSpvElementDeGraphe));

            lstEltsUtilisantLeSchema.Filtre = new CFiltreData(CSpvElementDeGraphe.c_champIdSchemaSmt + "=@1",
                                                              schema.Id);
            foreach (CSpvElementDeGraphe elt in lstEltsUtilisantLeSchema.ToArrayList())
            {
                CSpvElementDeGrapheSousSchema eltSpvSousSchema = elt.GetElementDuBonType() as CSpvElementDeGrapheSousSchema;
                if (eltSpvSousSchema != null)
                {
                    CNoeudDeGrapheReseau noeudDepart = eltSpvSousSchema.NoeudDepart;
                    CNoeudDeGrapheReseau noeudArrive = eltSpvSousSchema.NoeudArrive;
                    CArbreOperationnel   arbre       = new CArbreOperationnel();
                    CGrapheReseau        graphe      = baseGraphes.GetGrapheExistant(schema, eltSpvSousSchema.SensGraphe);
                    if (graphe == null)
                    {
                        graphe = new CGrapheReseau(baseGraphes);
                        result = graphe.CalculeGraphe(schema, eltSpvSousSchema.SensGraphe);
                        if (!result)
                        {
                            return(result);
                        }
                    }
                    result = arbre.CalculArbreRedondanceAuto(schema, graphe, noeudDepart, noeudArrive);
                    if (!result)
                    {
                        return(result);
                    }
                    CElementDeArbreOperationnelSousSchema eltOp = new CElementDeArbreOperationnelSousSchema(null);
                    eltOp.ElementDeArbre = arbre.ElementRacine;
                    eltOp.IdSchema       = schema.Id;
                    eltOp.NoeudArrive    = noeudArrive;
                    eltOp.NoeudDepart    = noeudDepart;

                    result = CObjetDonneeAIdNumerique.Delete(eltSpvSousSchema.ElementsFils, true);
                    if (!result)
                    {
                        return(result);
                    }
                    result = eltSpvSousSchema.FillFromElementDeGraphe(eltOp);
                    if (!result)
                    {
                        return(result);
                    }
                }
            }

            return(result);
        }