FruizioneConverter.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.protocol.basic.archive.abstraction;

  21. import java.io.ByteArrayInputStream;
  22. import java.util.ArrayList;
  23. import java.util.HashMap;
  24. import java.util.Map;

  25. import org.openspcoop2.core.config.constants.PortaDelegataAzioneIdentificazione;
  26. import org.openspcoop2.core.id.IDServizio;
  27. import org.openspcoop2.core.mapping.MappingFruizionePortaDelegata;
  28. import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
  29. import org.openspcoop2.protocol.abstraction.Fruizione;
  30. import org.openspcoop2.protocol.abstraction.constants.Autenticazione;
  31. import org.openspcoop2.protocol.abstraction.constants.CostantiAbstraction;
  32. import org.openspcoop2.protocol.abstraction.constants.Tipologia;
  33. import org.openspcoop2.protocol.abstraction.template.DatiFruizione;
  34. import org.openspcoop2.protocol.abstraction.template.DatiServizio;
  35. import org.openspcoop2.protocol.abstraction.template.DatiServizioApplicativoFruitore;
  36. import org.openspcoop2.protocol.abstraction.template.DatiSoggetto;
  37. import org.openspcoop2.protocol.abstraction.template.IdSoggetto;
  38. import org.openspcoop2.protocol.abstraction.template.TemplateFruizione;
  39. import org.openspcoop2.protocol.basic.archive.ZIPReadUtils;
  40. import org.openspcoop2.protocol.sdk.ProtocolException;
  41. import org.openspcoop2.protocol.sdk.archive.Archive;
  42. import org.openspcoop2.protocol.sdk.archive.ArchiveFruitore;
  43. import org.openspcoop2.protocol.sdk.archive.ArchiveIdCorrelazione;
  44. import org.openspcoop2.protocol.sdk.archive.ArchivePortaDelegata;
  45. import org.openspcoop2.protocol.sdk.constants.ArchiveVersion;
  46. import org.openspcoop2.protocol.sdk.registry.IConfigIntegrationReader;
  47. import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
  48. import org.openspcoop2.protocol.utils.ManagerUtils;
  49. import org.openspcoop2.utils.RandomString;
  50. import org.openspcoop2.utils.Utilities;
  51. import org.openspcoop2.utils.resources.TemplateUtils;
  52. import org.slf4j.Logger;

  53. /**    
  54.  * FruizioneConverter
  55.  *
  56.  * @author Poli Andrea (poli@link.it)
  57.  * @author $Author$
  58.  * @version $Rev$, $Date$
  59.  */
  60. public class FruizioneConverter extends AbstractConverter {

  61.     // ----- Static method -----
  62.    
  63.     public static synchronized ArchiveIdCorrelazione generateIdCorrelazione(
  64.             String tipoSoggettoFruitore,String nomeSoggettoFruitore,
  65.             String tipoSoggettoErogatore,String nomeSoggettoErogatore,
  66.             String tipoServizio, String nomeServizio,
  67.             String descrizione) throws ProtocolException{
  68.        
  69.         // Identificativo Unico di Correlazione
  70.         String uuid = "Fruizione_"+
  71.                 tipoSoggettoFruitore+"/"+nomeSoggettoFruitore+"_"+
  72.                 tipoSoggettoErogatore+"/"+nomeSoggettoErogatore+"_"+
  73.                 tipoServizio+"/"+nomeServizio+"_"+System.currentTimeMillis();
  74.        
  75.         Utilities.sleep(1); // per rendere univco il prossimo uuid
  76.    
  77.         ArchiveIdCorrelazione idCorrelazione = new ArchiveIdCorrelazione(uuid);
  78.        
  79.         String d = null;
  80.         if(descrizione!=null && !"".equals(descrizione)){
  81.             d = descrizione;
  82.         }
  83.         else{
  84.             d = "Fruizione "+tipoSoggettoFruitore+"/"+nomeSoggettoFruitore+" -> (servizio:"+tipoServizio+"/"+nomeServizio+" erogatore:"+tipoSoggettoErogatore+"/"+nomeSoggettoErogatore+")";
  85.         }
  86.         idCorrelazione.setDescrizione(d);

  87.         return idCorrelazione;
  88.     }
  89.    
  90.    
  91.    
  92.    
  93.    
  94.    
  95.     // ----- Instance method -----

  96.     public FruizioneConverter(Logger log,ZIPReadUtils zipReader) throws ProtocolException{
  97.         super(log, zipReader);
  98.     }
  99.    
  100.     // ritorna l'identificativo di correlazione.
  101.     public ArchiveIdCorrelazione fillArchive(Archive archive, Fruizione fruizione, TemplateFruizione templateFruizione,
  102.             IRegistryReader registryReader, IConfigIntegrationReader configIntegrationReader, boolean validationDocuments) throws ProtocolException{
  103.        
  104.         try{
  105.            
  106.             // Cerco identificare accordo di servizio parte speicfica
  107.             IDServizio idAccordoServizioParteSpecifica = null;
  108.             if(fruizione.getAccordoServizioParteSpecifica().getUri()!=null){
  109.                 idAccordoServizioParteSpecifica = this.idServizioFactory.getIDServizioFromUri(fruizione.getAccordoServizioParteSpecifica().getUri());
  110.                 if(idAccordoServizioParteSpecifica.getVersione()==null){
  111.                     // forzo il default a 1
  112.                     idAccordoServizioParteSpecifica = this.idServizioFactory.getIDServizioFromValues(idAccordoServizioParteSpecifica.getTipo(), idAccordoServizioParteSpecifica.getNome(),
  113.                             idAccordoServizioParteSpecifica.getSoggettoErogatore(), 1);
  114.                 }
  115.                 if(this.existsAccordoServizioParteSpecifica(archive, registryReader, idAccordoServizioParteSpecifica)==false){
  116.                     throw new ProtocolException("Accordo di Servizio Parte Specifica ["+idAccordoServizioParteSpecifica.toString()+"] non esistente");
  117.                 }
  118.             }
  119.             else {
  120.                 if(fruizione.getAccordoServizioParteSpecifica().getIdServizio().getSoggetto()!=null &&
  121.                         fruizione.getAccordoServizioParteSpecifica().getIdServizio().getTipo()!=null){
  122.                     idAccordoServizioParteSpecifica = this.idServizioFactory.getIDServizioFromValues(fruizione.getAccordoServizioParteSpecifica().getIdServizio().getSoggetto().getTipo(),
  123.                             fruizione.getAccordoServizioParteSpecifica().getIdServizio().getSoggetto().getNome(),
  124.                             fruizione.getAccordoServizioParteSpecifica().getIdServizio().getTipo(),
  125.                             fruizione.getAccordoServizioParteSpecifica().getIdServizio().getNome(),
  126.                             1);
  127.                     if(this.existsAccordoServizioParteSpecifica(archive, registryReader, idAccordoServizioParteSpecifica)==false){
  128.                         throw new ProtocolException("Accordo di Servizio Parte Specifica ["+idAccordoServizioParteSpecifica.toString()+"] non esistente");
  129.                     }
  130.                 }
  131.                 else{
  132.                     idAccordoServizioParteSpecifica = this.findIdAccordoServizioParteSpecifica(archive, registryReader,
  133.                             fruizione.getAccordoServizioParteSpecifica().getIdServizio().getNome(),
  134.                             fruizione.getAccordoServizioParteSpecifica().getIdServizio().getTipo(),
  135.                             1,
  136.                             fruizione.getAccordoServizioParteSpecifica().getIdServizio().getSoggetto());
  137.                 }
  138.             }
  139.             AccordoServizioParteSpecifica asps = this.getAccordoServizioParteSpecifica(archive, registryReader, idAccordoServizioParteSpecifica);
  140.             if(asps==null){
  141.                 throw new ProtocolException("Accordo di Servizio Parte Specifica ["+idAccordoServizioParteSpecifica.toString()+"] non esistente ?");
  142.             }
  143.            
  144.             // IdSoggetto
  145.             IdSoggetto soggettoErogatore = new IdSoggetto();
  146.             soggettoErogatore.setTipo(idAccordoServizioParteSpecifica.getSoggettoErogatore().getTipo());
  147.             soggettoErogatore.setNome(idAccordoServizioParteSpecifica.getSoggettoErogatore().getNome());
  148.            
  149.             // Protocollo
  150.             @SuppressWarnings("unused")
  151.             String protocollo = ManagerUtils.getProtocolByOrganizationType(soggettoErogatore.getTipo());
  152.                        
  153.             // Dati Servizio
  154.             DatiServizio datiServizio = new DatiServizio();
  155.             datiServizio.setUriAccordoServizioParteComune(asps.getAccordoServizioParteComune());
  156.             datiServizio.setPortType(asps.getPortType());
  157.             datiServizio.setTipo(idAccordoServizioParteSpecifica.getTipo());
  158.             datiServizio.setNome(idAccordoServizioParteSpecifica.getNome());
  159.             datiServizio.setErogatore(soggettoErogatore);
  160.            
  161.             // Dati Fruizione
  162.             IdSoggetto soggettoFruitore = new IdSoggetto();
  163.             soggettoFruitore.setTipo(fruizione.getSoggettoFruitore().getIdSoggetto().getTipo());
  164.             soggettoFruitore.setNome(fruizione.getSoggettoFruitore().getIdSoggetto().getNome());
  165.             DatiFruizione datiFruizione = new DatiFruizione();
  166.             datiFruizione.setSoggetto(soggettoFruitore);
  167.             if(fruizione.getFruizione()!=null){
  168.                 if(fruizione.getFruizione().getClientAuth()!=null){
  169.                     datiFruizione.setClientAuth(fruizione.getFruizione().getClientAuth().getValue());
  170.                 }
  171.                 datiFruizione.setEndpoint(fruizione.getFruizione().getEndpoint());
  172.             }

  173.             // Dati Applicativo Fruitore
  174.             boolean createApplicativoFruitore = false;
  175.             boolean createPortaDelegata = false;
  176.             DatiServizioApplicativoFruitore datiApplicativoFruitore = null;
  177.             if(Tipologia.INTERNA.equals(fruizione.getTipologia())){
  178.                
  179.                 createPortaDelegata = true;
  180.                
  181.                 if(fruizione.getServizioApplicativo()==null){
  182.                     throw new ProtocolException("Servizio Applicativo (Nome o DatiApplicativi) non indicati. Questi dati sono obbligatori per una fruizione di tipologia 'interna'");
  183.                 }
  184.                
  185.                 datiApplicativoFruitore = new DatiServizioApplicativoFruitore();
  186.                 datiApplicativoFruitore.setNome(fruizione.getServizioApplicativo().getNome());
  187.                 datiApplicativoFruitore.setNomePortaDelegata(fruizione.getServizioApplicativo().getNomePortaDelegata());
  188.                
  189.                 if(datiApplicativoFruitore.getNome()!=null){
  190.                     boolean existsSA = this.existsServizioApplicativo(archive, configIntegrationReader, fruizione.getSoggettoFruitore().getIdSoggetto(), datiApplicativoFruitore.getNome());
  191.                     if(!existsSA){
  192.                         if(fruizione.getServizioApplicativo().getDatiApplicativi()==null){
  193.                             throw new ProtocolException("Servizio Applicativo (DatiApplicativi) non indicati. Questi dati sono obbligatori per una fruizione di tipologia 'interna', quando viene indicato un servizio applicativo non esistente");
  194.                         }
  195.                         if(fruizione.getServizioApplicativo().getDatiApplicativi().getAutenticazione()==null){
  196.                             throw new ProtocolException("Servizio Applicativo (Autenticazione) non indicato. Questo dato è obbligatorio per una fruizione di tipologia 'interna', quando viene indicato un servizio applicativo non esistente");
  197.                         }
  198.                         datiApplicativoFruitore.setAutenticazione(fruizione.getServizioApplicativo().getDatiApplicativi().getAutenticazione().getValue());
  199.                         if(Autenticazione.NONE.equals(fruizione.getServizioApplicativo().getDatiApplicativi().getAutenticazione())==false){
  200.                             createApplicativoFruitore = true;
  201.                         }
  202.                     }
  203.                     else{
  204.                         // Se cmq ho indicato dei dati applicativi, allora magari desidero fare un update
  205.                         if(fruizione.getServizioApplicativo().getDatiApplicativi()!=null &&
  206.                                 fruizione.getServizioApplicativo().getDatiApplicativi().getAutenticazione() != null ){
  207.                             datiApplicativoFruitore.setAutenticazione(fruizione.getServizioApplicativo().getDatiApplicativi().getAutenticazione().getValue());
  208.                             if(Autenticazione.NONE.equals(fruizione.getServizioApplicativo().getDatiApplicativi().getAutenticazione())==false){
  209.                                 createApplicativoFruitore = true;
  210.                             }
  211.                         }
  212.                         else{
  213.                             datiApplicativoFruitore.setAutenticazione(this.getTipoCredenzialeServizioApplicativo(archive, configIntegrationReader,
  214.                                     fruizione.getSoggettoFruitore().getIdSoggetto(), datiApplicativoFruitore.getNome()));
  215.                         }
  216.                     }
  217.                 }
  218.                 else{
  219.                     if(fruizione.getServizioApplicativo().getDatiApplicativi()==null){
  220.                         throw new ProtocolException("Servizio Applicativo (Nome o DatiApplicativi) non indicati. Questi dati sono obbligatori per una fruizione di tipologia 'interna'");
  221.                     }
  222.                     if(fruizione.getServizioApplicativo().getDatiApplicativi().getAutenticazione()==null){
  223.                         throw new ProtocolException("Servizio Applicativo (Autenticazione) non indicato. Questo dato è obbligatorio per una fruizione di tipologia 'interna', quando non viene indicato un servizio applicativo");
  224.                     }
  225.                     datiApplicativoFruitore.setAutenticazione(fruizione.getServizioApplicativo().getDatiApplicativi().getAutenticazione().getValue());
  226.                     if(Autenticazione.NONE.equals(fruizione.getServizioApplicativo().getDatiApplicativi().getAutenticazione())==false){
  227.                         createApplicativoFruitore = true;
  228.                     }
  229.                 }
  230.                
  231.                 if(createApplicativoFruitore){
  232.                    
  233.                     if(Autenticazione.SSL.equals(fruizione.getServizioApplicativo().getDatiApplicativi().getAutenticazione())){
  234.                         if(fruizione.getServizioApplicativo().getDatiApplicativi().getSslSubject()==null){
  235.                             throw new ProtocolException("Ssl Subject non indicato per la fruizione, nonostante sia indicata una autenticazione di tipo 'ssl'");
  236.                         }
  237.                         if(fruizione.getServizioApplicativo().getDatiApplicativi().getBasicUsername()!=null){
  238.                             throw new ProtocolException("Basic Username non deve essere indicato per la fruizione. E' stata impostata una autenticazione di tipo 'ssl'");
  239.                         }
  240.                         if(fruizione.getServizioApplicativo().getDatiApplicativi().getBasicPassword()!=null){
  241.                             throw new ProtocolException("Basic Password non deve essere indicato per la fruizione. E' stata impostata una autenticazione di tipo 'ssl'");
  242.                         }
  243.                         datiApplicativoFruitore.setSslSubject(fruizione.getServizioApplicativo().getDatiApplicativi().getSslSubject());
  244.                     }
  245.                     else if(Autenticazione.BASIC.equals(fruizione.getServizioApplicativo().getDatiApplicativi().getAutenticazione())){
  246.                         if(fruizione.getServizioApplicativo().getDatiApplicativi().getSslSubject()!=null){
  247.                             throw new ProtocolException("Ssl Subject non deve essere indicato per la fruizione. E' stata impostata una autenticazione di tipo 'basic'");
  248.                         }
  249.                         datiApplicativoFruitore.setBasicUsername(fruizione.getServizioApplicativo().getDatiApplicativi().getBasicUsername());
  250.                         datiApplicativoFruitore.setBasicPassword(fruizione.getServizioApplicativo().getDatiApplicativi().getBasicPassword());
  251.                         if(datiApplicativoFruitore.getBasicPassword()==null){
  252.                             RandomString randomString = new RandomString(10);
  253.                             datiApplicativoFruitore.setBasicPassword(randomString.nextString());
  254.                         }
  255.                     }
  256.                 }
  257.    
  258.             }
  259.             else{
  260.                 if(fruizione.getServizioApplicativo()!=null){
  261.                     throw new ProtocolException("Servizio Applicativo (Nomi o DatiApplicativi) indicati in una fruizione di tipologia 'esterna'. Tale tipologia non prevede la configurazione di una PD e di un ServizioApplicativo");
  262.                 }
  263.             }
  264.            
  265.             // Dati Soggetto
  266.             boolean createSoggetto = false;
  267.             boolean createPdd = false;
  268.             DatiSoggetto datiSoggetto = new DatiSoggetto();
  269.             datiSoggetto.setId(soggettoFruitore);
  270.             if(this.existsSoggetto(archive, registryReader, fruizione.getSoggettoFruitore().getIdSoggetto()) == false){
  271.                 if(fruizione.getSoggettoFruitore().getNotExistsBehaviour()==null || fruizione.getSoggettoFruitore().getNotExistsBehaviour().isCreate()==false){
  272.                     throw new ProtocolException("Soggetto Fruitore ["+soggettoFruitore.getTipo()+"/"+soggettoFruitore.getNome()+"] non esistente");
  273.                 }
  274.                 else{
  275.                    
  276.                     createSoggetto = true;
  277.                    
  278.                     datiSoggetto.setEndpoint(fruizione.getSoggettoFruitore().getNotExistsBehaviour().getEndpoint());
  279.                     datiSoggetto.setPortaDominio(fruizione.getSoggettoFruitore().getNotExistsBehaviour().getPortaDominio());
  280.                    
  281.                     if(datiSoggetto.getPortaDominio()!=null){
  282.                         if(this.existsPdd(archive, registryReader, datiSoggetto.getPortaDominio())){
  283.                             if(Tipologia.INTERNA.equals(fruizione.getTipologia())){
  284.                                 if(this.isPddOperativa(archive, registryReader, datiSoggetto.getPortaDominio())==false){
  285.                                     throw new ProtocolException("La pdd ["+datiSoggetto.getPortaDominio()+
  286.                                             "] indicata per il Soggetto Fruitore ["+soggettoFruitore.getTipo()+"/"+soggettoFruitore.getNome()+"] "
  287.                                                     + "possiede un tipo 'esterno' non compatibile con una fruizione di tipologia 'interna'. Deve essere associata una pdd di tipo 'operativo'");
  288.                                 }
  289.                             }
  290.                             else{
  291.                                 if(this.isPddOperativa(archive, registryReader, datiSoggetto.getPortaDominio())){
  292.                                     throw new ProtocolException("La pdd ["+datiSoggetto.getPortaDominio()+
  293.                                             "] indicata per il Soggetto Fruitore ["+soggettoFruitore.getTipo()+"/"+soggettoFruitore.getNome()+"] "
  294.                                                     + "possiede un tipo 'operativo' non compatibile con una fruizione di tipologia 'esterna'. Deve essere associata una pdd di tipo 'esterno'");
  295.                                 }
  296.                             }
  297.                         }
  298.                         else{
  299.                             if(Tipologia.INTERNA.equals(fruizione.getTipologia())){
  300.                                 throw new ProtocolException("PdD ["+datiSoggetto.getPortaDominio()+"] non esistente (E' obbligatorio fornire una PdD esistente di tipo 'operativo' se la tipologia di fruizione è 'interna')");
  301.                             }
  302.                             createPdd = true;
  303.                         }
  304.                     }
  305.                     else{
  306.                         if(Tipologia.INTERNA.equals(fruizione.getTipologia())){
  307.                             datiSoggetto.setPortaDominio(this.getPddOperativa(registryReader));
  308.                         }else{
  309.                             createPdd = true; // creo pdd esterna.
  310.                         }
  311.                     }
  312.                    
  313.                 }
  314.             }
  315.                    
  316.            
  317.             // Identificativo Unico di Correlazione
  318.             ArchiveIdCorrelazione idCorrelazione = generateIdCorrelazione(soggettoFruitore.getTipo(),soggettoFruitore.getNome(),
  319.                     soggettoErogatore.getTipo(), soggettoErogatore.getNome(), datiServizio.getTipo(), datiServizio.getNome(),
  320.                     fruizione.getDescrizione());
  321.            
  322.             // Creazione mappa per FreeMarker
  323.             Map<String, Object> data = new HashMap<>();
  324.             data.put(CostantiAbstraction.EROGAZIONE_MAP_KEY_SERVIZIO, datiServizio);
  325.             data.put(CostantiAbstraction.EROGAZIONE_MAP_KEY_SOGGETTO, datiSoggetto);
  326.             data.put(CostantiAbstraction.EROGAZIONE_MAP_KEY_FRUIZIONE, datiFruizione);
  327.             data.put(CostantiAbstraction.EROGAZIONE_MAP_KEY_FRUITORE, soggettoFruitore); // metto entrambi in modo da averli a disposizione nel template
  328.             if(datiApplicativoFruitore!=null){
  329.                 data.put(CostantiAbstraction.EROGAZIONE_MAP_KEY_APPLICATIVO_FRUITORE, datiApplicativoFruitore);
  330.             }
  331.            
  332.            
  333.             // Creazione Pdd e Soggetti
  334.             if(createPdd){
  335.                 byte[]xml = TemplateUtils.toByteArray(templateFruizione.getTemplatePdd(), data);
  336.                 try{
  337.                     this.filler.readPortaDominio(archive, new ByteArrayInputStream(xml), xml, "pdd", validationDocuments, idCorrelazione);
  338.                 }catch(Exception e){
  339.                     throw new Exception("XmlTemplate["+new String(xml)+"]\n"+e.getMessage(),e);
  340.                 }
  341.             }
  342.             if(createSoggetto){
  343.                 byte[]xml = TemplateUtils.toByteArray(templateFruizione.getTemplateSoggetto(), data);
  344.                 try{
  345.                     this.filler.readSoggetto(archive,new ByteArrayInputStream(xml), xml, "soggetto",
  346.                             soggettoFruitore.getTipo(), soggettoFruitore.getNome(), validationDocuments, idCorrelazione);
  347.                 }catch(Exception e){
  348.                     throw new Exception("XmlTemplate["+new String(xml)+"]\n"+e.getMessage(),e);
  349.                 }
  350.             }
  351.            
  352.             // Creazione Fruizione
  353.             byte[]xml = TemplateUtils.toByteArray(templateFruizione.getTemplateFruitore(), data);
  354.             try{
  355.                 this.filler.readAccordoServizioParteSpecifica_Fruitore(archive, new ByteArrayInputStream(xml), xml,
  356.                         "fruizione", "servizio", soggettoErogatore.getTipo(), soggettoErogatore.getNome(),
  357.                         idAccordoServizioParteSpecifica.getTipo(), idAccordoServizioParteSpecifica.getNome(), idAccordoServizioParteSpecifica.getVersione()+"",
  358.                         validationDocuments, idCorrelazione,
  359.                         ArchiveVersion.V_1,null, null);
  360.             }catch(Exception e){
  361.                 throw new Exception("XmlTemplate["+new String(xml)+"]\n"+e.getMessage(),e);
  362.             }
  363.            
  364.             // Creazione SA
  365.             if(createApplicativoFruitore){
  366.                 for (int i = 0; i < templateFruizione.getTemplateServiziApplicativi().size(); i++) {
  367.                     xml = TemplateUtils.toByteArray(templateFruizione.getTemplateServiziApplicativi().get(i), data);
  368.                     try{
  369.                         this.filler.readServizioApplicativo(archive, new ByteArrayInputStream(xml), xml,
  370.                             "sa_"+i, soggettoFruitore.getTipo(), soggettoFruitore.getNome(), validationDocuments, idCorrelazione);
  371.                     }catch(Exception e){
  372.                         throw new Exception("XmlTemplate["+new String(xml)+"]\n"+e.getMessage(),e);
  373.                     }
  374.                 }
  375.             }
  376.                        
  377.             // Creazione PortaDelegata
  378.             if(createPortaDelegata){
  379.                 for (int i = 0; i < templateFruizione.getTemplatePorteDelegate().size(); i++) {
  380.                     xml = TemplateUtils.toByteArray(templateFruizione.getTemplatePorteDelegate().get(i), data);
  381.                     try{
  382.                         this.filler.readPortaDelegata(archive, new ByteArrayInputStream(xml), xml,
  383.                             "pd_"+i, soggettoFruitore.getTipo(), soggettoFruitore.getNome(), validationDocuments, idCorrelazione);
  384.                     }catch(Exception e){
  385.                         throw new Exception("XmlTemplate["+new String(xml)+"]\n"+e.getMessage(),e);
  386.                     }
  387.                 }
  388.             }
  389.            
  390.             // Creazione Mapping Fruizione
  391.             for (int i = 0; i < archive.getPorteDelegate().size(); i++) {
  392.                 ArchivePortaDelegata aPD = archive.getPorteDelegate().get(i);
  393.                 if(idCorrelazione.equals(aPD.getIdCorrelazione())){
  394.                     // Devo aggiungere in tutte le fruizioni la porta delegata
  395.                     for (int j = 0; j < archive.getAccordiFruitori().size(); j++) {
  396.                         ArchiveFruitore aFruitore = archive.getAccordiFruitori().get(j);
  397.                         if(idCorrelazione.equals(aFruitore.getIdCorrelazione())){
  398.                            
  399.                             MappingFruizionePortaDelegata mapping = new MappingFruizionePortaDelegata();
  400.                             mapping.setNome("regola_"+i+"_"+aPD.getIdPortaDelegata().getNome());
  401.                             mapping.setIdServizio(aFruitore.getIdAccordoServizioParteSpecifica());
  402.                             mapping.setIdFruitore(aFruitore.getIdSoggettoFruitore());
  403.                             mapping.setIdPortaDelegata(aPD.getIdPortaDelegata());
  404.                             mapping.setDefault(aPD.getPortaDelegata().getAzione()==null ||
  405.                                     !PortaDelegataAzioneIdentificazione.DELEGATED_BY.equals(aPD.getPortaDelegata().getAzione().getIdentificazione()));
  406.                            
  407.                             if(aFruitore.getMappingPorteDelegateAssociate()==null) {
  408.                                 aFruitore.setMappingPorteDelegateAssociate(new ArrayList<>());
  409.                             }
  410.                             aFruitore.getMappingPorteDelegateAssociate().add(mapping);
  411.                         }
  412.                     }
  413.                 }
  414.             }
  415.            
  416.             return idCorrelazione;
  417.            
  418.         }catch(Exception e){
  419.             throw new ProtocolException(e.getMessage(),e);
  420.         }
  421.        
  422.        
  423.     }
  424.    

  425.    
  426. }