SoggettoVirtuale.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.pdd.config;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.openspcoop2.core.id.IDPortaApplicativa;
import org.openspcoop2.core.id.IDServizioApplicativo;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.pdd.core.GestoreMessaggi;
import org.openspcoop2.pdd.core.PdDContext;
import org.openspcoop2.pdd.core.behaviour.Behaviour;
import org.openspcoop2.pdd.core.behaviour.BehaviourForwardToFilter;
import org.openspcoop2.pdd.core.behaviour.BehaviourLoader;
import org.openspcoop2.pdd.core.behaviour.IBehaviour;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.state.IState;
import org.openspcoop2.protocol.sdk.state.RequestInfo;



/**
 * Classe utilizzata per raccogliere le informazioni su servizi applicativi e 
 * soggetti reali associati ad un unico soggetto virtuale
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */

public class SoggettoVirtuale implements Serializable  {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private List<SoggettoVirtualeServizioApplicativo> soggettoVirtuale_serviziApplicativi = new ArrayList<SoggettoVirtualeServizioApplicativo>();
	private int count = 0;

	/* ********  C O S T R U T T O R E  ******** */

	/**
	 * Costruttore. 
	 *
	 * 
	 */
	public SoggettoVirtuale(){
	}


	public synchronized void addServizioApplicativo(SoggettoVirtualeServizioApplicativo sa){
		this.count++;
		sa.setId("SoggettoVirtuale-SA-"+this.count);
		this.soggettoVirtuale_serviziApplicativi.add(sa);
	}
	
	
	public List<IDSoggetto> getSoggettiRealiSenzaDuplicati() {
		List<IDSoggetto> list = new ArrayList<IDSoggetto>();
		for (SoggettoVirtualeServizioApplicativo sa : this.soggettoVirtuale_serviziApplicativi) {
			boolean find = false;
			for (IDSoggetto giaTrovato : list) {
				if( (sa.getIdSoggettoReale().getTipo().equals(giaTrovato.getTipo())) &&
						(sa.getIdSoggettoReale().getNome().equals(giaTrovato.getNome())) ){
					find = true;
					break;
				}
			}
			if(find == false){
				list.add(sa.getIdSoggettoReale());
			}
		}
		return list;
	}
	
	public List<String> getIdServiziApplicativi(boolean gestisciBehaviuorPerFiltri,GestoreMessaggi gestoreMessaggi,Busta busta, RequestInfo requestInfo,
			PdDContext pddContext, IProtocolFactory<?> protocolFactory, IState state) throws Exception{
		List<String> list = new ArrayList<>();
		for (SoggettoVirtualeServizioApplicativo sa : this.soggettoVirtuale_serviziApplicativi) {

			boolean filtrato = false;
			
			if(gestisciBehaviuorPerFiltri){
				
				if(sa.getPortaApplicativa().getBehaviour()!=null && sa.getPortaApplicativa().getBehaviour().getNome()!=null){
					
					IBehaviour behaviourImpl = BehaviourLoader.newInstance(sa.getPortaApplicativa().getBehaviour(), null,
							pddContext, protocolFactory, state);
					
					Busta bustaConSoggettiReali = busta.newInstance();
					// Inverto mitt-dest
					// il mittente e' il SoggettoVirtuale
					bustaConSoggettiReali.setMittente(busta.getDestinatario()); 
					bustaConSoggettiReali.setTipoMittente(busta.getTipoDestinatario()); 
					// sogg. destinatario reale	
					bustaConSoggettiReali.setDestinatario(sa.getIdSoggettoReale().getNome());
					bustaConSoggettiReali.setTipoDestinatario(sa.getIdSoggettoReale().getTipo());
					
					Behaviour behaviour = behaviourImpl.behaviour(gestoreMessaggi, bustaConSoggettiReali, 
							sa.getPortaApplicativa(), requestInfo);
					if(behaviour!=null && behaviour.getForwardTo()!=null &&
							behaviour.getForwardTo().size()==1){
						BehaviourForwardToFilter filter = behaviour.getForwardTo().get(0).getFilter();
						
						if(filter!=null){
							// Provo a vedere se il sa รจ filtrato
							List<IDServizioApplicativo> saAttuale = new ArrayList<IDServizioApplicativo>();
							IDServizioApplicativo idSA = new IDServizioApplicativo();
							idSA.setIdSoggettoProprietario(sa.getIdSoggettoReale());
							idSA.setNome(sa.getNomeServizioApplicativo());
							saAttuale.add(idSA);
							List<IDServizioApplicativo> saFiltrato = filter.aggiornaDestinatariAbilitati(saAttuale);
							if(saFiltrato.size()<=0){
								filtrato=true;
							}
						}
					}
				}
						
			}
			
			if(filtrato==false){
				list.add(sa.getId());
			}
		}
		return list;
	}
	
	public String getNomeServizioApplicativo(String idServizioApplicativo){
		for (SoggettoVirtualeServizioApplicativo sa : this.soggettoVirtuale_serviziApplicativi) {
			if(sa.getId().equals(idServizioApplicativo)){
				return sa.getNomeServizioApplicativo();
			}
		}
		return null;
	}
	
	public IDSoggetto getSoggettoReale(String idServizioApplicativo){
		for (SoggettoVirtualeServizioApplicativo sa : this.soggettoVirtuale_serviziApplicativi) {
			if(sa.getId().equals(idServizioApplicativo)){
				return sa.getIdSoggettoReale();
			}
		}
		return null;
	}
	
	public IDPortaApplicativa getIDPortaApplicativa(String idServizioApplicativo){
		for (SoggettoVirtualeServizioApplicativo sa : this.soggettoVirtuale_serviziApplicativi) {
			if(sa.getId().equals(idServizioApplicativo)){
				IDPortaApplicativa idPA = new IDPortaApplicativa();
				idPA.setNome(sa.getPortaApplicativa().getNome());
				return idPA;
			}
		}
		return null;
	}
	

}