IDServizioFactory.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 org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.constants.TipologiaServizio;

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

	private static final String TIPO_NON_FORNITO = "Tipo non fornito";
	private static final String NOME_NON_FORNITO = "Nome non fornito";
	private static final String SOGGETTO_EROGATORE_NON_FORNITO = "Soggetto erogatore non fornito";
	private static final String TIPO_SOGGETTO_EROGATORE_NON_FORNITO = "Tipo soggetto erogatore non fornito";
	private static final String NOME_SOGGETTO_EROGATORE_NON_FORNITO = "Nome soggetto erogatore non fornito";
	private static final String SINTASSI_NON_CORRETTA = "sintassi non corretta, atteso tipoSoggetto/nomeSoggetto:tipoServizio/nomeServizio:versione";
	
	private static IDServizioFactory factory = null;
	private static synchronized void init(){
		if(IDServizioFactory.factory==null){
			IDServizioFactory.factory = new IDServizioFactory();
		}
	}
	public static IDServizioFactory getInstance(){
		if(IDServizioFactory.factory==null){
			// spotbugs warning 'SING_SINGLETON_GETTER_NOT_SYNCHRONIZED'
			synchronized (IDServizioFactory.class) {
				IDServizioFactory.init();
			}
		}
		return IDServizioFactory.factory;
	}
	
	private IDServizioFactory() {}

	@SuppressWarnings("deprecation")
	private IDServizio build(String tipo,String nome,IDSoggetto soggettoErogatore,int versione){
		IDServizio idServizio = new IDServizio();
		idServizio.setTipo(tipo);
		idServizio.setNome(nome);
		idServizio.setSoggettoErogatore(soggettoErogatore);
		idServizio.setVersione(versione);
		return idServizio;
	}
	
	public String normalizeUri(String uri) throws DriverRegistroServiziException{
		// La uri può non contenere la versione, che invece nella 3.0 è obbligatoria.
		// Facendo la doppia conversione, viene aggiunta la versione di default
		IDServizio idServizio = this.getIDServizioFromUri(uri);
		return this.getUriFromIDServizio(idServizio);
	}
	
	public String getUriFromIDServizio(IDServizio idServizio) throws DriverRegistroServiziException{
		if(idServizio==null){
			throw new DriverRegistroServiziException("IDServizio non fornito");
		}
		if(idServizio.getTipo()==null){
			throw new DriverRegistroServiziException(TIPO_NON_FORNITO);
		}
		if(idServizio.getNome()==null){
			throw new DriverRegistroServiziException(NOME_NON_FORNITO);
		}
		IDSoggetto soggettoErogatore = idServizio.getSoggettoErogatore();
		if(soggettoErogatore==null){
			throw new DriverRegistroServiziException(SOGGETTO_EROGATORE_NON_FORNITO);
		}
		if(soggettoErogatore.getTipo()==null){
			throw new DriverRegistroServiziException(TIPO_SOGGETTO_EROGATORE_NON_FORNITO);
		}
		if(soggettoErogatore.getNome()==null){
			throw new DriverRegistroServiziException(NOME_SOGGETTO_EROGATORE_NON_FORNITO);
		}
		return soggettoErogatore.toString() + ":" + idServizio.getTipo()+"/"+idServizio.getNome() + ":" + idServizio.getVersione();
	}
	
	public String getUriFromAccordo(AccordoServizioParteSpecifica accordo)  throws DriverRegistroServiziException{
		if(accordo==null){
			throw new DriverRegistroServiziException("Accordo non fornito");
		}
		IDServizio idServizio = this.build(accordo.getTipo(),accordo.getNome(),
				BeanUtilities.getSoggettoErogatore(accordo),accordo.getVersione());
		return this.getUriFromIDServizio(idServizio);
	}
	
	public String getUriFromValues(String tipo, String nome,String tipoSoggettoErogatore,String nomeSoggettoErogatore,int ver)  throws DriverRegistroServiziException{
		if(tipo==null){
			throw new DriverRegistroServiziException(TIPO_NON_FORNITO);
		}
		if(nome==null){
			throw new DriverRegistroServiziException(NOME_NON_FORNITO);
		}
		if(tipoSoggettoErogatore==null){
			throw new DriverRegistroServiziException(TIPO_SOGGETTO_EROGATORE_NON_FORNITO);
		}
		if(nomeSoggettoErogatore==null){
			throw new DriverRegistroServiziException(NOME_SOGGETTO_EROGATORE_NON_FORNITO);
		}
		IDSoggetto soggettoErogatore = new IDSoggetto(tipoSoggettoErogatore,nomeSoggettoErogatore);
		IDServizio idServizio = this.build(tipo,nome,soggettoErogatore,ver);
		return this.getUriFromIDServizio(idServizio);
	}
	
	public String getUriFromValues(String tipo, String nome,IDSoggetto soggettoErogatore,int ver)  throws DriverRegistroServiziException{
		if(soggettoErogatore==null){
			throw new DriverRegistroServiziException(SOGGETTO_EROGATORE_NON_FORNITO);
		}
		return getUriFromValues(tipo, nome, soggettoErogatore.getTipo(), soggettoErogatore.getNome(), ver);
	}
	
	public IDServizio getIDServizioFromUri(String uriAccordo) throws DriverRegistroServiziException{
		try{
		
			// sintassi
			// tipoSoggetto/nomeSoggetto:tipoServizio/nomeServizio:versione
			
			if(uriAccordo==null){
				throw new DriverRegistroServiziException("Uri accordo non fornita");
			}
			int primoMarcatore = uriAccordo.indexOf(":");
			int secondoMarcatore = -1;
			if(primoMarcatore>=0){
				secondoMarcatore = uriAccordo.indexOf(":",primoMarcatore+1);
			}
			int terzoMarcatore = -1;
			if(secondoMarcatore>0){
				terzoMarcatore = uriAccordo.indexOf(":",secondoMarcatore+1);
				if(terzoMarcatore>0){
					throw new DriverRegistroServiziException(SINTASSI_NON_CORRETTA);
				}
			}
			
			if(primoMarcatore<0){
				throw new DriverRegistroServiziException(SINTASSI_NON_CORRETTA);
			}
			if(secondoMarcatore<=0){
				throw new DriverRegistroServiziException(SINTASSI_NON_CORRETTA);
			}
			
			String tmp1 = null; 
			String tmp2 = null;
			String tmp3 = null;
			tmp1 = uriAccordo.substring(0, primoMarcatore); //soggetto erogatore
			tmp2 = uriAccordo.substring((primoMarcatore+1), secondoMarcatore); // servizio
			tmp3 = uriAccordo.substring((secondoMarcatore+1),uriAccordo.length()); // versione
			
			int divisorioSoggettoErogatore = tmp1.indexOf("/");
			if(divisorioSoggettoErogatore<=0){
				throw new DriverRegistroServiziException("sintassi del soggetto erogatore non corretta, l'uri deve essere definita con la seguente forma: tipoSoggetto/nomeSoggetto:tipoServizio/nomeServizio:versione");
			}
			String tipoSoggettoErogatore = tmp1.substring(0,divisorioSoggettoErogatore);
			String nomeSoggettoErogatore = tmp1.substring((divisorioSoggettoErogatore+1),tmp1.length());
			IDSoggetto soggettoErogatore = new IDSoggetto(tipoSoggettoErogatore,nomeSoggettoErogatore);
			
			int divisorioServizio = tmp2.indexOf("/");
			if(divisorioServizio<=0){
				throw new DriverRegistroServiziException("sintassi del servizio non corretta, l'uri deve essere definita con la seguente forma: tipoSoggetto/nomeSoggetto:tipoServizio/nomeServizio:versione");
			}
			String tipoServizio = tmp2.substring(0,divisorioServizio);
			String nomeServizio = tmp2.substring((divisorioServizio+1),tmp2.length());
			
			int versione = 1;
			try{
				versione = Integer.parseInt(tmp3);
			}catch(Exception e){
				throw new DriverRegistroServiziException("sintassi della versione non corretta: "+e.getMessage(),e);
			}
			
			return this.build(tipoServizio,nomeServizio,soggettoErogatore,versione);
	
		}catch(Exception e){
			throw new DriverRegistroServiziException("Parsing uriAccordo["+uriAccordo+"] non riusciuto: "+e.getMessage());
		}
	}
	
	public IDServizio getIDServizioFromAccordo(AccordoServizioParteSpecifica accordo) throws DriverRegistroServiziException{
		if(accordo==null){
			throw new DriverRegistroServiziException("Accordo non fornito");
		}
		IDServizio idServizio = this.build(accordo.getTipo(), accordo.getNome(),
				new IDSoggetto(accordo.getTipoSoggettoErogatore(),accordo.getNomeSoggettoErogatore()),
				accordo.getVersione());
		if(TipologiaServizio.CORRELATO.equals(accordo.getTipologiaServizio())){
			idServizio.setTipologia(org.openspcoop2.core.constants.TipologiaServizio.CORRELATO);
		}
		else{
			idServizio.setTipologia(org.openspcoop2.core.constants.TipologiaServizio.NORMALE);
		}
		idServizio.setUriAccordoServizioParteComune(accordo.getAccordoServizioParteComune());
		idServizio.setPortType(accordo.getPortType());
		return idServizio;
	}
	
	public IDServizio getIDServizioFromValues(String tipo,String nome,String tipoSoggettoErogatore,String nomeSoggettoErogatore,int ver) throws DriverRegistroServiziException{
		if(tipo==null){
			throw new DriverRegistroServiziException(TIPO_NON_FORNITO);
		}
		if(nome==null){
			throw new DriverRegistroServiziException(NOME_NON_FORNITO);
		}
		if(tipoSoggettoErogatore==null){
			throw new DriverRegistroServiziException(TIPO_SOGGETTO_EROGATORE_NON_FORNITO);
		}
		if(nomeSoggettoErogatore==null){
			throw new DriverRegistroServiziException(NOME_SOGGETTO_EROGATORE_NON_FORNITO);
		}
		IDSoggetto soggettoErogatore = new IDSoggetto(tipoSoggettoErogatore,nomeSoggettoErogatore);
		return this.build(tipo,nome,soggettoErogatore,ver);
	}
	public IDServizio getIDServizioFromValuesWithoutCheck(String tipo,String nome,String tipoSoggettoErogatore,String nomeSoggettoErogatore,int ver) {
		IDSoggetto soggettoErogatore = new IDSoggetto(tipoSoggettoErogatore,nomeSoggettoErogatore);
		return this.build(tipo,nome,soggettoErogatore,ver);
	}
	public IDServizio getIDServizioFromValues(String tipo,String nome,IDSoggetto soggettoErogatore,int ver) throws DriverRegistroServiziException{
		if(soggettoErogatore==null){
			throw new DriverRegistroServiziException(SOGGETTO_EROGATORE_NON_FORNITO);
		}
		IDServizio idServ = this.getIDServizioFromValues(tipo, nome, soggettoErogatore.getTipo(), soggettoErogatore.getNome(), ver);
		idServ.getSoggettoErogatore().setCodicePorta(soggettoErogatore.getCodicePorta());
		return idServ;
	}
	
	
}