Calcolo generale
L'obiettivo di questa documentazione è descrivere il funzionamento del modulo di calcolo delle fibre logiche, analizzando le interazioni tra le varie parti del codice e fornendo una panoramica sui processi coinvolti.
L'implementazione prevede l'uso di diversi servizi e classi di supporto per gestire il calcolo delle fibre secondarie. Descriveremo con attenzione le parti di eliminazione pre calcolo, creazione delle nuove fibre e occupazione delle fibre fisiche.
Inizializzazione del Servizio
All'avvio dell'applicazione, il metodo init() in @PostConstruct inizializza alcune parti di gestione relative al server. Questo il metodo:
-
Registra il servizio
ServiceFibersLogicalnelgwRegistry. -
Recupera l'indirizzo IP del server locale.
-
Resetta eventuali calcoli delle fibre logiche rimasti in sospeso, solo se avviati dal corrente server.
@PostConstruct
public void init() {
gwRegistry.registerService("ServiceFibersLogical", this);
// Reset dei calcoli delle fibre logiche in sospeso
String serverIp = getServerIpAddress(null);
daoProjects.resetFibersLogicalCalc(serverIp);
}
Gestione dello Stato di Calcolo
Per assicurarsi che il calcolo delle fibre logiche sia coerente con lo stato attuale del progetto, vengono fornite alcune utility:
-
resetProjectCalcStatus(Long drawing): Resetta lo stato del calcolo delle fibre logiche per un progetto specifico.
-
getServerIpAddress(Long drawing): Recupera l'indirizzo IP del server locale e gestisce eventuali errori di rete loggandoli.
Processo di Calcolo
Il metodo principale che avvia il calcolo delle fibre logiche è fixFibersLogicalOfAProject(CalcFibersLogicalConfig calcFibersLogicalConfig), il quale esegue le seguenti operazioni:
-
Registra l'inizio del calcolo nei log.
-
Esegue la fase preliminare (
doPreCalcPhase). -
Se il calcolo non proviene da un'importazione NT2Star:
-
Genera le nuove fibre secondarie.
-
Associa le fibre ai cavi logici.
-
Esegue calcoli addizionali e bonifiche.
-
Controlla la presenza di errori.
-
Se il calcolo è valido, avvia l'associazione automatica delle giunzioni.
-
Registra la fine del calcolo nei log.
-
public void fixFibersLogicalOfAProject(CalcFibersLogicalConfig calcFibersLogicalConfig) throws Exception {
CalcLoggingUtils.logStartOfCalc(calcFibersLogicalConfig);
doPreCalcPhase(calcFibersLogicalConfig);
if (calcFibersLogicalConfig.isNT2Star() == null || !calcFibersLogicalConfig.isNT2Star()) {
CalcFibLogicalSupport calcFibLogicalSupport = generateNewSecondaryFibers(calcFibersLogicalConfig);
calcFibLogicalSupport = serviceRCablesFibers.associatesRCablesFibersToFibersLogicalByDrawing(calcFibersLogicalConfig, calcFibLogicalSupport);
doAdditionalCalcs(calcFibLogicalSupport);
doPreJunctionsReclamations(calcFibLogicalSupport);
if (!reportManager.checkIfCalcGotErrors(calcFibersLogicalConfig.getDrawing()) || serviceApplicationType.isAB()) {
startAutomaticAssociationOfJoints(calcFibLogicalSupport);
startChecksAfterFibLogicalCalculation(calcFibLogicalSupport);
}
doPostCalcActions(calcFibLogicalSupport);
CalcLoggingUtils.logEndOfCalc(calcFibLogicalSupport);
}
}
Fasi del Calcolo
1. Fase Preliminare
La fase preliminare (doPreCalcPhase) verifica se il check deve essere eseguito e, in caso affermativo:
-
Esegue eventuali bonifiche pre-calcolo.
-
Avvia i controlli preliminari di progetto, tra cui troviamo la cancellazione delle fibre in caso di calcolo "Col Si".
-
Se il calcolo proviene da un'importazione NT2Star, inizializza la configurazione specifica per NT2.
private void doPreCalcPhase(CalcFibersLogicalConfig calcFibersLogicalConfig) throws GisfoException {
if (checkPrePhase(calcFibersLogicalConfig)) return;
doPreCalcReclamations(calcFibersLogicalConfig);
startProjectPreliminaryChecks(calcFibersLogicalConfig);
if (calcFibersLogicalConfig.isNT2Star()) {
CalcFibLogicalSupport calcFibLogicalSupport = new CalcFibLogicalSupport(null, calcFibersLogicalConfig);
doInitializationForNT2(calcFibLogicalSupport);
}
}
È possibile saltare questa fase impostando il seguente campo a true:
calcFibersLogicalConfig.hasToSkipPrePhase()
In ordine vengono eseguite le bonifiche a seguire:
String report = serviceReclamationFibers.deleteIncorrectRCFByDrawing(calcFibersLogicalConfig.getDrawing());
Elimina tutte le Fibre Fisiche non connesse ad una sezione del progetto e quelle connesse a sezioni di altri progetti.
serviceReclamationFibers.reclamationFksInPrimaryCables(calcFibersLogicalConfig.getDrawing());
Rimuove gli FK delle aree GC/CNO dai cavi di primaria del progetto, quindi mette a null i campi fk_gc e fk_cno.
1.1 Associazione Cavi e Controlli sui Nodi
Metodo: performCableAssociationAndNodeChecks
-
Verifica se la configurazione riguarda il calcolo per singolo nodo (
calcFibersLogicalConfig.getOfSingleNode()).-
In caso contrario, inizializza un nuovo oggetto
AssociatedFkCnoFkGcInCablesper gestire le associazioni degli fk ai cavi (Vedi associazione fk ai cavi). -
Effettua i calcoli sulle associazioni di cavo e aggiorna il
reportManager. -
Recupera i nodi non modificabili e li imposta nel DTO di configurazione logica delle fibre.
-
Avvia controlli di multi-proprietà con
startMultiOwnershipChecks. -
Restituisce la lista aggiornata dei nodi reclamati.
-
1.1.1 Associazione fk ai cavi
In doCalculation viene avviata la procedura di calcolo degli fk ai cavi , gli fk vengono associati a tutti i cavi presenti in
status.getPcabCablesList()
Ad eccezione dei cavi di unidata identificati dal flag is_alternative_net = true.
Per ogni cavo viene creato un clone di backup
PcabCables oldCable = PcabCables.tryToCloneCable(cables);
Per ogni cavo vado a prendere l'ultimo nodo del cavo, quello di ordine maggiore, per poi eseguire una routing da quel cavo al GC/PFP/PCP del progetto, per individuarlo viene fatta una ricerca recursiva a ritroso fino a trovare il primo nodo compatibile.
Individuata la routing vado a scorrere tutti i nodi incontrati, a seconda del tipo di nodo va ad assegnare il campo fkGC, fkCno o fkPd a seconda delle impostazioni. Attenzione: l'orderCno e l'orderGC vengono assegnati post ordinamento dei cavi.
private void setCableFks(PcabCables cables, CableFkAssociatonStatus status) throws GisfoException {
HashSet<Long> hashSetIdEntClassNodes = status.getHashSetIdEntClassNodes();
List<PcabNodes> nodesOfShortesPath = status.getNodesOfShortesPath();
resetFks(cables, status.getCalcFibersLogicalConfig());
if (hashSetIdEntClassNodes.contains(PcabNodes.S_ID_ENTITY_CLASSIFICATION_PFS_OR_CNO)
&& !checkCableIsBelongToCascadeCno(nodesOfShortesPath, status)
&& !Objects.equals(cables.getFk_kv_net_use(), KvNetUse.VALUE_GRE_AGGREGATION)) {
setFkCno(cables, hashSetIdEntClassNodes, nodesOfShortesPath);
} else if (hashSetIdEntClassNodes.contains(PcabNodes.S_ID_ENTITY_CLASSIFICATION_PFP_OR_GC)) {
setFkGC(cables, nodesOfShortesPath);
}
}
private void setFkGC(PcabCables cables, List<PcabNodes> nodesOfShortesPath) {
Long fkGc = getFirstNodesInListByIdEntityClassification(nodesOfShortesPath, PcabNodes.S_ID_ENTITY_CLASSIFICATION_PFP_OR_GC);
cables.setFk_gc(fkGc);
}
private void setFkCno(PcabCables cables, HashSet<Long> hashSetIdEntClassNodes, List<PcabNodes> nodesOfShortesPath) {
Long fkCno = getFirstNodesInListByIdEntityClassification(nodesOfShortesPath, PcabNodes.S_ID_ENTITY_CLASSIFICATION_PFS_OR_CNO);
cables.setFk_cno(fkCno);
if (hashSetIdEntClassNodes.contains(PcabNodes.S_ID_ENTITY_CLASSIFICATION_PD) &&
hashSetIdEntClassNodes.contains(PcabNodes.S_ID_ENTITY_CLASSIFICATION_PT_OR_ROE)) {
Long fkPD = getFirstNodesInListByIdEntityClassification(nodesOfShortesPath, PcabNodes.S_ID_ENTITY_CLASSIFICATION_PD);
cables.setFk_pd(fkPD);
}
}
Al termine i campi del cavo vengono aggiornati solo se ci sono differenze rispetto al backup clonato in precedenza.
1.2 Pulizia delle Giunzioni
Metodo: startCleaningJunction
-
Se la configurazione riguarda un singolo nodo e la pulizia delle giunzioni è abilitata, chiama
cleaningFibersLogicalByNode. -
Se la pulizia delle giunzioni è attiva per l'intero drawing, chiama
cleaningFibersLogicalByDrawing. -
Se vi sono nodi reclamati, effettua la pulizia su una lista specifica di nodi.
1.2.1 Eliminazione di Fibers Logical
Metodi: cleaningFibersLogicalByDrawing, deleteFibersLogicalByNode, deleteFibersLogicalByFkFibersLogical
-
Eliminano le fibers logical associate a un nodo o a un identificatore specifico.
-
Eliminano le giunzioni associate alle fibers logical, se presenti.
-
Aggiornano il database per riflettere la rimozione delle fibers logical.
1.3 Controllo Doppia progettazione sul progetto
Metodo: startMultiOwnershipChecks
-
Recupera il bean
CheckerMultiOwnershipPcabNodesdal contesto dell'applicazione. -
Se il tipo di applicazione è
AB, esegue il check Doppia progettazione sul drawing (Vedi sezione UNIDATA). -
Se il tipo di applicazione è
GP, verifica solo la configurazione di alcuni nodi.
1.4 Setup delle fibre occupate
Metodo: setupOccupatedFibersLogical
-
Imposta lo stato delle giunzioni a realizzato per le fibre occupate.
-
Recupera tutte le fibers logical associate al drawing ed identifica i nodi iniziali delle fibers logical da eliminare.
-
Effettua la pulizia delle fibre logiche dei nodi Z con
cleaningFibersLogicalByList.
1.5 Rimozione fibre corrotte
checkIfAreThereFibersWithNullStartOrEndNode
Cancella tutte le Fibre Logiche senza nodo A o Z presenti nel drawing prima del calcolo fibre.
2 Creazione di nuove fibre logiche
Vedi il capitolo relativo
3. Calcoli Addizionali e Associazione dei Giunti
Dopo la generazione delle fibre secondarie, vengono eseguite operazioni aggiuntive, tra cui:
-
Verifica e associazione degli splitter primari e secondari.
-
Aggiornamento delle giunzioni.
-
Eventuale avvio del calcolo delle fibre primarie.
4. Azioni Post-Calcolo
Infine, vengono eseguite azioni di pulizia e aggiornamento:
-
doPostCalcActions: registra il completamento del calcolo e aggiorna le giunzioni integrative della secondaria.
-
cleanJunctionsByCalcConfiguration: verifica e pulisce eventuali giunzioni collegate a fibre danneggiate.
4.1 Creazione Automatica di Porte e Giunzioni
Metodo: startAutomaticAssociationOfJoints
-
Registra un messaggio di log.
-
Crea automaticamente le porte delle fibre con
serviceFibPorts.createAutomaticFibPorts. -
Crea automaticamente le giunzioni con
serviceFibJoints.createAutomaticFibJoints. -
Aggiorna il report manager con le nuove giunzioni.
-
Se la configurazione non riguarda un singolo nodo, avvia il recupero delle giunzioni in fibra.
5 Descrizione componenti
-
areaCoperturaService: Recupera i nodi non modificabili. -
reportManager: Registra informazioni e risultati delle operazioni. -
serviceFibPortseserviceFibJoints: Gestiscono rispettivamente porte e giunzioni in fibra. -
mapperPcabNodes: Recupera e aggiorna informazioni sui nodi. -
mapperFiber: Interagisce con il database per operazioni sulle fibers logical.
5.1 Parametri di Input
-
CalcFibersLogicalConfig: Configurazione dell'operazione sulle fibers logical. -
CalcFibLogicalSupport: Supporto per operazioni di calcolo.
5.2 Parametri di Output
-
Lista di
PcabNodes: Nodi aggiornati dopo le operazioni di pulizia e associazione. -
FibersLogicalaggiornate: Nuove fibers logical create nel database.