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.7 Eliminazione di Fibers Logical
Metodi: 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 Multi-Proprietà sui Nodi
Metodo: startMultiOwnershipChecks
-
Recupera il bean
CheckerMultiOwnershipPcabNodesdal contesto dell'applicazione. -
Se il tipo di applicazione è
AB, esegue un controllo multi-proprietà sul drawing. -
Se il tipo di applicazione è
GP, verifica solo la configurazione dei nodi.
1.4 Setup delle fibre occupate
Metodo: setupOccupatedFibersLogical
-
Imposta lo stato delle giunzioni per le fibre occupate.
-
Recupera tutte le fibers logical associate al drawing.
-
Identifica i nodi iniziali delle fibers logical da eliminare.
-
Effettua la pulizia dei nodi iniziali con
cleaningFibersLogicalByList.
2. Generazione delle Fibre Secondarie
Il metodo generateNewSecondaryFibers crea nuove fibre logiche madri secondarie e, se necessario, esegue controlli sugli Splitter secondari.
private CalcFibLogicalSupport generateNewSecondaryFibers(CalcFibersLogicalConfig calcFibersLogicalConfig) throws GisfoException {
CalcFibLogicalSupport calcFibLogicalSupport = new CalcFibLogicalSupport(null, calcFibersLogicalConfig);
if (serviceApplicationType.isAB() || serviceApplicationType.isGP())
serviceSplitterSecondario.checkSecondarySplittersByConfig(calcFibersLogicalConfig);
if (calcFibersLogicalConfig.hasToSkipPrePhase()) return calcFibLogicalSupport;
createNewFibersLogical(calcFibersLogicalConfig);
return calcFibLogicalSupport;
}
2.1 Creazione di Nuove Fibers Logical
Metodo: createNewFibersLogical
-
Registra un messaggio di log sulla creazione delle fibers logical.
-
Recupera i nodi per cui creare nuove fibers logical.
-
Avvia la creazione delle fibers logical utilizzando
createNewFibersLogicalForFibPcabNodes.
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.