ApiApiServiceImpl.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.core.config.rs.server.api.impl.api;

  21. import java.util.ArrayList;
  22. import java.util.Arrays;
  23. import java.util.List;

  24. import org.apache.commons.lang.StringEscapeUtils;
  25. import org.apache.commons.lang.StringUtils;
  26. import org.openspcoop2.core.commons.Filtri;
  27. import org.openspcoop2.core.commons.Liste;
  28. import org.openspcoop2.core.config.rs.server.api.ApiApi;
  29. import org.openspcoop2.core.config.rs.server.api.impl.Enums;
  30. import org.openspcoop2.core.config.rs.server.api.impl.Helper;
  31. import org.openspcoop2.core.config.rs.server.config.ServerProperties;
  32. import org.openspcoop2.core.config.rs.server.model.Api;
  33. import org.openspcoop2.core.config.rs.server.model.ApiAllegato;
  34. import org.openspcoop2.core.config.rs.server.model.ApiAzione;
  35. import org.openspcoop2.core.config.rs.server.model.ApiCanale;
  36. import org.openspcoop2.core.config.rs.server.model.ApiDescrizione;
  37. import org.openspcoop2.core.config.rs.server.model.ApiInformazioniGenerali;
  38. import org.openspcoop2.core.config.rs.server.model.ApiInformazioniGeneraliView;
  39. import org.openspcoop2.core.config.rs.server.model.ApiInterfaccia;
  40. import org.openspcoop2.core.config.rs.server.model.ApiInterfacciaRest;
  41. import org.openspcoop2.core.config.rs.server.model.ApiInterfacciaSoap;
  42. import org.openspcoop2.core.config.rs.server.model.ApiInterfacciaView;
  43. import org.openspcoop2.core.config.rs.server.model.ApiItem;
  44. import org.openspcoop2.core.config.rs.server.model.ApiModI;
  45. import org.openspcoop2.core.config.rs.server.model.ApiReferenteView;
  46. import org.openspcoop2.core.config.rs.server.model.ApiRisorsa;
  47. import org.openspcoop2.core.config.rs.server.model.ApiServizio;
  48. import org.openspcoop2.core.config.rs.server.model.ApiTags;
  49. import org.openspcoop2.core.config.rs.server.model.ApiViewItem;
  50. import org.openspcoop2.core.config.rs.server.model.CanaleEnum;
  51. import org.openspcoop2.core.config.rs.server.model.ConfigurazioneApiCanale;
  52. import org.openspcoop2.core.config.rs.server.model.ConfigurazioneCanaleEnum;
  53. import org.openspcoop2.core.config.rs.server.model.HttpMethodEnum;
  54. import org.openspcoop2.core.config.rs.server.model.ListaApi;
  55. import org.openspcoop2.core.config.rs.server.model.ListaApiAllegati;
  56. import org.openspcoop2.core.config.rs.server.model.ListaApiAzioni;
  57. import org.openspcoop2.core.config.rs.server.model.ListaApiRisorse;
  58. import org.openspcoop2.core.config.rs.server.model.ListaApiServizi;
  59. import org.openspcoop2.core.config.rs.server.model.RuoloAllegatoAPI;
  60. import org.openspcoop2.core.config.rs.server.model.TipoApiEnum;
  61. import org.openspcoop2.core.id.IDAccordo;
  62. import org.openspcoop2.core.id.IDPortType;
  63. import org.openspcoop2.core.id.IDPortTypeAzione;
  64. import org.openspcoop2.core.id.IDResource;
  65. import org.openspcoop2.core.registry.AccordoServizioParteComune;
  66. import org.openspcoop2.core.registry.Documento;
  67. import org.openspcoop2.core.registry.GruppiAccordo;
  68. import org.openspcoop2.core.registry.Gruppo;
  69. import org.openspcoop2.core.registry.GruppoAccordo;
  70. import org.openspcoop2.core.registry.Operation;
  71. import org.openspcoop2.core.registry.PortType;
  72. import org.openspcoop2.core.registry.Resource;
  73. import org.openspcoop2.core.registry.beans.AccordoServizioParteComuneSintetico;
  74. import org.openspcoop2.core.registry.constants.HttpMethod;
  75. import org.openspcoop2.core.registry.constants.ProprietariDocumento;
  76. import org.openspcoop2.core.registry.constants.ServiceBinding;
  77. import org.openspcoop2.core.registry.driver.IDAccordoFactory;
  78. import org.openspcoop2.protocol.basic.Costanti;
  79. import org.openspcoop2.protocol.basic.archive.APIUtils;
  80. import org.openspcoop2.protocol.sdk.constants.ConsoleOperationType;
  81. import org.openspcoop2.protocol.sdk.properties.ProtocolProperties;
  82. import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesUtils;
  83. import org.openspcoop2.utils.json.YAMLUtils;
  84. import org.openspcoop2.utils.service.BaseImpl;
  85. import org.openspcoop2.utils.service.authorization.AuthorizationConfig;
  86. import org.openspcoop2.utils.service.authorization.AuthorizationManager;
  87. import org.openspcoop2.utils.service.beans.ProfiloCollaborazioneEnum;
  88. import org.openspcoop2.utils.service.beans.ProfiloEnum;
  89. import org.openspcoop2.utils.service.beans.utils.BaseHelper;
  90. import org.openspcoop2.utils.service.beans.utils.ListaUtils;
  91. import org.openspcoop2.utils.service.context.IContext;
  92. import org.openspcoop2.utils.service.fault.jaxrs.FaultCode;
  93. import org.openspcoop2.web.ctrlstat.core.ConsoleSearch;
  94. import org.openspcoop2.web.ctrlstat.core.SerialiableFormFile;
  95. import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneCostanti;
  96. import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneHelper;
  97. import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneUtilities;
  98. import org.openspcoop2.web.ctrlstat.servlet.archivi.ArchiviCore;
  99. import org.openspcoop2.web.ctrlstat.servlet.archivi.ArchiviHelper;
  100. import org.openspcoop2.web.ctrlstat.servlet.gruppi.GruppiCore;
  101. import org.openspcoop2.web.lib.mvc.BinaryParameter;
  102. import org.openspcoop2.web.lib.mvc.TipoOperazione;

  103. /**
  104.  * ApiApiServiceImpl
  105.  *
  106.  * @author $Author$
  107.  * @version $Rev$, $Date$
  108.  *
  109.  */
  110. public class ApiApiServiceImpl extends BaseImpl implements ApiApi {

  111.     public ApiApiServiceImpl() {
  112.         super(org.slf4j.LoggerFactory.getLogger(ApiApiServiceImpl.class));
  113.     }

  114.     private AuthorizationConfig getAuthorizationConfig() throws Exception {
  115.         return new AuthorizationConfig(ServerProperties.getInstance().getProperties());
  116.     }

  117.     /**
  118.      * Creazione di un'API
  119.      *
  120.      * Questa operazione consente di creare una API
  121.      *
  122.      */
  123.     @Override
  124.     public void createApi(Api body, ProfiloEnum profilo, String soggetto) {
  125.         IContext context = this.getContext();
  126.         try {
  127.             context.getLogger().info("Invocazione in corso ...");

  128.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  129.             context.getLogger().debug("Autorizzazione completata con successo");

  130.             if (body == null)
  131.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare un body");

  132.             if (body.getReferente() == null || "".equals(body.getReferente().trim())) {
  133.                 body.setReferente(soggetto);
  134.             }

  135.             ApiEnv env = new ApiEnv(profilo, soggetto, context);

  136.             AccordoServizioParteComune as = ApiApiHelper.accordoApiToRegistro(body, env);

  137.             ProtocolProperties protocolProperties = null;
  138.             if(profilo != null) {
  139.                 protocolProperties = ApiApiHelper.getProtocolProperties(body, profilo);
  140.    
  141.                 if(protocolProperties != null) {
  142.                     as.setProtocolPropertyList(ProtocolPropertiesUtils.toProtocolPropertiesRegistry(protocolProperties, ConsoleOperationType.ADD, null));
  143.                 }
  144.             }
  145.            
  146.             IDAccordo idAccordoFromAccordo = env.idAccordoFactory.getIDAccordoFromAccordo(as);
  147.             if (env.apcCore.existsAccordoServizio(idAccordoFromAccordo))
  148.                 throw FaultCode.CONFLITTO.toException("Api già esistente");

  149.             boolean validazioneDocumenti = ServerProperties.getInstance().isValidazioneDocumenti();

  150.             StringBuilder bfTags = new StringBuilder();
  151.             if(body!=null && body.getTags()!=null && !body.getTags().isEmpty()) {
  152.                 for (String tag : body.getTags()) {
  153.                     if(bfTags.length()>0) {
  154.                         bfTags.append(",");
  155.                     }
  156.                     bfTags.append(tag);
  157.                 }
  158.             }
  159.            
  160.             boolean gestioneCanaliEnabled = env.gestioneCanali;
  161.             String canale = as.getCanale();
  162.             String canaleStato = null;
  163.             if(canale == null) {
  164.                 canaleStato = AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_DEFAULT;
  165.             } else {
  166.                 canaleStato = AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_RIDEFINITO;
  167.             }
  168.                        
  169.             if (!env.apcHelper.accordiCheckData(TipoOperazione.ADD, as.getNome(), as.getDescrizione(),
  170.                     as.getProfiloCollaborazione().toString(), Helper.toBinaryParameter(as.getByteWsdlDefinitorio()), // wsdldef
  171.                     Helper.toBinaryParameter(as.getByteWsdlConcettuale()), // wsdlconc,
  172.                     Helper.toBinaryParameter(as.getByteWsdlLogicoErogatore()), // wsdlserv
  173.                     Helper.toBinaryParameter(as.getByteWsdlLogicoFruitore()), // wsdlservcorr,
  174.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getFiltroDuplicati()),
  175.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getConfermaRicezione()),
  176.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getIdCollaborazione()),
  177.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getIdRiferimentoRichiesta()),
  178.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getConsegnaInOrdine()), "", // scadenza
  179.                     "0", // Id intero del servizio applicativo
  180.                     as.getSoggettoReferente().getId().toString(), // IDSoggetto?
  181.                     as.getVersione().toString(), null, // accordoCooperazione
  182.                     false, // visibilitaAccordoServizio
  183.                     false, // visibilitaAccordoCooperazione
  184.                     null, // ID AccordoOld
  185.                     new BinaryParameter(), // wsblconc
  186.                     new BinaryParameter(), // wsblserv
  187.                     new BinaryParameter(), // wsblservcorr
  188.                     validazioneDocumenti, env.tipo_protocollo, null, // backToStato
  189.                     env.apcCore.toMessageServiceBinding(as.getServiceBinding()), null, // messageType
  190.                     Enums.interfaceTypeFromFormatoSpecifica.get(as.getFormatoSpecifica()), env.gestisciSoggettoReferente,
  191.                     bfTags.toString(),
  192.                     canaleStato, canale, gestioneCanaliEnabled
  193.                     )) {

  194.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  195.             }
  196.            
  197.             ApiApiHelper.validateProperties(env, protocolProperties, idAccordoFromAccordo, ConsoleOperationType.ADD);
  198.            

  199.             List<Object> objectToCreate = new ArrayList<>();
  200.            
  201.             if(body.getTags()!=null && !body.getTags().isEmpty()) {
  202.                 as.setGruppi(new GruppiAccordo());
  203.                
  204.                 GruppiCore gruppiCore = new GruppiCore(env.stationCore);
  205.                
  206.                 for (String tag : body.getTags()) {
  207.                     GruppoAccordo gruppo = new GruppoAccordo();
  208.                     gruppo.setNome(tag);
  209.                     as.getGruppi().addGruppo(gruppo);
  210.                    
  211.                     if(!gruppiCore.existsGruppo(tag)) {
  212.                         Gruppo nuovoGruppo = new Gruppo();
  213.                         nuovoGruppo.setNome(tag);
  214.                         nuovoGruppo.setSuperUser(as.getSuperUser());
  215.                         objectToCreate.add(nuovoGruppo);
  216.                     }
  217.                 }
  218.             }
  219.            
  220.             objectToCreate.add(as);
  221.            
  222.             // effettuo le operazioni
  223.             env.apcCore.performCreateOperation(env.userLogin, false, objectToCreate.toArray(new Object[objectToCreate.size()]));
  224.            
  225.             context.getLogger().info("Invocazione completata con successo");
  226.            
  227.             // Bug Fix: altrimenti viene generato 204
  228.             context.getServletResponse().setStatus(201);
  229.            
  230.         } catch (javax.ws.rs.WebApplicationException e) {
  231.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  232.             throw e;
  233.         } catch (Throwable e) {
  234.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  235.             throw FaultCode.ERRORE_INTERNO.toException(e);
  236.         }
  237.     }

  238.     /**
  239.      * Creazione di un allegato di una API
  240.      *
  241.      * Questa operazione consente di aggiungere un allegato alla API identificata
  242.      * dal nome e dalla versione
  243.      *
  244.      */
  245.     @Override
  246.     public void createApiAllegato(ApiAllegato body, String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  247.         IContext context = this.getContext();
  248.         try {

  249.             context.getLogger().info("Invocazione in corso ...");

  250.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  251.             context.getLogger().debug("Autorizzazione completata con successo");

  252.             if (body == null)
  253.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Body non presente");

  254.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  255.             AccordoServizioParteComune as = Helper.getAccordoFull(nome, versione, env.idSoggetto.toIDSoggetto(), env.apcCore);

  256.             if (as == null)
  257.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Nessuna Api corrisponde ai parametri indicati");

  258.             Documento documento = ApiApiHelper.apiAllegatoToDocumento(body, as, env);

  259.             if(RuoloAllegatoAPI.ALLEGATO.equals(body.getAllegato().getRuolo())) {
  260.                 as.addAllegato(documento);
  261.             }
  262.             else if(RuoloAllegatoAPI.SPECIFICASEMIFORMALE.equals(body.getAllegato().getRuolo())) {
  263.                 as.addSpecificaSemiformale(documento);
  264.             }else {
  265.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Ruolo " + body.getAllegato().getRuolo() + " sconosciuto");
  266.             }

  267.             ArchiviCore archiviCore = new ArchiviCore(env.stationCore);
  268.             SerialiableFormFile filewrap = new SerialiableFormFile(documento.getFile(), documento.getByteContenuto());

  269.             env.requestWrapper.overrideParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ALLEGATI_RUOLO,
  270.                     documento.getRuolo());

  271.             ArchiviHelper archiviHelper = new ArchiviHelper(env.stationCore, env.requestWrapper, env.pd,
  272.                     env.requestWrapper.getSession());

  273.             boolean documentoUnivocoIndipendentementeTipo = true;
  274.             if (archiviCore.existsDocumento(documento, ProprietariDocumento.accordoServizio,
  275.                     documentoUnivocoIndipendentementeTipo)) {
  276.                 throw FaultCode.CONFLITTO.toException("Allegato con nome " + documento.getFile() + " già presente nella API");
  277.             }

  278.             if (!archiviHelper.accordiAllegatiCheckData(TipoOperazione.ADD, filewrap, documento,
  279.                     ProprietariDocumento.accordoServizio, env.protocolFactory)) {
  280.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  281.             }

  282.             env.apcCore.performUpdateOperation(env.userLogin, false, as);

  283.             context.getLogger().info("Invocazione completata con successo");
  284.            
  285.             // Bug Fix: altrimenti viene generato 204
  286.             context.getServletResponse().setStatus(201);
  287.            
  288.         } catch (javax.ws.rs.WebApplicationException e) {
  289.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  290.             throw e;
  291.         } catch (Throwable e) {
  292.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  293.             throw FaultCode.ERRORE_INTERNO.toException(e);
  294.         }
  295.     }

  296.     /**
  297.      * Creazione di un'azione di una API
  298.      *
  299.      * Questa operazione consente di aggiungere una azione al servizio della API
  300.      * identificata dal nome e dalla versione
  301.      *
  302.      */
  303.     @Override
  304.     public void createApiAzione(ApiAzione body, String nome, Integer versione, String nomeServizio, ProfiloEnum profilo,
  305.             String soggetto) {
  306.         IContext context = this.getContext();
  307.         // body.
  308.         try {
  309.             context.getLogger().info("Invocazione in corso ...");

  310.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  311.             context.getLogger().debug("Autorizzazione completata con successo");

  312.             if (body == null)
  313.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare un body");

  314.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  315.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  316.             if (as == null)
  317.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Nessuna Api con nome: " + nome + " e versione " + versione);
  318.             if (as.getServiceBinding() == ServiceBinding.REST)
  319.                 throw FaultCode.RICHIESTA_NON_VALIDA
  320.                         .toException("Non è possibile registrare Azioni e Servizi su Api con interfaccia REST");

  321.             PortType pt = as.getPortTypeList().stream().filter(p -> nomeServizio.equals(p.getNome())).findFirst()
  322.                     .orElse(null);

  323.             if (pt == null)
  324.                 throw FaultCode.NOT_FOUND.toException("Nessun Servizio con nome: " + nomeServizio);

  325.             Operation newOp = ApiApiHelper.apiAzioneToOperazione(body, pt);

  326.             if (env.apcCore.existsAccordoServizioPorttypeOperation(newOp.getNome(), pt.getId()))
  327.                 throw FaultCode.CONFLITTO.toException("L'azione " + newOp.getNome() + " è già stata associata alla Api");

  328.             ProtocolProperties protocolProperties = null;
  329.             if(profilo != null) {
  330.                 protocolProperties = ApiApiHelper.getProtocolProperties(body, profilo, as, newOp, env);
  331.    
  332.                 if(protocolProperties != null) {
  333.                     newOp.setProtocolPropertyList(ProtocolPropertiesUtils.toProtocolPropertiesRegistry(protocolProperties, ConsoleOperationType.ADD, null));
  334.                 }
  335.             }

  336.            
  337.             pt.addAzione(newOp);
  338.            
  339.             ProfiloCollaborazioneEnum profiloBody = body.getProfiloCollaborazione()!=null ? body.getProfiloCollaborazione() : ProfiloCollaborazioneEnum.SINCRONO;
  340.            
  341.             if (! env.apcHelper.accordiPorttypeOperationCheckData(
  342.                     TipoOperazione.ADD,
  343.                     as.getId().toString(),
  344.                     nomeServizio,
  345.                     newOp.getNome(),
  346.                     newOp.getProfAzione(),
  347.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newOp.getFiltroDuplicati()),
  348.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newOp.getConfermaRicezione()),
  349.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newOp.getIdCollaborazione()),
  350.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newOp.getIdRiferimentoRichiesta()),
  351.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newOp.getConsegnaInOrdine()),
  352.                     newOp.getScadenza() != null ? newOp.getScadenza() : "", "-", // Servizio Correlato
  353.                     "-", // Azione Correlata
  354.                     Enums.profiloCollaborazioneFromApiEnum.get(profiloBody).toString(), "0", // styleOp
  355.                     "", // soapActionOp,
  356.                     "literal", // useOp,
  357.                     null, // opTypeOp,
  358.                     "" // nsWSDLOp
  359.             )) {
  360.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  361.             }
  362.            
  363.             IDPortType idPT = new IDPortType();
  364.             idPT.setNome(pt.getNome());
  365.             idPT.setIdAccordo(IDAccordoFactory.getInstance().getIDAccordoFromAccordo(as));
  366.             IDPortTypeAzione idAccordoAzione = new IDPortTypeAzione();
  367.             idAccordoAzione.setNome(newOp.getNome());
  368.             idAccordoAzione.setIdPortType(idPT);
  369.            
  370.             ApiApiHelper.validateProperties(env, protocolProperties, idAccordoAzione, ConsoleOperationType.ADD);
  371.            

  372.             AccordiServizioParteComuneUtilities.createPortTypeOperation(env.apcCore.isEnableAutoMappingWsdlIntoAccordo(),
  373.                     env.apcCore, env.apcHelper, as, pt, env.userLogin);

  374.             context.getLogger().info("Invocazione completata con successo");
  375.            
  376.             // Bug Fix: altrimenti viene generato 204
  377.             context.getServletResponse().setStatus(201);
  378.            
  379.         } catch (javax.ws.rs.WebApplicationException e) {
  380.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  381.             throw e;
  382.         } catch (Throwable e) {
  383.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  384.             throw FaultCode.ERRORE_INTERNO.toException(e);
  385.         }
  386.     }

  387.     /**
  388.      * Creazione di una risorsa di una API
  389.      *
  390.      * Questa operazione consente di aggiungere una risorsa alla API identificata
  391.      * dal nome e dalla versione
  392.      *
  393.      */
  394.     @Override
  395.     public void createApiRisorsa(ApiRisorsa body, String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  396.         IContext context = this.getContext();
  397.         try {
  398.             context.getLogger().info("Invocazione in corso ...");

  399.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  400.             context.getLogger().debug("Autorizzazione completata con successo");

  401.             if (body == null)
  402.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare un body");

  403.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  404.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  405.             if (as == null)
  406.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Nessuna Api con nome: " + nome + " e versione " + versione);

  407.             if (as.getServiceBinding() != ServiceBinding.REST) {
  408.                 throw FaultCode.RICHIESTA_NON_VALIDA
  409.                         .toException("E' possibile registrare risorse solo su API con interfaccia REST");
  410.             }

  411.             Resource newRes = ApiApiHelper.apiRisorsaToRegistro(body, as);

  412.             ProtocolProperties protocolProperties = null;
  413.             if(profilo != null) {
  414.                 protocolProperties = ApiApiHelper.getProtocolProperties(body, profilo, newRes, env);
  415.    
  416.                 if(protocolProperties != null) {
  417.                     newRes.setProtocolPropertyList(ProtocolPropertiesUtils.toProtocolPropertiesRegistry(protocolProperties, ConsoleOperationType.ADD, null));
  418.                 }
  419.             }
  420.            

  421.             if (StringUtils.isEmpty(newRes.getNome()) && newRes.getMethod() == null)
  422.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Il campo nome non è stato definito");

  423.             if (env.apcCore.existsAccordoServizioResource(newRes.getMethodRawEnumValue(), newRes.getPath(), as.getId(), null))
  424.                 throw FaultCode.CONFLITTO.toException("La risorsa " + newRes.getNome() + " è già stata associata alla Api");

  425.             if (!env.apcHelper.accordiResourceCheckData(TipoOperazione.ADD, as.getId().toString(),
  426.                     body.getNome() != null ? body.getNome() : "", newRes.getNome(), newRes.getPath(), newRes.getMethodRawEnumValue(),
  427.                     newRes.getDescrizione(), env.apcCore.toMessageMessageType(newRes.getMessageType()), null, // oldNomeRisorsa
  428.                     null, // oldNomeRisorsaGenerato
  429.                     null, // oldPath
  430.                     null, // oldHttpMethod
  431.                     AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_DEFAULT,
  432.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newRes.getFiltroDuplicati()),
  433.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newRes.getConfermaRicezione()), // confricaz,
  434.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newRes.getIdCollaborazione()),
  435.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newRes.getIdRiferimentoRichiesta()),
  436.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newRes.getConsegnaInOrdine()), // consordaz,
  437.                     "" // scadenzaaz
  438.             )) {
  439.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  440.             }

  441.             IDResource idResource = new IDResource();
  442.             idResource.setNome(newRes.getNome());
  443.             idResource.setIdAccordo(IDAccordoFactory.getInstance().getIDAccordoFromAccordo(as));
  444.            
  445.             ApiApiHelper.validateProperties(env, protocolProperties, idResource, newRes.getMethod()!=null ? newRes.getMethod().toString() : null, newRes.getPath(), ConsoleOperationType.ADD);
  446.            
  447.             as.addResource(newRes);

  448.             AccordiServizioParteComuneUtilities.createResource(env.apcCore.isEnableAutoMappingWsdlIntoAccordo(), env.apcCore,
  449.                     env.apcHelper, as, env.userLogin);

  450.             context.getLogger().info("Invocazione completata con successo");
  451.            
  452.             // Bug Fix: altrimenti viene generato 204
  453.             context.getServletResponse().setStatus(201);
  454.            
  455.         } catch (javax.ws.rs.WebApplicationException e) {
  456.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  457.             throw e;
  458.         } catch (Throwable e) {
  459.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  460.             throw FaultCode.ERRORE_INTERNO.toException(e);
  461.         }
  462.     }

  463.     /**
  464.      * Creazione di un servizio di una API
  465.      *
  466.      * Questa operazione consente di aggiungere un servizio alla API identificata
  467.      * dal nome e dalla versione
  468.      *
  469.      */
  470.     @Override
  471.     public void createApiServizio(ApiServizio body, String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  472.         IContext context = this.getContext();
  473.         try {
  474.             context.getLogger().info("Invocazione in corso ...");

  475.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  476.             context.getLogger().debug("Autorizzazione completata con successo");

  477.             if (body == null)
  478.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare un body");

  479.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  480.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  481.             if (as == null)
  482.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Nessuna Api con nome: " + nome + " e versione " + versione);

  483.             if (as.getServiceBinding() == ServiceBinding.REST) {
  484.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Non è possibile associare un servizio ad una api REST");
  485.             }

  486.             // Il Servizio assumiamo che di base RIDEFINISCA il profilo della api, dato che
  487.             // abbiamo nei campi dei valori che dalla console sono configurabili sono in
  488.             // quel caso.
  489.             PortType newPT = ApiApiHelper.apiServizioToRegistro(body, as, env);

  490.             if (env.apcCore.existsAccordoServizioPorttype(newPT.getNome(), as.getId()))
  491.                 throw FaultCode.CONFLITTO.toException("Il servizio " + newPT.getNome() + " è già stato associato alla API");

  492.             if (!env.apcHelper.accordiPorttypeCheckData(TipoOperazione.ADD, as.getId().toString(), newPT.getNome(),
  493.                     newPT.getDescrizione(), AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_RIDEFINITO,
  494.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newPT.getFiltroDuplicati()),
  495.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newPT.getConfermaRicezione()),
  496.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newPT.getIdCollaborazione()),
  497.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newPT.getIdRiferimentoRichiesta()),
  498.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newPT.getConsegnaInOrdine()),
  499.                     newPT.getScadenza())) {
  500.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  501.             }
  502.             as.addPortType(newPT);

  503.             env.apcCore.performUpdateOperation(env.userLogin, false, as);

  504.             context.getLogger().info("Invocazione completata con successo");
  505.            
  506.             // Bug Fix: altrimenti viene generato 204
  507.             context.getServletResponse().setStatus(201);
  508.            
  509.         } catch (javax.ws.rs.WebApplicationException e) {
  510.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  511.             throw e;
  512.         } catch (Throwable e) {
  513.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  514.             throw FaultCode.ERRORE_INTERNO.toException(e);
  515.         }
  516.     }

  517.     /**
  518.      * Elimina un'api
  519.      *
  520.      * Questa operazione consente di eliminare un API identificata dal nome e dalla
  521.      * versione
  522.      *
  523.      */
  524.     @Override
  525.     public void deleteApi(String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  526.         IContext context = this.getContext();
  527.         try {
  528.             context.getLogger().info("Invocazione in corso ...");

  529.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  530.             context.getLogger().debug("Autorizzazione completata con successo");

  531.             ApiEnv env = new ApiEnv(profilo, soggetto, context);

  532.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  533.             if (as != null) {
  534.                 StringBuilder inUsoMessage = new StringBuilder();
  535.                
  536.                 AccordiServizioParteComuneUtilities.deleteAccordoServizioParteComune(as, env.userLogin, env.apcCore,
  537.                         env.apcHelper, inUsoMessage, "\n");
  538.                 if (inUsoMessage.length() > 0)
  539.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(inUsoMessage.toString()));
  540.             }

  541.             if (env.delete_404 && as == null)
  542.                 throw FaultCode.NOT_FOUND.toException("Api non trovata");

  543.             context.getLogger().info("Invocazione completata con successo");

  544.         } catch (javax.ws.rs.WebApplicationException e) {
  545.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  546.             throw e;
  547.         } catch (Throwable e) {
  548.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  549.             throw FaultCode.ERRORE_INTERNO.toException(e);
  550.         }
  551.     }

  552.     /**
  553.      * Elimina un allegato di una API
  554.      *
  555.      * Questa operazione consente di eliminare un'allegato della API identificata
  556.      * dal nome e dalla versione
  557.      *
  558.      */
  559.     @Override
  560.     public void deleteApiAllegato(String nome, Integer versione, String nomeAllegato, ProfiloEnum profilo,
  561.             String soggetto) {
  562.         IContext context = this.getContext();
  563.         try {
  564.             context.getLogger().info("Invocazione in corso ...");

  565.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  566.             context.getLogger().debug("Autorizzazione completata con successo");

  567.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  568.             final AccordoServizioParteComune as = BaseHelper
  569.                     .supplyOrNotFound(() -> ApiApiHelper.getAccordoFull(nome, versione, env), "API");
  570.             final Documento toDel = BaseHelper.evalnull(() -> env.archiviCore.getDocumento(nomeAllegato, null, null,
  571.                     as.getId(), false, ProprietariDocumento.accordoServizio)

  572.             );

  573.             if (toDel != null) {
  574.                 AccordiServizioParteComuneUtilities.deleteAccordoServizioParteComuneAllegati(as, env.userLogin, env.apcCore,
  575.                         env.apcHelper, Arrays.asList(toDel.getId()));
  576.             }

  577.             if (env.delete_404 && toDel == null)
  578.                 throw FaultCode.NOT_FOUND
  579.                         .toException("Allegato con nome " + nomeAllegato + " non presente per il servizio applicativo scelto.");

  580.             context.getLogger().info("Invocazione completata con successo");
  581.         } catch (javax.ws.rs.WebApplicationException e) {
  582.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  583.             throw e;
  584.         } catch (Throwable e) {
  585.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  586.             throw FaultCode.ERRORE_INTERNO.toException(e);
  587.         }
  588.     }

  589.     /**
  590.      * Elimina un'azione del servizio di una API
  591.      *
  592.      * Questa operazione consente di eliminare un'azione del servizio della API
  593.      * identificata dal nome e dalla versione
  594.      *
  595.      */
  596.     @Override
  597.     public void deleteApiAzione(String nome, Integer versione, String nomeServizio, String nomeAzione,
  598.             ProfiloEnum profilo, String soggetto) {
  599.         IContext context = this.getContext();
  600.         try {
  601.             context.getLogger().info("Invocazione in corso ...");

  602.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  603.             context.getLogger().debug("Autorizzazione completata con successo");

  604.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  605.             AccordoServizioParteComune as = BaseHelper
  606.                     .supplyOrNotFound(() -> ApiApiHelper.getAccordoFull(nome, versione, env), "API");

  607.             PortType pt = null;
  608.             for (int i = 0; i < as.sizePortTypeList(); i++) {
  609.                 pt = as.getPortType(i);
  610.                 if (nomeServizio.equals(pt.getNome()))
  611.                     break;
  612.             }

  613.             if (pt == null)
  614.                 throw FaultCode.NOT_FOUND.toException("Nessun Servizio registrato sulla api con nome " + nomeServizio);

  615.             if (BaseHelper.findFirst(pt.getAzioneList(), op -> op.getNome().equals(nomeAzione)).isPresent()) {
  616.                 StringBuilder inUsoMessage = new StringBuilder();

  617.                 AccordiServizioParteComuneUtilities.deleteAccordoServizioParteComuneOperations(as, env.userLogin, env.apcCore,
  618.                         env.apcHelper, inUsoMessage, "\n", pt, Arrays.asList(nomeAzione));

  619.                 if (inUsoMessage.length() > 0)
  620.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(inUsoMessage.toString()));

  621.             }

  622.             else if (env.delete_404) {
  623.                 throw FaultCode.NOT_FOUND.toException("Azione " + nomeAzione + " non registrata sul servizio " + nomeServizio);
  624.             }

  625.             context.getLogger().info("Invocazione completata con successo");

  626.         } catch (javax.ws.rs.WebApplicationException e) {
  627.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  628.             throw e;
  629.         } catch (Throwable e) {
  630.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  631.             throw FaultCode.ERRORE_INTERNO.toException(e);
  632.         }
  633.     }

  634.     /**
  635.      * Elimina una risorsa di una API
  636.      *
  637.      * Questa operazione consente di eliminare una risorsa della API identificata
  638.      * dal nome e dalla versione
  639.      *
  640.      */
  641.     @Override
  642.     public void deleteApiRisorsa(String nome, Integer versione, String nomeRisorsa, ProfiloEnum profilo,
  643.             String soggetto) {
  644.         IContext context = this.getContext();
  645.         try {
  646.             context.getLogger().info("Invocazione in corso ...");

  647.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  648.             context.getLogger().debug("Autorizzazione completata con successo");

  649.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  650.             final AccordoServizioParteComune as = BaseHelper
  651.                     .supplyOrNotFound(() -> ApiApiHelper.getAccordoFull(nome, versione, env), "API");

  652.             if (BaseHelper.findFirst(as.getResourceList(), res -> res.getNome().equals(nomeRisorsa)).isPresent()) {

  653.                 StringBuilder inUsoMessage = new StringBuilder();
  654.                 AccordiServizioParteComuneUtilities.deleteAccordoServizioParteComuneRisorse(as, env.userLogin, env.apcCore,
  655.                         env.apcHelper, inUsoMessage, "\n", Arrays.asList(nomeRisorsa));

  656.                 if (inUsoMessage.length() > 0)
  657.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(inUsoMessage.toString()));

  658.             } else if (env.delete_404) {
  659.                 throw FaultCode.NOT_FOUND.toException("Risorsa " + nomeRisorsa + " non associata alla API ");
  660.             }

  661.             context.getLogger().info("Invocazione completata con successo");
  662.         } catch (javax.ws.rs.WebApplicationException e) {
  663.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  664.             throw e;
  665.         } catch (Throwable e) {
  666.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  667.             throw FaultCode.ERRORE_INTERNO.toException(e);
  668.         }
  669.     }

  670.     /**
  671.      * Elimina un servizio di una API
  672.      *
  673.      * Questa operazione consente di eliminare un servizio della API identificata
  674.      * dal nome e dalla versione
  675.      *
  676.      */
  677.     @Override
  678.     public void deleteApiServizio(String nome, Integer versione, String nomeServizio, ProfiloEnum profilo,
  679.             String soggetto) {
  680.         IContext context = this.getContext();
  681.         try {
  682.             context.getLogger().info("Invocazione in corso ...");

  683.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  684.             context.getLogger().debug("Autorizzazione completata con successo");

  685.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  686.             final AccordoServizioParteComune as = BaseHelper
  687.                     .supplyOrNotFound(() -> ApiApiHelper.getAccordoFull(nome, versione, env), "API");

  688.             if (BaseHelper.findFirst(as.getPortTypeList(), pt -> pt.getNome().equals(nomeServizio)).isPresent()) {

  689.                 final StringBuilder inUsoMessage = new StringBuilder();
  690.                 AccordiServizioParteComuneUtilities.deleteAccordoServizioParteComunePortTypes(as, env.userLogin, env.apcCore,
  691.                         env.apcHelper, inUsoMessage, "\n", Arrays.asList(nomeServizio));

  692.                 if (inUsoMessage.length() > 0) {
  693.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(inUsoMessage.toString()));
  694.                 }

  695.             } else if (env.delete_404) {
  696.                 throw FaultCode.NOT_FOUND.toException("Servizio " + nomeServizio + " non associato alla API");
  697.             }

  698.             context.getLogger().info("Invocazione completata con successo");
  699.         } catch (javax.ws.rs.WebApplicationException e) {
  700.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  701.             throw e;
  702.         } catch (Throwable e) {
  703.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  704.             throw FaultCode.ERRORE_INTERNO.toException(e);
  705.         }
  706.     }

  707.     /**
  708.      * Restituisce l'allegato di una API
  709.      *
  710.      * Questa operazione consente di ottenere l'allegato di una API identificata dal
  711.      * nome e dalla versione
  712.      *
  713.      */
  714.     @Override
  715.     public byte[] downloadApiAllegato(String nome, Integer versione, String nomeAllegato, ProfiloEnum profilo,
  716.             String soggetto) {
  717.         IContext context = this.getContext();
  718.         try {
  719.             context.getLogger().info("Invocazione in corso ...");

  720.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  721.             context.getLogger().debug("Autorizzazione completata con successo");

  722.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  723.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  724.             if (as == null)
  725.                 throw FaultCode.NOT_FOUND.toException("Api non trovata");

  726.             Documento doc = as.getAllegatoList().stream().filter(a -> nomeAllegato.equals(a.getFile())).findFirst()
  727.                     .orElse(null);

  728.             if (doc == null) {
  729.                 doc = as.getSpecificaSemiformaleList().stream().filter(a -> nomeAllegato.equals(a.getFile())).findFirst()
  730.                         .orElse(null);
  731.             }
  732.            
  733.             if (doc == null)
  734.                 throw FaultCode.NOT_FOUND
  735.                         .toException("Nessun allegato con nome " + nomeAllegato + " registrato per la Api specificata");

  736.             doc = env.archiviCore.getDocumento(doc.getFile(), doc.getTipo(), doc.getRuolo(), doc.getIdProprietarioDocumento(),
  737.                     true, ProprietariDocumento.accordoServizio);

  738.             context.getLogger().info("Invocazione completata con successo");

  739.             Helper.setContentType(context, doc.getFile());
  740.            
  741.             return doc.getByteContenuto();
  742.         } catch (javax.ws.rs.WebApplicationException e) {
  743.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  744.             throw e;
  745.         } catch (Throwable e) {
  746.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  747.             throw FaultCode.ERRORE_INTERNO.toException(e);
  748.         }
  749.     }

  750.     /**
  751.      * Restituisce l'interfaccia di una API
  752.      *
  753.      * Questa operazione consente di ottenere l'interfaccia di una API identificata
  754.      * dal nome e dalla versione
  755.      *
  756.      */
  757.     @Override
  758.     public byte[] downloadApiInterfaccia(String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  759.         IContext context = this.getContext();
  760.         try {
  761.             // ApiInterfacciaView a = new ApiInterfacciaView();

  762.             context.getLogger().info("Invocazione in corso ...");

  763.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  764.             context.getLogger().debug("Autorizzazione completata con successo");

  765.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  766.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  767.             if (as == null)
  768.                 throw FaultCode.NOT_FOUND.toException("Api non trovata");

  769.             context.getLogger().info("Invocazione completata con successo");

  770.             byte [] spec = null;
  771.             switch (as.getServiceBinding()) {
  772.             case REST:
  773.                 spec = as.getByteWsdlConcettuale();
  774.                 break;
  775.             case SOAP:
  776.                 spec = as.getByteWsdlLogicoErogatore();
  777.                 break;
  778.             }
  779.            
  780.             String fileName = null;
  781.             switch (as.getFormatoSpecifica()) {
  782.             case WSDL_11:
  783.                 fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_CONCETTUALE_WSDL;
  784.                 break;
  785.             case OPEN_API_3:
  786.                 YAMLUtils yamlUtils = YAMLUtils.getInstance();
  787.                 if(yamlUtils.isYaml(spec)) {
  788.                     fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_OPENAPI_3_0_YAML;
  789.                 }
  790.                 else {  
  791.                     fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_OPENAPI_3_0_JSON;
  792.                 }
  793.                 break;
  794.             case SWAGGER_2:
  795.                 yamlUtils = YAMLUtils.getInstance();
  796.                 if(yamlUtils.isYaml(spec)) {
  797.                     fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_SWAGGER_2_0_YAML;
  798.                 }
  799.                 else {
  800.                     fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_SWAGGER_2_0_JSON;
  801.                 }
  802.                 break;
  803.             case WADL:
  804.                 fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WADL;
  805.                 break;
  806.             }
  807.            
  808.             if(fileName!=null) {
  809.                 Helper.setContentType(context, fileName);
  810.             }
  811.            
  812.             return spec;
  813.         } catch (javax.ws.rs.WebApplicationException e) {
  814.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  815.             throw e;
  816.         } catch (Throwable e) {
  817.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  818.             throw FaultCode.ERRORE_INTERNO.toException(e);
  819.         }
  820.     }

  821.     /**
  822.      * Ricerca api
  823.      *
  824.      * Elenca le API registrate
  825.      *
  826.      */
  827.     @Override
  828.     public ListaApi findAllApi(ProfiloEnum profilo, String soggetto, String q, Integer limit, Integer offset,
  829.             TipoApiEnum tipoApi, String tag, Boolean profiloQualsiasi) {
  830.         IContext context = this.getContext();
  831.         try {
  832.             context.getLogger().info("Invocazione in corso ...");

  833.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  834.             context.getLogger().debug("Autorizzazione completata con successo");

  835.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);

  836.             final int idLista = Liste.ACCORDI;
  837.             final ConsoleSearch ricerca = Helper.setupRicercaPaginata(q, limit, offset, idLista, env.idSoggetto.toIDSoggetto(),
  838.                     env.tipo_protocollo);

  839.             if(profiloQualsiasi!=null && profiloQualsiasi) {
  840.                 ricerca.clearFilter(idLista, Filtri.FILTRO_PROTOCOLLO);
  841.             }
  842.            
  843.             if (tipoApi != null)
  844.                 ricerca.addFilter(idLista, Filtri.FILTRO_SERVICE_BINDING, Enums.serviceBindingFromTipo.get(tipoApi).toString().toLowerCase());
  845.            
  846.             if(tag!=null) {
  847.                 ricerca.addFilter(idLista, Filtri.FILTRO_GRUPPO, tag);
  848.             }

  849.             final String tipoAccordo = "apc"; // Dal debug.
  850.             final List<AccordoServizioParteComuneSintetico> lista = AccordiServizioParteComuneUtilities
  851.                     .accordiList(env.apcCore, env.userLogin, ricerca, tipoAccordo);
  852.            
  853.             final ListaApi ret = ListaUtils.costruisciListaPaginata(context.getUriInfo(),
  854.                     ricerca.getIndexIniziale(idLista),
  855.                     ricerca.getPageSize(idLista),
  856.                     ricerca.getNumEntries(idLista), ListaApi.class);

  857.             if (env.findall_404 && lista.isEmpty())
  858.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api corrisponde ai criteri di ricerca");

  859.             lista.forEach(as -> ret
  860.                     .addItemsItem(ApiApiHelper.apiToItem(ApiApiHelper.accordoSpcRegistroToApi(as, env.soggettiCore), as, env)));

  861.             context.getLogger().info("Invocazione completata con successo");
  862.             return ret;

  863.         } catch (javax.ws.rs.WebApplicationException e) {
  864.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  865.             throw e;
  866.         } catch (Throwable e) {
  867.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  868.             throw FaultCode.ERRORE_INTERNO.toException(e);
  869.         }
  870.     }

  871.     /**
  872.      * Elenco allegati di una API
  873.      *
  874.      * Questa operazione consente di ottenere gli allegati di una API identificata
  875.      * dal nome e dalla versione
  876.      *
  877.      */
  878.     @Override
  879.     public ListaApiAllegati findAllApiAllegati(String nome, Integer versione, ProfiloEnum profilo, String soggetto,
  880.             String q, Integer limit, Integer offset) {
  881.         IContext context = this.getContext();
  882.         try {
  883.             context.getLogger().info("Invocazione in corso ...");

  884.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  885.             context.getLogger().debug("Autorizzazione completata con successo");

  886.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  887.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  888.             if (as == null)
  889.                 throw FaultCode.NOT_FOUND.toException("Api non trovata");

  890.             int idLista = Liste.ACCORDI_ALLEGATI;
  891.             ConsoleSearch ricerca = Helper.setupRicercaPaginata(q, limit, offset, idLista, env.idSoggetto.toIDSoggetto(),
  892.                     env.tipo_protocollo);

  893.             List<Documento> docsRegistro = env.apcCore.accordiAllegatiList(as.getId().intValue(), ricerca);

  894.             if (docsRegistro.size() == 0 && env.findall_404)
  895.                 throw FaultCode.NOT_FOUND.toException("Nessun allegato dell'Api specificata corrisponde ai criteri di ricerca");

  896.             final ListaApiAllegati ret = ListaUtils.costruisciListaPaginata(context.getUriInfo(),
  897.                     ricerca.getIndexIniziale(idLista),
  898.                     ricerca.getPageSize(idLista),
  899.                     ricerca.getNumEntries(idLista), ListaApiAllegati.class);
  900.             docsRegistro.forEach(d -> ret.addItemsItem(ApiApiHelper.documentoToApiAllegatoItem(d)));

  901.             context.getLogger().info("Invocazione completata con successo");

  902.             return ret;

  903.         } catch (javax.ws.rs.WebApplicationException e) {
  904.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  905.             throw e;
  906.         } catch (Throwable e) {
  907.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  908.             throw FaultCode.ERRORE_INTERNO.toException(e);
  909.         }
  910.     }

  911.     /**
  912.      * Elenco servizi di una API
  913.      *
  914.      * Questa operazione consente di ottenere le azioni di un servizio della API
  915.      * identificata dal nome e dalla versione
  916.      *
  917.      */
  918.     @Override
  919.     public ListaApiAzioni findAllApiAzioni(String nome, Integer versione, String nomeServizio, ProfiloEnum profilo,
  920.             String soggetto, String q, Integer limit, Integer offset) {
  921.         IContext context = this.getContext();
  922.         try {
  923.             context.getLogger().info("Invocazione in corso ...");

  924.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  925.             context.getLogger().debug("Autorizzazione completata con successo");

  926.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  927.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  928.             if (as == null)
  929.                 throw FaultCode.NOT_FOUND.toException("Api non trovata");

  930.             int idLista = Liste.ACCORDI_PORTTYPE_AZIONI;
  931.             ConsoleSearch ricerca = Helper.setupRicercaPaginata(q, limit, offset, idLista, env.idSoggetto.toIDSoggetto(),
  932.                     env.tipo_protocollo);

  933.             PortType pt = as.getPortTypeList().stream().filter(p -> nomeServizio.equals(p.getNome())).findFirst()
  934.                     .orElse(null);

  935.             if (pt == null)
  936.                 throw FaultCode.NOT_FOUND
  937.                         .toException("Non è stato trovato alcun servizio con nome " + nomeServizio + " legato alla Api");

  938.             List<Operation> azioniServizio = env.apcCore.accordiPorttypeOperationList(pt.getId().intValue(), ricerca);

  939.             if (azioniServizio.size() == 0 && env.findall_404)
  940.                 throw FaultCode.NOT_FOUND.toException("Nessua azione dell'Api specificata corrisponde ai criteri di ricerca");

  941.             final ListaApiAzioni ret = ListaUtils.costruisciListaPaginata(context.getUriInfo(),
  942.                     ricerca.getIndexIniziale(idLista),
  943.                     ricerca.getPageSize(idLista),
  944.                     ricerca.getNumEntries(idLista), ListaApiAzioni.class);

  945.             azioniServizio.forEach(op -> ret.addItemsItem(ApiApiHelper.operazioneToApiAzione(op)));

  946.             context.getLogger().info("Invocazione completata con successo");
  947.             return ret;

  948.         } catch (javax.ws.rs.WebApplicationException e) {
  949.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  950.             throw e;
  951.         } catch (Throwable e) {
  952.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  953.             throw FaultCode.ERRORE_INTERNO.toException(e);
  954.         }
  955.     }

  956.     /**
  957.      * Elenco risorse di una API
  958.      *
  959.      * Questa operazione consente di ottenere le risorse di una API identificata dal
  960.      * nome e dalla versione
  961.      *
  962.      */
  963.     @Override
  964.     public ListaApiRisorse findAllApiRisorse(String nome, Integer versione, ProfiloEnum profilo, String soggetto,
  965.             String q, Integer limit, Integer offset, HttpMethodEnum httpMethod) {
  966.         IContext context = this.getContext();
  967.         try {
  968.             context.getLogger().info("Invocazione in corso ...");

  969.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  970.             context.getLogger().debug("Autorizzazione completata con successo");

  971.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  972.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  973.             if (as == null)
  974.                 throw FaultCode.NOT_FOUND.toException("Api non trovata");

  975.             int idLista = Liste.ACCORDI_API_RESOURCES;

  976.             ConsoleSearch ricerca = Helper.setupRicercaPaginata(q, limit, offset, idLista, env.idSoggetto.toIDSoggetto(),
  977.                     env.tipo_protocollo);

  978.             if (httpMethod != null)
  979.                 ricerca.addFilter(idLista, Filtri.FILTRO_HTTP_METHOD, httpMethod.toString());

  980.             final ListaApiRisorse ret = ListaUtils.costruisciListaPaginata(context.getUriInfo(),
  981.                     ricerca.getIndexIniziale(idLista),
  982.                     ricerca.getPageSize(idLista),
  983.                     ricerca.getNumEntries(idLista), ListaApiRisorse.class);
  984.             List<Resource> risorse = env.apcCore.accordiResourceList(as.getId().intValue(), ricerca);

  985.             if (risorse.size() == 0 && env.findall_404)
  986.                 throw FaultCode.NOT_FOUND.toException("Nessun allegato dell'Api specificata corrisponde ai criteri di ricerca");

  987.             risorse.forEach(r -> ret.addItemsItem(ApiApiHelper.risorsaRegistroToApi(r)));

  988.             context.getLogger().info("Invocazione completata con successo");
  989.             return ret;

  990.         } catch (javax.ws.rs.WebApplicationException e) {
  991.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  992.             throw e;
  993.         } catch (Throwable e) {
  994.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  995.             throw FaultCode.ERRORE_INTERNO.toException(e);
  996.         }
  997.     }

  998.     /**
  999.      * Elenco servizi di una API
  1000.      *
  1001.      * Questa operazione consente di ottenere i servizi di una API identificata dal
  1002.      * nome e dalla versione
  1003.      *
  1004.      */
  1005.     @Override
  1006.     public ListaApiServizi findAllApiServizi(String nome, Integer versione, ProfiloEnum profilo, String soggetto,
  1007.             String q, Integer limit, Integer offset) {
  1008.         IContext context = this.getContext();
  1009.         try {
  1010.             context.getLogger().info("Invocazione in corso ...");

  1011.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1012.             context.getLogger().debug("Autorizzazione completata con successo");

  1013.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1014.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1015.             if (as == null)
  1016.                 throw FaultCode.NOT_FOUND.toException("Api non trovata");

  1017.             int idLista = Liste.ACCORDI_PORTTYPE;

  1018.             ConsoleSearch ricerca = Helper.setupRicercaPaginata(q, limit, offset, idLista, env.idSoggetto.toIDSoggetto(),
  1019.                     env.tipo_protocollo);

  1020.             List<PortType> servizi = env.apcCore.accordiPorttypeList(as.getId().intValue(), ricerca);

  1021.             final ListaApiServizi ret = ListaUtils.costruisciListaPaginata(context.getUriInfo(),
  1022.                     ricerca.getIndexIniziale(idLista),
  1023.                     ricerca.getPageSize(idLista),
  1024.                     ricerca.getNumEntries(idLista), ListaApiServizi.class);

  1025.             if (servizi.size() == 0 && env.findall_404)
  1026.                 throw FaultCode.NOT_FOUND.toException("Nessun allegato dell'Api specificata corrisponde ai criteri di ricerca");

  1027.             servizi.forEach(s -> ret.addItemsItem(ApiApiHelper.servizioRegistroToApi(s)));

  1028.             context.getLogger().info("Invocazione completata con successo");
  1029.             return ret;
  1030.         } catch (javax.ws.rs.WebApplicationException e) {
  1031.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1032.             throw e;
  1033.         } catch (Throwable e) {
  1034.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1035.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1036.         }
  1037.     }

  1038.     /**
  1039.      * Restituisce i dettagli di una API
  1040.      *
  1041.      * Questa operazione consente di ottenere i dettagli di una API identificata dal
  1042.      * nome e dalla versione
  1043.      *
  1044.      */
  1045.     @Override
  1046.     public ApiViewItem getApi(String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  1047.         IContext context = this.getContext();
  1048.         try {
  1049.             context.getLogger().info("Invocazione in corso ...");

  1050.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1051.             context.getLogger().debug("Autorizzazione completata con successo");

  1052.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1053.             AccordoServizioParteComuneSintetico as = ApiApiHelper.getAccordoSintetico(nome, versione, env);

  1054.             if (as == null)
  1055.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1056.             ApiItem item = ApiApiHelper.apiToItem(ApiApiHelper.accordoSpcRegistroToApi(as, env.soggettiCore), as, env);
  1057.             ApiViewItem ret = new ApiViewItem();

  1058.             ret.setDescrizione(item.getDescrizione());
  1059.             ret.setTipoInterfaccia(item.getTipoInterfaccia());
  1060.             ret.setNome(item.getNome());
  1061.             ret.setProfilo(item.getProfilo());
  1062.             ret.setReferente(item.getSoggetto());
  1063.             ret.setSoggetto(item.getSoggetto());
  1064.             ret.setVersione(item.getVersione());
  1065.             ret.setStato(item.getStato());
  1066.             ret.setStatoDescrizione(item.getStatoDescrizione());
  1067.             ret.setTags(item.getTags());
  1068.             ret.setCanale(item.getCanale());
  1069.             context.getLogger().info("Invocazione completata con successo");
  1070.             return ret;

  1071.         } catch (javax.ws.rs.WebApplicationException e) {
  1072.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1073.             throw e;
  1074.         } catch (Throwable e) {
  1075.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1076.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1077.         }
  1078.     }

  1079.     /**
  1080.      * Restituisce il dettaglio di un allegato di una API
  1081.      *
  1082.      * Questa operazione consente di ottenere il dettaglio di un allegato della API
  1083.      * identificata dal nome e dalla versione
  1084.      *
  1085.      */
  1086.     @Override
  1087.     public ApiAllegato getApiAllegato(String nome, Integer versione, String nomeAllegato, ProfiloEnum profilo,
  1088.             String soggetto) {
  1089.         IContext context = this.getContext();
  1090.         try {
  1091.             context.getLogger().info("Invocazione in corso ...");

  1092.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1093.             context.getLogger().debug("Autorizzazione completata con successo");

  1094.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1095.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1096.             if (as == null)
  1097.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1098.             ApiAllegato ret = as.getAllegatoList().stream().filter(a -> nomeAllegato.equals(a.getFile())).map(a -> {
  1099.                 try {
  1100.                     return ApiApiHelper.documentoToApiAllegato(env.archiviCore.getDocumento(a.getId(), true));
  1101.                 } catch (Exception e) {
  1102.                     return null;
  1103.                 }
  1104.             }).findFirst().orElse(null);
  1105.            
  1106.             if(ret==null) {
  1107.                 ret = as.getSpecificaSemiformaleList().stream().filter(a -> nomeAllegato.equals(a.getFile())).map(a -> {
  1108.                     try {
  1109.                         return ApiApiHelper.documentoToApiAllegato(env.archiviCore.getDocumento(a.getId(), true));
  1110.                     } catch (Exception e) {
  1111.                         return null;
  1112.                     }
  1113.                 }).findFirst().orElse(null);
  1114.             }

  1115.             if (ret == null)
  1116.                 throw FaultCode.NOT_FOUND
  1117.                         .toException("Nessun allegato con nome " + nomeAllegato + " registrato per la Api specificata");

  1118.             context.getLogger().info("Invocazione completata con successo");
  1119.             return ret;

  1120.         } catch (javax.ws.rs.WebApplicationException e) {
  1121.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1122.             throw e;
  1123.         } catch (Throwable e) {
  1124.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1125.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1126.         }
  1127.     }

  1128.     /**
  1129.      * Restituisce il dettaglio di un'azione di un servizio della API
  1130.      *
  1131.      * Questa operazione consente di ottenere il dettaglio di un'azione nel servizio
  1132.      * della API identificata dal nome e dalla versione
  1133.      *
  1134.      */
  1135.     @Override
  1136.     public ApiAzione getApiAzione(String nome, Integer versione, String nomeServizio, String nomeAzione,
  1137.             ProfiloEnum profilo, String soggetto) {
  1138.         IContext context = this.getContext();
  1139.         try {
  1140.             context.getLogger().info("Invocazione in corso ...");

  1141.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1142.             context.getLogger().debug("Autorizzazione completata con successo");

  1143.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1144.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1145.             if (as == null)
  1146.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1147.             PortType pt = as.getPortTypeList().stream().filter(p -> nomeServizio.equals(p.getNome())).findFirst()
  1148.                     .orElse(null);

  1149.             if (pt == null)
  1150.                 throw FaultCode.NOT_FOUND.toException("Nessun Servizio con nome: " + nomeServizio);

  1151.             Operation az = pt.getAzioneList().stream().filter(a -> nomeAzione.equals(a.getNome()))
  1152.                     .findFirst().orElse(null);

  1153.             if (az == null)
  1154.                 throw FaultCode.NOT_FOUND
  1155.                         .toException("Nessuna azione con nome " + nomeAzione + " registrato per il servizio " + nomeServizio);

  1156.             ApiAzione ret = ApiApiHelper.operazioneToApiAzione(az);

  1157.             ApiApiHelper.populateApiAzioneWithProtocolInfo(as, az, env, profilo, ret);

  1158.             context.getLogger().info("Invocazione completata con successo");
  1159.             return ret;

  1160.         } catch (javax.ws.rs.WebApplicationException e) {
  1161.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1162.             throw e;
  1163.         } catch (Throwable e) {
  1164.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1165.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1166.         }
  1167.     }

  1168.     /*
  1169.      * Restituisce il canale associato all'API
  1170.      *
  1171.      * Questa operazione consente di ottenere il canale associato all'API identificata dal nome e dalla versione
  1172.      *
  1173.      */
  1174.     @Override
  1175.     public ApiCanale getApiCanale(String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  1176.         IContext context = this.getContext();
  1177.         try {
  1178.             context.getLogger().info("Invocazione in corso ...");    

  1179.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1180.             context.getLogger().debug("Autorizzazione completata con successo");    
  1181.                        
  1182.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1183.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1184.             if (as == null)
  1185.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1186.             ApiCanale canale = null;
  1187.             if(env.gestioneCanali) {
  1188.                 canale = new ApiCanale();
  1189.                 if(as.getCanale()!=null && !"".equals(as.getCanale())) {
  1190.                     canale.setNome(as.getCanale());
  1191.                     canale.setConfigurazione(CanaleEnum.API);
  1192.                 }
  1193.                 else {
  1194.                     canale.setNome(env.canaleDefault);
  1195.                     canale.setConfigurazione(CanaleEnum.DEFAULT);
  1196.                 }
  1197.             }
  1198.             else {
  1199.                 throw new Exception("Gestione dei canali non abilitata");
  1200.             }
  1201.            
  1202.             context.getLogger().info("Invocazione completata con successo");
  1203.             return canale;
  1204.      
  1205.         }
  1206.         catch(javax.ws.rs.WebApplicationException e) {
  1207.             context.getLogger().error("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  1208.             throw e;
  1209.         }
  1210.         catch(Throwable e) {
  1211.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  1212.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1213.         }
  1214.     }

  1215.     /**
  1216.      * Restituisce la descrizione di una API
  1217.      *
  1218.      * Questa operazione consente di ottenere la descrizione di una API identificata
  1219.      * dal nome e dalla versione
  1220.      *
  1221.      */
  1222.     @Override
  1223.     public ApiDescrizione getApiDescrizione(String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  1224.         IContext context = this.getContext();
  1225.         try {
  1226.             context.getLogger().info("Invocazione in corso ...");

  1227.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1228.             context.getLogger().debug("Autorizzazione completata con successo");

  1229.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1230.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1231.             if (as == null)
  1232.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1233.             ApiDescrizione ret = new ApiDescrizione();
  1234.             ret.setDescrizione(as.getDescrizione());

  1235.             context.getLogger().info("Invocazione completata con successo");
  1236.             return ret;

  1237.         } catch (javax.ws.rs.WebApplicationException e) {
  1238.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1239.             throw e;
  1240.         } catch (Throwable e) {
  1241.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1242.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1243.         }
  1244.     }

  1245.     /**
  1246.      * Restituisce le informazioni generali di una API
  1247.      *
  1248.      * Questa operazione consente di ottenere le informazioni generali di una API
  1249.      * identificata dal nome e dalla versione
  1250.      *
  1251.      */
  1252.     @Override
  1253.     public ApiInformazioniGeneraliView getApiInformazioniGenerali(String nome, Integer versione, ProfiloEnum profilo,
  1254.             String soggetto) {
  1255.         IContext context = this.getContext();
  1256.         try {
  1257.             context.getLogger().info("Invocazione in corso ...");

  1258.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1259.             context.getLogger().debug("Autorizzazione completata con successo");

  1260.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1261.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1262.             if (as == null)
  1263.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1264.             ApiInformazioniGeneraliView ret = new ApiInformazioniGeneraliView();

  1265.             ret.setNome(as.getNome());
  1266.             ret.setProfilo(env.profilo);
  1267.             ret.setVersione(as.getVersione());

  1268.             context.getLogger().info("Invocazione completata con successo");
  1269.             return ret;

  1270.         } catch (javax.ws.rs.WebApplicationException e) {
  1271.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1272.             throw e;
  1273.         } catch (Throwable e) {
  1274.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1275.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1276.         }
  1277.     }

  1278.     /**
  1279.      * Restituisce l'interfaccia di una API
  1280.      *
  1281.      * Questa operazione consente di ottenere l'interfaccia di una API identificata
  1282.      * dal nome e dalla versione
  1283.      *
  1284.      */
  1285.     @Override
  1286.     public ApiInterfacciaView getApiInterfaccia(String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  1287.         IContext context = this.getContext();
  1288.         try {
  1289.             context.getLogger().info("Invocazione in corso ...");

  1290.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1291.             context.getLogger().debug("Autorizzazione completata con successo");

  1292.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1293.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1294.             if (as == null)
  1295.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1296.             ApiInterfacciaView ret = new ApiInterfacciaView();

  1297.             ret.setProfilo(env.profilo);
  1298.            
  1299.             TipoApiEnum protocollo = as.getServiceBinding() == ServiceBinding.REST ? TipoApiEnum.REST : TipoApiEnum.SOAP;
  1300.            
  1301.             switch (protocollo) {
  1302.             case REST:
  1303.                 ApiInterfacciaRest iRest = new ApiInterfacciaRest();
  1304.                 iRest.setProtocollo(protocollo);
  1305.                 iRest.setFormato(Enums.formatoRestFromSpecifica.get(as.getFormatoSpecifica()));
  1306.                 ret.setTipoInterfaccia(iRest);
  1307.                 ret.setInterfaccia(as.getByteWsdlConcettuale());
  1308.                 break;
  1309.             case SOAP:
  1310.                 ApiInterfacciaSoap iSoap = new ApiInterfacciaSoap();
  1311.                 iSoap.setProtocollo(protocollo);
  1312.                 iSoap.setFormato(Enums.formatoSoapFromSpecifica.get(as.getFormatoSpecifica()));
  1313.                 ret.setTipoInterfaccia(iSoap);
  1314.                 ret.setInterfaccia(as.getByteWsdlLogicoErogatore());
  1315.                 break;
  1316.             default:
  1317.                 throw FaultCode.ERRORE_INTERNO
  1318.                         .toException("Tipologia interfaccia registro sconosciuta: " + as.getServiceBinding().name());
  1319.             }

  1320.             context.getLogger().info("Invocazione completata con successo");
  1321.             return ret;

  1322.         } catch (javax.ws.rs.WebApplicationException e) {
  1323.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1324.             throw e;
  1325.         } catch (Throwable e) {
  1326.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1327.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1328.         }
  1329.     }

  1330.     /**
  1331.     * Restituisce le informazioni ModI associate all'API
  1332.     *
  1333.     * Questa operazione consente di ottenere le informazioni ModI associato all'API identificata dal nome e dalla versione
  1334.     *
  1335.     */
  1336.     @Override
  1337.     public ApiModI getApiModI(String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  1338.         IContext context = this.getContext();
  1339.         try {
  1340.             context.getLogger().info("Invocazione in corso ...");    

  1341.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1342.             context.getLogger().debug("Autorizzazione completata con successo");    
  1343.                
  1344.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1345.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1346.             if (as == null)
  1347.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1348.             ApiModI ret = ModiApiApiHelper.getApiModI(as, profilo, env);
  1349.            
  1350.             context.getLogger().info("Invocazione completata con successo");
  1351.             return ret;

  1352.         }
  1353.         catch(javax.ws.rs.WebApplicationException e) {
  1354.             context.getLogger().error("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  1355.             throw e;
  1356.         }
  1357.         catch(Throwable e) {
  1358.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  1359.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1360.         }
  1361.     }
  1362.    

  1363.     /**
  1364.      * Restituisce il nome del soggetto referente dell'api
  1365.      *
  1366.      * Questa operazione consente di ottenere il nome del soggetto referente
  1367.      * dell'API identificata dal nome e dalla versione
  1368.      *
  1369.      */
  1370.     @Override
  1371.     public ApiReferenteView getApiReferente(String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  1372.         IContext context = this.getContext();
  1373.         try {
  1374.             context.getLogger().info("Invocazione in corso ...");

  1375.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1376.             context.getLogger().debug("Autorizzazione completata con successo");

  1377.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1378.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1379.             if (as == null)
  1380.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1381.             ApiReferenteView ret = new ApiReferenteView();
  1382.             ret.setProfilo(env.profilo);
  1383.             ret.setReferente(as.getSoggettoReferente().getNome());

  1384.             context.getLogger().info("Invocazione completata con successo");
  1385.             return ret;
  1386.         } catch (javax.ws.rs.WebApplicationException e) {
  1387.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1388.             throw e;
  1389.         } catch (Throwable e) {
  1390.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1391.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1392.         }
  1393.     }

  1394.     /**
  1395.      * Restituisce il dettaglio di una risorsa di una API
  1396.      *
  1397.      * Questa operazione consente di ottenere il dettaglio di una risorsa della API
  1398.      * identificata dal nome e dalla versione
  1399.      *
  1400.      */
  1401.     @Override
  1402.     public ApiRisorsa getApiRisorsa(String nome, Integer versione, String nomeRisorsa, ProfiloEnum profilo,
  1403.             String soggetto) {
  1404.         IContext context = this.getContext();
  1405.         try {
  1406.             context.getLogger().info("Invocazione in corso ...");

  1407.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1408.             context.getLogger().debug("Autorizzazione completata con successo");

  1409.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1410.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1411.             if (as == null)
  1412.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1413.             Resource res = as.getResourceList().stream().filter(r -> nomeRisorsa.equals(r.getNome()))
  1414.                     .findFirst().orElse(null);

  1415.             if (res == null)
  1416.                 throw FaultCode.NOT_FOUND
  1417.                         .toException("Nessuna risorsa con nome " + nomeRisorsa + " è registrata per la Api indicata");


  1418.             ApiRisorsa ret = ApiApiHelper.risorsaRegistroToApi(res);

  1419.             ApiApiHelper.populateApiRisorsaWithProtocolInfo(as, res, env, profilo, ret);

  1420.             context.getLogger().info("Invocazione completata con successo");
  1421.             return ret;

  1422.         } catch (javax.ws.rs.WebApplicationException e) {
  1423.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1424.             throw e;
  1425.         } catch (Throwable e) {
  1426.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1427.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1428.         }
  1429.     }

  1430.     /**
  1431.      * Restituisce il dettaglio di un servizio di una API
  1432.      *
  1433.      * Questa operazione consente di ottenere il dettaglio di un servizio della API
  1434.      * identificata dal nome e dalla versione
  1435.      *
  1436.      */
  1437.     @Override
  1438.     public ApiServizio getApiServizio(String nome, Integer versione, String nomeServizio, ProfiloEnum profilo,
  1439.             String soggetto) {
  1440.         IContext context = this.getContext();
  1441.         try {
  1442.             context.getLogger().info("Invocazione in corso ...");

  1443.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1444.             context.getLogger().debug("Autorizzazione completata con successo");

  1445.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1446.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1447.             if (as == null)
  1448.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1449.             ApiServizio ret = as.getPortTypeList().stream().filter(p -> nomeServizio.equals(p.getNome()))
  1450.                     .map(p -> ApiApiHelper.servizioRegistroToApi(p)).findFirst().orElse(null);

  1451.             if (ret == null)
  1452.                 throw FaultCode.NOT_FOUND.toException("Nessun Servizio con nome: " + nomeServizio);

  1453.             context.getLogger().info("Invocazione completata con successo");
  1454.             return ret;

  1455.         } catch (javax.ws.rs.WebApplicationException e) {
  1456.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1457.             throw e;
  1458.         } catch (Throwable e) {
  1459.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1460.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1461.         }
  1462.     }

  1463.     /**
  1464.      * Restituisce i tags associati all'API
  1465.      *
  1466.      * Questa operazione consente di ottenere i tags associati all'API identificata dal nome e dalla versione
  1467.      *
  1468.      */
  1469.     @Override
  1470.     public ApiTags getApiTags(String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  1471.         IContext context = this.getContext();
  1472.         try {
  1473.             context.getLogger().info("Invocazione in corso ...");

  1474.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1475.             context.getLogger().debug("Autorizzazione completata con successo");

  1476.             ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1477.             AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1478.             if (as == null)
  1479.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1480.             ApiTags ret = new ApiTags();
  1481.             if(as.getGruppi()!=null && as.getGruppi().getGruppoList()!=null && !as.getGruppi().getGruppoList().isEmpty()) {
  1482.                 for (GruppoAccordo tag : as.getGruppi().getGruppoList()) {
  1483.                     ret.addTagsItem(tag.getNome());
  1484.                 }
  1485.             }
  1486.            
  1487.             context.getLogger().info("Invocazione completata con successo");
  1488.             return ret;

  1489.         } catch (javax.ws.rs.WebApplicationException e) {
  1490.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1491.             throw e;
  1492.         } catch (Throwable e) {
  1493.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1494.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1495.         }
  1496.     }

  1497.    
  1498.     /**
  1499.      * Modifica i dati di un allegato di una API
  1500.      *
  1501.      * Questa operazione consente di aggiornare i dettagli di un allegato della API
  1502.      * identificata dal nome e dalla versione
  1503.      *
  1504.      */
  1505.     @Override
  1506.     public void updateApiAllegato(ApiAllegato body, String nome, Integer versione, String nomeAllegato,
  1507.             ProfiloEnum profilo, String soggetto) {
  1508.         IContext context = this.getContext();
  1509.         try {
  1510.             context.getLogger().info("Invocazione in corso ...");

  1511.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1512.             context.getLogger().debug("Autorizzazione completata con successo");

  1513.             if (body == null)
  1514.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare un body");

  1515.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1516.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1517.             if (as == null)
  1518.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1519.             final Documento oldDoc = BaseHelper.supplyOrNotFound(() -> env.archiviCore.getDocumento(nomeAllegato, null, null,
  1520.                     as.getId(), false, ProprietariDocumento.accordoServizio),
  1521.                     "Allegato con nome " + nomeAllegato + " per la API scelta.");

  1522.             final Documento newDoc = ApiApiHelper.apiAllegatoToDocumento(body, as, env);
  1523.             newDoc.setId(oldDoc.getId());

  1524.             if (!newDoc.getRuolo().equals(oldDoc.getRuolo()))
  1525.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Non puoi modificare il ruolo di un allegato");

  1526.             SerialiableFormFile filewrap = new SerialiableFormFile(newDoc.getFile(), newDoc.getByteContenuto());

  1527.             env.requestWrapper.overrideParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ALLEGATI_RUOLO,
  1528.                     newDoc.getRuolo());

  1529.             ArchiviHelper archiviHelper = new ArchiviHelper(env.stationCore, env.requestWrapper, env.pd,
  1530.                     env.requestWrapper.getSession());

  1531.             if (!archiviHelper.accordiAllegatiCheckData(TipoOperazione.CHANGE, filewrap, newDoc,
  1532.                     ProprietariDocumento.accordoServizio, env.protocolFactory)) {
  1533.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  1534.             }

  1535.             AccordiServizioParteComuneUtilities.updateAccordoServizioParteComuneAllegati(as, oldDoc, newDoc);

  1536.             env.apcCore.performUpdateOperation(env.userLogin, false, as);

  1537.             context.getLogger().info("Invocazione completata con successo");
  1538.         } catch (javax.ws.rs.WebApplicationException e) {
  1539.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1540.             throw e;
  1541.         } catch (Throwable e) {
  1542.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1543.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1544.         }
  1545.     }

  1546.     /**
  1547.      * Modifica i dati di un'azione nel servizio di una API
  1548.      *
  1549.      * Questa operazione consente di aggiornare i dettagli di un'azione della API
  1550.      * identificata dal nome e dalla versione
  1551.      *
  1552.      */
  1553.     @Override
  1554.     public void updateApiAzione(ApiAzione body, String nome, Integer versione, String nomeServizio, String nomeAzione,
  1555.             ProfiloEnum profilo, String soggetto) {
  1556.         IContext context = this.getContext();
  1557.         try {
  1558.             context.getLogger().info("Invocazione in corso ...");

  1559.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1560.             context.getLogger().debug("Autorizzazione completata con successo");

  1561.             if (body == null)
  1562.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare un body");

  1563.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1564.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1565.             if (as == null)
  1566.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1567.             final PortType pt = as.getPortTypeList().stream().filter(p -> nomeServizio.equals(p.getNome())).findFirst()
  1568.                     .orElse(null);

  1569.             if (pt == null)
  1570.                 throw FaultCode.NOT_FOUND.toException("Nessun Servizio con nome: " + nomeServizio);

  1571.             final Operation oldOp = BaseHelper.findAndRemoveFirst(pt.getAzioneList(),
  1572.                     (op -> nomeAzione.equals(op.getNome())));

  1573.             if (oldOp == null)
  1574.                 throw FaultCode.NOT_FOUND
  1575.                         .toException("Nessuna Azione con nome: " + nomeAzione + " associata al servizio " + nomeServizio);

  1576.             if (!nomeAzione.equals(oldOp.getNome())) {
  1577.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Non puoi modificare il nome dell'azione");
  1578.             }

  1579.             ApiApiHelper.updateOperation(body, pt, oldOp);
  1580.             final Operation newOp = oldOp;
  1581.            
  1582.             ProfiloCollaborazioneEnum profiloBody = body.getProfiloCollaborazione()!=null ? body.getProfiloCollaborazione() : ProfiloCollaborazioneEnum.SINCRONO;
  1583.            
  1584.             ProtocolProperties protocolProperties = null;
  1585.             if(profilo != null) {
  1586.                 protocolProperties = ApiApiHelper.getProtocolProperties(body, profilo, as, newOp, env);
  1587.    
  1588.                 if(protocolProperties != null) {
  1589.                     newOp.setProtocolPropertyList(ProtocolPropertiesUtils.toProtocolPropertiesRegistry(protocolProperties, ConsoleOperationType.CHANGE, null));
  1590.                 }
  1591.             }

  1592.             if (! env.apcHelper.accordiPorttypeOperationCheckData(
  1593.                     TipoOperazione.CHANGE,
  1594.                     as.getId().toString(),
  1595.                     nomeServizio,
  1596.                     newOp.getNome(),
  1597.                     newOp.getProfAzione(),
  1598.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newOp.getFiltroDuplicati()),
  1599.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newOp.getConfermaRicezione()),
  1600.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newOp.getIdCollaborazione()),
  1601.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newOp.getIdRiferimentoRichiesta()),
  1602.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newOp.getConsegnaInOrdine()),
  1603.                     newOp.getScadenza() != null ? newOp.getScadenza() : "", // Scadenza operazione
  1604.                     "-", // Servizio Correlato
  1605.                     "-", // Azione Correlata
  1606.                     Enums.profiloCollaborazioneFromApiEnum.get(profiloBody).toString(), "0", // styleOp
  1607.                     "", // soapActionOp,
  1608.                     "literal", // useOp,
  1609.                     null, // opTypeOp,
  1610.                     "" // nsWSDLOp
  1611.             )) {
  1612.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  1613.             }

  1614.             IDPortType idPT = new IDPortType();
  1615.             idPT.setNome(pt.getNome());
  1616.             idPT.setIdAccordo(IDAccordoFactory.getInstance().getIDAccordoFromAccordo(as));
  1617.             IDPortTypeAzione idAccordoAzione = new IDPortTypeAzione();
  1618.             idAccordoAzione.setNome(oldOp.getNome());
  1619.             idAccordoAzione.setIdPortType(idPT);
  1620.            
  1621.             ApiApiHelper.validateProperties(env, protocolProperties, idAccordoAzione, ConsoleOperationType.CHANGE);
  1622.            
  1623.             // Dopo aver fatto i controlli sui dati aggiungo la nuova azione
  1624.             pt.addAzione(newOp);

  1625.             AccordiServizioParteComuneUtilities.createPortTypeOperation(env.apcCore.isEnableAutoMappingWsdlIntoAccordo(),
  1626.                     env.apcCore, env.apcHelper, as, pt, env.userLogin);

  1627.             context.getLogger().info("Invocazione completata con successo");

  1628.         } catch (javax.ws.rs.WebApplicationException e) {
  1629.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1630.             throw e;
  1631.         } catch (Throwable e) {
  1632.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1633.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1634.         }
  1635.     }

  1636.     /**
  1637.      * Consente di modificare il canale associato all'API
  1638.      *
  1639.      * Questa operazione consente di aggiornare il canale associato all'API identificata dal nome e dalla versione
  1640.      *
  1641.      */
  1642.     @Override
  1643.     public void updateApiCanale(ConfigurazioneApiCanale body, String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  1644.         IContext context = this.getContext();
  1645.         try {
  1646.             context.getLogger().info("Invocazione in corso ...");    

  1647.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1648.             context.getLogger().debug("Autorizzazione completata con successo");    
  1649.                        
  1650.             if (body == null)
  1651.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare un body");
  1652.            
  1653.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1654.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);
  1655.            
  1656.             if (as == null)
  1657.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1658.            
  1659.             final IDAccordo oldIdAccordo = env.idAccordoFactory.getIDAccordoFromAccordo(as);

  1660.             if(!env.gestioneCanali) {
  1661.                 throw new Exception("Gestione dei canali non abilitata");
  1662.             }
  1663.            
  1664.             if(ConfigurazioneCanaleEnum.RIDEFINITO.equals(body.getConfigurazione())){
  1665.                 if(body.getCanale()==null || "".equals(body.getCanale())) {
  1666.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare un canale");
  1667.                 }
  1668.                 if(!env.canali.contains(body.getCanale())) {
  1669.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException("Il canale fornito '" + body.getCanale() + "' non è presente nel registro");
  1670.                 }
  1671.                 as.setCanale(body.getCanale());
  1672.             }
  1673.             else {
  1674.                 as.setCanale(null);
  1675.             }

  1676.             boolean validazioneDocumenti = ServerProperties.getInstance().isValidazioneDocumenti();

  1677.             BinaryParameter wsdlserv = new BinaryParameter();
  1678.             wsdlserv.setValue(as.getByteWsdlLogicoErogatore());

  1679.             BinaryParameter wsdlconc = new BinaryParameter();
  1680.             wsdlconc.setValue(as.getByteWsdlConcettuale());

  1681.             BinaryParameter wsdldef = new BinaryParameter();
  1682.             wsdldef.setValue(as.getByteWsdlDefinitorio());

  1683.             /*
  1684.              * boolean visibilitaAccordoCooperazione=false;
  1685.              * if("-".equals(this.accordoCooperazioneId)==false &&
  1686.              * "".equals(this.accordoCooperazioneId)==false &&
  1687.              * this.accordoCooperazioneId!=null){ AccordoCooperazione ac =
  1688.              * acCore.getAccordoCooperazione(Long.parseLong(this.accordoCooperazioneId));
  1689.              * visibilitaAccordoCooperazione=ac.getPrivato()!=null && ac.getPrivato(); }
  1690.              */

  1691.             StringBuilder bfTags = new StringBuilder();
  1692.             if(as.getGruppi()!=null && as.getGruppi().getGruppoList()!=null && !as.getGruppi().getGruppoList().isEmpty()) {
  1693.                 for (GruppoAccordo tag : as.getGruppi().getGruppoList()) {
  1694.                     if(bfTags.length()>0) {
  1695.                         bfTags.append(",");
  1696.                     }
  1697.                     bfTags.append(tag.getNome());
  1698.                 }
  1699.             }
  1700.            
  1701.             boolean gestioneCanaliEnabled = env.gestioneCanali;
  1702.             String canale = as.getCanale();
  1703.             String canaleStato = null;
  1704.             if(canale == null) {
  1705.                 canaleStato = AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_DEFAULT;
  1706.             } else {
  1707.                 canaleStato = AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_RIDEFINITO;
  1708.             }
  1709.            
  1710.             if (!env.apcHelper.accordiCheckData(TipoOperazione.CHANGE, as.getNome(), as.getDescrizione(),
  1711.                     as.getProfiloCollaborazione().toString(), Helper.toBinaryParameter(as.getByteWsdlDefinitorio()),
  1712.                     Helper.toBinaryParameter(as.getByteWsdlConcettuale()),
  1713.                     Helper.toBinaryParameter(as.getByteWsdlLogicoErogatore()),
  1714.                     Helper.toBinaryParameter(as.getByteWsdlLogicoFruitore()),
  1715.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getFiltroDuplicati()),
  1716.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getConfermaRicezione()),
  1717.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getIdCollaborazione()),
  1718.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getIdRiferimentoRichiesta()),
  1719.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getConsegnaInOrdine()),
  1720.                     as.getScadenza() == null ? "" : as.getScadenza(), as.getId().toString(), as.getSoggettoReferente().getNome(),
  1721.                     as.getVersione().toString(), null, // AccordoCooperazioneID
  1722.                     false, // privato false, null,
  1723.                     false, // visibilitaAccordoCooperazione
  1724.                     oldIdAccordo, // idAccordoOld
  1725.                     null, // wsblconc
  1726.                     null, // wsblserv
  1727.                     null, // wsblservrorr
  1728.                     validazioneDocumenti, env.tipo_protocollo, null, // backToStato
  1729.                     env.apcCore.toMessageServiceBinding(as.getServiceBinding()), null, // MessageType
  1730.                     Enums.interfaceTypeFromFormatoSpecifica.get(as.getFormatoSpecifica()), env.gestisciSoggettoReferente,
  1731.                     bfTags.toString(),
  1732.                     canaleStato, canale, gestioneCanaliEnabled)) {

  1733.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  1734.             }

  1735.             // Il profilo di collaborazione di base è Sincrono.
  1736.             // Quindi Nella AccordiServizioPArteComuneChange così come nella Add possiamo
  1737.             // assumerlo costante.
  1738.             // Sono i Servizi e le Azioni ad avere un profilo di collaborazione

  1739.             as.setOldIDAccordoForUpdate(oldIdAccordo);
  1740.             List<Object> operazioniList = new ArrayList<>(Arrays.asList(as));

  1741.             // Questa roba non serve qui perchè la updateDescrizione non cambia il nome e
  1742.             // quindi nemmeno l'ID.
  1743.             IDAccordo idNEW = env.idAccordoFactory.getIDAccordoFromAccordo(as);
  1744.             if (idNEW.equals(oldIdAccordo) == false) {
  1745.                 AccordiServizioParteComuneUtilities.findOggettiDaAggiornare(oldIdAccordo, as, env.apcCore, operazioniList);
  1746.             }

  1747.             env.apcCore.performUpdateOperation(env.userLogin, false, operazioniList.toArray());

  1748.             context.getLogger().info("Invocazione completata con successo");
  1749.         }
  1750.         catch(javax.ws.rs.WebApplicationException e) {
  1751.             context.getLogger().error("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  1752.             throw e;
  1753.         }
  1754.         catch(Throwable e) {
  1755.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  1756.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1757.         }
  1758.     }

  1759.     /**
  1760.      * Consente di modificare la descrizione di una API
  1761.      *
  1762.      * Questa operazione consente di aggiornare la descrizione di una API
  1763.      * identificata dal nome e dalla versione
  1764.      *
  1765.      */
  1766.     @Override
  1767.     public void updateApiDescrizione(ApiDescrizione body, String nome, Integer versione, ProfiloEnum profilo,
  1768.             String soggetto) {
  1769.         IContext context = this.getContext();
  1770.         try {
  1771.             context.getLogger().info("Invocazione in corso ...");

  1772.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1773.             context.getLogger().debug("Autorizzazione completata con successo");

  1774.             if (body == null)
  1775.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare un body");

  1776.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1777.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);
  1778.            
  1779.             if (as == null)
  1780.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1781.             final IDAccordo oldIdAccordo = env.idAccordoFactory.getIDAccordoFromAccordo(as);
  1782.            
  1783.             as.setDescrizione(body.getDescrizione());

  1784.             boolean validazioneDocumenti = ServerProperties.getInstance().isValidazioneDocumenti();

  1785.             BinaryParameter wsdlserv = new BinaryParameter();
  1786.             wsdlserv.setValue(as.getByteWsdlLogicoErogatore());

  1787.             BinaryParameter wsdlconc = new BinaryParameter();
  1788.             wsdlconc.setValue(as.getByteWsdlConcettuale());

  1789.             BinaryParameter wsdldef = new BinaryParameter();
  1790.             wsdldef.setValue(as.getByteWsdlDefinitorio());

  1791.             /*
  1792.              * boolean visibilitaAccordoCooperazione=false;
  1793.              * if("-".equals(this.accordoCooperazioneId)==false &&
  1794.              * "".equals(this.accordoCooperazioneId)==false &&
  1795.              * this.accordoCooperazioneId!=null){ AccordoCooperazione ac =
  1796.              * acCore.getAccordoCooperazione(Long.parseLong(this.accordoCooperazioneId));
  1797.              * visibilitaAccordoCooperazione=ac.getPrivato()!=null && ac.getPrivato(); }
  1798.              */

  1799.             StringBuilder bfTags = new StringBuilder();
  1800.             if(as.getGruppi()!=null && as.getGruppi().getGruppoList()!=null && !as.getGruppi().getGruppoList().isEmpty()) {
  1801.                 for (GruppoAccordo tag : as.getGruppi().getGruppoList()) {
  1802.                     if(bfTags.length()>0) {
  1803.                         bfTags.append(",");
  1804.                     }
  1805.                     bfTags.append(tag.getNome());
  1806.                 }
  1807.             }
  1808.            
  1809.             boolean gestioneCanaliEnabled = env.gestioneCanali;
  1810.             String canale = as.getCanale();
  1811.             String canaleStato = null;
  1812.             if(canale == null) {
  1813.                 canaleStato = AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_DEFAULT;
  1814.             } else {
  1815.                 canaleStato = AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_RIDEFINITO;
  1816.             }
  1817.            
  1818.             if (!env.apcHelper.accordiCheckData(TipoOperazione.CHANGE, as.getNome(), as.getDescrizione(),
  1819.                     as.getProfiloCollaborazione().toString(), Helper.toBinaryParameter(as.getByteWsdlDefinitorio()),
  1820.                     Helper.toBinaryParameter(as.getByteWsdlConcettuale()),
  1821.                     Helper.toBinaryParameter(as.getByteWsdlLogicoErogatore()),
  1822.                     Helper.toBinaryParameter(as.getByteWsdlLogicoFruitore()),
  1823.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getFiltroDuplicati()),
  1824.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getConfermaRicezione()),
  1825.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getIdCollaborazione()),
  1826.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getIdRiferimentoRichiesta()),
  1827.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getConsegnaInOrdine()),
  1828.                     as.getScadenza() == null ? "" : as.getScadenza(), as.getId().toString(), as.getSoggettoReferente().getNome(),
  1829.                     as.getVersione().toString(), null, // AccordoCooperazioneID
  1830.                     false, // privato false, null,
  1831.                     false, // visibilitaAccordoCooperazione
  1832.                     oldIdAccordo, // idAccordoOld
  1833.                     null, // wsblconc
  1834.                     null, // wsblserv
  1835.                     null, // wsblservrorr
  1836.                     validazioneDocumenti, env.tipo_protocollo, null, // backToStato
  1837.                     env.apcCore.toMessageServiceBinding(as.getServiceBinding()), null, // MessageType
  1838.                     Enums.interfaceTypeFromFormatoSpecifica.get(as.getFormatoSpecifica()), env.gestisciSoggettoReferente,
  1839.                     bfTags.toString(),
  1840.                     canaleStato, canale, gestioneCanaliEnabled)) {

  1841.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  1842.             }

  1843.             // Il profilo di collaborazione di base è Sincrono.
  1844.             // Quindi Nella AccordiServizioPArteComuneChange così come nella Add possiamo
  1845.             // assumerlo costante.
  1846.             // Sono i Servizi e le Azioni ad avere un profilo di collaborazione

  1847.             as.setOldIDAccordoForUpdate(oldIdAccordo);
  1848.             List<Object> operazioniList = new ArrayList<>(Arrays.asList(as));

  1849.             // Questa roba non serve qui perchè la updateDescrizione non cambia il nome e
  1850.             // quindi nemmeno l'ID.
  1851.             IDAccordo idNEW = env.idAccordoFactory.getIDAccordoFromAccordo(as);
  1852.             if (idNEW.equals(oldIdAccordo) == false) {
  1853.                 AccordiServizioParteComuneUtilities.findOggettiDaAggiornare(oldIdAccordo, as, env.apcCore, operazioniList);
  1854.             }

  1855.             env.apcCore.performUpdateOperation(env.userLogin, false, operazioniList.toArray());

  1856.             context.getLogger().info("Invocazione completata con successo");
  1857.         } catch (javax.ws.rs.WebApplicationException e) {
  1858.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1859.             throw e;
  1860.         } catch (Throwable e) {
  1861.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1862.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1863.         }
  1864.     }

  1865.     /**
  1866.      * Consente di modificare le informazioni generali di una API
  1867.      *
  1868.      * Questa operazione consente di aggiornare le informazioni generali di una API
  1869.      * identificata dal nome e dalla versione
  1870.      *
  1871.      */
  1872.     @Override
  1873.     public void updateApiInformazioniGenerali(ApiInformazioniGenerali body, String nome, Integer versione,
  1874.             ProfiloEnum profilo, String soggetto) {
  1875.         IContext context = this.getContext();
  1876.         try {
  1877.             context.getLogger().info("Invocazione in corso ...");

  1878.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1879.             context.getLogger().debug("Autorizzazione completata con successo");

  1880.             BaseHelper.throwIfNull(body);

  1881.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1882.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1883.             if (as == null)
  1884.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1885.             final IDAccordo oldIdAccordo = env.idAccordoFactory.getIDAccordoFromAccordo(as);

  1886.             as.setNome(body.getNome());
  1887.             as.setVersione(body.getVersione());

  1888.             boolean validazioneDocumenti = ServerProperties.getInstance().isValidazioneDocumenti();

  1889.             /*
  1890.              * boolean visibilitaAccordoCooperazione=false;
  1891.              * if("-".equals(this.accordoCooperazioneId)==false &&
  1892.              * "".equals(this.accordoCooperazioneId)==false &&
  1893.              * this.accordoCooperazioneId!=null){ AccordoCooperazione ac =
  1894.              * acCore.getAccordoCooperazione(Long.parseLong(this.accordoCooperazioneId));
  1895.              * visibilitaAccordoCooperazione=ac.getPrivato()!=null && ac.getPrivato(); }
  1896.              */

  1897.             StringBuilder bfTags = new StringBuilder();
  1898.             if(as.getGruppi()!=null && as.getGruppi().getGruppoList()!=null && !as.getGruppi().getGruppoList().isEmpty()) {
  1899.                 for (GruppoAccordo tag : as.getGruppi().getGruppoList()) {
  1900.                     if(bfTags.length()>0) {
  1901.                         bfTags.append(",");
  1902.                     }
  1903.                     bfTags.append(tag.getNome());
  1904.                 }
  1905.             }
  1906.            
  1907.             boolean gestioneCanaliEnabled = env.gestioneCanali;
  1908.             String canale = as.getCanale();
  1909.             String canaleStato = null;
  1910.             if(canale == null) {
  1911.                 canaleStato = AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_DEFAULT;
  1912.             } else {
  1913.                 canaleStato = AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_RIDEFINITO;
  1914.             }
  1915.            
  1916.             if (!env.apcHelper.accordiCheckData(TipoOperazione.CHANGE, as.getNome(), as.getDescrizione(),
  1917.                     as.getProfiloCollaborazione().toString(), Helper.toBinaryParameter(as.getByteWsdlDefinitorio()),
  1918.                     Helper.toBinaryParameter(as.getByteWsdlConcettuale()),
  1919.                     Helper.toBinaryParameter(as.getByteWsdlLogicoErogatore()),
  1920.                     Helper.toBinaryParameter(as.getByteWsdlLogicoFruitore()),
  1921.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getFiltroDuplicati()),
  1922.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getConfermaRicezione()),
  1923.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getIdCollaborazione()),
  1924.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getIdRiferimentoRichiesta()),
  1925.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getConsegnaInOrdine()),
  1926.                     as.getScadenza() == null ? "" : as.getScadenza(), as.getId().toString(), as.getSoggettoReferente().getNome(),
  1927.                     as.getVersione().toString(), null, // AccordoCooperazioneID
  1928.                     false, // privato false, null,
  1929.                     false, // visibilitaAccordoCooperazione
  1930.                     oldIdAccordo, // idAccordoOld
  1931.                     null, // wsblconc
  1932.                     null, // wsblserv
  1933.                     null, // wsblservrorr
  1934.                     validazioneDocumenti, env.tipo_protocollo, null, // backToStato
  1935.                     env.apcCore.toMessageServiceBinding(as.getServiceBinding()), null, // MessageType
  1936.                     Enums.interfaceTypeFromFormatoSpecifica.get(as.getFormatoSpecifica()), env.gestisciSoggettoReferente,
  1937.                     bfTags.toString(),
  1938.                     canaleStato, canale, gestioneCanaliEnabled)) {

  1939.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  1940.             }

  1941.             as.setOldIDAccordoForUpdate(oldIdAccordo);
  1942.             List<Object> operazioniList = new ArrayList<>(Arrays.asList(as));

  1943.             IDAccordo idNEW = env.idAccordoFactory.getIDAccordoFromAccordo(as);
  1944.             if (idNEW.equals(oldIdAccordo) == false) {
  1945.                 AccordiServizioParteComuneUtilities.findOggettiDaAggiornare(oldIdAccordo, as, env.apcCore, operazioniList);
  1946.             }

  1947.             env.apcCore.performUpdateOperation(env.userLogin, false, operazioniList.toArray());
  1948.             context.getLogger().info("Invocazione completata con successo");
  1949.         } catch (javax.ws.rs.WebApplicationException e) {
  1950.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  1951.             throw e;
  1952.         } catch (Throwable e) {
  1953.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  1954.             throw FaultCode.ERRORE_INTERNO.toException(e);
  1955.         }
  1956.     }

  1957.     /**
  1958.      * Consente di modificare l'interfaccia di una API
  1959.      *
  1960.      * Questa operazione consente di aggiornare l'interfaccia di una API
  1961.      * identificata dal nome e dalla versione
  1962.      *
  1963.      */
  1964.     @Override
  1965.     public void updateApiInterfaccia(ApiInterfaccia body, String nome, Integer versione, ProfiloEnum profilo,
  1966.             String soggetto) {
  1967.         IContext context = this.getContext();
  1968.         try {
  1969.             context.getLogger().info("Invocazione in corso ...");

  1970.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  1971.             context.getLogger().debug("Autorizzazione completata con successo");

  1972.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  1973.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  1974.             if (as == null)
  1975.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  1976.             final String tipoWsdl = as.getServiceBinding() == ServiceBinding.REST
  1977.                     ? AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_CONCETTUALE
  1978.                     : AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_EROGATORE;

  1979.             final String wsdl = new String(body.getInterfaccia());

  1980.             ServerProperties serverProperties = ServerProperties.getInstance();
  1981.             final boolean validazioneDocumenti = serverProperties.isValidazioneDocumenti();

  1982.             if (!env.apcHelper.accordiWSDLCheckData(env.pd, tipoWsdl, wsdl, as, validazioneDocumenti, env.tipo_protocollo)) {
  1983.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  1984.             }

  1985.             final boolean facilityUnicoWSDL_interfacciaStandard = as.getServiceBinding() == ServiceBinding.SOAP;

  1986.             ServerProperties properties = ServerProperties.getInstance();

  1987.             boolean aggiornaEsistenti = serverProperties.isUpdateInterfacciaApiUpdateIfExists();
  1988.             boolean eliminaNonPresentiNuovaInterfaccia = serverProperties.isUpdateInterfacciaApiDeleteIfNotFound();
  1989.             List<IDResource> risorseEliminate = new ArrayList<IDResource>();
  1990.             List<IDPortType> portTypeEliminati = new ArrayList<IDPortType>();
  1991.             List<IDPortTypeAzione> operationEliminate = new ArrayList<IDPortTypeAzione>();
  1992.            
  1993.             AccordiServizioParteComuneUtilities.updateInterfacciaAccordoServizioParteComune(tipoWsdl, wsdl, as,
  1994.                     properties.isEnabledAutoMapping(), properties.isValidazioneDocumenti(),
  1995.                     properties.isEnabledAutoMappingEstraiXsdSchemiFromWsdlTypes(), facilityUnicoWSDL_interfacciaStandard,
  1996.                     env.tipo_protocollo, env.apcCore,
  1997.                     aggiornaEsistenti, eliminaNonPresentiNuovaInterfaccia,
  1998.                     risorseEliminate, portTypeEliminati, operationEliminate);

  1999.             // effettuo le operazioni
  2000.             env.apcCore.performUpdateOperation(env.userLogin, false, as);

  2001.             context.getLogger().info("Invocazione completata con successo");
  2002.         } catch (javax.ws.rs.WebApplicationException e) {
  2003.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  2004.             throw e;
  2005.         } catch (Throwable e) {
  2006.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  2007.             throw FaultCode.ERRORE_INTERNO.toException(e);
  2008.         }
  2009.     }

  2010.     /**
  2011.      * Consente di modificare le informazioni ModI associate all'API
  2012.      *
  2013.      * Questa operazione consente di aggiornare le informazioni ModI associate all'API identificata dal nome e dalla versione
  2014.      *
  2015.     */
  2016.     @Override
  2017.     public void updateApiModI(ApiModI body, String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  2018.         IContext context = this.getContext();
  2019.         try {
  2020.             context.getLogger().info("Invocazione in corso ...");    

  2021.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  2022.             context.getLogger().debug("Autorizzazione completata con successo");    
  2023.                
  2024.             if (body == null)
  2025.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare un body");

  2026.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  2027.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  2028.             if (as == null)
  2029.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  2030.             ProtocolProperties updateModiProtocolProperties = ModiApiApiHelper.updateModiProtocolProperties(as, profilo, body);
  2031.            
  2032.             IDAccordo idAccordoFromAccordo = env.idAccordoFactory.getIDAccordoFromAccordo(as);
  2033.             ApiApiHelper.validateProperties(env, updateModiProtocolProperties, idAccordoFromAccordo, ConsoleOperationType.CHANGE);
  2034.            
  2035.             if(updateModiProtocolProperties != null) {
  2036.                 as.setProtocolPropertyList(ProtocolPropertiesUtils.toProtocolPropertiesRegistry(updateModiProtocolProperties, ConsoleOperationType.ADD, null));
  2037.             }

  2038.             env.apcCore.performUpdateOperation(env.userLogin, false, as);

  2039.             context.getLogger().info("Invocazione completata con successo");
  2040.         }
  2041.         catch(javax.ws.rs.WebApplicationException e) {
  2042.             context.getLogger().error("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  2043.             throw e;
  2044.         }
  2045.         catch(Throwable e) {
  2046.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  2047.             throw FaultCode.ERRORE_INTERNO.toException(e);
  2048.         }
  2049.     }

  2050.     /**
  2051.      * Modifica i dati di una risorsa di una API
  2052.      *
  2053.      * Questa operazione consente di aggiornare i dettagli di una risorsa della API
  2054.      * identificata dal nome e dalla versione
  2055.      *
  2056.      */
  2057.     @Override
  2058.     public void updateApiRisorsa(ApiRisorsa body, String nome, Integer versione, String nomeRisorsa, ProfiloEnum profilo,
  2059.             String soggetto) {
  2060.         IContext context = this.getContext();
  2061.         try {
  2062.             context.getLogger().info("Invocazione in corso ...");

  2063.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  2064.             context.getLogger().debug("Autorizzazione completata con successo");

  2065.             if (body == null)
  2066.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare un body");

  2067.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  2068.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  2069.             if (as == null)
  2070.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  2071.             Resource oldResource = BaseHelper.findAndRemoveFirst(as.getResourceList(), r -> nomeRisorsa.equals(r.getNome()));

  2072.             if (oldResource == null)
  2073.                 throw FaultCode.NOT_FOUND.toException("Nessuna risorsa trovata con nome " + nomeRisorsa);

  2074.             final String oldPath = oldResource.getPath();
  2075.             final String oldHttpMethod = oldResource.getMethodRawEnumValue();
  2076.             final String oldNomeRisorsaGenerato = oldHttpMethod != null
  2077.                     ? APIUtils.normalizeResourceName(HttpMethod.toEnumConstant(oldHttpMethod), oldPath)
  2078.                     : null;

  2079.             ApiApiHelper.updateRisorsa(body, oldResource);
  2080.             final Resource newRes = oldResource;

  2081.             ProtocolProperties protocolProperties = null;
  2082.             if(profilo != null) {
  2083.                 protocolProperties = ApiApiHelper.getProtocolProperties(body, profilo, newRes, env);
  2084.    
  2085.                 if(protocolProperties != null) {
  2086.                     newRes.setProtocolPropertyList(ProtocolPropertiesUtils.toProtocolPropertiesRegistry(protocolProperties, ConsoleOperationType.CHANGE, null));
  2087.                 }
  2088.             }

  2089.             if (!env.apcHelper.accordiResourceCheckData(TipoOperazione.CHANGE, as.getId().toString(),
  2090.                     body.getNome() != null ? body.getNome() : "", newRes.getNome(), newRes.getPath(), newRes.getMethodRawEnumValue(),
  2091.                     newRes.getDescrizione(), env.apcCore.toMessageMessageType(newRes.getMessageType()), nomeRisorsa,
  2092.                     oldNomeRisorsaGenerato, oldPath, oldHttpMethod,
  2093.                     AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_RIDEFINITO,
  2094.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newRes.getFiltroDuplicati()),
  2095.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newRes.getConfermaRicezione()), // confricaz,
  2096.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newRes.getIdCollaborazione()),
  2097.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newRes.getIdRiferimentoRichiesta()),
  2098.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newRes.getConsegnaInOrdine()), // consordaz,
  2099.                     newRes.getScadenza() != null ? newRes.getScadenza() : "")) {
  2100.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  2101.             }
  2102.            
  2103.             IDResource idResource = new IDResource();
  2104.             idResource.setNome(oldResource.getNome());
  2105.             idResource.setIdAccordo(IDAccordoFactory.getInstance().getIDAccordoFromAccordo(as));
  2106.            
  2107.             ApiApiHelper.validateProperties(env, protocolProperties, idResource, newRes.getMethod()!=null ? newRes.getMethod().toString() : null, newRes.getPath(), ConsoleOperationType.ADD);
  2108.            

  2109.             as.addResource(newRes);

  2110.             AccordiServizioParteComuneUtilities.createResource(env.apcCore.isEnableAutoMappingWsdlIntoAccordo(), env.apcCore,
  2111.                     env.apcHelper, as, env.userLogin);

  2112.             context.getLogger().info("Invocazione completata con successo");
  2113.         } catch (javax.ws.rs.WebApplicationException e) {
  2114.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  2115.             throw e;
  2116.         } catch (Throwable e) {
  2117.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  2118.             throw FaultCode.ERRORE_INTERNO.toException(e);
  2119.         }
  2120.     }

  2121.     /**
  2122.      * Modifica i dati di un servizio di una API
  2123.      *
  2124.      * Questa operazione consente di aggiornare i dettagli di un servizio della API
  2125.      * identificata dal nome e dalla versione
  2126.      *
  2127.      */
  2128.     @Override
  2129.     public void updateApiServizio(ApiServizio body, String nome, Integer versione, String nomeServizio,
  2130.             ProfiloEnum profilo, String soggetto) {
  2131.         IContext context = this.getContext();
  2132.         try {
  2133.             context.getLogger().info("Invocazione in corso ...");

  2134.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  2135.             context.getLogger().debug("Autorizzazione completata con successo");

  2136.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  2137.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);

  2138.             if (as == null)
  2139.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);

  2140.             final PortType oldPt = BaseHelper.findAndRemoveFirst(as.getPortTypeList(),
  2141.                     (p -> nomeServizio.equals(p.getNome())));

  2142.             if (oldPt == null)
  2143.                 throw FaultCode.NOT_FOUND.toException("Nessun Servizio registrato con nome: " + nomeServizio);

  2144.             ApiApiHelper.updatePortType(body, oldPt, env);
  2145.             final PortType newPt = oldPt;

  2146.             if (!env.apcHelper.accordiPorttypeCheckData(TipoOperazione.CHANGE, as.getId().toString(), newPt.getNome(),
  2147.                     newPt.getDescrizione(), AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_RIDEFINITO,
  2148.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newPt.getFiltroDuplicati()),
  2149.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newPt.getConfermaRicezione()),
  2150.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newPt.getIdCollaborazione()),
  2151.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newPt.getIdRiferimentoRichiesta()),
  2152.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(newPt.getConsegnaInOrdine()),
  2153.                     newPt.getScadenza() != null ? newPt.getScadenza() : "")) {
  2154.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  2155.             }

  2156.             as.addPortType(newPt);

  2157.             env.apcCore.performUpdateOperation(env.userLogin, false, as);

  2158.             context.getLogger().info("Invocazione completata con successo");
  2159.         } catch (javax.ws.rs.WebApplicationException e) {
  2160.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  2161.             throw e;
  2162.         } catch (Throwable e) {
  2163.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  2164.             throw FaultCode.ERRORE_INTERNO.toException(e);
  2165.         }
  2166.     }
  2167.    
  2168.     /**
  2169.      * Consente di modificare i tags associati all'API
  2170.      *
  2171.      * Questa operazione consente di aggiornare i tags associati all'API identificata dal nome e dalla versione
  2172.      *
  2173.      */
  2174.     @Override
  2175.     public void updateApiTags(ApiTags body, String nome, Integer versione, ProfiloEnum profilo, String soggetto) {
  2176.         IContext context = this.getContext();
  2177.         try {
  2178.             context.getLogger().info("Invocazione in corso ...");

  2179.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  2180.             context.getLogger().debug("Autorizzazione completata con successo");

  2181.             if (body == null)
  2182.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare un body");

  2183.             final ApiEnv env = new ApiEnv(profilo, soggetto, context);
  2184.             final AccordoServizioParteComune as = ApiApiHelper.getAccordoFull(nome, versione, env);
  2185.            
  2186.             if (as == null)
  2187.                 throw FaultCode.NOT_FOUND.toException("Nessuna Api registrata con nome " + nome + " e versione " + versione);
  2188.            
  2189.             final IDAccordo oldIdAccordo = env.idAccordoFactory.getIDAccordoFromAccordo(as);
  2190.            
  2191.             List<Object> objectToCreate = new ArrayList<>();
  2192.            
  2193.             if(body.getTags()==null || body.getTags().isEmpty()) {
  2194.                 as.setGruppi(null);
  2195.             }
  2196.             else {
  2197.                 as.setGruppi(new GruppiAccordo()); // annullo eventuali tags presenti.
  2198.                
  2199.                 GruppiCore gruppiCore = new GruppiCore(env.stationCore);
  2200.                
  2201.                 for (String tag : body.getTags()) {
  2202.                     GruppoAccordo gruppo = new GruppoAccordo();
  2203.                     gruppo.setNome(tag);
  2204.                     as.getGruppi().addGruppo(gruppo);
  2205.                    
  2206.                     if(!gruppiCore.existsGruppo(tag)) {
  2207.                         Gruppo nuovoGruppo = new Gruppo();
  2208.                         nuovoGruppo.setNome(tag);
  2209.                         nuovoGruppo.setSuperUser(as.getSuperUser());
  2210.                         objectToCreate.add(nuovoGruppo);
  2211.                     }
  2212.                 }
  2213.             }
  2214.            
  2215.             boolean validazioneDocumenti = ServerProperties.getInstance().isValidazioneDocumenti();

  2216.             BinaryParameter wsdlserv = new BinaryParameter();
  2217.             wsdlserv.setValue(as.getByteWsdlLogicoErogatore());

  2218.             BinaryParameter wsdlconc = new BinaryParameter();
  2219.             wsdlconc.setValue(as.getByteWsdlConcettuale());

  2220.             BinaryParameter wsdldef = new BinaryParameter();
  2221.             wsdldef.setValue(as.getByteWsdlDefinitorio());

  2222.             /*
  2223.              * boolean visibilitaAccordoCooperazione=false;
  2224.              * if("-".equals(this.accordoCooperazioneId)==false &&
  2225.              * "".equals(this.accordoCooperazioneId)==false &&
  2226.              * this.accordoCooperazioneId!=null){ AccordoCooperazione ac =
  2227.              * acCore.getAccordoCooperazione(Long.parseLong(this.accordoCooperazioneId));
  2228.              * visibilitaAccordoCooperazione=ac.getPrivato()!=null && ac.getPrivato(); }
  2229.              */

  2230.             StringBuilder bfTags = new StringBuilder();
  2231.             if(as.getGruppi()!=null && as.getGruppi().getGruppoList()!=null && !as.getGruppi().getGruppoList().isEmpty()) {
  2232.                 for (GruppoAccordo tag : as.getGruppi().getGruppoList()) {
  2233.                     if(bfTags.length()>0) {
  2234.                         bfTags.append(",");
  2235.                     }
  2236.                     bfTags.append(tag.getNome());
  2237.                 }
  2238.             }
  2239.            
  2240.             boolean gestioneCanaliEnabled = env.gestioneCanali;
  2241.             String canale = as.getCanale();
  2242.             String canaleStato = null;
  2243.             if(canale == null) {
  2244.                 canaleStato = AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_DEFAULT;
  2245.             } else {
  2246.                 canaleStato = AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_RIDEFINITO;
  2247.             }
  2248.            
  2249.             if (!env.apcHelper.accordiCheckData(TipoOperazione.CHANGE, as.getNome(), as.getDescrizione(),
  2250.                     as.getProfiloCollaborazione().toString(), Helper.toBinaryParameter(as.getByteWsdlDefinitorio()),
  2251.                     Helper.toBinaryParameter(as.getByteWsdlConcettuale()),
  2252.                     Helper.toBinaryParameter(as.getByteWsdlLogicoErogatore()),
  2253.                     Helper.toBinaryParameter(as.getByteWsdlLogicoFruitore()),
  2254.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getFiltroDuplicati()),
  2255.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getConfermaRicezione()),
  2256.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getIdCollaborazione()),
  2257.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getIdRiferimentoRichiesta()),
  2258.                     AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(as.getConsegnaInOrdine()),
  2259.                     as.getScadenza() == null ? "" : as.getScadenza(), as.getId().toString(), as.getSoggettoReferente().getNome(),
  2260.                     as.getVersione().toString(), null, // AccordoCooperazioneID
  2261.                     false, // privato false, null,
  2262.                     false, // visibilitaAccordoCooperazione
  2263.                     oldIdAccordo, // idAccordoOld
  2264.                     null, // wsblconc
  2265.                     null, // wsblserv
  2266.                     null, // wsblservrorr
  2267.                     validazioneDocumenti, env.tipo_protocollo, null, // backToStato
  2268.                     env.apcCore.toMessageServiceBinding(as.getServiceBinding()), null, // MessageType
  2269.                     Enums.interfaceTypeFromFormatoSpecifica.get(as.getFormatoSpecifica()), env.gestisciSoggettoReferente,
  2270.                     bfTags.toString(),
  2271.                     canaleStato, canale, gestioneCanaliEnabled)) {

  2272.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  2273.             }

  2274.             // Il profilo di collaborazione di base è Sincrono.
  2275.             // Quindi Nella AccordiServizioPArteComuneChange così come nella Add possiamo
  2276.             // assumerlo costante.
  2277.             // Sono i Servizi e le Azioni ad avere un profilo di collaborazione

  2278.             as.setOldIDAccordoForUpdate(oldIdAccordo);
  2279.             List<Object> operazioniList = new ArrayList<>(Arrays.asList(as));

  2280.             // Questa roba non serve qui perchè la updateDescrizione non cambia il nome e
  2281.             // quindi nemmeno l'ID.
  2282.             IDAccordo idNEW = env.idAccordoFactory.getIDAccordoFromAccordo(as);
  2283.             if (idNEW.equals(oldIdAccordo) == false) {
  2284.                 AccordiServizioParteComuneUtilities.findOggettiDaAggiornare(oldIdAccordo, as, env.apcCore, operazioniList);
  2285.             }

  2286.            
  2287.             // effettuo le operazioni
  2288.             if(objectToCreate.size()>0) {
  2289.                 env.apcCore.performCreateOperation(env.userLogin, false, objectToCreate.toArray(new Object[objectToCreate.size()]));
  2290.             }
  2291.            
  2292.             env.apcCore.performUpdateOperation(env.userLogin, false, operazioniList.toArray());

  2293.             context.getLogger().info("Invocazione completata con successo");
  2294.         } catch (javax.ws.rs.WebApplicationException e) {
  2295.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s", e, e.getMessage());
  2296.             throw e;
  2297.         } catch (Throwable e) {
  2298.             context.getLogger().error("Invocazione terminata con errore: %s", e, e.getMessage());
  2299.             throw FaultCode.ERRORE_INTERNO.toException(e);
  2300.         }
  2301.     }


  2302. }