//---------------------------------------------------------------------------------------------- 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); }
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); }
////////////////////////////////////////////////////////////////// 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; } } } } }
//----------------------------------------------------------------- /// <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); }