SoggettiUtilities.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.web.ctrlstat.servlet.soggetti;

import java.util.HashMap;
import java.util.List;
import java.util.Set;

import org.openspcoop2.core.commons.ErrorsHandlerCostant;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.Soggetto;
import org.openspcoop2.protocol.engine.utils.DBOggettiInUsoUtils;
import org.openspcoop2.web.ctrlstat.dao.SoggettoCtrlStat;
import org.openspcoop2.web.ctrlstat.servlet.pdd.PddCore;
import org.openspcoop2.web.ctrlstat.servlet.utenti.UtentiCore;
import org.openspcoop2.web.lib.mvc.Costanti;
import org.openspcoop2.web.lib.mvc.TipoOperazione;

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

	public static List<Object> getOggettiDaAggiornare(SoggettiCore soggettiCore,
			String oldnomeprov,String nomeprov,
			String oldtipoprov,String tipoprov,
			SoggettoCtrlStat sog) throws Exception{
		
		// Oggetti da modificare (per riflettere la modifica sul connettore)
		SoggettoUpdateUtilities soggettoUpdateUtilities = 
				new SoggettoUpdateUtilities(soggettiCore, oldnomeprov, nomeprov, oldtipoprov, tipoprov, sog);

		// Soggetto
		// aggiungo il soggetto da aggiornare
		soggettoUpdateUtilities.addSoggetto();

		// Servizi Applicativi
		// Se e' cambiato il tipo o il nome del soggetto devo effettuare la modifica dei servizi applicativi
		// poiche il cambio si riflette sul nome dei connettori del servizio applicativo
		soggettoUpdateUtilities.checkServiziApplicativi();

		// Accordi di Cooperazione
		// Se e' cambiato il tipo o il nome del soggetto devo effettuare la modifica degli accordi di cooperazione:
		// - soggetto referente
		// - soggetti partecipanti
		soggettoUpdateUtilities.checkAccordiCooperazione();

		// Accordi di Servizio Parte Comune
		// Se e' cambiato il tipo o il nome del soggetto devo effettuare la modifica degli accordi di servizio 
		// poiche il cambio si riflette sul soggetto gestore
		soggettoUpdateUtilities.checkAccordiServizioParteComune();

		// Accordi di Servizio Parte Specifica
		// Se e' cambiato il tipo o il nome del soggetto devo effettuare la modifica dei servizi 
		// poiche il cambio si riflette sul nome dei connettori del servizio 
		soggettoUpdateUtilities.checkAccordiServizioParteSpecifica();

		// Porte Delegate
		// Se e' cambiato il tipo o il nome del soggetto devo effettuare la modifica delle porte delegate
		// poiche il cambio si riflette sul nome della porta delegata
		soggettoUpdateUtilities.checkPorteDelegate();

		// Porte Applicative
		// Se e' cambiato il tipo o il nome del soggetto virtuale devo effettuare la modifica delle porte applicative
		// poiche il cambio si riflette all'interno delle informazioni delle porte applicative
		soggettoUpdateUtilities.checkPorteApplicative();	

		// Fruitori nei servizi 
		soggettoUpdateUtilities.checkFruitori();
		
		// Check Policy Globali
		soggettoUpdateUtilities.checkPolicyGlobali();
		
		// Check Regole di Proxy Pass
		soggettoUpdateUtilities.checkConfigurazione();
		
		return soggettoUpdateUtilities.getOggettiDaAggiornare();
	}
	
	public static SoggettiDelStatus deleteSoggetto(Soggetto soggettoRegistro, org.openspcoop2.core.config.Soggetto soggettoConfig, String userLogin, 
			SoggettiCore soggettiCore, SoggettiHelper soggettiHelper, StringBuilder inUsoMessage, String newLine) throws Exception {
		
		PddCore pddCore = new PddCore(soggettiCore);
		UtentiCore utentiCore = new UtentiCore(soggettiCore);
		
		boolean deleteOperativo = false;
		boolean delete = false;
		
		IDSoggetto idSoggetto = null;
		if(soggettiCore.isRegistroServiziLocale()){
			idSoggetto = new IDSoggetto(soggettoRegistro.getTipo(), soggettoRegistro.getNome());
			soggettoConfig = soggettiCore.getSoggetto(idSoggetto);
		}
		else{
			idSoggetto = new IDSoggetto(soggettoConfig.getTipo(), soggettoConfig.getNome());
		}
		boolean soggettoInUso = false;
		boolean normalizeObjectIds = !soggettiHelper.isModalitaCompleta();
		HashMap<ErrorsHandlerCostant, List<String>> whereIsInUso = new HashMap<ErrorsHandlerCostant, List<String>>();
		boolean verificaRuoli = false;
		if(soggettiCore.isRegistroServiziLocale()){
			soggettoInUso = soggettiCore.isSoggettoInUso(soggettoRegistro, whereIsInUso, normalizeObjectIds, verificaRuoli);
		}else{
			soggettoInUso = soggettiCore.isSoggettoInUso(soggettoConfig, whereIsInUso, normalizeObjectIds, verificaRuoli);
		}


		if (soggettoInUso) {
			inUsoMessage.append(DBOggettiInUsoUtils.toString(idSoggetto, whereIsInUso, true, newLine, normalizeObjectIds));
			inUsoMessage.append(newLine);

		} 
		else if(soggettoConfig.isDominioDefault()) {
			String protocollo = soggettiCore.getProtocolloAssociatoTipoSoggetto(idSoggetto.getTipo());
			inUsoMessage.append("Il Soggetto '"+soggettiHelper.getLabelNomeSoggetto(protocollo, idSoggetto)+"',  essendo il soggeto predefinito per il profilo '"+
					soggettiHelper.getLabelProtocollo(protocollo)+"', non è eliminabile");
			inUsoMessage.append(newLine);
			inUsoMessage.append(newLine);
		}
		else {
			SoggettoCtrlStat sog = new SoggettoCtrlStat(soggettoRegistro, soggettoConfig);
			soggettiCore.performDeleteOperation(userLogin, soggettiHelper.smista(), sog);
			delete = true;
			
			if(soggettoRegistro!=null && !pddCore.isPddEsterna(soggettoRegistro.getPortaDominio())) {
				
				// sistemo utenze dopo l'aggiornamento
				IDSoggetto idSoggettoSelezionato = new IDSoggetto(soggettoRegistro.getTipo(), soggettoRegistro.getNome());
				utentiCore.modificaSoggettoUtilizzatoConsole(idSoggettoSelezionato.toString(), null); // annullo selezione
				
				deleteOperativo = true;
			}
		}
		
		SoggettiDelStatus delStatus = new SoggettiDelStatus();
		delStatus.setDeletedOperativo(deleteOperativo);
		delStatus.setDeleted(delete);
		return delStatus;
		
	}
	
	public static boolean soggettiCheckData(SoggettiCore soggettiCore, SoggettiHelper soggettiHelper,
			String newLine,
			String oldnomeprov, String oldtipoprov, boolean privato,
			TipoOperazione tipoOp, String id, String tipoprov, String nomeprov, String codiceIpa, String pdUrlPrefixRewriter, String paUrlPrefixRewriter,
			Soggetto soggettoOld, boolean isSupportatoAutenticazioneSoggetti, String descrizione, String portaDominio) throws Exception {
		
		// Controlli sui campi immessi
		boolean isOk = soggettiHelper.soggettiCheckData(tipoOp, id, tipoprov, nomeprov, codiceIpa, pdUrlPrefixRewriter, paUrlPrefixRewriter,
				soggettoOld, isSupportatoAutenticazioneSoggetti, descrizione, portaDominio);

		if(isOk){
			// check change tipo/nome con gestione workflow abilitata
			if(soggettiCore.isRegistroServiziLocale() && soggettiHelper.isShowGestioneWorkflowStatoDocumenti()){
				if( (!oldnomeprov.equals(nomeprov)) || (!oldtipoprov.equals(tipoprov)) ){
					HashMap<ErrorsHandlerCostant, String> whereIsInUso = new HashMap<>();
					if (soggettiCore.isSoggettoInUsoInPackageFinali(soggettoOld, whereIsInUso)) {
						Set<ErrorsHandlerCostant> keys = whereIsInUso.keySet();
						String tipoNome = soggettoOld.getTipo() + "/" + soggettoOld.getNome();
						StringBuilder bf = new StringBuilder();
						bf.append("Tipo o Nome del soggetto ");
						bf.append(tipoNome);
						bf.append(" non modificabile poiche' :"+newLine);
						for (ErrorsHandlerCostant key : keys) {
							String msg = whereIsInUso.get(key);

							if (ErrorsHandlerCostant.IN_USO_IN_SERVIZI.toString().equals(key.toString())) {
								bf.append("- erogatore di Servizi in uno stato finale: " + msg + newLine);
							}
							else if (ErrorsHandlerCostant.POSSIEDE_FRUITORI.toString().equals(key.toString())) {
								bf.append("- fruitore in uno stato finale: " + msg + newLine);
							}
							else if (ErrorsHandlerCostant.IS_REFERENTE.toString().equals(key.toString())) {
								bf.append("- referente di un accordo di servizio in uno stato finale: " + msg + newLine);
							}
							else if (ErrorsHandlerCostant.IS_REFERENTE_COOPERAZIONE.toString().equals(key.toString())) {
								bf.append("- referente di un accordo di cooperazione in uno stato finale: " + msg + newLine);
							}
							else if (ErrorsHandlerCostant.IS_PARTECIPANTE_COOPERAZIONE.toString().equals(key.toString())) {
								bf.append("- soggetto partecipante di un accordo di cooperazione in uno stato finale: " + msg + newLine);
							}

						}// chiudo for

						bf.append(newLine);
						isOk = false;
						soggettiHelper.getPd().setMessage(bf.toString(), Costanti.MESSAGE_TYPE_INFO);
					} 
				}
			}
		}

		if(isOk &&
			// check visibilita
			soggettiCore.isRegistroServiziLocale() && soggettiCore.isShowFlagPrivato() && privato) {
			HashMap<ErrorsHandlerCostant, String> whereIsInUso = new HashMap<>();
			if (soggettiCore.isSoggettoInUsoInPackagePubblici(soggettoOld, whereIsInUso)) {
				Set<ErrorsHandlerCostant> keys = whereIsInUso.keySet();
				String tipoNome = soggettoOld.getTipo() + "/" + soggettoOld.getNome();
				StringBuilder bf = new StringBuilder();
				bf.append("Visibilita' del soggetto ");
				bf.append(tipoNome);
				bf.append(" non impostabile a privata poichè :"+newLine);
				for (ErrorsHandlerCostant key : keys) {
					String msg = whereIsInUso.get(key);

					if (ErrorsHandlerCostant.IN_USO_IN_SERVIZI.toString().equals(key.toString())) {
						bf.append("- erogatore di Servizi con visibilita' pubblica: " + msg + newLine);
					}
					else if (ErrorsHandlerCostant.POSSIEDE_FRUITORI.toString().equals(key.toString())) {
						bf.append("- fruitore di servizi con visibilita' pubblica: " + msg + newLine);
					}
					else if (ErrorsHandlerCostant.IS_REFERENTE.toString().equals(key.toString())) {
						bf.append("- referente di un accordo di servizio con visibilita' pubblica: " + msg + newLine);
					}
					else if (ErrorsHandlerCostant.IS_REFERENTE_COOPERAZIONE.toString().equals(key.toString())) {
						bf.append("- referente di un accordo di cooperazione con visibilita' pubblica: " + msg + newLine);
					}
					else if (ErrorsHandlerCostant.IS_PARTECIPANTE_COOPERAZIONE.toString().equals(key.toString())) {
						bf.append("- soggetto partecipante di un accordo di cooperazione con visibilita' pubblica: " + msg + newLine);
					}

				}// chiudo for

				bf.append("<br>");
				isOk = false;
				soggettiHelper.getPd().setMessage(bf.toString(),Costanti.MESSAGE_TYPE_INFO);
			}
		}
		
		return isOk;
	}
}