ConfigurazioneUtilities.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.web.ctrlstat.servlet.config;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.allarmi.Allarme;
import org.openspcoop2.core.allarmi.AllarmeHistory;
import org.openspcoop2.core.allarmi.IdAllarme;
import org.openspcoop2.core.allarmi.constants.RuoloPorta;
import org.openspcoop2.core.config.Configurazione;
import org.openspcoop2.core.config.PortaApplicativa;
import org.openspcoop2.core.config.PortaDelegata;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
import org.openspcoop2.core.config.utils.ConfigurazionePdDUtils;
import org.openspcoop2.core.controllo_traffico.AttivazionePolicy;
import org.openspcoop2.core.controllo_traffico.ConfigurazionePolicy;
import org.openspcoop2.core.controllo_traffico.beans.InfoPolicy;
import org.openspcoop2.core.controllo_traffico.constants.RuoloPolicy;
import org.openspcoop2.core.id.IDPortaApplicativa;
import org.openspcoop2.core.id.IDPortaDelegata;
import org.openspcoop2.core.mapping.MappingErogazionePortaApplicativa;
import org.openspcoop2.core.mapping.MappingFruizionePortaDelegata;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
import org.openspcoop2.message.constants.ServiceBinding;
import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
import org.openspcoop2.web.ctrlstat.core.ControlStationCoreException;
import org.openspcoop2.web.ctrlstat.driver.DriverControlStationException;
import org.openspcoop2.web.ctrlstat.driver.DriverControlStationNotFound;
import org.openspcoop2.web.ctrlstat.servlet.pa.PorteApplicativeCore;
import org.openspcoop2.web.ctrlstat.servlet.pd.PorteDelegateCore;
import org.openspcoop2.web.ctrlstat.servlet.soggetti.SoggettiCore;
import org.openspcoop2.web.lib.mvc.TipoOperazione;
/**
* ConfigurazioneUtilities
*
* @author Andrea Poli (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*
*/
public class ConfigurazioneUtilities {
public static boolean alreadyExists(TipoOperazione tipoOperazione, ConfigurazioneCore confCore, ConfigurazioneHelper confHelper,
AttivazionePolicy policy, InfoPolicy infoPolicy, RuoloPolicy ruoloPorta, String nomePorta, ServiceBinding serviceBinding,
StringBuilder existsMessage, String newLine, String modalita) throws Exception {
if(infoPolicy!=null){
String perApi = "globale";
if(ruoloPorta!=null && nomePorta!=null && !"".equals(nomePorta)) {
perApi = "per l'API";
}
AttivazionePolicy p = null;
try {
p = confCore.getPolicy(policy.getIdPolicy(),policy.getFiltro(), policy.getGroupBy(),
ruoloPorta, nomePorta);
}catch(DriverControlStationNotFound e) {
//ignore
}
if(p!=null){
if(TipoOperazione.ADD.equals(tipoOperazione) || (p.getId()!=null && policy.getId()!=null && p.getId().longValue()!=policy.getId().longValue())){
String prefisso = "Esiste già una attivazione "+perApi+" della policy '"+
policy.getIdPolicy()+"' ";
if(ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_POLICY_ACTIVE_POLICY_MODALITA_BUILT_IN.equals(modalita)) {
prefisso = "Esiste già una policy "+perApi+" con i criteri indicati ";
}
String messaggio = prefisso+newLine+
"e"+newLine+
"Raggruppamento: "+ confHelper.toStringCompactGroupBy(policy.getGroupBy(),ruoloPorta,nomePorta,serviceBinding)+newLine+
"e"+newLine+
"Filtro: "+ confHelper.toStringCompactFilter(policy.getFiltro(),ruoloPorta,nomePorta,serviceBinding);
existsMessage.append(messaggio);
return true;
}
}
AttivazionePolicy pAlias = null;
if(policy.getAlias()!=null && !"".equals(policy.getAlias())) {
try {
pAlias = confCore.getPolicyByAlias(policy.getAlias(),
ruoloPorta, nomePorta);
}catch(DriverControlStationNotFound e) {
//ignore
}
if(pAlias!=null){
if(TipoOperazione.ADD.equals(tipoOperazione) || (pAlias.getId()!=null && policy.getId()!=null && pAlias.getId().longValue()!=policy.getId().longValue())){
String messaggio = "Esiste già una policy "+perApi+" con "+ConfigurazioneCostanti.LABEL_PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_POLICY_ACTIVE_POLICY_ALIAS+" '"+policy.getAlias()+"'";
existsMessage.append(messaggio);
return true;
}
}
}
}
return false;
}
private static String _getAttivazionePolicyTipo(AttivazionePolicy attivazionePolicy) {
String tipo = "";
if(attivazionePolicy.getFiltro()!=null && attivazionePolicy.getFiltro().getRuoloPorta()!=null &&
StringUtils.isNotEmpty(attivazionePolicy.getFiltro().getNomePorta())) {
tipo = attivazionePolicy.getFiltro().getRuoloPorta().getValue()+"_"+attivazionePolicy.getFiltro().getNomePorta();
}
else {
tipo = "globale";
}
return tipo;
}
private static String _buildLabelApi(Allarme allarme, ConfigurazioneHelper confHelper, ConfigurazioneCore confCore) {
if(allarme.getFiltro()!=null && allarme.getFiltro().isEnabled() &&
allarme.getFiltro().getRuoloPorta()!=null &&
allarme.getFiltro().getNomePorta()!=null && StringUtils.isNotEmpty(allarme.getFiltro().getNomePorta())) {
switch (allarme.getFiltro().getRuoloPorta()) {
case APPLICATIVA:
try {
PorteApplicativeCore porteApplicativeCore = new PorteApplicativeCore(confCore);
IDPortaApplicativa idPA = new IDPortaApplicativa();
idPA.setNome(allarme.getFiltro().getNomePorta());
PortaApplicativa paFound = porteApplicativeCore.getPortaApplicativa(idPA);
MappingErogazionePortaApplicativa mappingPA = porteApplicativeCore.getMappingErogazionePortaApplicativa(paFound);
String labelErogazione = confHelper.getLabelIdServizio(mappingPA.getIdServizio());
if(!mappingPA.isDefault()) {
labelErogazione = labelErogazione+" (gruppo:"+mappingPA.getDescrizione()+")";
}
return labelErogazione;
}catch(Throwable t) {
ControlStationCore.getLog().error("Errore durante l'identificazione dell'erogazione: "+t.getMessage(),t);
}
break;
case DELEGATA:
try {
PorteDelegateCore porteDelegateCore = new PorteDelegateCore(confCore);
SoggettiCore soggettiCore = new SoggettiCore(confCore);
IDPortaDelegata idPD = new IDPortaDelegata();
idPD.setNome(allarme.getFiltro().getNomePorta());
PortaDelegata pdFound = porteDelegateCore.getPortaDelegata(idPD);
MappingFruizionePortaDelegata mappingPD = porteDelegateCore.getMappingFruizionePortaDelegata(pdFound);
String labelFruizione = confHelper.getLabelServizioFruizione(soggettiCore.getProtocolloAssociatoTipoSoggetto(mappingPD.getIdFruitore().getTipo()),
mappingPD.getIdFruitore(), mappingPD.getIdServizio());
if(!mappingPD.isDefault()) {
labelFruizione = labelFruizione+" (gruppo:"+mappingPD.getDescrizione()+")";
}
return labelFruizione;
}catch(Throwable t) {
ControlStationCore.getLog().error("Errore durante l'identificazione della fruizione: "+t.getMessage(),t);
}
break;
default:
break;
}
}
return null;
}
public static void deleteAttivazionePolicy(List<AttivazionePolicy> policies , ConfigurazioneHelper confHelper, ConfigurazioneCore confCore, String userLogin,
StringBuilder inUsoMessage, String newLine, List<AttivazionePolicy> policiesRimosse) throws DriverControlStationException, DriverConfigurazioneNotFound, DriverConfigurazioneException, DriverRegistroServiziNotFound, DriverRegistroServiziException, ControlStationCoreException, Exception {
StringBuilder deleteMessage = new StringBuilder();
boolean oneOnlyConfig = false;
if(policies.size()==1) {
oneOnlyConfig=true;
}
else {
oneOnlyConfig = true;
String tipo = _getAttivazionePolicyTipo(policies.get(0));
for (int i = 1; i < policies.size(); i++) {
AttivazionePolicy attivazionePolicyI = policies.get(i);
String tipoI = _getAttivazionePolicyTipo(attivazionePolicyI);
if(!tipoI.equals(tipo)) {
oneOnlyConfig = false;
break;
}
}
}
for (AttivazionePolicy attivazionePolicy : policies) {
boolean delete = true;
boolean policyApi = attivazionePolicy.getFiltro()!=null && attivazionePolicy.getFiltro().isEnabled() &&
attivazionePolicy.getFiltro().getRuoloPorta()!=null &&
attivazionePolicy.getFiltro().getNomePorta()!=null && StringUtils.isNotEmpty(attivazionePolicy.getFiltro().getNomePorta());
if("DimensioneMassimaMessaggi".equals(attivazionePolicy.getAlias()) && !policyApi) {
if(deleteMessage.length()>0){
deleteMessage.append(newLine);
}
StringBuilder bf = new StringBuilder();
bf.append(newLine);
bf.append("La policy '"+attivazionePolicy.getAlias()+"' non è eliminabile; è consentito modificarne i valori di soglia o disabilitarla");
deleteMessage.append(bf.toString());
delete = false;
}
if(delete && confCore.isConfigurazioneAllarmiEnabled()){
RuoloPorta ruoloPorta = null;
String nomePorta = null;
if(attivazionePolicy.getFiltro()!=null && attivazionePolicy.getFiltro().getRuoloPorta()!=null &&
StringUtils.isNotEmpty(attivazionePolicy.getFiltro().getNomePorta())) {
switch (attivazionePolicy.getFiltro().getRuoloPorta()) {
case DELEGATA:
ruoloPorta = RuoloPorta.DELEGATA;
break;
case APPLICATIVA:
ruoloPorta = RuoloPorta.APPLICATIVA;
break;
default:
break;
}
nomePorta = attivazionePolicy.getFiltro().getNomePorta();
}
/** throw new NotImplementedException("Da implementare quando verranno aggiunti gli allarmi."); */
List<Allarme> allarmiObjectUtilizzanoPolicy = confCore.allarmiForPolicyRateLimiting(attivazionePolicy.getIdActivePolicy(),ruoloPorta,nomePorta);
List<String> allarmiUtilizzanoPolicy = null;
if(allarmiObjectUtilizzanoPolicy!=null && !allarmiObjectUtilizzanoPolicy.isEmpty()) {
allarmiUtilizzanoPolicy = new ArrayList<>();
for (Allarme allarme : allarmiObjectUtilizzanoPolicy) {
String nomeAllarme = allarme.getAlias();
if(!oneOnlyConfig) {
String labelApi = _buildLabelApi(allarme, confHelper, confCore);
if(labelApi!=null) {
nomeAllarme = nomeAllarme + " - "+ labelApi;
}
}
allarmiUtilizzanoPolicy.add(nomeAllarme);
}
}
if(allarmiUtilizzanoPolicy!=null && !allarmiUtilizzanoPolicy.isEmpty()){
StringBuilder bf = new StringBuilder();
bf.append(newLine);
bf.append("La policy '"+attivazionePolicy.getAlias()+"' risulta utilizzata da ");
bf.append(allarmiUtilizzanoPolicy.size());
if(allarmiUtilizzanoPolicy.size()<2){
bf.append(" allarme");
}else{
bf.append(" allarmi");
}
if(oneOnlyConfig) {
boolean globale = !(attivazionePolicy.getFiltro()!=null && attivazionePolicy.getFiltro().getRuoloPorta()!=null &&
StringUtils.isNotEmpty(attivazionePolicy.getFiltro().getNomePorta()));
if(!globale) {
bf.append(RuoloPolicy.APPLICATIVA.equals(attivazionePolicy.getFiltro().getRuoloPorta())?" configurati sull'erogazione":" configurati sulla fruizione");
}
}
bf.append(": ");
for (int j = 0; j < allarmiUtilizzanoPolicy.size(); j++) {
bf.append(newLine);
bf.append("- ").append(allarmiUtilizzanoPolicy.get(j));
}
if(deleteMessage.length()>0){
deleteMessage.append(newLine);
}
deleteMessage.append(bf.toString());
delete = false;
}
}
if(delete) {
// aggiungo elemento alla lista di quelli da cancellare
policiesRimosse.add(attivazionePolicy);
}
}
if(deleteMessage.length()>0){
if(!policiesRimosse.isEmpty()){
inUsoMessage.append("Non è stato possibile completare l'eliminazione di tutti gli elementi selezionati:"+newLine+deleteMessage.toString());
}
else{
inUsoMessage.append("Non è stato possibile eliminare gli elementi selezionati:"+newLine+deleteMessage.toString());
}
}
if(!policiesRimosse .isEmpty()) {
// eseguo delete
confCore.performDeleteOperation(userLogin, confHelper.smista(), (Object[]) policiesRimosse.toArray(new AttivazionePolicy[1]));
}
}
public static void updatePosizioneAttivazionePolicy(ConfigurazioneCore confCore, InfoPolicy infoPolicy, AttivazionePolicy policy,
RuoloPolicy ruoloPorta, String nomePorta) throws Exception {
confCore.updatePosizioneAttivazionePolicy(infoPolicy, policy,
ruoloPorta, nomePorta);
}
public static int getProssimaPosizioneUrlInvocazioneRegola(Configurazione config) {
return ConfigurazionePdDUtils.getProssimaPosizioneUrlInvocazioneRegola(config);
}
public static AllarmeHistory createAllarmeHistory(Allarme allarme, String userLogin) {
// registro la modifica
AllarmeHistory history = new AllarmeHistory();
history.setEnabled(allarme.getEnabled());
history.setAcknowledged(allarme.getAcknowledged());
history.setDettaglioStato(allarme.getDettaglioStato());
IdAllarme idConfigurazioneAllarme = new IdAllarme();
idConfigurazioneAllarme.setNome(allarme.getNome());
history.setIdAllarme(idConfigurazioneAllarme);
history.setStato(allarme.getStato());
history.setTimestampUpdate(allarme.getLasttimestampUpdate());
history.setUtente(userLogin);
return history;
}
public static void deleteAllarmi(List<Allarme> allarmiToRemove , ConfigurazioneHelper confHelper, ConfigurazioneCore confCore, String userLogin,
StringBuilder inUsoMessage, String newLine, List<Allarme> allarmiRimossi) throws DriverControlStationException, DriverConfigurazioneNotFound, DriverConfigurazioneException, DriverRegistroServiziNotFound, DriverRegistroServiziException, ControlStationCoreException, Exception {
StringBuilder deleteMessage = new StringBuilder();
for (Allarme allarmeDaEliminare : allarmiToRemove) {
boolean delete = true;
List<ConfigurazionePolicy> policyObjectUtilizzanoAllarme = confCore.configurazioneControlloTrafficoConfigurazionePolicyListConApplicabilitaAllarme(allarmeDaEliminare.getNome());
List<String> policyUtilizzanoAllarme = null;
if(policyObjectUtilizzanoAllarme!=null && !policyObjectUtilizzanoAllarme.isEmpty()) {
policyUtilizzanoAllarme = new ArrayList<>();
for (ConfigurazionePolicy policy : policyObjectUtilizzanoAllarme) {
String nomePolicy = policy.getIdPolicy();
policyUtilizzanoAllarme.add(nomePolicy);
}
}
if(policyUtilizzanoAllarme!=null && policyUtilizzanoAllarme.size()>0){
StringBuilder bf = new StringBuilder();
bf.append(newLine);
bf.append("L'allarme '"+allarmeDaEliminare.getAlias()+"' risulta utilizzata da ");
bf.append(policyUtilizzanoAllarme.size());
bf.append(" policy del Controllo del Traffico (criterio di applicabilità)");
bf.append(": ");
for (int j = 0; j < policyUtilizzanoAllarme.size(); j++) {
//if(j>0){
bf.append(newLine);
//}
bf.append("- ").append(policyUtilizzanoAllarme.get(j));
}
if(deleteMessage.length()>0){
deleteMessage.append(newLine);
}
deleteMessage.append(bf.toString());
delete = false;
}
if(delete) {
// aggiungo elemento alla lista di quelli da cancellare
allarmiRimossi.add(allarmeDaEliminare);
}
}
if(deleteMessage.length()>0){
if(allarmiRimossi.size()>0){
inUsoMessage.append("Non è stato possibile completare l'eliminazione di tutti gli elementi selezionati:"+newLine+deleteMessage.toString());
}
else{
inUsoMessage.append("Non è stato possibile eliminare gli elementi selezionati:"+newLine+deleteMessage.toString());
}
}
}
}