SICAtoOpenSPCoopContext.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.spcoop.sica;

import java.util.HashMap;
import java.util.Map;

import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.protocol.sdk.registry.IRegistryReader;



/**
* Contesto per la classe SICAtoOpenSPCoopContext
*
* @author Andrea Poli (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
*/
public class SICAtoOpenSPCoopContext {

	private static SICAtoOpenSPCoopContext staticContext = null;
	public static void initSICAtoOpenSPCoopContext() throws SICAToOpenSPCoopUtilitiesException{
		initSICAtoOpenSPCoopContext(null);
	}
	public static synchronized void initSICAtoOpenSPCoopContext(String configurationFile) throws SICAToOpenSPCoopUtilitiesException{
		if(staticContext==null){
			staticContext = new SICAtoOpenSPCoopContext(configurationFile);
		}
	}
	public static SICAtoOpenSPCoopContext getInstance() throws SICAToOpenSPCoopUtilitiesException{
		if(staticContext==null){
			initSICAtoOpenSPCoopContext(DEFAULT_SICA_PROPERTIES_NAME);
		}
		return staticContext;
	}
	
	private static String DEFAULT_SICA_PROPERTIES_NAME = "sica";

	private String configurationFile;
	public SICAtoOpenSPCoopContext() throws SICAToOpenSPCoopUtilitiesException{
		this(DEFAULT_SICA_PROPERTIES_NAME);
	}
	public SICAtoOpenSPCoopContext(String configurationFile) throws SICAToOpenSPCoopUtilitiesException{
		try{
			this.configurationFile = configurationFile;
			
			this.SICAClient_generaProject = Boolean.parseBoolean(readProperty("SICAClient.project"));
			this.SICAClient_includiInfoRegistroGenerale = Boolean.parseBoolean(readProperty("SICAClient.includiInfoRegistroGenerale"));
			this.SICAClient_nomeAccordo_32CaratteriMax = Boolean.parseBoolean(readProperty("SICAClient.nomeAccordo.32CaratteriMax"));
			
			this.InformazioniEGov_specificaSemiformale = Boolean.parseBoolean(readProperty("InformazioniEGov.specificaSemiformale"));
			this.InformazioniEGov_wscp = Boolean.parseBoolean(readProperty("InformazioniEGov.wscp"));
			this.InformazioniEGov_wscpDisabled_namespaceCnipa = Boolean.parseBoolean(readProperty("InformazioniEGov.wscpDisabled.namespace.cnipa"));
			this.InformazioniEGov_wscpDisabled_childUnqualified = Boolean.parseBoolean(readProperty("InformazioniEGov.wscpDisabled.childUnqualified"));
			this.InformazioniEGov_wscpEnabled_childUnqualified = Boolean.parseBoolean(readProperty("InformazioniEGov.wscpEnabled.childUnqualified"));
			this.InformazioniEGov_nomiSPCoop_qualified = Boolean.parseBoolean(readProperty("InformazioniEGov.nomiSPCoop.qualified"));
			
			this.WSDL_XSD_prettyDocuments = Boolean.parseBoolean(readProperty("WSDL_XSD.prettyDocuments"));
			this.WSDL_XSD_allineaImportInclude = Boolean.parseBoolean(readProperty("WSDL_XSD.allineaImportInclude"));
			this.WSDL_XSD_accordiParteSpecifica_gestioneParteComune = Boolean.parseBoolean(readProperty("WSDL_XSD.accordiParteSpecifica.gestioneParteComune"));
			this.WSDL_XSD_accordiParteSpecifica_openspcoopToSica_eliminazioneImportParteComune = Boolean.parseBoolean(readProperty("WSDL_XSD.accordiParteSpecifica.openspcoopToSica.eliminazioneImportParteComune"));
			this.WSDL_XSD_accordiParteSpecifica_sicaToOpenspcoop_aggiuntaImportParteComune = Boolean.parseBoolean(readProperty("WSDL_XSD.accordiParteSpecifica.sicaToOpenspcoop.aggiuntaImportParteComune"));
			this.WSDL_XSD_accordiParteSpecifica_wsdlEmpty = Boolean.parseBoolean(readProperty("WSDL_XSD.accordiParteSpecifica.wsdlEmpty"));
			
			this.setSICAClientEnabledOptions(readProperty("SICAClient.opzioniAbilitate"));
			this.setSICAClientDisabledOptions(readProperty("SICAClient.opzioniDisabilitate"));
		}
		catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException(e);
		}
	}	
	

	private java.util.ResourceBundle bundle = null;
	public java.util.ResourceBundle getBundle() {
		return this.bundle;
	}
	public void setBundle(java.util.ResourceBundle bundle) {
		this.bundle = bundle;
	}
	private synchronized void initResourceBundle(){
		if(this.bundle==null){
			this.bundle = java.util.ResourceBundle.getBundle(this.configurationFile);
		} 
	}
	
	private String readProperty(String key) throws Exception{
		if(this.bundle==null){
			initResourceBundle();
		}
		String properties = this.bundle.getString(key);
		if(properties==null)
			throw new Exception("Proprieta ["+key+"] non trovata");
		return properties.trim();
	}
	
	
	
	
	// -------- Opzioni di compatibilita' con SICA Client -----------------

	/** Indicazione se i package vengono generati con il .project
	  Tale file e' necessario per importare i package nel SICAClient */
	private boolean SICAClient_generaProject = true;

	/** Indicazione se i package vengono generate con le informazioni 
	 inserite dal RegistroSICA Generale in fase di pubblicazione:
	 - versione
	 - soggetto erogatore/referente */
	private boolean SICAClient_includiInfoRegistroGenerale = true;

	/** Indica se il nome degli accordi deve essere limitato al numero di caratteri limite uguale a 32. */
	private boolean  SICAClient_nomeAccordo_32CaratteriMax = true;


	// --------- Documento di Modalita' esplicita delle informazioni eGov -------------

	/** Indicazione se le informazioni sul protocollo spcoop vengono inserite
	 come documento di specifica semiformale (proprietà = true) o come allegato generico (proprietà = false) */ 
	private boolean InformazioniEGov_specificaSemiformale = true;

	/** Indicazione se le informazioni sul protocollo spcoop vengono generate tramite lo schema xsd
	 utilizzato nel ClientSICA  o tramite lo schema definito dal documento
	 'Struttura dell'accordo di servizio e dell'accordo di cooperazione: versione 1.0' del CNIPA */
	private boolean InformazioniEGov_wscp = false;
	
	/** Opzione valida SOLO SE InformazioniEGov.wscp = false
	 Indicare il namespace da utilizzare per le informazioni sul protocollo spcoop.
	 Sul documento  'Struttura dell'accordo di servizio e dell'accordo di cooperazione: versione 1.0' del cnipa viene indicato "http://www.cnipa.it/collProfiles" (true)
	 Da comunicazioni CNIPA il namespace sembrerebbe comunque cambiato in "http://spcoop.gov.it/collProfiles" (false) */
	private boolean InformazioniEGov_wscpDisabled_namespaceCnipa = false;
	
	/** Opzione valida SOLO SE InformazioniEGov.wscp = false
	 il Client SICA permette di costruire XML che possiedono un prefix nel root element,
	 ma poi non usato negli elementi interni.
	 Es:
	 <tns:egovDecllElement xmlns:tns="http://spcoop.gov.it/collProfiles" ...>
	 		<e-govVersion>....
	 Questo XML non e' validabile rispetto all'XSD poiche' e-govVersion non e' qualificato.
	
	 Se si abilita la proprieta' sottostante, vengono accettati anche tali file XML malformati. */
	private boolean InformazioniEGov_wscpDisabled_childUnqualified=true;

	/** Opzione valida SOLO SE InformazioniEGov.wscp = true
	 Il client SICA si aspetta un file wscp che possiedono un prefix nel root element wscp,
	 e che negli elementi interni tale prefix non venga utilizzato.
	 Se si costruisce un xml regolare (con anche gli elementi interni correttamente qualificati) il client SICA da errore
	 Es di xml atteso:
	 <wspc:profiloCollaborazioneEGOV xmlns:wscp="http://spcoop.gov.it/sica/wscp" ...>
	 		<versioneEGOV>....
	
	 Se si abilita la proprieta' sottostante, vengono sia gestiti (e accettati) che prodotti xml compatibili con il ClientSICA (non validabili rispetto all'xsd) */
	private boolean InformazioniEGov_wscpEnabled_childUnqualified=true;
	
	/** Indicazione se nelle informazioni sul protocollo spcoop vengono inseriti nomi di azioni e servizi qualificati con prefisso e namespace
	  Il Namespace utilizzato sara' il target namespace del wsdl concettuale */
	private boolean  InformazioniEGov_nomiSPCoop_qualified=true;



	// --------- Gestione documenti WSDL/XSD ----------------------

	/** Indicazione se i documenti trattati devono essere formattati */
	private boolean WSDL_XSD_prettyDocuments = false;

	/** Indicazione se i wsdl e gli xsd presenti nei package devono essere preprocessati prima
	 di importarli o esportali nel registro dei servizi di OpenSPCoop.
	 In caso di pre-processamento attivo, tutti gli import e gli include presenti vengono allineati
	 con la struttura dei package del registro dei servizi di OpenSPCoop (in caso di import) 
	 o con la struttura dei package CNIPA (in caso di export) */
	private boolean WSDL_XSD_allineaImportInclude = true;

	/** Se viene abilitata l'opzione:
	 - in fase di ESPORTAZIONE, dal registro dei servizi OpenSPCoop, 
	 	i package degli accordi parte specifica conterranno dei porti di accesso WSDL che includono la parte comune direttamente nel WSDL.
	 - in fase di IMPORTAZIONE dei package viene attuato il processo inverso.*/ 
	private boolean WSDL_XSD_accordiParteSpecifica_gestioneParteComune = true;
	
	/** Questa opzione viene interpretata solo se l'opzione  'WSDL_XSD.accordiParteSpecifica.gestioneParteComune' e' disabilitata
	 Se si abilita, in fase di esportazione viene controllato che all'interno del wsdl implementativo l'import della parte comune non sia presente (e se presente viene eliminato).*/
	private boolean WSDL_XSD_accordiParteSpecifica_openspcoopToSica_eliminazioneImportParteComune = false;

	/** Questa opzione viene interpretata solo se l'opzione  'WSDL_XSD.accordiParteSpecifica.gestioneParteComune' e' disabilitata
	 Se si abilita, in fase di importazione viene controllato che all'interno del wsdl implementativo l'import della parte comune sia presente (e se non presente viene aggiunto). */
	private boolean WSDL_XSD_accordiParteSpecifica_sicaToOpenspcoop_aggiuntaImportParteComune = false;
	
	/** Indicazione se devono essere prodotti dei WSDL vuoti, in caso non sia definita la parte implementativa fruitore o erogatore
	 negli accordi di servizio parte specifica */
	private boolean WSDL_XSD_accordiParteSpecifica_wsdlEmpty = true;
	
	
	
	
	// --------- Compatibilita' Client SICA ----------------------
	/** Indicazione se i package devono essere creati SICAClient compatibility */
	private boolean SICAClientCompatibility = false;
	
	/** Lista di proprieta' sopra definite, separate da virgola, che si vogliono utilizzare come abilitate per creare package compatibili per il ClientSICA */
	private Map<String, Boolean> SICAClientEnabledOptions = new HashMap<String, Boolean>();
	
	/** Lista di proprieta' sopra definite, separate da virgola, che si vogliono utilizzare come disabilitate per creare package compatibili per il ClientSICA */
	private Map<String, Boolean> SICAClientDisabledOptions = new HashMap<String, Boolean>();
	
	
	
	
	// --------- Array list contenente il mapping fra Soggetti e CodiciIPA
	private Map<String, String> mappingSoggettoSPCoopToCodiceIPA = new HashMap<>();
	
	public void addMappingSoggettoSPCoopToCodiceIPA(IDSoggetto idSoggettoSPCoop,String codiceIPA){
		if(codiceIPA==null || idSoggettoSPCoop==null || idSoggettoSPCoop.toString() ==null)
			return;
		if(this.mappingSoggettoSPCoopToCodiceIPA.containsKey(idSoggettoSPCoop.toString())==false)
			this.mappingSoggettoSPCoopToCodiceIPA.put(idSoggettoSPCoop.toString(), codiceIPA);
	}
	
	public String getCodiceIPA(IDSoggetto idSoggettoSPCoop){
		return this.mappingSoggettoSPCoopToCodiceIPA.get(idSoggettoSPCoop.toString());
	}
	
	public String getCodiceIPA(String nomeSoggetto){
		return this.getCodiceIPA(new IDSoggetto("spc", nomeSoggetto));
	}
	
	public IDSoggetto getIDSoggetto(String codiceIPA){
		if(this.mappingSoggettoSPCoopToCodiceIPA.containsValue(codiceIPA)){
			for (String key : this.mappingSoggettoSPCoopToCodiceIPA.keySet()) {
				String value = this.mappingSoggettoSPCoopToCodiceIPA.get(key);
				if(value.equals(codiceIPA)){
					String [] split = key.split("/");
					return new IDSoggetto(split[0],split[1]);
				}
			}
		}
		return null;
	}
	
	
	
	
	// --------- Array list contenente il mapping fra uri AccordiServizioParteSpecifica e IDServizio OpenSPCoop
	private Map<String,String> mappingServizioSPCoopToUriAPS = new HashMap<>();
	
	public void addMappingServizioToUriAPS(IRegistryReader registryReader,IDServizio idServizioSPCoop) throws SICAToOpenSPCoopUtilitiesException{
		if(idServizioSPCoop==null || 
				idServizioSPCoop.getTipo()==null || idServizioSPCoop.getNome()==null || idServizioSPCoop.getVersione()==null ||
				idServizioSPCoop.getSoggettoErogatore()==null ||
				idServizioSPCoop.getSoggettoErogatore().getTipo()==null || idServizioSPCoop.getSoggettoErogatore().getNome()==null){
			return;
		}
		String keyServizioSPCoop = null;
		try{
			keyServizioSPCoop = IDServizioFactory.getInstance().getUriFromIDServizio(idServizioSPCoop);
		}catch(Exception e){
			// non dovrebbe avvenire errore
			return;
		}
		if(this.mappingServizioSPCoopToUriAPS.containsKey(keyServizioSPCoop)==false){
			this.mappingServizioSPCoopToUriAPS.put(keyServizioSPCoop, 
					SICAtoOpenSPCoopUtilities.idAccordoServizioParteSpecifica_openspcoopToSica(registryReader,idServizioSPCoop, this));
		}
	}
	
	public String getUriAPS(IDServizio idServizioSPCoop){
		return this.mappingServizioSPCoopToUriAPS.get(idServizioSPCoop.toString());
	}
	
	public IDServizio getIDServizio(String uriAPS){
		if(this.mappingServizioSPCoopToUriAPS.containsValue(uriAPS)){
			for (String key : this.mappingServizioSPCoopToUriAPS.keySet()) {
				String value = this.mappingServizioSPCoopToUriAPS.get(key);
				if(value.equals(uriAPS)){
					try{
						return IDServizioFactory.getInstance().getIDServizioFromUri(key);
					}catch(Exception e){
						throw new RuntimeException("(key["+key+"] value["+value+"]) "+ e.getMessage(),e);
					}
				}
			}
		}
		return null;
	}
	
	
	
	
	
	// ----------- Metodi di Get/Set ----------------------------
	
	public boolean isSICAClient_generaProject() {
		return checkOption("SICAClient.project",this.SICAClient_generaProject);
	}

	public void setSICAClient_generaProject(boolean client_generaProject) {
		this.SICAClient_generaProject = client_generaProject;
	}

	public boolean isSICAClient_includiInfoRegistroGenerale() {
		return checkOption("SICAClient.includiInfoRegistroGenerale",this.SICAClient_includiInfoRegistroGenerale);
	}

	public void setSICAClient_includiInfoRegistroGenerale(
			boolean client_includiInfoRegistroGenerale) {
		this.SICAClient_includiInfoRegistroGenerale = client_includiInfoRegistroGenerale;
	}

	public boolean isSICAClient_nomeAccordo_32CaratteriMax() {
		return checkOption("SICAClient.nomeAccordo.32CaratteriMax",this.SICAClient_nomeAccordo_32CaratteriMax);
	}
	public void setSICAClient_nomeAccordo_32CaratteriMax(
			boolean client_nomeAccordo_32CaratteriMax) {
		this.SICAClient_nomeAccordo_32CaratteriMax = client_nomeAccordo_32CaratteriMax;
	}
	
	public boolean isWSDL_XSD_accordiParteSpecifica_wsdlEmpty() {
		return checkOption("WSDL_XSD.accordiParteSpecifica.wsdlEmpty",this.WSDL_XSD_accordiParteSpecifica_wsdlEmpty);
	}

	public void setWSDL_XSD_accordiParteSpecifica_wsdlEmpty(
			boolean client_accordiParteSpecifica_wsdlEmpty) {
		this.WSDL_XSD_accordiParteSpecifica_wsdlEmpty = client_accordiParteSpecifica_wsdlEmpty;
	}

	public boolean isInformazioniEGov_specificaSemiformale() {
		return checkOption("InformazioniEGov.specificaSemiformale",this.InformazioniEGov_specificaSemiformale);
	}

	public void setInformazioniEGov_specificaSemiformale(
			boolean informazioniEGov_specificaSemiformale) {
		this.InformazioniEGov_specificaSemiformale = informazioniEGov_specificaSemiformale;
	}

	public boolean isInformazioniEGov_wscp() {
		return checkOption("InformazioniEGov.wscp",this.InformazioniEGov_wscp);
	}

	public void setInformazioniEGov_wscp(boolean informazioniEGov_wscp) {
		this.InformazioniEGov_wscp = informazioniEGov_wscp;
	}

	public boolean isInformazioniEGov_wscpDisabled_namespaceCnipa() {
		return this.InformazioniEGov_wscpDisabled_namespaceCnipa;
	}
	public void setInformazioniEGov_wscpDisabled_namespaceCnipa(
			boolean informazioniEGovWscpDisabledNamespaceCnipa) {
		this.InformazioniEGov_wscpDisabled_namespaceCnipa = informazioniEGovWscpDisabledNamespaceCnipa;
	}
	
	public boolean isInformazioniEGov_wscpDisabled_childUnqualified() {
		return this.InformazioniEGov_wscpDisabled_childUnqualified;
	}
	public void setInformazioniEGov_wscpDisabled_childUnqualified(
			boolean informazioniEGovWscpDisabledChildUnqualified) {
		this.InformazioniEGov_wscpDisabled_childUnqualified = informazioniEGovWscpDisabledChildUnqualified;
	}
	public boolean isInformazioniEGov_wscpEnabled_childUnqualified() {
		return this.InformazioniEGov_wscpEnabled_childUnqualified;
	}
	public void setInformazioniEGov_wscpEnabled_childUnqualified(
			boolean informazioniEGovWscpEnabledChildUnqualified) {
		this.InformazioniEGov_wscpEnabled_childUnqualified = informazioniEGovWscpEnabledChildUnqualified;
	}
	
	public boolean isInformazioniEGov_nomiSPCoop_qualified() {
		return this.InformazioniEGov_nomiSPCoop_qualified;
	}
	public void setInformazioniEGov_nomiSPCoop_qualified(
			boolean informazioniEGovNomiSPCoopQualified) {
		this.InformazioniEGov_nomiSPCoop_qualified = informazioniEGovNomiSPCoopQualified;
	}
	
	public boolean isWSDL_XSD_prettyDocuments() {
		return checkOption("WSDL_XSD.prettyDocuments",this.WSDL_XSD_prettyDocuments);
	}

	public void setWSDL_XSD_prettyDocuments(boolean documents) {
		this.WSDL_XSD_prettyDocuments = documents;
	}

	public boolean isWSDL_XSD_allineaImportInclude() {
		return checkOption("WSDL_XSD.allineaImportInclude",this.WSDL_XSD_allineaImportInclude);
	}

	public void setWSDL_XSD_allineaImportInclude(boolean importInclude) {
		this.WSDL_XSD_allineaImportInclude = importInclude;
	}

	public boolean isWSDL_XSD_accordiParteSpecifica_gestioneParteComune() {
		return checkOption("WSDL_XSD.accordiParteSpecifica.gestioneParteComune",this.WSDL_XSD_accordiParteSpecifica_gestioneParteComune);
	}

	public void setWSDL_XSD_accordiParteSpecifica_gestioneParteComune(
			boolean parteSpecifica_gestioneParteComune) {
		this.WSDL_XSD_accordiParteSpecifica_gestioneParteComune = parteSpecifica_gestioneParteComune;
	}

	public boolean isWSDL_XSD_accordiParteSpecifica_openspcoopToSica_eliminazioneImportParteComune() {
		return checkOption("WSDL_XSD.accordiParteSpecifica.openspcoopToSica.eliminazioneImportParteComune",this.WSDL_XSD_accordiParteSpecifica_openspcoopToSica_eliminazioneImportParteComune);
	}

	public void setWSDL_XSD_accordiParteSpecifica_openspcoopToSica_eliminazioneImportParteComune(
			boolean parteSpecifica_openspcoopToSica_eliminazioneImportParteComune) {
		this.WSDL_XSD_accordiParteSpecifica_openspcoopToSica_eliminazioneImportParteComune = parteSpecifica_openspcoopToSica_eliminazioneImportParteComune;
	}

	public boolean isWSDL_XSD_accordiParteSpecifica_sicaToOpenspcoop_aggiuntaImportParteComune() {
		return checkOption("WSDL_XSD.accordiParteSpecifica.sicaToOpenspcoop.aggiuntaImportParteComune",this.WSDL_XSD_accordiParteSpecifica_sicaToOpenspcoop_aggiuntaImportParteComune);
	}

	public void setWSDL_XSD_accordiParteSpecifica_sicaToOpenspcoop_aggiuntaImportParteComune(
			boolean parteSpecifica_sicaToOpenspcoop_aggiuntaImportParteComune) {
		this.WSDL_XSD_accordiParteSpecifica_sicaToOpenspcoop_aggiuntaImportParteComune = parteSpecifica_sicaToOpenspcoop_aggiuntaImportParteComune;
	}
	
	public boolean isSICAClientCompatibility() {
		return this.SICAClientCompatibility;
	}

	public void setSICAClientCompatibility(boolean clientCompatibility) {
		this.SICAClientCompatibility = clientCompatibility;
	}
	
	public void setSICAClientEnabledOptions(String enabledOptions){
		if(enabledOptions==null)
			return;
		String [] options = enabledOptions.trim().split(",");
		if(options!=null && options.length>0){
			for(int i=0; i<options.length; i++){
				//System.out.println("ABILITO PER SICA ["+options[i].trim()+"]");
				this.SICAClientEnabledOptions.put(options[i].trim(), true);
			}
		}
	}
	
	public void setSICAClientDisabledOptions(String disabledOptions){
		if(disabledOptions==null)
			return;
		String [] options = disabledOptions.trim().split(",");
		if(options!=null && options.length>0){
			for(int i=0; i<options.length; i++){
				//System.out.println("DISABILITO PER SICA ["+options[i].trim()+"]");
				this.SICAClientDisabledOptions.put(options[i].trim(), true);
			}
		}
	}
	
	private boolean checkOption(String name,boolean defaultValue){
		if(this.SICAClientCompatibility){
			if(this.SICAClientEnabledOptions.containsKey(name)){
				//System.out.println("ABILITO FORCED ["+name+"]");
				return true;
			}
			else if(this.SICAClientDisabledOptions.containsKey(name)){
				//System.out.println("DISABILITO FORCED ["+name+"]");
				return false;
			}
		}
		//System.out.println("NORMALE VALORE ["+name+"");
		return defaultValue;
	}
}