ConfigurazionePdD_controlloTraffico.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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.openspcoop2.core.commons.dao.DAOFactory;
import org.openspcoop2.core.config.Proprieta;
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.core.constants.TipoPdD;
import org.openspcoop2.core.controllo_traffico.AttivazionePolicy;
import org.openspcoop2.core.controllo_traffico.ConfigurazioneGenerale;
import org.openspcoop2.core.controllo_traffico.ConfigurazionePolicy;
import org.openspcoop2.core.controllo_traffico.ConfigurazioneRateLimitingProprieta;
import org.openspcoop2.core.controllo_traffico.ElencoIdPolicy;
import org.openspcoop2.core.controllo_traffico.ElencoIdPolicyAttive;
import org.openspcoop2.core.controllo_traffico.IdActivePolicy;
import org.openspcoop2.core.controllo_traffico.IdPolicy;
import org.openspcoop2.core.controllo_traffico.beans.UniqueIdentifierUtilities;
import org.openspcoop2.core.controllo_traffico.constants.RuoloPolicy;
import org.openspcoop2.core.controllo_traffico.constants.TipoRisorsaPolicyAttiva;
import org.openspcoop2.core.controllo_traffico.dao.IAttivazionePolicyServiceSearch;
import org.openspcoop2.core.controllo_traffico.dao.IConfigurazionePolicyServiceSearch;
import org.openspcoop2.generic_project.exception.NotFoundException;
import org.openspcoop2.generic_project.expression.IPaginatedExpression;
import org.openspcoop2.generic_project.expression.SortOrder;
import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
import org.openspcoop2.pdd.core.controllo_traffico.policy.config.PolicyConfiguration;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
/**
* ConfigurazionePdD_controlloTraffico
*
* @author Poli Andrea (poli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class ConfigurazionePdD_controlloTraffico extends AbstractConfigurazionePdDConnectionResourceManager {
private ServiceManagerProperties smp;
public ConfigurazionePdD_controlloTraffico(OpenSPCoop2Properties openspcoopProperties, DriverConfigurazioneDB driver, boolean useConnectionPdD) {
super(openspcoopProperties, driver, useConnectionPdD, OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTrafficoSql(openspcoopProperties.isControlloTrafficoDebug()));
this.smp = new ServiceManagerProperties();
this.smp.setShowSql(this.openspcoopProperties.isControlloTrafficoDebug());
this.smp.setDatabaseType(this.driver.getTipoDB());
}
private static ConfigurazioneGenerale configurazioneGenerale = null;
public ConfigurazioneGenerale getConfigurazioneControlloTraffico(Connection connectionPdD) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
if( this.configurazioneDinamica || ConfigurazionePdD_controlloTraffico.configurazioneGenerale==null){
ConfigurazionePdDConnectionResource cr = null;
try{
cr = this.getConnection(connectionPdD, "ControlloTraffico.getConfigurazioneGenerale");
org.openspcoop2.core.controllo_traffico.dao.IServiceManager sm =
(org.openspcoop2.core.controllo_traffico.dao.IServiceManager) DAOFactory.getInstance(this.log).
getServiceManager(org.openspcoop2.core.controllo_traffico.utils.ProjectInfo.getInstance(),
cr.connectionDB,this.smp,this.log);
ConfigurazionePdD_controlloTraffico.configurazioneGenerale = sm.getConfigurazioneGeneraleServiceSearch().get();
}
catch(NotFoundException e) {
String errorMsg = "Configurazione del Controllo del Traffico non trovata: "+e.getMessage();
this.log.debug(errorMsg,e);
throw new DriverConfigurazioneNotFound(errorMsg,e);
}
catch(Exception e){
String errorMsg = "Errore durante la configurazione del Controllo del Traffico: "+e.getMessage();
this.log.error(errorMsg,e);
throw new DriverConfigurazioneException(errorMsg,e);
}
finally {
this.releaseConnection(cr);
}
}
return ConfigurazionePdD_controlloTraffico.configurazioneGenerale;
}
private static PolicyConfiguration configurazionePolicyRateLimitingGlobali = null;
public PolicyConfiguration getConfigurazionePolicyRateLimitingGlobali(Connection connectionPdD) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
if( this.configurazioneDinamica || ConfigurazionePdD_controlloTraffico.configurazionePolicyRateLimitingGlobali==null){
ConfigurazionePdDConnectionResource cr = null;
try{
cr = this.getConnection(connectionPdD, "ControlloTraffico.getConfigurazionePolicyRateLimitingGlobali");
org.openspcoop2.core.controllo_traffico.dao.IServiceManager sm =
(org.openspcoop2.core.controllo_traffico.dao.IServiceManager) DAOFactory.getInstance(this.log).
getServiceManager(org.openspcoop2.core.controllo_traffico.utils.ProjectInfo.getInstance(),
cr.connectionDB,this.smp,this.log);
List<Proprieta> list = new ArrayList<Proprieta>();
List<ConfigurazioneRateLimitingProprieta> l = sm.getConfigurazioneRateLimitingProprietaServiceSearch().findAll(sm.getConfigurazioneRateLimitingProprietaServiceSearch().newPaginatedExpression());
if(l!=null && !l.isEmpty()) {
for (ConfigurazioneRateLimitingProprieta configurazioneRateLimitingProprieta : l) {
Proprieta p = new Proprieta();
p.setNome(configurazioneRateLimitingProprieta.getNome());
p.setValore(configurazioneRateLimitingProprieta.getValore());
list.add(p);
}
}
ConfigurazionePdD_controlloTraffico.configurazionePolicyRateLimitingGlobali = new PolicyConfiguration(list);
}
catch(NotFoundException e) {
String errorMsg = "Configurazione delle policy globali di rate limiting non trovata: "+e.getMessage();
this.log.debug(errorMsg,e);
throw new DriverConfigurazioneNotFound(errorMsg,e);
}
catch(Exception e){
String errorMsg = "Errore durante la configurazione del Controllo del Traffico: "+e.getMessage();
this.log.error(errorMsg,e);
throw new DriverConfigurazioneException(errorMsg,e);
}
finally {
this.releaseConnection(cr);
}
}
return ConfigurazionePdD_controlloTraffico.configurazionePolicyRateLimitingGlobali;
}
public Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> getElencoIdPolicyAttiveAPI(Connection connectionPdD, TipoPdD tipoPdD, String nomePorta) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
return this.getElencoIdPolicyApiAttiveEngine(connectionPdD, tipoPdD, nomePorta, true,
false,true);
}
public Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> getElencoIdPolicyAttiveGlobali(Connection connectionPdD) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
return this.getElencoIdPolicyApiAttiveEngine(connectionPdD, null, null, false,
false,true);
}
public Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> getElencoIdPolicyAttiveAPIDimensioneMessaggio(Connection connectionPdD, TipoPdD tipoPdD, String nomePorta) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
return this.getElencoIdPolicyApiAttiveEngine(connectionPdD, tipoPdD, nomePorta, true,
true,false);
}
public Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> getElencoIdPolicyAttiveGlobaliDimensioneMessaggio(Connection connectionPdD) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
return this.getElencoIdPolicyApiAttiveEngine(connectionPdD, null, null, false,
true,false);
}
private Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> getElencoIdPolicyApiAttiveEngine(Connection connectionPdD, TipoPdD tipoPdD, String nomePorta, boolean api,
boolean includiSoloPolicyDimensioneMessaggio, boolean escludiPolicyDimensioneMessaggio) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
String prefix = "";
if(includiSoloPolicyDimensioneMessaggio) {
prefix = " [DimensioneMessaggio]";
}
if(api) {
if(tipoPdD==null) {
throw new DriverConfigurazioneException("Tipo PdD non fornito; richiesto per una policy API"+prefix);
}
if(nomePorta==null) {
throw new DriverConfigurazioneException("Nome Porta non fornito; richiesto per una policy API"+prefix);
}
}
ConfigurazionePdDConnectionResource cr = null;
try{
cr = this.getConnection(connectionPdD, "ControlloTraffico.getElencoIdPolicyAttive");
org.openspcoop2.core.controllo_traffico.dao.IServiceManager sm =
(org.openspcoop2.core.controllo_traffico.dao.IServiceManager) DAOFactory.getInstance(this.log).
getServiceManager(org.openspcoop2.core.controllo_traffico.utils.ProjectInfo.getInstance(),
cr.connectionDB,this.smp,this.log);
IAttivazionePolicyServiceSearch search = sm.getAttivazionePolicyServiceSearch();
IPaginatedExpression expression = search.newPaginatedExpression();
if(api) {
if(TipoPdD.DELEGATA.equals(tipoPdD)) {
expression.equals(AttivazionePolicy.model().FILTRO.RUOLO_PORTA, RuoloPolicy.DELEGATA.getValue());
}
else {
expression.equals(AttivazionePolicy.model().FILTRO.RUOLO_PORTA, RuoloPolicy.APPLICATIVA.getValue());
}
expression.equals(AttivazionePolicy.model().FILTRO.NOME_PORTA,nomePorta);
}
else {
expression.isNull(AttivazionePolicy.model().FILTRO.NOME_PORTA);
}
expression.limit(100000); // non dovrebbero esistere tante regole
expression.addOrder(AttivazionePolicy.model().POSIZIONE, SortOrder.ASC);
List<IdActivePolicy> list = search.findAllIds(expression);
if(list!=null && list.size()>0){
// Devo raggrupparle per risorse.
// Ordinate lo sono gia' poiche' ho fatto l'ordine precedentemente
Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> map = new HashMap<>();
for (IdActivePolicy idActivePolicy : list) {
ConfigurazionePolicy confPolicy = null;
try {
confPolicy = this.getConfigurazionePolicy(cr, idActivePolicy.getIdPolicy());
}
catch(DriverConfigurazioneNotFound e) {
this.log.error("Configurazione Policy '"+idActivePolicy.getIdPolicy()+"' non esistente ? ",e);
throw new NotFoundException("Configurazione Policy '"+idActivePolicy.getIdPolicy()+"' non esistente", e);
}
if(confPolicy==null) {
throw new NotFoundException("Configurazione Policy '"+idActivePolicy.getIdPolicy()+"' non esistente");
}
ElencoIdPolicyAttive elencoIdPolicy = null;
TipoRisorsaPolicyAttiva tipoPolicyAttiva = TipoRisorsaPolicyAttiva.getTipo(confPolicy.getRisorsa(), confPolicy.isSimultanee());
if(escludiPolicyDimensioneMessaggio) {
if(TipoRisorsaPolicyAttiva.DIMENSIONE_MASSIMA_MESSAGGIO.equals(tipoPolicyAttiva)) {
continue;
}
}
else if(includiSoloPolicyDimensioneMessaggio) {
if(!TipoRisorsaPolicyAttiva.DIMENSIONE_MASSIMA_MESSAGGIO.equals(tipoPolicyAttiva)) {
continue;
}
}
if(map.containsKey(tipoPolicyAttiva)) {
elencoIdPolicy = map.get(tipoPolicyAttiva);
}
else {
elencoIdPolicy = new ElencoIdPolicyAttive();
map.put(tipoPolicyAttiva, elencoIdPolicy);
}
elencoIdPolicy.addIdActivePolicy(idActivePolicy);
}
if(map.isEmpty()) {
if(api) {
throw new NotFoundException("policy API non esistenti per la porta '"+nomePorta+"' (ruolo: "+tipoPdD.getTipo()+")"+prefix);
}
else {
throw new NotFoundException("policy globali non esistenti"+prefix);
}
}
return map;
}
else {
if(api) {
throw new NotFoundException("policy API non esistenti per la porta '"+nomePorta+"' (ruolo: "+tipoPdD.getTipo()+")"+prefix);
}
else {
throw new NotFoundException("policy globali non esistenti"+prefix);
}
}
}
catch(NotFoundException e) {
String errorMsg = "ElencoIdPolicyAttive del Controllo del Traffico non trovata: "+e.getMessage();
this.log.debug(errorMsg,e);
throw new DriverConfigurazioneNotFound(errorMsg,e);
}
catch(Exception e){
String errorMsg = "Errore durante la lettura dell'ElencoIdPolicyAttive del Controllo del Traffico: "+e.getMessage();
this.log.error(errorMsg,e);
throw new DriverConfigurazioneException(errorMsg,e);
}
finally {
this.releaseConnection(cr);
}
}
public AttivazionePolicy getAttivazionePolicy(Connection connectionPdD, String id) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
ConfigurazionePdDConnectionResource cr = null;
try{
cr = this.getConnection(connectionPdD, "ControlloTraffico.getAttivazionePolicy_"+id);
org.openspcoop2.core.controllo_traffico.dao.IServiceManager sm =
(org.openspcoop2.core.controllo_traffico.dao.IServiceManager) DAOFactory.getInstance(this.log).
getServiceManager(org.openspcoop2.core.controllo_traffico.utils.ProjectInfo.getInstance(),
cr.connectionDB,this.smp,this.log);
IAttivazionePolicyServiceSearch search = sm.getAttivazionePolicyServiceSearch();
IdActivePolicy policyId = new IdActivePolicy();
policyId.setNome(UniqueIdentifierUtilities.extractIdActivePolicy(id));
return search.get(policyId);
}
catch(NotFoundException e) {
String errorMsg = "AttivazionePolicy del Controllo del Traffico non trovata: "+e.getMessage();
this.log.debug(errorMsg,e);
throw new DriverConfigurazioneNotFound(errorMsg,e);
}
catch(Exception e){
String errorMsg = "Errore durante la lettura dell'AttivazionePolicy del Controllo del Traffico: "+e.getMessage();
this.log.error(errorMsg,e);
throw new DriverConfigurazioneException(errorMsg,e);
}
finally {
this.releaseConnection(cr);
}
}
public ElencoIdPolicy getElencoIdPolicy(Connection connectionPdD) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
ConfigurazionePdDConnectionResource cr = null;
try{
cr = this.getConnection(connectionPdD, "ControlloTraffico.getElencoIdPolicy");
org.openspcoop2.core.controllo_traffico.dao.IServiceManager sm =
(org.openspcoop2.core.controllo_traffico.dao.IServiceManager) DAOFactory.getInstance(this.log).
getServiceManager(org.openspcoop2.core.controllo_traffico.utils.ProjectInfo.getInstance(),
cr.connectionDB,this.smp,this.log);
ElencoIdPolicy elencoIdPolicy = new ElencoIdPolicy();
IConfigurazionePolicyServiceSearch search = sm.getConfigurazionePolicyServiceSearch();
IPaginatedExpression expression = search.newPaginatedExpression();
expression.limit(100000); // non dovrebbero esistere tante regole
List<IdPolicy> list = search.findAllIds(expression);
if(list!=null && list.size()>0){
elencoIdPolicy.setIdPolicyList(list);
}
return elencoIdPolicy;
}
catch(NotFoundException e) {
String errorMsg = "ElencoIdPolicy del Controllo del Traffico non trovata: "+e.getMessage();
this.log.debug(errorMsg,e);
throw new DriverConfigurazioneNotFound(errorMsg,e);
}
catch(Exception e){
String errorMsg = "Errore durante la lettura dell'ElencoIdPolicy del Controllo del Traffico: "+e.getMessage();
this.log.error(errorMsg,e);
throw new DriverConfigurazioneException(errorMsg,e);
}
finally {
this.releaseConnection(cr);
}
}
public ConfigurazionePolicy getConfigurazionePolicy(Connection connectionPdD, String id) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
ConfigurazionePdDConnectionResource cr = null;
try{
cr = this.getConnection(connectionPdD, "ControlloTraffico.getConfigurazionePolicy_"+id);
return getConfigurazionePolicy(cr, id);
}
catch(DriverConfigurazioneNotFound e){
throw e;
}
catch(DriverConfigurazioneException e){
throw e;
}
catch(Exception e){
String errorMsg = "Errore durante la lettura della ConfigurazionePolicy del Controllo del Traffico: "+e.getMessage();
this.log.error(errorMsg,e);
throw new DriverConfigurazioneException(errorMsg,e);
}
finally {
this.releaseConnection(cr);
}
}
private ConfigurazionePolicy getConfigurazionePolicy(ConfigurazionePdDConnectionResource crParam, String id) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
try{
org.openspcoop2.core.controllo_traffico.dao.IServiceManager sm =
(org.openspcoop2.core.controllo_traffico.dao.IServiceManager) DAOFactory.getInstance(this.log).
getServiceManager(org.openspcoop2.core.controllo_traffico.utils.ProjectInfo.getInstance(),
crParam.connectionDB,this.smp,this.log);
IConfigurazionePolicyServiceSearch search = sm.getConfigurazionePolicyServiceSearch();
IdPolicy policyId = new IdPolicy();
policyId.setNome(id);
return search.get(policyId);
}
catch(NotFoundException e) {
String errorMsg = "ConfigurazionePolicy del Controllo del Traffico non trovata: "+e.getMessage();
this.log.debug(errorMsg,e);
throw new DriverConfigurazioneNotFound(errorMsg,e);
}
catch(Exception e){
String errorMsg = "Errore durante la lettura della ConfigurazionePolicy del Controllo del Traffico: "+e.getMessage();
this.log.error(errorMsg,e);
throw new DriverConfigurazioneException(errorMsg,e);
}
}
}