AbstractConverter.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 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.basic.archive.abstraction;

import java.util.ArrayList;
import java.util.List;

import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDServizioApplicativo;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.protocol.abstraction.Soggetto;
import org.openspcoop2.protocol.basic.archive.ZIPReadUtils;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.archive.Archive;
import org.openspcoop2.protocol.sdk.registry.ProtocolFiltroRicercaAccordi;
import org.openspcoop2.protocol.sdk.registry.ProtocolFiltroRicercaServizi;
import org.openspcoop2.protocol.sdk.registry.IConfigIntegrationReader;
import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
import org.openspcoop2.protocol.sdk.registry.RegistryException;
import org.openspcoop2.protocol.sdk.registry.RegistryNotFound;
import org.slf4j.Logger;

/**     
 * AbstractConverter
 *
 * @author Poli Andrea (poli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public abstract class AbstractConverter {


	
	protected IDAccordoFactory idAccordoFactory;
	protected IDServizioFactory idServizioFactory;
	protected Logger log;
	protected ZIPReadUtils filler;
	
	protected AbstractConverter(Logger log,ZIPReadUtils zipReader) throws ProtocolException{
		this.idAccordoFactory = IDAccordoFactory.getInstance();
		this.idServizioFactory = IDServizioFactory.getInstance();
		this.log = log;
		this.filler = zipReader;
	}
			
	protected boolean existsPdd(Archive archive, IRegistryReader registryReader, String pdd) {
		
		// Cerco nel registro
		if(registryReader.existsPortaDominio(pdd)){
			return true;
		}
				
		// Cerco negli oggetti presenti nell'archivio
		if(archive.getPdd().size()>0){
			for (int i = 0; i < archive.getPdd().size(); i++) {
				String nome = archive.getPdd().get(i).getPortaDominio().getNome();
				if(nome.equals(pdd)){
					return true;
				}
			}
		}
		
		return false;
				
	}
	
	protected boolean isPddOperativa(Archive archive, IRegistryReader registryReader, String pdd) throws RegistryException{
		
		// Cerco nel registro
		if(registryReader.existsPortaDominio(pdd)){
			try{
				if(registryReader.findIdPorteDominio(true).contains(pdd)){
					return true;
				}
			}catch(RegistryNotFound notFound){
				return false;
			}
		}
		
		return false; // le pdd presenti nell'archivio vengono aggiunte come esterne.
	}
	
	protected String getPddOperativa(IRegistryReader registryReader) throws RegistryNotFound, RegistryException{
		return registryReader.findIdPorteDominio(true).get(0); // una pdd operativa esiste sempre
	}
	
	protected boolean existsSoggetto(Archive archive, IRegistryReader registryReader, Soggetto idSoggetto) {
		
		// Cerco nel registro
		if(registryReader.existsSoggetto(new IDSoggetto(idSoggetto.getTipo(), idSoggetto.getNome()))){
			return true;
		}
		
		// Cerco negli oggetti presenti nell'archivio
		if(archive.getSoggetti().size()>0){
			for (int i = 0; i < archive.getSoggetti().size(); i++) {
				org.openspcoop2.core.registry.Soggetto soggetto = archive.getSoggetti().get(i).getSoggettoRegistro();
				if(soggetto!=null){
					if(idSoggetto.getTipo().equals(soggetto.getTipo()) && idSoggetto.getNome().equals(soggetto.getNome())){
						return true;
					}
				}
			}
		}
		
		return false;
				
	}
	
	protected boolean existsServizioApplicativo(Archive archive, IConfigIntegrationReader configIntegrationReader, Soggetto idSoggetto, String nomeServizioApplicativo) {
		
		IDServizioApplicativo idServizioApplicativo = new IDServizioApplicativo();
		idServizioApplicativo.setIdSoggettoProprietario(new IDSoggetto(idSoggetto.getTipo(), idSoggetto.getNome()));
		idServizioApplicativo.setNome(nomeServizioApplicativo);
		
		// Cerco nel registro
		if(configIntegrationReader.existsServizioApplicativo(idServizioApplicativo)){
			return true;
		}
		
		// Cerco negli oggetti presenti nell'archivio
		if(archive.getServiziApplicativi().size()>0){
			for (int i = 0; i < archive.getServiziApplicativi().size(); i++) {
				org.openspcoop2.core.config.ServizioApplicativo sa = archive.getServiziApplicativi().get(i).getServizioApplicativo();
				if(sa!=null){
					if(idSoggetto.getTipo().equals(sa.getTipoSoggettoProprietario()) && 
							idSoggetto.getNome().equals(sa.getNomeSoggettoProprietario()) &&
							nomeServizioApplicativo.equals(sa.getNome())){
						return true;
					}
				}
			}
		}
		
		return false;
				
	}
	
	protected String getTipoCredenzialeServizioApplicativo(Archive archive, IConfigIntegrationReader configIntegrationReader, Soggetto idSoggetto, String nomeServizioApplicativo) throws Exception {
		
		IDServizioApplicativo idServizioApplicativo = new IDServizioApplicativo();
		idServizioApplicativo.setIdSoggettoProprietario(new IDSoggetto(idSoggetto.getTipo(), idSoggetto.getNome()));
		idServizioApplicativo.setNome(nomeServizioApplicativo);
		
		ServizioApplicativo sa = null;
		
		// Cerco nel registro
		if(configIntegrationReader.existsServizioApplicativo(idServizioApplicativo)){
			sa = configIntegrationReader.getServizioApplicativo(idServizioApplicativo);
		}
		else{
			// Cerco negli oggetti presenti nell'archivio
			if(archive.getServiziApplicativi().size()>0){
				for (int i = 0; i < archive.getServiziApplicativi().size(); i++) {
					org.openspcoop2.core.config.ServizioApplicativo saTmp = archive.getServiziApplicativi().get(i).getServizioApplicativo();
					if(saTmp!=null){
						if(idSoggetto.getTipo().equals(saTmp.getTipoSoggettoProprietario()) && 
								idSoggetto.getNome().equals(saTmp.getNomeSoggettoProprietario()) &&
								nomeServizioApplicativo.equals(saTmp.getNome())){
							sa = saTmp;
							break;
						}
					}
				}
			}
		}
		
		if(sa==null){
			throw new Exception("Servizio Applicativo ["+idServizioApplicativo.toString()+"] non esistente");
		}
		if(sa.getInvocazionePorta()==null){
			throw new Exception("Servizio Applicativo ["+idServizioApplicativo.toString()+"] non possiede delle credenziali di accesso alla PdD (Indicare un applicativo con tipologia 'fruitore')");
		}
		if(sa.getInvocazionePorta().sizeCredenzialiList()<=0){
			throw new Exception("Servizio Applicativo ["+idServizioApplicativo.toString()+"] non possiede delle credenziali di accesso alla PdD (Indicare un applicativo con tipologia 'fruitore') con credenziali");
		}
		return sa.getInvocazionePorta().getCredenziali(0).getTipo().getValue();
				
	}
	
	protected boolean existsAccordoServizioParteComune(Archive archive, IRegistryReader registryReader, IDAccordo idAccordo) throws RegistryException {
		
		// Cerco nel registro
		try{
			registryReader.getAccordoServizioParteComune(idAccordo);
			return true;
		}catch(RegistryNotFound notFound){
			// ignore
		}
		
		// Cerco negli oggetti presenti nell'archivio
		if(archive.getAccordiServizioParteComune().size()>0){
			for (int i = 0; i < archive.getAccordiServizioParteComune().size(); i++) {
				try{
					IDAccordo id = this.idAccordoFactory.getIDAccordoFromAccordo(archive.getAccordiServizioParteComune().get(i).getAccordoServizioParteComune());
					if(idAccordo.equals(id)){
						return true;
					}
				}catch(Exception e){
					// ignore
				}
			}
		}
		if(archive.getAccordiServizioComposto().size()>0){
			for (int i = 0; i < archive.getAccordiServizioComposto().size(); i++) {
				try{
					IDAccordo id = this.idAccordoFactory.getIDAccordoFromAccordo(archive.getAccordiServizioComposto().get(i).getAccordoServizioParteComune());
					if(idAccordo.equals(id)){
						return true;
					}
				}catch(Exception e){
					// ignore
				}
			}
		}

		return false;
				
	}
	
	protected IDAccordo findIdAccordoServizioParteComune(Archive archive, IRegistryReader registryReader, 
			String nome, Soggetto idSoggetto, Integer versione) throws DriverRegistroServiziException, ProtocolException, RegistryException{
		
		List<IDAccordo> idAccordi = new ArrayList<IDAccordo>();
		List<String> uriAccordi = new ArrayList<>();
		
		// Cerco nel registro
		ProtocolFiltroRicercaAccordi filtroAccordi = new ProtocolFiltroRicercaAccordi();
		filtroAccordi.setNome(nome);
		if(versione!=null){
			filtroAccordi.setVersione(versione);
		}
		if(idSoggetto!=null){
			IDSoggetto idSoggettoOp2 = new IDSoggetto(idSoggetto.getTipo(), idSoggetto.getNome());
			filtroAccordi.setSoggetto(idSoggettoOp2);
		}
		try {
			List<IDAccordo> found = registryReader.findIdAccordiServizioParteComune(filtroAccordi);
			if(found.size()>0){
				for (IDAccordo id : found) {
					idAccordi.add(id);
					uriAccordi.add(this.idAccordoFactory.getUriFromIDAccordo(id));
				}
			}
		} catch (RegistryNotFound e) {
		}
		
		// Cerco negli oggetti presenti nell'archivio
		if(archive.getAccordiServizioParteComune().size()>0){
			for (int i = 0; i < archive.getAccordiServizioParteComune().size(); i++) {
				try{	
					IDAccordo id = this.idAccordoFactory.getIDAccordoFromAccordo(archive.getAccordiServizioParteComune().get(i).getAccordoServizioParteComune());
					if(nome.equals(id.getNome())==false){
						continue;
					}
					if(versione!=null && id.getVersione()!=null && (versione.intValue()!=id.getVersione().intValue()) ){
						continue;
					}
					if(idSoggetto!=null){
						if(id.getSoggettoReferente()==null){
							continue;
						}
						if(idSoggetto.getTipo()!=null && idSoggetto.getTipo().equals(id.getSoggettoReferente().getTipo())==false){
							continue;
						}
						if(idSoggetto.getNome()!=null && idSoggetto.getNome().equals(id.getSoggettoReferente().getNome())==false){
							continue;
						}
					}
					String uri = this.idAccordoFactory.getUriFromIDAccordo(id);
					if(uriAccordi.contains(uri)==false){
						idAccordi.add(id);
						uriAccordi.add(uri);
					}
				}catch(Exception e){
					// ignore
				}
			}
		}
		if(archive.getAccordiServizioComposto().size()>0){
			for (int i = 0; i < archive.getAccordiServizioComposto().size(); i++) {
				try{
					IDAccordo id = this.idAccordoFactory.getIDAccordoFromAccordo(archive.getAccordiServizioComposto().get(i).getAccordoServizioParteComune());
					if(nome.equals(id.getNome())==false){
						continue;
					}
					if(versione!=null && id.getVersione()!=null && (versione.intValue()!=id.getVersione().intValue()) ){
						continue;
					}
					if(idSoggetto!=null){
						if(id.getSoggettoReferente()==null){
							continue;
						}
						if(idSoggetto.getTipo()!=null && idSoggetto.getTipo().equals(id.getSoggettoReferente().getTipo())==false){
							continue;
						}
						if(idSoggetto.getNome()!=null && idSoggetto.getNome().equals(id.getSoggettoReferente().getNome())==false){
							continue;
						}
					}
					String uri = this.idAccordoFactory.getUriFromIDAccordo(id);
					if(uriAccordi.contains(uri)==false){
						idAccordi.add(id);
						uriAccordi.add(uri);
					}
				}catch(Exception e){
					// ignore
				}
			}
		}
		
		// Verifico
		if(idAccordi.size()==1){
			return idAccordi.get(0);
		}
		else {
			String filtro = "Nome["+nome+"]";
			if(versione!=null){
				filtro = filtro + " Versione["+versione+"]";
			}
			if(idSoggetto!=null){
				filtro = filtro + " TipoSoggetto["+idSoggetto.getTipo()+"]";
				filtro = filtro + " NomeSoggetto["+idSoggetto.getNome()+"]";
			}
			if(idAccordi.size()<1){
				throw new ProtocolException("Non risultano accordi di servizio parte comune che corrispondono al seguente criterio di ricerca: "+filtro);
			}
			else{
				throw new ProtocolException("Risultano più accordi di servizio parte comune ("+uriAccordi.size()+") che corrispondono al seguente criterio di ricerca: "+filtro+""
						+ "\nGli accordi sono: "+uriAccordi.toString());
			}
		}
	}
	
	
	protected boolean existsAccordoServizioParteSpecifica(Archive archive, IRegistryReader registryReader, IDServizio idServizio) throws RegistryException {
		
		// Cerco nel registro
		try{
			registryReader.getAccordoServizioParteSpecifica(idServizio);
			return true;
		}catch(RegistryNotFound notFound){
			// ignore
		}
		
		// Cerco negli oggetti presenti nell'archivio
		if(archive.getAccordiServizioParteSpecifica().size()>0){
			for (int i = 0; i < archive.getAccordiServizioParteSpecifica().size(); i++) {
				try{
					AccordoServizioParteSpecifica asps = archive.getAccordiServizioParteSpecifica().get(i).getAccordoServizioParteSpecifica();
					IDServizio id = IDServizioFactory.getInstance().getIDServizioFromValues(asps.getTipo(), asps.getNome(),
							asps.getTipoSoggettoErogatore(), asps.getNomeSoggettoErogatore(), 
							asps.getVersione()); 
					if(idServizio.equals(id)){
						return true;
					}
				}catch(Exception e){
					// ignore
				}
			}
		}

		return false;
				
	}

	
	protected AccordoServizioParteSpecifica getAccordoServizioParteSpecifica(Archive archive, IRegistryReader registryReader, IDServizio idServizio) throws RegistryException {
	
		// Cerco nel registro
		try{
			return registryReader.getAccordoServizioParteSpecifica(idServizio);
		}catch(RegistryNotFound notFound){
			// ignore
		}
		
		// Cerco negli oggetti presenti nell'archivio
		if(archive.getAccordiServizioParteSpecifica().size()>0){
			for (int i = 0; i < archive.getAccordiServizioParteSpecifica().size(); i++) {
				try{
					AccordoServizioParteSpecifica asps = archive.getAccordiServizioParteSpecifica().get(i).getAccordoServizioParteSpecifica();
					if(idServizio.getTipo().equals(asps.getTipo())==false ){
						continue;
					}
					if(idServizio.getNome().equals(asps.getNome())==false){
						continue;
					}
					if(idServizio.getVersione().intValue() != asps.getVersione().intValue()){
						continue;
					}
					if(idServizio.getSoggettoErogatore().getTipo().equals(asps.getTipoSoggettoErogatore())==false){
						continue;
					}
					if(idServizio.getSoggettoErogatore().getNome().equals(asps.getNomeSoggettoErogatore())==false){
						continue;
					}
					return asps;
				}catch(Exception e){
					// ignore
				}
			}
		}
		return null;
				
	}
	
	protected IDServizio findIdAccordoServizioParteSpecifica(Archive archive, IRegistryReader registryReader, 
			String nome, String tipo, Integer versione, Soggetto idSoggetto) throws DriverRegistroServiziException, ProtocolException, RegistryException{
		
		List<IDServizio> idAccordi = new ArrayList<IDServizio>();
		List<String> uriAccordi = new ArrayList<>();
		
		// Cerco nel registro
		ProtocolFiltroRicercaServizi filtroAccordi = new ProtocolFiltroRicercaServizi();
		filtroAccordi.setTipoServizio(tipo);
		filtroAccordi.setNomeServizio(nome);
		if(idSoggetto!=null){
			IDSoggetto idSoggettoOp2 = new IDSoggetto(idSoggetto.getTipo(), idSoggetto.getNome());
			filtroAccordi.setSoggettoErogatore(idSoggettoOp2);
		}
		try {
			List<IDServizio> found = registryReader.findIdAccordiServizioParteSpecifica(filtroAccordi);
			if(found.size()>0){
				for (IDServizio id : found) {
					idAccordi.add(id);
					uriAccordi.add(id.toString());
				}
			}
		} catch (RegistryNotFound e) {
		}
		
		// Cerco negli oggetti presenti nell'archivio
		if(archive.getAccordiServizioParteSpecifica().size()>0){
			for (int i = 0; i < archive.getAccordiServizioParteSpecifica().size(); i++) {
				try{
					AccordoServizioParteSpecifica asps = archive.getAccordiServizioParteSpecifica().get(i).getAccordoServizioParteSpecifica();
					if(tipo!=null && (tipo.equals(asps.getTipo())==false) ){
						continue;
					}
					if(nome.equals(asps.getNome())==false){
						continue;
					}
					if(versione!=null && (versione.intValue() != asps.getVersione().intValue()) ){
						continue;
					}
					if(idSoggetto!=null){
						if(idSoggetto.getTipo().equals(asps.getTipoSoggettoErogatore())==false){
							continue;
						}
						if(idSoggetto.getNome().equals(asps.getNomeSoggettoErogatore())==false){
							continue;
						}

						IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(tipo, nome,
								new IDSoggetto(idSoggetto.getTipo(),idSoggetto.getNome()), 
								versione);
						String uri = idServizio.toString();
						if(uriAccordi.contains(uri)==false){
							idAccordi.add(idServizio);
							uriAccordi.add(uri);
						}
					}
				}catch(Exception e){
					// ignore
				}
			}
		}
		
		
		// Verifico
		if(idAccordi.size()==1){
			return idAccordi.get(0);
		}
		else {
			String filtro = "Nome["+nome+"]";
			if(tipo!=null){
				filtro = filtro + " Tipo["+tipo+"]";
			}
			if(idSoggetto!=null){
				filtro = filtro + " TipoSoggetto["+idSoggetto.getTipo()+"]";
				filtro = filtro + " NomeSoggetto["+idSoggetto.getNome()+"]";
			}
			if(idAccordi.size()<1){
				throw new ProtocolException("Non risultano accordi di servizio parte specifica che corrispondono al seguente criterio di ricerca: "+filtro);
			}
			else{
				throw new ProtocolException("Risultano più accordi di servizio parte specifica ("+uriAccordi.size()+") che corrispondono al seguente criterio di ricerca: "+filtro+""
						+ "\nGli accordi sono: "+uriAccordi.toString());
			}
		}
	}
		
	
}