PorteApplicativeConnettoriMultipliAbilitazione.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */


  20. package org.openspcoop2.web.ctrlstat.servlet.pa;

  21. import java.text.MessageFormat;
  22. import java.util.ArrayList;
  23. import java.util.List;

  24. import javax.servlet.ServletException;
  25. import javax.servlet.http.HttpServletRequest;
  26. import javax.servlet.http.HttpServletResponse;
  27. import javax.servlet.http.HttpSession;

  28. import org.apache.commons.lang.StringUtils;
  29. import org.apache.struts.action.Action;
  30. import org.apache.struts.action.ActionForm;
  31. import org.apache.struts.action.ActionForward;
  32. import org.apache.struts.action.ActionMapping;
  33. import org.openspcoop2.core.commons.Liste;
  34. import org.openspcoop2.core.config.PortaApplicativa;
  35. import org.openspcoop2.core.config.PortaApplicativaServizioApplicativo;
  36. import org.openspcoop2.core.config.PortaApplicativaServizioApplicativoConnettore;
  37. import org.openspcoop2.core.config.ProprietaOggetto;
  38. import org.openspcoop2.core.config.constants.CostantiConfigurazione;
  39. import org.openspcoop2.core.config.constants.StatoFunzionalita;
  40. import org.openspcoop2.core.id.IDSoggetto;
  41. import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
  42. import org.openspcoop2.core.registry.beans.AccordoServizioParteComuneSintetico;
  43. import org.openspcoop2.message.constants.ServiceBinding;
  44. import org.openspcoop2.pdd.core.jmx.JMXUtils;
  45. import org.openspcoop2.utils.date.DateManager;
  46. import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
  47. import org.openspcoop2.web.ctrlstat.core.ConsoleSearch;
  48. import org.openspcoop2.web.ctrlstat.costanti.CostantiControlStation;
  49. import org.openspcoop2.web.ctrlstat.servlet.GeneralHelper;
  50. import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneCore;
  51. import org.openspcoop2.web.ctrlstat.servlet.aps.AccordiServizioParteSpecificaCore;
  52. import org.openspcoop2.web.lib.mvc.Costanti;
  53. import org.openspcoop2.web.lib.mvc.ForwardParams;
  54. import org.openspcoop2.web.lib.mvc.GeneralData;
  55. import org.openspcoop2.web.lib.mvc.MessageType;
  56. import org.openspcoop2.web.lib.mvc.PageData;
  57. import org.openspcoop2.web.lib.mvc.ServletUtils;

  58. /**
  59.  * PorteApplicativeConnettoriMultipliAbilitazione
  60.  *
  61.  * @author Andrea Poli (apoli@link.it)
  62.  * @author Giuliano Pintori (pintori@link.it)
  63.  * @author $Author$
  64.  * @version $Rev$, $Date$
  65.  *
  66.  */
  67. public final class PorteApplicativeConnettoriMultipliAbilitazione extends Action {

  68.     @Override
  69.     public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

  70.         HttpSession session = request.getSession(true);

  71.         // Inizializzo PageData
  72.         PageData pd = new PageData();

  73.         GeneralHelper generalHelper = new GeneralHelper(session);

  74.         // Inizializzo GeneralData
  75.         GeneralData gd = generalHelper.initGeneralData(request);

  76.         try {
  77.             PorteApplicativeHelper porteApplicativeHelper = new PorteApplicativeHelper(request, pd, session);
  78.            
  79.             // prelevo il flag che mi dice da quale pagina ho acceduto la sezione delle porte applicative
  80.             Integer parentPA = ServletUtils.getIntegerAttributeFromSession(PorteApplicativeCostanti.ATTRIBUTO_PORTE_APPLICATIVE_PARENT, session, request);
  81.             if(parentPA == null) parentPA = PorteApplicativeCostanti.ATTRIBUTO_PORTE_APPLICATIVE_PARENT_NONE;
  82.            
  83.             String changeAbilitato = porteApplicativeHelper.getParameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ABILITA);
  84.             String schedulingP = porteApplicativeHelper.getParameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_SCHEDULING);
  85.             boolean scheduling = "true".equalsIgnoreCase(schedulingP);
  86.             String nomePorta = porteApplicativeHelper.getParameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_NOME_PORTA);
  87.             String idPorta = porteApplicativeHelper.getParameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID);
  88.             String nomeSAConnettore = porteApplicativeHelper.getParameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_CONNETTORI_MULTIPLI_NOME_SA);

  89.             String idConnTab = porteApplicativeHelper.getParameter(CostantiControlStation.PARAMETRO_ID_CONN_TAB);
  90.             if(StringUtils.isNotEmpty(idConnTab)) {
  91.                 ServletUtils.setObjectIntoSession(request, session, idConnTab, CostantiControlStation.PARAMETRO_ID_CONN_TAB);
  92.             }

  93.             String fromAPIPageInfo = porteApplicativeHelper.getParameter(CostantiControlStation.PARAMETRO_API_PAGE_INFO);
  94.             boolean fromApi = Costanti.CHECK_BOX_ENABLED_TRUE.equalsIgnoreCase(fromAPIPageInfo);

  95.             String actionConferma = porteApplicativeHelper.getParameter(Costanti.PARAMETRO_ACTION_CONFIRM);

  96.             // check su oldNomePD
  97.             //          PageData pdOld =  ServletUtils.getPageDataFromSession(session);
  98.             //          String oldNomePA = pdOld.getHidden(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_OLD_NOME_PA);
  99.             //          oldNomePA = (((oldNomePA != null) && !oldNomePA.equals("")) ? oldNomePA : nomePorta);

  100.             // Preparo il menu
  101.             porteApplicativeHelper.makeMenu();

  102.             PorteApplicativeCore porteApplicativeCore = new PorteApplicativeCore();

  103.             // Prendo la porta applicativa
  104.             PortaApplicativa pa = porteApplicativeCore.getPortaApplicativa(Integer.parseInt(idPorta));

  105.             PortaApplicativaServizioApplicativo oldPaSA = null;
  106.             for (PortaApplicativaServizioApplicativo paSATmp : pa.getServizioApplicativoList()) {
  107.                 if(paSATmp.getNome().equals(nomeSAConnettore)) {
  108.                     oldPaSA = paSATmp;                  
  109.                 }
  110.             }

  111.             // in progress segnalo l'azione che si sta effettuando
  112.             if(actionConferma == null) {
  113.                 boolean eseguiOperazione = true;

  114.                 // solo per i casi in cui sto disabilitando
  115.                 StringBuilder sbErrore = new StringBuilder();
  116.                 if(!ServletUtils.isCheckBoxEnabled(changeAbilitato)) {
  117.                     AccordiServizioParteSpecificaCore apsCore = new AccordiServizioParteSpecificaCore(porteApplicativeCore);
  118.                     AccordiServizioParteComuneCore apcCore = new AccordiServizioParteComuneCore(porteApplicativeCore);
  119.                    
  120.                     String idAsps = porteApplicativeHelper.getParameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_ASPS);
  121.                     if(idAsps == null)
  122.                         idAsps = "";
  123.                     long idAspsLong = Long.parseLong(idAsps);
  124.                     AccordoServizioParteSpecifica asps = apsCore.getAccordoServizioParteSpecifica(idAspsLong);
  125.                     AccordoServizioParteComuneSintetico apc = apcCore.getAccordoServizioSintetico(asps.getIdAccordo());
  126.                     ServiceBinding serviceBinding = apcCore.toMessageServiceBinding(apc.getServiceBinding());
  127.                    
  128.                     // controllo che il connettore non sia utilizzato in altri punti della configurazione
  129.                     List<String> messaggiSezioniConnettore = new ArrayList<>();
  130.                     int numeroElementiDaControllare = 1;
  131.                    
  132.                     boolean connettoreUtilizzatiConfig = porteApplicativeHelper.isConnettoreMultiploInUso(numeroElementiDaControllare,
  133.                             nomeSAConnettore, pa, asps, apc, serviceBinding, messaggiSezioniConnettore);
  134.                    
  135.                     if(!scheduling) {
  136.                    
  137.                         if(connettoreUtilizzatiConfig) {
  138.                             sbErrore.append(PorteApplicativeCostanti.MESSAGGIO_IMPOSSIBILE_DISABILITARE_IL_CONNETTORE_UTILIZZATI_IN_CONFIGURAZIONE);
  139.                             sbErrore.append(":").append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
  140.                             for (String s : messaggiSezioniConnettore) {
  141.                                 sbErrore.append(s);
  142.                             }
  143.    
  144.                             eseguiOperazione = false;
  145.                         }
  146.                        
  147.                        
  148.                         if(!connettoreUtilizzatiConfig) {
  149.                             // controllare che almeno un connettore rimanga abilitato
  150.                             int numeroAbilitati = 0;
  151.                             for (PortaApplicativaServizioApplicativo paSATmp : pa.getServizioApplicativoList()) {
  152.                                 if(!paSATmp.getNome().equals(nomeSAConnettore)) { // controllo che tutti gli altri non siano disabilitati
  153.                                     boolean abilitato = paSATmp.getDatiConnettore() != null ?   paSATmp.getDatiConnettore().getStato().equals(StatoFunzionalita.ABILITATO) : true;
  154.        
  155.                                     if(abilitato)
  156.                                         numeroAbilitati ++;
  157.                                 }
  158.                             }
  159.                            
  160.                            
  161.                             if(numeroAbilitati < 1) {
  162.                                 eseguiOperazione = false;
  163.                                 sbErrore.append(MessageFormat.format(PorteApplicativeCostanti.MESSAGGIO_IMPOSSIBILE_DISABILITARE_IL_CONNETTORE_0_DEVE_RIMANARE_ALMENTO_UN_CONNETTORE_ABILITATO,
  164.                                         porteApplicativeHelper.getLabelNomePortaApplicativaServizioApplicativo(oldPaSA)));
  165.                             }
  166.                         }
  167.                        
  168.                     }
  169.                 }

  170.                 String messaggio = null;
  171.                 String title = null;
  172.                
  173.                 if(eseguiOperazione) {
  174.                     messaggio = porteApplicativeHelper.getMessaggioConfermaModificaRegolaStatoConnettoreMultiplo(fromApi, oldPaSA, ServletUtils.isCheckBoxEnabled(changeAbilitato), true,true,scheduling);
  175.                     String[][] bottoni = {
  176.                             { Costanti.LABEL_MONITOR_BUTTON_ANNULLA,
  177.                                 Costanti.LABEL_MONITOR_BUTTON_ANNULLA_CONFERMA_PREFIX +
  178.                                 Costanti.LABEL_MONITOR_BUTTON_ANNULLA_CONFERMA_SUFFIX

  179.                             },
  180.                             { Costanti.LABEL_MONITOR_BUTTON_CONFERMA,
  181.                                 Costanti.LABEL_MONITOR_BUTTON_ESEGUI_OPERAZIONE_CONFERMA_PREFIX +
  182.                                 Costanti.LABEL_MONITOR_BUTTON_ESEGUI_OPERAZIONE_CONFERMA_SUFFIX }};
  183.                     pd.setBottoni(bottoni );
  184.                 } else {
  185.                     messaggio = sbErrore.toString();
  186.                     title = "Attenzione";
  187.                     String[][] bottoni = {
  188.                             { Costanti.LABEL_MONITOR_BUTTON_CHIUDI,
  189.                                 Costanti.LABEL_MONITOR_BUTTON_ANNULLA_CONFERMA_PREFIX +
  190.                                 Costanti.LABEL_MONITOR_BUTTON_ANNULLA_CONFERMA_SUFFIX

  191.                             }
  192.                             };
  193.                     pd.setBottoni(bottoni );
  194.                 }
  195.                 pd.setMessage(messaggio, title, MessageType.CONFIRM);
  196.             }

  197.             // se ho confermato effettuo la modifica altrimenti torno direttamente alla lista
  198.             if(actionConferma != null && actionConferma.equals(Costanti.PARAMETRO_ACTION_CONFIRM_VALUE_OK)) {
  199.                 // Prendo la porta applicativa
  200.                 pa = porteApplicativeCore.getPortaApplicativa(Integer.parseInt(idPorta));

  201.                 PortaApplicativaServizioApplicativo paSA = null;
  202.                 for (PortaApplicativaServizioApplicativo paSATmp : pa.getServizioApplicativoList()) {
  203.                     if(paSATmp.getNome().equals(nomeSAConnettore)) {
  204.                         paSA = paSATmp;                
  205.                     }
  206.                 }

  207.                 PortaApplicativaServizioApplicativoConnettore datiConnettore = paSA.getDatiConnettore();

  208.                 if(datiConnettore == null) { // succede solo se e' la prima volta che modifico la configurazione di default
  209.                     datiConnettore = new PortaApplicativaServizioApplicativoConnettore();
  210.                     datiConnettore.setNome(CostantiConfigurazione.NOME_CONNETTORE_DEFAULT);
  211.                 }
  212.                 String nomeConnettore = datiConnettore.getNome();

  213.                 paSA.setDatiConnettore(datiConnettore);

  214.                 //              // Modifico i dati della porta applicativa nel db
  215.                 //              pa.setNome(nomePorta);
  216.                 //              IDPortaApplicativa oldIDPortaApplicativaForUpdate = new IDPortaApplicativa();
  217.                 //              oldIDPortaApplicativaForUpdate.setNome(oldNomePA);
  218.                 //              pa.setOldIDPortaApplicativaForUpdate(oldIDPortaApplicativaForUpdate);


  219.                 // cambio solo la modalita'
  220.                 if(scheduling) {
  221.                     if(ServletUtils.isCheckBoxEnabled(changeAbilitato)) {
  222.                         datiConnettore.setScheduling(StatoFunzionalita.ABILITATO);
  223.                     }
  224.                     else{
  225.                         datiConnettore.setScheduling(StatoFunzionalita.DISABILITATO);
  226.                     }
  227.                 }
  228.                 else {
  229.                     if(ServletUtils.isCheckBoxEnabled(changeAbilitato)) {
  230.                         datiConnettore.setStato(StatoFunzionalita.ABILITATO);
  231.                     }
  232.                     else{
  233.                         datiConnettore.setStato(StatoFunzionalita.DISABILITATO);
  234.                     }
  235.                 }

  236.                 String userLogin = ServletUtils.getUserLoginFromSession(session);
  237.                
  238.                 if(datiConnettore.getProprietaOggetto()==null) {
  239.                     datiConnettore.setProprietaOggetto(new ProprietaOggetto());
  240.                 }
  241.                 datiConnettore.getProprietaOggetto().setUtenteUltimaModifica(userLogin);
  242.                 datiConnettore.getProprietaOggetto().setDataUltimaModifica(DateManager.getDate());
  243.                
  244.                 porteApplicativeCore.performUpdateOperation(userLogin, porteApplicativeHelper.smista(), pa);
  245.                
  246.                 List<String> aliasJmx = porteApplicativeCore.getJmxPdDAliases();
  247.                 if(aliasJmx!=null && !aliasJmx.isEmpty()) {
  248.                    
  249.                     boolean repositoryUpdated = false;
  250.                    
  251.                     for (String alias : aliasJmx) {
  252.                        
  253.                         // config
  254.                         boolean success = false;
  255.                         String metodo = null;
  256.                         if(scheduling) {
  257.                             metodo = StatoFunzionalita.ABILITATO.equals(datiConnettore.getScheduling()) ?
  258.                                     porteApplicativeCore.getJmxPdDConfigurazioneSistemaNomeMetodoEnableSchedulingConnettoreMultiplo(alias) :
  259.                                     porteApplicativeCore.getJmxPdDConfigurazioneSistemaNomeMetodoDisableSchedulingConnettoreMultiplo(alias);
  260.                         }
  261.                         else {
  262.                             metodo = StatoFunzionalita.ABILITATO.equals(datiConnettore.getStato()) ?
  263.                                     porteApplicativeCore.getJmxPdDConfigurazioneSistemaNomeMetodoEnableConnettoreMultiplo(alias) :
  264.                                     porteApplicativeCore.getJmxPdDConfigurazioneSistemaNomeMetodoDisableConnettoreMultiplo(alias);
  265.                         }
  266.                         try{
  267.                             String stato = porteApplicativeCore.getInvoker().invokeJMXMethod(alias,
  268.                                     porteApplicativeCore.getJmxPdDConfigurazioneSistemaType(alias),
  269.                                     porteApplicativeCore.getJmxPdDConfigurazioneSistemaNomeRisorsaConfigurazionePdD(alias),
  270.                                     metodo,
  271.                                     pa.getNome(),
  272.                                     nomeConnettore,
  273.                                     userLogin);
  274.                             if(stato==null) {
  275.                                 throw new ServletException("Aggiornamento fallito");
  276.                             }
  277.                             if(
  278.                                     !(
  279.                                         JMXUtils.MSG_OPERAZIONE_EFFETTUATA_SUCCESSO.equals(stato)
  280.                                         ||
  281.                                         (stato!=null && stato.startsWith(JMXUtils.MSG_OPERAZIONE_EFFETTUATA_SUCCESSO_PREFIX))
  282.                                     )
  283.                                 ){
  284.                                 throw new ServletException(stato);
  285.                             }
  286.                             else {
  287.                                 success = true;
  288.                             }
  289.                         }catch(Exception e){
  290.                             String msgErrore = "Errore durante l'aggiornamento dello "+(scheduling ? "scheduling" : "stato")+" del connettore "+nomeConnettore+" della PortaApplicativa '"+pa.getNome()+"' via jmx (jmxMethod '"+metodo+"') (node:"+alias+"): "+e.getMessage();
  291.                             ControlStationCore.logError(msgErrore, e);
  292.                         }
  293.                        
  294.                         if(scheduling && !repositoryUpdated && success) {
  295.                             // repository
  296.                             metodo = StatoFunzionalita.ABILITATO.equals(datiConnettore.getScheduling()) ?
  297.                                     porteApplicativeCore.getJmxPdDConfigurazioneSistemaNomeMetodoEnableSchedulingConnettoreMultiploRuntimeRepository(alias) :
  298.                                     porteApplicativeCore.getJmxPdDConfigurazioneSistemaNomeMetodoDisableSchedulingConnettoreMultiploRuntimeRepository(alias);
  299.                             try{
  300.                                 boolean slowOperation = true;
  301.                                 String stato = porteApplicativeCore.getInvoker().invokeJMXMethod(alias,
  302.                                         porteApplicativeCore.getJmxPdDConfigurazioneSistemaType(alias),
  303.                                         porteApplicativeCore.getJmxPdDConfigurazioneSistemaNomeRisorsaConfigurazionePdD(alias),
  304.                                         metodo,
  305.                                         slowOperation,
  306.                                         pa.getNome(),
  307.                                         nomeConnettore);
  308.                                 if(stato==null) {
  309.                                     throw new ServletException("Aggiornamento fallito");
  310.                                 }
  311.                                 if(
  312.                                         !(
  313.                                             JMXUtils.MSG_OPERAZIONE_EFFETTUATA_SUCCESSO.equals(stato)
  314.                                             ||
  315.                                             (stato!=null && stato.startsWith(JMXUtils.MSG_OPERAZIONE_EFFETTUATA_SUCCESSO_PREFIX))
  316.                                         )
  317.                                     ){
  318.                                     throw new ServletException(stato);
  319.                                 }
  320.                                 else {
  321.                                     repositoryUpdated = true;
  322.                                     ControlStationCore.logDebug("Aggiornato scheduling del connettore: "+stato);
  323.                                 }
  324.                             }catch(Exception e){
  325.                                 String msgErrore = "Errore durante l'aggiornamento dello scheduling del connettore "+nomeConnettore+" della PortaApplicativa '"+pa.getNome()+"' via jmx (jmxMethod '"+metodo+"') (node:"+alias+"): "+e.getMessage();
  326.                                 ControlStationCore.logError(msgErrore, e);
  327.                             }
  328.                         }
  329.                     }
  330.                 }
  331.                
  332.                 ServletUtils.removeRisultatiRicercaFromSession(request, session, Liste.PORTE_APPLICATIVE_CONNETTORI_MULTIPLI);
  333.             }

  334.             // Preparo la lista
  335.             ConsoleSearch ricerca = (ConsoleSearch) ServletUtils.getSearchObjectFromSession(request, session, ConsoleSearch.class);

  336.             int idLista = Liste.PORTE_APPLICATIVE_CONNETTORI_MULTIPLI;

  337.             ricerca = porteApplicativeHelper.checkSearchParameters(idLista, ricerca);

  338.             PortaApplicativa portaApplicativa = porteApplicativeCore.getPortaApplicativa(Integer.parseInt(idPorta));
  339.             IDSoggetto idSoggettoProprietario = new IDSoggetto(pa.getTipoSoggettoProprietario(), pa.getNomeSoggettoProprietario());
  340.             List<PortaApplicativaServizioApplicativo> listaFiltrata = porteApplicativeHelper.applicaFiltriRicercaConnettoriMultipli(ricerca, idLista, pa.getServizioApplicativoList(), idSoggettoProprietario);
  341.                        
  342.             PortaApplicativaServizioApplicativo paSA = null;
  343.             for (PortaApplicativaServizioApplicativo paSATmp : pa.getServizioApplicativoList()) {
  344.                 if(paSATmp.getNome().equals(nomeSAConnettore)) {
  345.                     paSA = paSATmp;                
  346.                 }
  347.             }

  348.             if(paSA==null) {
  349.                 throw new Exception("Connettore '"+nomeSAConnettore+"' non trovato");
  350.             }
  351.            
  352.             PortaApplicativaServizioApplicativoConnettore datiConnettore = paSA.getDatiConnettore();

  353.             if(datiConnettore == null) { // succede solo se e' la prima volta che modifico la configurazione di default
  354.                 datiConnettore = new PortaApplicativaServizioApplicativoConnettore();
  355.                 datiConnettore.setNome(CostantiConfigurazione.NOME_CONNETTORE_DEFAULT);
  356.             }
  357.            
  358.             String nomeConnettoreChangeList = datiConnettore.getNome();
  359.             if(nomeConnettoreChangeList==null) {
  360.                 nomeConnettoreChangeList = CostantiConfigurazione.NOME_CONNETTORE_DEFAULT;
  361.             }
  362.            
  363.             porteApplicativeHelper.preparePorteAppConnettoriMultipliList_fromChangeConnettore(nomePorta, ricerca, listaFiltrata, portaApplicativa,
  364.                     nomeConnettoreChangeList);

  365.             ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);

  366.             // Forward control to the specified success URI
  367.             return ServletUtils.getStrutsForwardEditModeFinished(mapping, PorteApplicativeCostanti.OBJECT_NAME_PORTE_APPLICATIVE_CONNETTORI_MULTIPLI_ABILITAZIONE, ForwardParams.OTHER(""));
  368.         } catch (Exception e) {
  369.             return ServletUtils.getStrutsForwardError(ControlStationCore.getLog(), e, pd, request, session, gd, mapping,
  370.                     PorteApplicativeCostanti.OBJECT_NAME_PORTE_APPLICATIVE_CONNETTORI_MULTIPLI_ABILITAZIONE,
  371.                     ForwardParams.OTHER(""));

  372.         }
  373.     }
  374. }