ArchiveValidator.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2025 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.protocol.engine.archive;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.archive.Archive;
import org.openspcoop2.protocol.sdk.archive.ArchiveAccordoServizioParteSpecifica;
import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
import org.openspcoop2.utils.resources.MapReader;
/**
* ArchiveValidator
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class ArchiveValidator {
private IRegistryReader registryReader;
public ArchiveValidator(IRegistryReader registryReader){
this.registryReader = registryReader;
}
public void validateArchive(Archive archive, String protocolloEffettivo,
boolean validazioneDocumenti, ImportInformationMissingCollection importInformationMissingCollection,
String userLogin, boolean checkCorrelazioneAsincrona, boolean delete) throws Exception,ImportInformationMissingException{
try{
IProtocolFactory<?> protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName(protocolloEffettivo);
validateAndFillImportInformationMissing(archive, protocolFactory,
importInformationMissingCollection, validazioneDocumenti, userLogin,
checkCorrelazioneAsincrona, delete);
}catch(ImportInformationMissingException e){
throw e;
}catch(Exception e){
throw e;
}
}
private void validateAndFillImportInformationMissing(Archive archive,IProtocolFactory<?> protocolFactory,
ImportInformationMissingCollection importInformationMissingCollection, boolean validazioneDocumenti, String userLogin,
boolean checkCorrelazioneAsincrona, boolean delete) throws Exception,ImportInformationMissingException{
ImporterInformationMissingUtils importerInformationMissingUtils =
new ImporterInformationMissingUtils(importInformationMissingCollection, this.registryReader, validazioneDocumenti, protocolFactory, userLogin, archive);
// Soggetto Default
Map<String, IDSoggetto> mapIdSoggettoDefault = new HashMap<>();
Map<String, Boolean> mapAPIconReferente = new HashMap<>();
ProtocolFactoryManager protocolFactoryManager = ProtocolFactoryManager.getInstance();
if(protocolFactoryManager==null) {
throw new Exception("ProtocolFactoryManager not initialized");
}
Enumeration<String> pEnum = protocolFactoryManager.getProtocolFactories().keys();
if(pEnum!=null) {
while (pEnum.hasMoreElements()) {
String protocollo = (String) pEnum.nextElement();
MapReader<String, String> mapTipoSoggettoDefault = protocolFactoryManager.getDefaultOrganizationTypes();
if(mapTipoSoggettoDefault==null || mapTipoSoggettoDefault.size()<=0) {
throw new Exception("TipiSoggetto di default non trovato per il protocollo '"+protocollo+"'");
}
String tipoSoggettoDefault = mapTipoSoggettoDefault.get(protocollo);
if(tipoSoggettoDefault==null) {
throw new Exception("TipoSoggetto di default non trovato per il protocollo '"+protocollo+"'");
}
IDSoggetto soggettoDefaultProtocollo = this.registryReader.getIdSoggettoDefault(tipoSoggettoDefault);
if(soggettoDefaultProtocollo==null) {
throw new Exception("IDSoggetto di default non trovato per il protocollo '"+protocollo+"'");
}
mapIdSoggettoDefault.put(protocollo, soggettoDefaultProtocollo);
IProtocolFactory<?> pf = protocolFactoryManager.getProtocolFactoryByName(protocollo);
boolean supportoReferente = false;
if(pf!=null) {
supportoReferente = pf.createProtocolConfiguration().isSupportoSoggettoReferenteAccordiParteComune();
}
mapAPIconReferente.put(protocollo, supportoReferente);
}
}
// ArchiveInformationMissing
if(archive.getInformationMissing()!=null){
importerInformationMissingUtils.validateAndFillInformationMissing(archive.getInformationMissing(),delete);
// Templates Names
// ImporterInformationMissingSetter.replaceTemplatesNames(archive);
// NO!! Senno tutti i riferimenti con EMPTY saltano!!!! Va fatto per ultimo.
}
// ServiziApplicativi
for (int i = 0; i < archive.getServiziApplicativi().size(); i++) {
importerInformationMissingUtils.validateAndFillServizioApplicativo(archive.getServiziApplicativi().get(i));
}
// PorteDelegate
for (int i = 0; i < archive.getPorteDelegate().size(); i++) {
importerInformationMissingUtils.validateAndFillPortaDelegata(archive.getPorteDelegate().get(i));
}
// PorteApplicative
for (int i = 0; i < archive.getPorteApplicative().size(); i++) {
importerInformationMissingUtils.validateAndFillPortaApplicativa(archive.getPorteApplicative().get(i));
}
// Accordi di Cooperazione
for (int i = 0; i < archive.getAccordiCooperazione().size(); i++) {
importerInformationMissingUtils.validateAndFillAccordoCooperazione(archive.getAccordiCooperazione().get(i));
}
// Accordi di Servizio Parte Comune
for (int i = 0; i < archive.getAccordiServizioParteComune().size(); i++) {
importerInformationMissingUtils.validateAndFillAccordoServizioParteComune(archive.getAccordiServizioParteComune().get(i),
checkCorrelazioneAsincrona);
}
// Accordi di Servizio Parte Specifica
// Divisione tra parte specifica "normale" e "composta".
// In particolare non si prendono tutti i composti, ma solo quelli che richiedono prima il caricamento dell'accordo di servizio composto presente in questo archivio.
List<ArchiveAccordoServizioParteSpecifica> listServiziImplementanoAccordiServizioCompostoPresentiArchivio = new ArrayList<ArchiveAccordoServizioParteSpecifica>();
for (int i = 0; i < archive.getAccordiServizioParteSpecifica().size(); i++) {
ArchiveAccordoServizioParteSpecifica archiveServizio = archive.getAccordiServizioParteSpecifica().get(i);
String uriAccordoServizioParteComune = archiveServizio.getAccordoServizioParteSpecifica().getAccordoServizioParteComune();
boolean found = false;
for (int j = 0; j < archive.getAccordiServizioComposto().size(); j++) {
AccordoServizioParteComune as = archive.getAccordiServizioComposto().get(j).getAccordoServizioParteComune();
String uri = IDAccordoFactory.getInstance().getUriFromAccordo(as);
if(uriAccordoServizioParteComune.equals(uri)){
found = true;
listServiziImplementanoAccordiServizioCompostoPresentiArchivio.add(archiveServizio);
break;
}
}
if(!found) {
importerInformationMissingUtils.validateAndFillAccordoServizioParteSpecifica(archive.getAccordiServizioParteSpecifica().get(i),
mapIdSoggettoDefault,
mapAPIconReferente);
}
}
// Accordi di Servizio Composti
for (int i = 0; i < archive.getAccordiServizioComposto().size(); i++) {
importerInformationMissingUtils.validateAndFillAccordoServizioParteComune(archive.getAccordiServizioComposto().get(i),
checkCorrelazioneAsincrona);
}
// Accordi di Servizio Parte Specifica Composti
for (ArchiveAccordoServizioParteSpecifica archiveAccordoServizioParteSpecifica : listServiziImplementanoAccordiServizioCompostoPresentiArchivio) {
importerInformationMissingUtils.validateAndFillAccordoServizioParteSpecifica(archiveAccordoServizioParteSpecifica,
mapIdSoggettoDefault,
mapAPIconReferente);
}
// Fruizioni
for (int i = 0; i < archive.getAccordiFruitori().size(); i++) {
importerInformationMissingUtils.validateAndFillFruitore(archive.getAccordiFruitori().get(i));
}
// Templates Names
ImporterInformationMissingSetter.replaceTemplatesNames(archive, this.registryReader);
}
}