ConnettoreJMSProperties.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.core.connettori;



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

import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.openspcoop2.utils.UtilsException;
import org.slf4j.Logger;

/**
 * Reader delle proprieta' di personalizzazione della spedizione attraverso il connettore JMS
 *  
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */

public class ConnettoreJMSProperties {

	public static final String JMS_PREFIX_PROPERTY = "org.openspcoop.pubblicazione.";
	
	/** Logger utilizzato per errori eventuali. */
	private static Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();


	/* ********  F I E L D S  P R I V A T I  ******** */

	/** Reader delle proprieta' impostate nel file 'govway.jmsPublisher.properties' */
	private Properties reader;

	/** Copia Statica */
	private static ConnettoreJMSProperties connettoreJMSProperties = null;


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

	/**
	 * Viene chiamato in causa per istanziare il properties reader
	 *
	 * 
	 */
	private ConnettoreJMSProperties() throws UtilsException {

		/* ---- Lettura del cammino del file di configurazione ---- */
		this.reader = new Properties();
		try(java.io.InputStream properties = ConnettoreJMSProperties.class.getResourceAsStream("/govway.jmsPublisher.properties");){  
			this.reader.load(properties);
		}catch(Exception e) {
			doError(e);
		}

	}
	private void doError(Exception e) throws UtilsException {
		ConnettoreJMSProperties.log.error("Riscontrato errore durante la lettura del file 'govway.jmsPublisher.properties': "+e.getMessage(),e);
	    throw new UtilsException("ConnettoreJMSProperties initialize error: "+e.getMessage(),e);
	}


	/**
	 * Il Metodo si occupa di inizializzare il propertiesReader 
	 *
	 * 
	 */
	public static boolean initialize(){

		try {
		    ConnettoreJMSProperties.connettoreJMSProperties = new ConnettoreJMSProperties();	
		    return true;
		}
		catch(Exception e) {
		    return false;
		}
	}
    
	/**
	 * Ritorna l'istanza di questa classe
	 *
	 * @return Istanza di Properties
	 * 
	 */
	public static ConnettoreJMSProperties getInstance(){
	    if(ConnettoreJMSProperties.connettoreJMSProperties==null) {
	    	// spotbugs warning 'SING_SINGLETON_GETTER_NOT_SYNCHRONIZED': l'istanza viene creata allo startup
	    	synchronized (ConnettoreJMSProperties.class) {
	    		if(ConnettoreJMSProperties.connettoreJMSProperties==null) {
	    			ConnettoreJMSProperties.initialize();
	    		}
	    	}
	    }
	    return ConnettoreJMSProperties.connettoreJMSProperties;
	}
    









	/* ********  M E T O D I  ******** */

	/**
	 * Restituisce una lista di identificatori dei servizi di pubblicazione definiti
	 *
	 * @return lista di identificatori dei servizi di pubblicazione definiti
	 * 
	 */
	public Map<String,IDServizio> getIDServiziPubblicazione() {	
		Map<String,IDServizio> servizi= new HashMap<>();
	    try{ 
			// Raccolta servizi
			java.util.List<String> idServizi = new java.util.ArrayList<>();	
			java.util.Enumeration<?> en = this.reader.propertyNames();
			for (; en.hasMoreElements() ;) {
			    String property = (String) en.nextElement();
			    if(property.startsWith(JMS_PREFIX_PROPERTY)){
				String key = (property.substring(JMS_PREFIX_PROPERTY.length()));
				int indexOf = key.indexOf(".");
				key = key.substring(0,indexOf);
				if(key != null)
				    key = key.trim();
				if(!idServizi.contains(key))
				    idServizi.add(key);
			    }
			}
			
			for(int i=0; i<idServizi.size(); i++){
			    /**log.info("Raccolta variabili per servizio ["+idServizi.get(i)+"]");*/
				
			    IDSoggetto idSoggetto = new IDSoggetto();
			    idSoggetto.setTipo((String)this.reader.get(JMS_PREFIX_PROPERTY+idServizi.get(i)+".tipoSoggettoErogatore"));
			    idSoggetto.setNome((String)this.reader.get(JMS_PREFIX_PROPERTY+idServizi.get(i)+".soggettoErogatore"));
				
			    String tipoServizio = (String)this.reader.get(JMS_PREFIX_PROPERTY+idServizi.get(i)+".tipoServizio");
			    String nomeServizio = (String)this.reader.get(JMS_PREFIX_PROPERTY+idServizi.get(i)+".servizio");
			    Integer versioneServizio = Integer.parseInt(((String)this.reader.get(JMS_PREFIX_PROPERTY+idServizi.get(i)+".versioneServizio")));
			    IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(tipoServizio, nomeServizio, idSoggetto, versioneServizio);
			    
			    /**log.info("Servizio ["+IDServizioFactory.getInstance().getUriFromIDServizio(idServizio)+"]");*/
			    servizi.put(idServizi.get(i),idServizio);
			}
			
			return servizi;
		
	    }catch(Throwable e) {
	    	ConnettoreJMSProperties.log.error("Riscontrato errore durante la lettura dei servizi pubblicatori : 'org.openspcoop.pubblicazione.*'",e);
	    	servizi = null;
	    	return servizi;
	    }  
	}
	
