Kenmegne
7 days ago 1bc8864f134272c4bf23a9b05831803a423a4771
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package com.megatim.apifdxweb.core.impl.helper;
 
import com.megatim.apifdxweb.core.ifaces.referentiel.ReferentielManager;
import com.megatim.apifdxweb.tools.AppContext;
import com.megatim.fdxcommons.core.ifaces.db.ReferentielDataSaver;
import com.megatim.fdxcommons.core.ifaces.helper.DataInMemoryHandler;
import com.megatim.fdxcommons.core.ifaces.helper.ReferentielConsumptionHelper;
import com.megatim.fdxcommons.core.ifaces.helper.referentiel.DynamicTableCreator;
import com.megatim.fdxcommons.model.pojo.ReferentielToImportData;
import com.megatim.fdxcommons.model.referentiel.Referentiel;
import com.megatim.fdxcommons.tools.exceptions.ImportReferentielException;
import javax.annotation.Resource;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import javax.sql.DataSource;
import javax.transaction.Transactional;
import com.megatim.fdxcommons.core.ifaces.dataproduction.DataMigration;
import com.megatim.fdxcommons.core.ifaces.referentiel.historique.ReferentielIntegrationHistoriqueManager;
import com.megatim.fdxcommons.model.pojo.TableDefinition;
import com.megatim.fdxcommons.model.referentiel.historique.ReferentielIntegrationHistorique;
import com.megatim.fdxcommons.model.referentiel.historique.ReferentielIntegrationHistoriqueId;
import com.megatim.fdxcommons.model.referentiel.historique.pojo.FilteredTypeFichier;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
 
/**
 *
 * @author ASUS
 */
@Dependent
public class ReferentielConsumptionHelperImpl implements ReferentielConsumptionHelper {
 
    @Inject
    private ReferentielDataSaver referentielDataSaver;
 
    @Inject
    ReferentielManager referentielManager;
 
    @Inject
    private DataInMemoryHandler dataInMemoryHandler;
 
    @Inject
    private DynamicTableCreator dynamicTableCreator;
 
    @Resource(lookup = AppContext.JNDI_NAME)
    private DataSource dataSource;
 
    @Inject
    private DataMigration dataMigration;
 
    @Inject
    private ReferentielIntegrationHistoriqueManager refIntegrationHistoriqueManager;
 
    @Override
    @Transactional
    public void consume(ReferentielToImportData referentielToImportData) throws Exception {
        Referentiel refInDB = referentielManager.getReferentielEnCours();
 
        if (refInDB != null && Long.valueOf(refInDB.getVersion()) >= Long.valueOf(referentielToImportData.getReferentielEnCours().getVersion())) {
            throw new ImportReferentielException("Version du référentiel 'en cours' est antérieure à la version existante dans le système");
        }
        referentielDataSaver.persist(referentielToImportData);
 
        if (refInDB != null) {
            FilteredTypeFichier filteredTypeFichiers = dataMigration.filterTypeFichiers(referentielToImportData.getTableDefinitions(),
                    refInDB.getVersion(),
                    referentielToImportData.getReferentielEnCours().getVersion());
 
            //On creé uniquement les tables dont le typefichier est absent dans le ref précédent ou la structure de ses colonnes a changé
            createTables(filteredTypeFichiers.getChangedOrNewTypeFichiers(), referentielToImportData.getTableDefinitions());
 
            saveReferentielIntegrationHistorique(filteredTypeFichiers, referentielToImportData.getReferentielEnCours().getVersion());
        } else {
            //On creé les tables
            dynamicTableCreator.createDynamicTables(referentielToImportData.getTableDefinitions());
 
            saveHistoriqueChangedOrNewTypeFichiers(referentielToImportData);
        }
 
        //Charger les nouvelles informations du référentiel dans un objet en mémoire
        dataInMemoryHandler.initializeDataInMemory();
    }
 
    private void createTables(Set<String> changedOrNewTypeFichiers, List<TableDefinition> tableDefs) throws Exception {
        dynamicTableCreator
                .createDynamicTables(tableDefs
                        .stream()
                        .filter(t -> changedOrNewTypeFichiers.contains(t.getCodeTypeFichier()))
                        .collect(Collectors.toList()));
    }
 
    private void saveReferentielIntegrationHistorique(FilteredTypeFichier filteredTypeFichiers, String newRef) {
        saveHistoriqueChangedOrNewTypeFichiers(filteredTypeFichiers.getChangedOrNewTypeFichiers(), newRef);
        saveHistoriqueUnChangedTypeFichiers(filteredTypeFichiers.getUnChangedTypeFichiers(), newRef);
    }
 
    private void saveHistoriqueChangedOrNewTypeFichiers(Set<String> changedOrNewTypeFichiers, String newRef) {
        for (String codeTypeFichier : changedOrNewTypeFichiers) {
            refIntegrationHistoriqueManager.save(new ReferentielIntegrationHistorique(codeTypeFichier, newRef, new HashSet<>(Arrays.asList(newRef))));
        }
    }
 
    private void saveHistoriqueChangedOrNewTypeFichiers(ReferentielToImportData referentielToImportData) {
        Set<String> changedOrNewTypeFichiers = referentielToImportData.getTypeFichiers().stream().map(t -> t.getCode()).collect(Collectors.toSet());
        saveHistoriqueChangedOrNewTypeFichiers(changedOrNewTypeFichiers, referentielToImportData.getReferentielEnCours().getVersion());
    }
 
    private void saveHistoriqueUnChangedTypeFichiers(Set<String> unChangedOrNewTypeFichiers, String newRef) {
 
        for (String codeTypeFichier : unChangedOrNewTypeFichiers) {
            ReferentielIntegrationHistorique refInt = refIntegrationHistoriqueManager
                    .getById(new ReferentielIntegrationHistoriqueId(codeTypeFichier, newRef));
 
            if (refInt == null) {
                refIntegrationHistoriqueManager.save(new ReferentielIntegrationHistorique(codeTypeFichier, newRef, new HashSet<>(Arrays.asList(newRef))));
            } else {
                refInt.getDependingReferentiels().add(newRef);
                refIntegrationHistoriqueManager.save(refInt);
            }
        }
    }
}