Skip to main content

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 ServiceFibersLogical nel gwRegistry.

  • 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:

  1. Registra l'inizio del calcolo nei log.

  2. Esegue la fase preliminare (doPreCalcPhase).

  3. Se il calcolo non proviene da un'importazione NT2Star:

    • Genera le nuove fibre secondarie.

    • Associa le fibre logiche alle fibre fisiche nei cavi.

    • 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 all'interno di doPreCalcReclamations:

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.

Mentre in startProjectPreliminaryChecks verranno eseguite le operazioni seguenti:

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 AssociatedFkCnoFkGcInCables per 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 viene preso 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 ricorsiva a ritroso fino a trovare il primo nodo compatibile.

Individuata la routing vengono scorsi 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 tramite le fibre fisiche, se presenti.

  • Aggiornano il database per riflettere la rimozione delle fibers logical.

NOTA BENE: LE GIUNZIONI IN STATO REALIZZATO NON VANNO MAI CANCELLATE IN NESSUN CASO. IN BASE AL TIPO DI CALCOLO LA MANCATA ELIMINAZIONE VA RIPORTATA NEL REPORT.

1.3 Controllo Doppia progettazione sul progetto

Metodo: startMultiOwnershipChecks

  • Recupera il bean CheckerMultiOwnershipPcabNodes dal 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.

Video lezione dei punti precedenti Lezione 2 - Preparazione progetto al Calcolo Fibre

2 Creazione di nuove fibre logiche

Vedi il capitolo relativo

3 Ordinamento cavi

Vedi il capitolo relativo

4 Occupazione delle fibre fisiche

Vedi il capitolo relativo

5 Calcoli Addizionali e Associazione delle Giunzioni

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.

6 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.

6.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.