	/**
	 * Restituisce le proprieta' da utilizzare con il contesto JNDI di lookup, se impostate.
	 *
	 * @return proprieta' da utilizzare con il contesto JNDI di lookup.
	 * 
	 */
	public java.util.Properties getJNDIContextConfigurazione(String id) {	
		java.util.Properties prop = new java.util.Properties();
		try{ 
			String ricerca = JMS_PREFIX_PROPERTY + id +".jndi.contextProperty.";
			java.util.Enumeration<?> en = this.reader.propertyNames();
			for (; en.hasMoreElements() ;) {
				String property = (String) en.nextElement();
				if(property.startsWith(ricerca)){
					String key = (property.substring(ricerca.length()));
					if(key != null)
						key = key.trim();
					String value = this.reader.getProperty(property);
					if(value!=null)
						value = value.trim();
					if(key!=null && value!=null){
						prop.setProperty(key,value);
						/**System.out.println("context ["+key+"] ["+value+"]");*/
					}
				}
			}
			return prop;

		}catch(java.lang.Exception e) {
			String msg = "Riscontrato errore durante la lettura delle propriete' JNDI per la configurazione: "+e.getMessage();
			ConnettoreJMSProperties.log.error(msg,e);
			prop = null;
			return prop;
		}    
	}
	
	/**
	 * Restituisce le proprieta' da utilizzare con il contesto JNDI di lookup, se impostate.
	 *
	 * @return proprieta' da utilizzare con il contesto JNDI di lookup.
	 * 
	 */
	public java.util.Properties getJNDIPoolConfigurazione(String id) {	
		java.util.Properties prop = new java.util.Properties();
		try{ 
			String ricerca = JMS_PREFIX_PROPERTY + id +".jndi.poolProperty.";
			java.util.Enumeration<?> en = this.reader.propertyNames();
			for (; en.hasMoreElements() ;) {
				String property = (String) en.nextElement();
				if(property.startsWith(ricerca)){
					String key = (property.substring(ricerca.length()));
					if(key != null)
						key = key.trim();
					String value = this.reader.getProperty(property);
					if(value!=null)
						value = value.trim();
					if(key!=null && value!=null){
						prop.setProperty(key,value);
						/**System.out.println("pool ["+key+"] ["+value+"]");*/
					}
				}
			}
			return prop;

		}catch(java.lang.Exception e) {
			String msg = "Riscontrato errore durante la lettura delle propriete' JNDI per la configurazione: "+e.getMessage();
			ConnettoreJMSProperties.log.error(msg,e);
			prop = null;
			return prop;
		}    
	}
	
	
	public String[] getClassNameSetPropertiesJMS(){
		String [] sNull = null;
		try{ 
			String value = this.reader.getProperty("org.openspcoop.pubblicazione.setProprietaJMS.class");
			if(value!=null){
				value = value.trim();
				String [] classi = value.split(",");
				if(classi!=null){
					for(int i=0;i<classi.length;i++){
						classi[i] = classi[i].trim();
					}
				}
				return classi;
			}else
				return sNull;
		}catch(java.lang.Exception e) {
			String msg = "Riscontrato errore durante la lettura delle classi da utilizzare per il setting delle proprieta' JMS: "+e.getMessage();
			ConnettoreJMSProperties.log.error(msg,e);
			return sNull;
		}   
	}
	

}