PorteNamingUtils.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.utils;

import java.util.List;

import org.openspcoop2.message.constants.ServiceBinding;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.config.IProtocolConfiguration;

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

	private IProtocolFactory<?> protocolFactory;
	private IProtocolConfiguration protocolConfiguration;
	private ServiceBinding serviceBindingDefault = null;
	
	public PorteNamingUtils(IProtocolFactory<?> protocolFactory) throws ProtocolException {
		this.protocolFactory = protocolFactory;
		this.protocolConfiguration = protocolFactory.createProtocolConfiguration();
		
		if(this.protocolFactory.getManifest().getBinding().getRest()!=null &&
				this.protocolFactory.getManifest().getBinding().getSoap()!=null) {
			// deve essere specificato un service binding di default
			switch(this.protocolFactory.getManifest().getBinding().getDefault()) {
			case REST:
				this.serviceBindingDefault = ServiceBinding.REST;
				break;
			case SOAP:
				this.serviceBindingDefault = ServiceBinding.SOAP;
				break;
			}
		}
		else if(this.protocolFactory.getManifest().getBinding().getRest()!=null) {
			this.serviceBindingDefault = ServiceBinding.REST;
		}
		else {
			this.serviceBindingDefault = ServiceBinding.SOAP;
		}
	}
	
	
	public String normalizePD(String nome) throws ProtocolException {
		// Convenzione PD: FRUITORE/EROGATORE/SERVIZIO/...
		// Ogni oggetto viene separato dal tipo "_"
		 int [] posizioneSoggetto = new int[2];
		 posizioneSoggetto[0] = 0;
		 posizioneSoggetto[1] = 1;
		 int [] posizioneServizio = new int[1];
		 posizioneServizio[0] = 2;
		 return _normalize(nome, posizioneSoggetto, posizioneServizio);
	}
	public String normalizePA(String nome) throws ProtocolException {
		// Convenzione PA: EROGATORE/SERVIZIO/...
		// Ogni oggetto viene separato dal tipo "_"
		 int [] posizioneSoggetto = new int[1];
		 posizioneSoggetto[0] = 0;
		 int [] posizioneServizio = new int[1];
		 posizioneServizio[0] = 1;
		 return _normalize(nome, posizioneSoggetto, posizioneServizio);
	}
	private String _normalize(String nome, int [] posizioneSoggetto, int [] posizioneServizio) throws ProtocolException {
		if(nome.contains("/")) {
			
			String tipoSoggettoDefault = this.protocolConfiguration.getTipoSoggettoDefault();
			String _tipoSoggettoDefault = tipoSoggettoDefault +"_";
			int _lengthTipoSoggettoDefault = _tipoSoggettoDefault.length();
			
			String tipoServizioDefault = this.protocolConfiguration.getTipoServizioDefault(this.serviceBindingDefault);
			String _tipoServizioDefault = tipoServizioDefault +"_";
			int _lengthTipoServizioDefault = _tipoServizioDefault.length();
			
			String [] tmp = nome.split("/");
			if(tmp.length>=3) {
				StringBuilder bf = new StringBuilder();
				for (int i = 0; i < tmp.length; i++) {
					if(i>0) {
						bf.append("/");
					}
					
					boolean soggetto = false;
					for (int j = 0; j < posizioneSoggetto.length; j++) {
						if(i==posizioneSoggetto[j]) {
							soggetto = true;
							break;
						}
					}
					
					boolean servizio = false;
					for (int j = 0; j < posizioneServizio.length; j++) {
						if(i==posizioneServizio[j]) {
							servizio = true;
							break;
						}
					}
					
					String s = tmp[i].trim();
					if(soggetto || servizio) {
						if(soggetto) {
							if(s.startsWith(_tipoSoggettoDefault) && s.length()>_lengthTipoSoggettoDefault) {
								bf.append(s.substring(_lengthTipoSoggettoDefault));
							}
							else {
								bf.append(s);
							}
						}
						else {
							if(s.startsWith(_tipoServizioDefault) && s.length()>_lengthTipoServizioDefault) {
								bf.append(s.substring(_lengthTipoServizioDefault));
							}
							else {
								bf.append(s);
							}
						}
					}
					else {
						bf.append(s);
					}
				}
				return bf.toString();
			}
			
		}
		return nome;
	}
	
	
	
	public String enrichPD(String nome) throws ProtocolException {
		// Convenzione PD: FRUITORE/EROGATORE/SERVIZIO/...
		// Ogni oggetto viene separato dal tipo "_"
		 int [] posizioneSoggetto = new int[2];
		 posizioneSoggetto[0] = 0;
		 posizioneSoggetto[1] = 1;
		 int [] posizioneServizio = new int[1];
		 posizioneServizio[0] = 2;
		 return _enrich(nome, posizioneSoggetto, posizioneServizio);
	}
	public String enrichPA(String nome) throws ProtocolException {
		// Convenzione PA: EROGATORE/SERVIZIO/...
		// Ogni oggetto viene separato dal tipo "_"
		 int [] posizioneSoggetto = new int[1];
		 posizioneSoggetto[0] = 0;
		 int [] posizioneServizio = new int[1];
		 posizioneServizio[0] = 1;
		 return _enrich(nome, posizioneSoggetto, posizioneServizio);
	}
	private String _enrich(String nome, int [] posizioneSoggetto, int [] posizioneServizio) throws ProtocolException {
		if(nome.contains("/")) {
			
			String tipoSoggettoDefault = this.protocolConfiguration.getTipoSoggettoDefault();
			String _tipoSoggettoDefault = tipoSoggettoDefault +"_";
			List<String> tipiSoggetto = this.protocolConfiguration.getTipiSoggetti();
			
			String tipoServizioDefault = this.protocolConfiguration.getTipoServizioDefault(this.serviceBindingDefault);
			String _tipoServizioDefault = tipoServizioDefault +"_";
			List<String> tipiServizi = this.protocolConfiguration.getTipiServizi(this.serviceBindingDefault);
			
			String [] tmp = nome.split("/");
			if(tmp.length>=3) {
				StringBuilder bf = new StringBuilder();
				for (int i = 0; i < tmp.length; i++) {
					if(i>0) {
						bf.append("/");
					}
					
					boolean soggetto = false;
					for (int j = 0; j < posizioneSoggetto.length; j++) {
						if(i==posizioneSoggetto[j]) {
							soggetto = true;
							break;
						}
					}
					
					boolean servizio = false;
					for (int j = 0; j < posizioneServizio.length; j++) {
						if(i==posizioneServizio[j]) {
							servizio = true;
							break;
						}
					}
					
					String s = tmp[i].trim();
					if(soggetto || servizio) {
						if(soggetto) {
							if(s.contains("_")==false) {
								bf.append(_tipoSoggettoDefault);	
							}
							else {
								boolean found = false;
								for (String tipoSoggetto : tipiSoggetto) {
									if(s.startsWith(tipoSoggetto+"_")) {
										found = true;
										break;
									}
								}
								if(!found) {
									bf.append(_tipoSoggettoDefault);	
								}
							}
							bf.append(s);
						}
						else {
							if(s.contains("_")==false) {
								bf.append(_tipoServizioDefault);	
							}
							else {
								boolean found = false;
								for (String tipoServizio : tipiServizi) {
									if(s.startsWith(tipoServizio+"_")) {
										found = true;
										break;
									}
								}
								if(!found) {
									bf.append(_tipoServizioDefault);	
								}
							}
							bf.append(s);
						}
					}
					else {
						bf.append(s);
					}
				}
				return bf.toString();
			}
			
		}
		return nome;
	}
	
}