BeanUtilities.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.core.registry.driver;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDAccordoCooperazione;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoCooperazione;
import org.openspcoop2.core.registry.IdSoggetto;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.Documento;
import org.openspcoop2.core.registry.PortaDominio;
import org.openspcoop2.core.registry.RegistroServizi;
import org.openspcoop2.core.registry.Soggetto;
import org.openspcoop2.core.registry.constants.RuoliDocumento;
import org.openspcoop2.core.registry.constants.TipiDocumentoCoordinamento;
import org.openspcoop2.core.registry.constants.TipiDocumentoLivelloServizio;
import org.openspcoop2.core.registry.constants.TipiDocumentoSemiformale;
import org.openspcoop2.core.registry.constants.TipiDocumentoSicurezza;

/**
 * Utility sui bean del package
 *  
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public abstract class BeanUtilities implements IDriverRegistroServiziGet {

	
	private static final String DRIVER_REGISTRO_SERVIZI_DB = "org.openspcoop2.core.registry.driver.db.DriverRegistroServiziDB";
	
	
	/**
	 * Controlla che il bean presente nel registro, sia uguale al bean passato come parametro
	 * 
	 * @param idAccordo
	 * @param accordoCooperazione
	 * @return true se il bean presente nel registro, sia uguale al bean passato come parametro
	 */
	@Override
	public boolean verificaAccordoCooperazione(IDAccordoCooperazione idAccordo,AccordoCooperazione accordoCooperazione)throws DriverRegistroServiziException {
		return verificaAccordoCooperazione(idAccordo,accordoCooperazione,true);
	}
	@Override
	public boolean verificaAccordoCooperazione(IDAccordoCooperazione idAccordo,AccordoCooperazione accordoCooperazione,boolean checkID)throws DriverRegistroServiziException{
		AccordoCooperazione beanRegistro = null;
		try{
			if(this.getClass().getName().equals(BeanUtilities.DRIVER_REGISTRO_SERVIZI_DB)){
				Method m = this.getClass().getMethod("getAccordoCooperazione", IDAccordoCooperazione.class,boolean.class);
				beanRegistro = (AccordoCooperazione) m.invoke(this, idAccordo, true);
			}
			else
				beanRegistro =  this.getAccordoCooperazione(idAccordo);
		}catch(DriverRegistroServiziNotFound dNotFound){}
		catch(Exception e){
			throw new DriverRegistroServiziException(e.getMessage(),e);
		}
		if(beanRegistro==null){
			if(accordoCooperazione==null)
				return true;
			else
				return false;
		}else{
			if(accordoCooperazione==null)
				return false;
			else
				return beanRegistro.equals(accordoCooperazione,checkID);
		}
	}
	
	
	
	/**
	 * Controlla che il bean presente nel registro, sia uguale al bean passato come parametro
	 * 
	 * @param idAccordo
	 * @param accordoServizioParteComune
	 * @return true se il bean presente nel registro, sia uguale al bean passato come parametro
	 */
	@Override
	public boolean verificaAccordoServizioParteComune(IDAccordo idAccordo,AccordoServizioParteComune accordoServizioParteComune)throws DriverRegistroServiziException {
		return verificaAccordoServizioParteComune(idAccordo,accordoServizioParteComune,true);
	}
	@Override
	public boolean verificaAccordoServizioParteComune(IDAccordo idAccordo,AccordoServizioParteComune accordoServizioParteComune,boolean checkID)throws DriverRegistroServiziException{
		AccordoServizioParteComune beanRegistro = null;
		try{
			if(this.getClass().getName().equals(BeanUtilities.DRIVER_REGISTRO_SERVIZI_DB)){
				Method m = this.getClass().getMethod("getAccordoServizioParteComune", IDAccordo.class,boolean.class);
				beanRegistro = (AccordoServizioParteComune) m.invoke(this, idAccordo, true);
			}
			else
				beanRegistro =  this.getAccordoServizioParteComune(idAccordo);
		}catch(DriverRegistroServiziNotFound dNotFound){}
		catch(Exception e){
			throw new DriverRegistroServiziException(e.getMessage(),e);
		}
		if(beanRegistro==null){
			if(accordoServizioParteComune==null)
				return true;
			else
				return false;
		}else{
			if(accordoServizioParteComune==null)
				return false;
			else
				return beanRegistro.equals(accordoServizioParteComune,checkID);
		}
	}
	
	
	/**
	 * Controlla che il bean presente nel registro, sia uguale al bean passato come parametro
	 * 
	 * @param nomePdd
	 * @param pdd
	 * @return true se il bean presente nel registro, sia uguale al bean passato come parametro
	 */
	@Override
	public boolean verificaPortaDominio(String nomePdd,PortaDominio pdd)throws DriverRegistroServiziException{
		return this.verificaPortaDominio(nomePdd, pdd,true);
	}
	@Override
	public boolean verificaPortaDominio(String nomePdd,PortaDominio pdd,boolean checkID)throws DriverRegistroServiziException{
		PortaDominio beanRegistro = null;
		try{
			beanRegistro = this.getPortaDominio(nomePdd);
		}catch(DriverRegistroServiziNotFound dNotFound){}
		if(beanRegistro==null){
			if(pdd==null)
				return true;
			else
				return false;
		}else{
			if(pdd==null)
				return false;
			else
				return beanRegistro.equals(pdd,checkID);
		}
	}
	
	
	/**
	 * Controlla che il bean presente nel registro, sia uguale al bean passato come parametro
	 * 
	 * @param idSoggetto
	 * @param soggetto
	 * @return true se il bean presente nel registro, sia uguale al bean passato come parametro
	 * @throws DriverRegistroServiziException
	 */
	@Override
	public boolean verificaSoggetto(IDSoggetto idSoggetto,Soggetto soggetto)throws DriverRegistroServiziException {
		return verificaSoggetto(idSoggetto, soggetto,true);
	}
	@Override
	public boolean verificaSoggetto(IDSoggetto idSoggetto,Soggetto soggetto,boolean checkID)throws DriverRegistroServiziException{
		Soggetto beanRegistro = null;
		try{
			beanRegistro = this.getSoggetto(idSoggetto);
		}catch(DriverRegistroServiziNotFound dNotFound){}
		if(beanRegistro==null){
			if(soggetto==null)
				return true;
			else
				return false;
		}else{
			if(soggetto==null)
				return false;
			else
				return beanRegistro.equals(soggetto,checkID);
		}
	}

	
	/**
	 * Controlla che il bean presente nel registro, sia uguale al bean passato come parametro
	 * 
	 * @param idServizio
	 * @param accordoServizioParteSpecifica
	 * @return true se il bean presente nel registro, sia uguale al bean passato come parametro
	 * @throws DriverRegistroServiziException
	 */
	@Override
	public boolean verificaAccordoServizioParteSpecifica(IDServizio idServizio,AccordoServizioParteSpecifica accordoServizioParteSpecifica)throws DriverRegistroServiziException {
		return verificaAccordoServizioParteSpecifica(idServizio,accordoServizioParteSpecifica,true);
	}
	@Override
	public boolean verificaAccordoServizioParteSpecifica(IDServizio idServizio,AccordoServizioParteSpecifica accordoServizioParteSpecifica,boolean checkID)throws DriverRegistroServiziException{
		AccordoServizioParteSpecifica beanRegistro = null;
		try{
			if(this.getClass().getName().equals(BeanUtilities.DRIVER_REGISTRO_SERVIZI_DB)){
				Method m = this.getClass().getMethod("getAccordoServizioParteSpecifica", IDServizio.class,boolean.class);
				beanRegistro = (AccordoServizioParteSpecifica) m.invoke(this, idServizio, true);
			}
			else
				beanRegistro =  this.getAccordoServizioParteSpecifica(idServizio);
		}catch(DriverRegistroServiziNotFound dNotFound){}
		catch(Exception e){
			throw new DriverRegistroServiziException(e.getMessage(),e);
		}
		if(beanRegistro==null){
			if(accordoServizioParteSpecifica==null)
				return true;
			else
				return false;
		}else{
			if(accordoServizioParteSpecifica==null)
				return false;
			else
				return beanRegistro.equals(accordoServizioParteSpecifica,checkID);
		}
	}
	
	/**
	 * Controlla che il bean presente nel registro, sia uguale al bean passato come parametro
	 * 
	 * @param idSoggetto Identificatore del Soggetto di tipo {@link org.openspcoop2.core.id.IDSoggetto}.
	 * @param idAccordoServizioParteComune ID dell'accordo che deve implementare il servizio correlato
	 * @param accordoServizioParteSpecifica
	 * @return true se il bean presente nel registro, sia uguale al bean passato come parametro
	 * @throws DriverRegistroServiziException
	 */
	@Override
	public boolean verificaAccordoServizioParteSpecifica_ServizioCorrelato(IDSoggetto idSoggetto, IDAccordo idAccordoServizioParteComune,AccordoServizioParteSpecifica accordoServizioParteSpecifica)throws DriverRegistroServiziException {
		return verificaAccordoServizioParteSpecifica_ServizioCorrelato(idSoggetto,idAccordoServizioParteComune,accordoServizioParteSpecifica,true);
	}
	@Override
	public boolean verificaAccordoServizioParteSpecifica_ServizioCorrelato(IDSoggetto idSoggetto, IDAccordo idAccordoServizioParteComune,AccordoServizioParteSpecifica accordoServizioParteSpecifica,boolean checkID)throws DriverRegistroServiziException{
		AccordoServizioParteSpecifica beanRegistro = null;
		try{
			if(this.getClass().getName().equals(BeanUtilities.DRIVER_REGISTRO_SERVIZI_DB)){
				Method m = this.getClass().getMethod("getAccordoServizioParteSpecifica_ServizioCorrelato", IDSoggetto.class,IDAccordo.class,boolean.class);
				beanRegistro = (AccordoServizioParteSpecifica) m.invoke(this, idSoggetto, idAccordoServizioParteComune, true);
			}
			else
				beanRegistro =  this.getAccordoServizioParteSpecifica_ServizioCorrelato(idSoggetto,idAccordoServizioParteComune);
		}catch(DriverRegistroServiziNotFound dNotFound){}
		catch(Exception e){
			throw new DriverRegistroServiziException(e.getMessage(),e);
		}
		if(beanRegistro==null){
			if(accordoServizioParteSpecifica==null)
				return true;
			else
				return false;
		}else{
			if(accordoServizioParteSpecifica==null)
				return false;
			else
				return beanRegistro.equals(accordoServizioParteSpecifica,checkID);
		}
	}
	
	
	
	
	public static IDSoggetto getSoggettoReferenteID(IdSoggetto ass){
		if(ass!=null && ass.getTipo()!=null && ass.getNome()!=null){
			return new IDSoggetto(ass.getTipo(),ass.getNome());
		}else{
			return null;
		}
	}

	public static IDSoggetto getSoggettoErogatore(AccordoServizioParteSpecifica asps){
		if(asps!=null && asps.getTipoSoggettoErogatore()!=null && asps.getNomeSoggettoErogatore()!=null){
			return new IDSoggetto(asps.getTipoSoggettoErogatore(),asps.getNomeSoggettoErogatore());
		}else{
			return null;
		}
	}
	
	
	public static void validateTipoRuolo(String tipo,String ruolo)throws DriverRegistroServiziException{
		if(RuoliDocumento.allegato.toString().equals(ruolo)){
			// qualsiasi tipo e' accettato
			return;
		}else if(RuoliDocumento.specificaSemiformale.toString().equals(ruolo)){
			if(TipiDocumentoSemiformale.HTML.toString().equals(tipo)==false &&
					TipiDocumentoSemiformale.LINGUAGGIO_NATURALE.toString().equals(tipo)==false &&
					TipiDocumentoSemiformale.UML.toString().equals(tipo)==false &&
					TipiDocumentoSemiformale.XML.toString().equals(tipo)==false &&
					TipiDocumentoSemiformale.XSD.toString().equals(tipo)==false &&
					TipiDocumentoSemiformale.JSON.toString().equals(tipo)==false &&
					TipiDocumentoSemiformale.YAML.toString().equals(tipo)==false){
				throw new DriverRegistroServiziException("Tipo["+tipo+"] non accettato per il Ruolo["+ruolo+"], valori ammessi sono: "+
						TipiDocumentoSemiformale.HTML.toString()+","
						+TipiDocumentoSemiformale.LINGUAGGIO_NATURALE.toString()+","
						+TipiDocumentoSemiformale.UML.toString()+","
						+TipiDocumentoSemiformale.XML.toString()+","
						+TipiDocumentoSemiformale.XSD.toString()+","
						+TipiDocumentoSemiformale.JSON.toString()+","
						+TipiDocumentoSemiformale.YAML.toString());
			}
		}else if(RuoliDocumento.specificaLivelloServizio.toString().equals(ruolo)){
			if(TipiDocumentoLivelloServizio.WSAGREEMENT.toString().equals(tipo)==false &&
					TipiDocumentoLivelloServizio.WSLA.toString().equals(tipo)==false){
				throw new DriverRegistroServiziException("Tipo["+tipo+"] non accettato per il Ruolo["+ruolo+"], valori ammessi sono: "+
						TipiDocumentoLivelloServizio.WSAGREEMENT.toString()+","
						+TipiDocumentoLivelloServizio.WSLA.toString());
			}
		}else if(RuoliDocumento.specificaSicurezza.toString().equals(ruolo)){
			if(TipiDocumentoSicurezza.LINGUAGGIO_NATURALE.toString().equals(tipo)==false &&
					TipiDocumentoSicurezza.WSPOLICY.toString().equals(tipo)==false &&
					TipiDocumentoSicurezza.XACML_POLICY.toString().equals(tipo)==false){
				throw new DriverRegistroServiziException("Tipo["+tipo+"] non accettato per il Ruolo["+ruolo+"], valori ammessi sono: "+
						TipiDocumentoSicurezza.LINGUAGGIO_NATURALE.toString()+","
						+TipiDocumentoSicurezza.WSPOLICY.toString()+","
						+TipiDocumentoSicurezza.XACML_POLICY.toString());
			}
		}else if(RuoliDocumento.specificaCoordinamento.toString().equals(ruolo)){
			if(TipiDocumentoCoordinamento.BPEL.toString().equals(tipo)==false &&
					TipiDocumentoCoordinamento.WSCDL.toString().equals(tipo)==false){
				throw new DriverRegistroServiziException("Tipo["+tipo+"] non accettato per il Ruolo["+ruolo+"], valori ammessi sono: "+
						TipiDocumentoCoordinamento.BPEL.toString()+","
						+TipiDocumentoCoordinamento.WSCDL.toString());
			}
		}else{
			throw new DriverRegistroServiziException("Ruolo non conosciuto");
		}
	}
	
	/**
	 * Dato un bean {@link AccordoServizioParteComune}, {@link AccordoCooperazione}, {@link AccordoServizioParteSpecifica} ritorna la lista
	 * di tutti i {@link Documento} contenuti nel bean, recuperandoli dagli array interni al bean.
	 * @param <T> -{@link AccordoServizioParteComune}, {@link AccordoCooperazione}, {@link AccordoServizioParteSpecifica}
	 * @param o -Il bean del quale si vogliono tutti i documenti
	 * @return La lista dei documenti. La lista non e' mai null.
	 */
	public static <T> ArrayList<Documento> getAllDocumenti(T o){
		ArrayList<Documento> lista = new ArrayList<Documento>();
		
		if(o instanceof AccordoServizioParteComune){
			AccordoServizioParteComune b = (AccordoServizioParteComune)o;
			
			if(b.sizeAllegatoList()>0){
				for (Documento documento : b.getAllegatoList()) {
					lista.add(documento);
				}
			}
			if(b.sizeSpecificaSemiformaleList()>0){
				for (Documento documento : b.getSpecificaSemiformaleList()) {
					lista.add(documento);
				}
			}
		}else if (o instanceof AccordoCooperazione){
			AccordoCooperazione b = (AccordoCooperazione)o;
			
			if(b.sizeAllegatoList()>0){
				for (Documento documento : b.getAllegatoList()) {
					lista.add(documento);
				}
			}
			if(b.sizeSpecificaSemiformaleList()>0){
				for (Documento documento : b.getSpecificaSemiformaleList()) {
					lista.add(documento);
				}
			}
			
		}else if(o instanceof AccordoServizioParteSpecifica){
			AccordoServizioParteSpecifica b = (AccordoServizioParteSpecifica)o;
			
			if(b.sizeAllegatoList()>0){
				for (Documento documento : b.getAllegatoList()) {
					lista.add(documento);
				}
			}
			if(b.sizeSpecificaSemiformaleList()>0){
				for (Documento documento : b.getSpecificaSemiformaleList()) {
					lista.add(documento);
				}
			}
			if(b.sizeSpecificaLivelloServizioList()>0){
				for (Documento documento : b.getSpecificaLivelloServizioList()) {
					lista.add(documento);
				}
			}
			if(b.sizeSpecificaSicurezzaList()>0){
				for (Documento documento : b.getSpecificaSicurezzaList()) {
					lista.add(documento);
				}
			}
		}
		
		//lista vuota
		return lista;
		
	}
	
	
	
	
	
	
	public RegistroServizi getImmagineCompletaRegistroServizi() throws DriverRegistroServiziException{

		RegistroServizi registroServizi = new RegistroServizi();
		
		// Porte di Dominio
		List<String> idPdd = null;
		try{
			idPdd = this.getAllIdPorteDominio(new FiltroRicerca());
		}catch(DriverRegistroServiziNotFound dNotFound){}
		if(idPdd!=null){
			for(int i=0; i<idPdd.size(); i++){
				try{
					registroServizi.addPortaDominio(this.getPortaDominio(idPdd.get(i)));
				}catch(DriverRegistroServiziNotFound dNotfound){
					throw new DriverRegistroServiziException("Porta di Dominio ["+idPdd.get(i)+"] trovato tramite getAllId ma poi non recuperabile: "+dNotfound.getMessage(),dNotfound);
				}
			}
		}
		
		// Accordi di Cooperazione
		List<IDAccordoCooperazione> idAccordiCooperazione = null;
		try{
			idAccordiCooperazione = this.getAllIdAccordiCooperazione(new FiltroRicercaAccordi());
		}catch(DriverRegistroServiziNotFound dNotFound){}
		if(idAccordiCooperazione!=null){
			for(int i=0; i<idAccordiCooperazione.size(); i++){
				try{
					registroServizi.addAccordoCooperazione(this.getAccordoCooperazione(idAccordiCooperazione.get(i)));
				}catch(DriverRegistroServiziNotFound dNotfound){
					throw new DriverRegistroServiziException("Accordo di cooperazione ["+idAccordiCooperazione.get(i)+"] trovato tramite getAllId ma poi non recuperabile: "+dNotfound.getMessage(),dNotfound);
				}
			}
		}
		
		// Accordi di Servizio
		List<IDAccordo> idAccordiServizio = null;
		try{
			idAccordiServizio = this.getAllIdAccordiServizioParteComune(new FiltroRicercaAccordi());
		}catch(DriverRegistroServiziNotFound dNotFound){}
		if(idAccordiServizio!=null){
			for(int i=0; i<idAccordiServizio.size(); i++){
				try{
					registroServizi.addAccordoServizioParteComune(this.getAccordoServizioParteComune(idAccordiServizio.get(i)));
				}catch(DriverRegistroServiziNotFound dNotfound){
					throw new DriverRegistroServiziException("Accordo di servizio parte comune ["+idAccordiServizio.get(i)+"] trovato tramite getAllId ma poi non recuperabile: "+dNotfound.getMessage(),dNotfound);
				}
			}
		}
		
		// Soggetti
		List<IDSoggetto> idSoggetti = null;
		try{
			idSoggetti = this.getAllIdSoggetti(new FiltroRicercaSoggetti());
		}catch(DriverRegistroServiziNotFound dNotFound){}
		if(idSoggetti!=null){
			for(int i=0; i<idSoggetti.size(); i++){
				try{
					Soggetto soggetto = this.getSoggetto(idSoggetti.get(i));
					
					// I servizi possono contenere solo meta-informazioni (es. Driver DB)
					while(soggetto.sizeAccordoServizioParteSpecificaList()>0){
						soggetto.removeAccordoServizioParteSpecifica(0);
					}
					
					FiltroRicercaServizi filtro = new FiltroRicercaServizi();
					filtro.setTipoSoggettoErogatore(soggetto.getTipo());
					filtro.setNomeSoggettoErogatore(soggetto.getNome());
					
					// Recupero servizi con informazioni complete
					List<IDServizio> idServizi = null;
					try{
						idServizi = this.getAllIdServizi(filtro);
					}catch(DriverRegistroServiziNotFound dNotFound){}
					if(idServizi!=null){
						for(int j=0; j<idServizi.size(); j++){
							try{
								AccordoServizioParteSpecifica s = this.getAccordoServizioParteSpecifica(idServizi.get(j));
								soggetto.addAccordoServizioParteSpecifica(s);
							}catch(DriverRegistroServiziNotFound dNotfound){
								throw new DriverRegistroServiziException("Accordo Servizio Parte Specifica ["+idServizi.get(j)+"] trovato tramite getAllId ma poi non recuperabile: "+dNotfound.getMessage(),dNotfound);
							}
						}
					}
					
					registroServizi.addSoggetto(soggetto);
				}catch(DriverRegistroServiziNotFound dNotfound){
					throw new DriverRegistroServiziException("Soggetto ["+idSoggetti.get(i)+"] trovato tramite getAllId ma poi non recuperabile: "+dNotfound.getMessage(),dNotfound);
				}
			}
		}
		
		return registroServizi;
	}
}