ConfigurazionePdD_plugins.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.config;

import java.sql.Connection;
import java.util.List;

import org.openspcoop2.core.commons.Filtri;
import org.openspcoop2.core.commons.dao.DAOFactory;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
import org.openspcoop2.core.config.driver.db.DriverConfigurazioneDB;
import org.openspcoop2.generic_project.exception.NotFoundException;
import org.openspcoop2.generic_project.expression.IExpression;
import org.openspcoop2.generic_project.expression.IPaginatedExpression;
import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
import org.openspcoop2.core.plugins.IdPlugin;
import org.openspcoop2.core.plugins.Plugin;
import org.openspcoop2.core.plugins.PluginProprietaCompatibilita;
import org.openspcoop2.core.plugins.dao.IPluginServiceSearch;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.openspcoop2.utils.NameValue;

/**     
 * ConfigurazionePdD_plugins
 *
 * @author Poli Andrea (poli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class ConfigurazionePdD_plugins extends AbstractConfigurazionePdDConnectionResourceManager {

	private ServiceManagerProperties smp;
	
	
	public ConfigurazionePdD_plugins(OpenSPCoop2Properties openspcoopProperties, DriverConfigurazioneDB driver, boolean useConnectionPdD) {
		super(openspcoopProperties, driver, useConnectionPdD, OpenSPCoop2Logger.getLoggerOpenSPCoopPluginsSql(openspcoopProperties.isConfigurazionePluginsDebug()));
		
		this.smp = new ServiceManagerProperties();
		this.smp.setShowSql(this.openspcoopProperties.isConfigurazionePluginsDebug());
		this.smp.setDatabaseType(this.driver.getTipoDB());
	}
	
	
	
	
	public int countPlugins(Connection connectionPdD) throws DriverConfigurazioneException{
		
		ConfigurazionePdDConnectionResource cr = null;
		try{
			cr = this.getConnection(connectionPdD, "Plugins.countPlugins");
			org.openspcoop2.core.plugins.dao.IServiceManager sm = 
					(org.openspcoop2.core.plugins.dao.IServiceManager) DAOFactory.getInstance(this.log).
					getServiceManager(org.openspcoop2.core.plugins.utils.ProjectInfo.getInstance(),
							cr.connectionDB,this.smp,this.log);
			
			IPluginServiceSearch search =  sm.getPluginServiceSearch();
			IExpression expr = search.newExpression();
			return (int) search.count(expr).longValue();
		}
		catch(Exception e){
			String errorMsg = "Errore durante la conta dei plugins registrati: "+e.getMessage();
			this.log.error(errorMsg,e);
			throw new DriverConfigurazioneException(errorMsg,e);
		}
		finally {
			this.releaseConnection(cr);
		}

	}
	
	public List<IdPlugin> findAllPluginIds(Connection connectionPdD, int offset, int limit) throws DriverConfigurazioneException{
		
		ConfigurazionePdDConnectionResource cr = null;
		try{
			cr = this.getConnection(connectionPdD, "Plugins.findAllPluginIds_"+offset+"_"+limit);
			org.openspcoop2.core.plugins.dao.IServiceManager sm = 
					(org.openspcoop2.core.plugins.dao.IServiceManager) DAOFactory.getInstance(this.log).
					getServiceManager(org.openspcoop2.core.plugins.utils.ProjectInfo.getInstance(),
							cr.connectionDB,this.smp,this.log);
			
			IPluginServiceSearch search =  sm.getPluginServiceSearch();
			IPaginatedExpression pagExpr = search.newPaginatedExpression();
			pagExpr.offset(offset);
			pagExpr.limit(limit);
			pagExpr.addOrder(Plugin.model().TIPO_PLUGIN);
			pagExpr.addOrder(Plugin.model().TIPO);
			return search.findAllIds(pagExpr);
		}
		catch(Exception e){
			String errorMsg = "Errore durante la lettura degli idPlugin (offset:"+offset+" limit:"+limit+"): "+e.getMessage();
			this.log.error(errorMsg,e);
			throw new DriverConfigurazioneException(errorMsg,e);
		}
		finally {
			this.releaseConnection(cr);
		}

	}
	
	
	
	public String getPluginClassName(Connection connectionPdD, String tipoPlugin, String tipo) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
		return getPluginClassNameByFilter(connectionPdD, tipoPlugin, tipo);
	}
	public String getPluginClassNameByFilter(Connection connectionPdD, String tipoPlugin, String tipo, NameValue ... filtri) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
		
		if(tipoPlugin==null || "".equals(tipoPlugin)) {
			throw new DriverConfigurazioneException("tipo plugin non fornito");
		}
		if(tipo==null || "".equals(tipo)) {
			throw new DriverConfigurazioneException("tipo non fornito");
		}
		
		ConfigurazionePdDConnectionResource cr = null;
		try{
			cr = this.getConnection(connectionPdD, "Plugins.getPluginClassName_"+tipoPlugin+"#"+tipo);
			org.openspcoop2.core.plugins.dao.IServiceManager sm = 
					(org.openspcoop2.core.plugins.dao.IServiceManager) DAOFactory.getInstance(this.log).
					getServiceManager(org.openspcoop2.core.plugins.utils.ProjectInfo.getInstance(),
							cr.connectionDB,this.smp,this.log);
			
			IPluginServiceSearch search =  sm.getPluginServiceSearch();
			IdPlugin idPlugin = new IdPlugin();
			idPlugin.setTipoPlugin(tipoPlugin);
			idPlugin.setTipo(tipo);
			
			Plugin plugin = search.get(idPlugin);
			
			if(filtri!=null && filtri.length>0) {
				for (int i = 0; i < filtri.length; i++) {
					NameValue filtro = filtri[i];
					
					if(plugin.sizePluginProprietaCompatibilitaList()>0) {
						for (int j = 0; j < plugin.sizePluginProprietaCompatibilitaList(); j++) {
							PluginProprietaCompatibilita ppc = plugin.getPluginProprietaCompatibilita(j);
							if(ppc.getNome().equals(filtro.getName())) {
								if(!ppc.getValore().equals(filtro.getValue())) {
									
									// gestisco caso speciale
									boolean isCasoSpecialeQualsiasi = false;
									
									if(Filtri.FILTRO_RUOLO_NOME.equals(ppc.getNome()) && Filtri.FILTRO_RUOLO_VALORE_ENTRAMBI.equals(ppc.getValore())) {
										isCasoSpecialeQualsiasi = true;
									}
									
									if(Filtri.FILTRO_APPLICABILITA_NOME.equals(ppc.getNome())) {
										if(Filtri.FILTRO_APPLICABILITA_VALORE_QUALSIASI.equals(ppc.getValore())) {
											isCasoSpecialeQualsiasi = true;
										}
										else if(Filtri.FILTRO_APPLICABILITA_VALORE_FRUIZIONE.equals(filtro.getValue()) && Filtri.FILTRO_APPLICABILITA_VALORE_IMPLEMENTAZIONE_API.equals(ppc.getValore())) {
											isCasoSpecialeQualsiasi = true;
										} 
										else if(Filtri.FILTRO_APPLICABILITA_VALORE_EROGAZIONE.equals(filtro.getValue()) && Filtri.FILTRO_APPLICABILITA_VALORE_IMPLEMENTAZIONE_API.equals(ppc.getValore())) {
											isCasoSpecialeQualsiasi = true;
										} 
									}
									
									if(!isCasoSpecialeQualsiasi) {									
										throw new NotFoundException("Filtro '"+ppc.getNome()+"' non soddisfatto (atteso:"+filtro.getValue()+" trovato:"+ppc.getValore()+")");
									}
								}
							}
						}
					}
					
				}
			}
			
			return plugin.getClassName();

		}
		catch(NotFoundException e) {
			String errorMsg = "Plugin (tipologia:"+tipoPlugin+" tipo:"+tipo+") non trovato: "+e.getMessage();
			this.log.debug(errorMsg,e);
			throw new DriverConfigurazioneNotFound(errorMsg,e);
		}
		catch(Exception e){
			String errorMsg = "Errore durante la lettura del Plugin (tipologia:"+tipoPlugin+" tipo:"+tipo+"): "+e.getMessage();
			this.log.error(errorMsg,e);
			throw new DriverConfigurazioneException(errorMsg,e);
		}
		finally {
			this.releaseConnection(cr);
		}

	}
	
	
	public String getPluginTipo(Connection connectionPdD, String tipoPlugin, String className) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
		return getPluginTipoByFilter(connectionPdD, tipoPlugin, className);
	}
	public String getPluginTipoByFilter(Connection connectionPdD, String tipoPlugin, String className, NameValue ... filtri) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
		
		if(tipoPlugin==null || "".equals(tipoPlugin)) {
			throw new DriverConfigurazioneException("tipo plugin non fornito");
		}
		if(className==null || "".equals(className)) {
			throw new DriverConfigurazioneException("Classname non fornito");
		}
		
		ConfigurazionePdDConnectionResource cr = null;
		try{
			cr = this.getConnection(connectionPdD, "Plugins.getPluginTipo_"+tipoPlugin+"#"+className);
			org.openspcoop2.core.plugins.dao.IServiceManager sm = 
					(org.openspcoop2.core.plugins.dao.IServiceManager) DAOFactory.getInstance(this.log).
					getServiceManager(org.openspcoop2.core.plugins.utils.ProjectInfo.getInstance(),
							cr.connectionDB,this.smp,this.log);
			
			IPluginServiceSearch search =  sm.getPluginServiceSearch();
			
			IExpression expr = search.newExpression();
			expr.equals(Plugin.model().TIPO_PLUGIN, tipoPlugin);
			expr.equals(Plugin.model().CLASS_NAME, className);
			
			Plugin plugin = search.find(expr);
			
			if(filtri!=null && filtri.length>0) {
				for (int i = 0; i < filtri.length; i++) {
					NameValue filtro = filtri[i];
					
					if(plugin.sizePluginProprietaCompatibilitaList()>0) {
						for (int j = 0; j < plugin.sizePluginProprietaCompatibilitaList(); j++) {
							PluginProprietaCompatibilita ppc = plugin.getPluginProprietaCompatibilita(j);
							if(ppc.getNome().equals(filtro.getName())) {
								if(!ppc.getValore().equals(filtro.getValue())) {
									
									// gestisco caso speciale
									boolean isCasoSpecialeQualsiasi = false;
									
									if(Filtri.FILTRO_RUOLO_NOME.equals(ppc.getNome()) && Filtri.FILTRO_RUOLO_VALORE_ENTRAMBI.equals(ppc.getValore())) {
										isCasoSpecialeQualsiasi = true;
									}
									
									if(Filtri.FILTRO_APPLICABILITA_NOME.equals(ppc.getNome())) {
										if(Filtri.FILTRO_APPLICABILITA_VALORE_QUALSIASI.equals(ppc.getValore())) {
											isCasoSpecialeQualsiasi = true;
										}
										else if(Filtri.FILTRO_APPLICABILITA_VALORE_FRUIZIONE.equals(filtro.getValue()) && Filtri.FILTRO_APPLICABILITA_VALORE_IMPLEMENTAZIONE_API.equals(ppc.getValore())) {
											isCasoSpecialeQualsiasi = true;
										} 
										else if(Filtri.FILTRO_APPLICABILITA_VALORE_EROGAZIONE.equals(filtro.getValue()) && Filtri.FILTRO_APPLICABILITA_VALORE_IMPLEMENTAZIONE_API.equals(ppc.getValore())) {
											isCasoSpecialeQualsiasi = true;
										} 
									}
									
									if(!isCasoSpecialeQualsiasi) {									
										throw new NotFoundException("Filtro '"+ppc.getNome()+"' non soddisfatto (atteso:"+filtro.getValue()+" trovato:"+ppc.getValore()+")");
									}
								}
							}
						}
					}
					
				}
			}
			
			return plugin.getTipo();

		}
		catch(NotFoundException e) {
			String errorMsg = "Plugin (tipologia:"+tipoPlugin+" className:"+className+") non trovato: "+e.getMessage();
			this.log.debug(errorMsg,e);
			throw new DriverConfigurazioneNotFound(errorMsg,e);
		}
		catch(Exception e){
			String errorMsg = "Errore durante la lettura del Plugin (tipologia:"+tipoPlugin+" className:"+className+"): "+e.getMessage();
			this.log.error(errorMsg,e);
			throw new DriverConfigurazioneException(errorMsg,e);
		}
		finally {
			this.releaseConnection(cr);
		}

	}
	
	
}