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

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 deidelle GiuntiGiunzioni

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.