ZIPReadUtils.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;

  21. import java.io.BufferedReader;
  22. import java.io.ByteArrayInputStream;
  23. import java.io.ByteArrayOutputStream;
  24. import java.io.File;
  25. import java.io.FileOutputStream;
  26. import java.io.IOException;
  27. import java.io.InputStream;
  28. import java.io.StringReader;
  29. import java.util.ArrayList;
  30. import java.util.HashMap;
  31. import java.util.Iterator;
  32. import java.util.List;
  33. import java.util.Map;
  34. import java.util.zip.ZipEntry;
  35. import java.util.zip.ZipFile;

  36. import javax.activation.FileDataSource;

  37. import org.openspcoop2.core.allarmi.constants.RuoloPorta;
  38. import org.openspcoop2.core.config.Configurazione;
  39. import org.openspcoop2.core.config.PortaApplicativa;
  40. import org.openspcoop2.core.config.PortaDelegata;
  41. import org.openspcoop2.core.config.ServizioApplicativo;
  42. import org.openspcoop2.core.config.constants.CostantiConfigurazione;
  43. import org.openspcoop2.core.config.constants.TipoAutorizzazione;
  44. import org.openspcoop2.core.config.driver.ExtendedInfoManager;
  45. import org.openspcoop2.core.config.utils.ConfigurazionePdDUtils;
  46. import org.openspcoop2.core.constants.ProprietariProtocolProperty;
  47. import org.openspcoop2.core.controllo_traffico.constants.RuoloPolicy;
  48. import org.openspcoop2.core.id.IDPortaApplicativa;
  49. import org.openspcoop2.core.id.IDPortaDelegata;
  50. import org.openspcoop2.core.id.IDServizio;
  51. import org.openspcoop2.core.id.IDSoggetto;
  52. import org.openspcoop2.core.mapping.MappingErogazionePortaApplicativa;
  53. import org.openspcoop2.core.mapping.MappingFruizionePortaDelegata;
  54. import org.openspcoop2.core.registry.AccordoCooperazione;
  55. import org.openspcoop2.core.registry.AccordoServizioParteComune;
  56. import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
  57. import org.openspcoop2.core.registry.Azione;
  58. import org.openspcoop2.core.registry.Documento;
  59. import org.openspcoop2.core.registry.Fruitore;
  60. import org.openspcoop2.core.registry.Gruppo;
  61. import org.openspcoop2.core.registry.IdSoggetto;
  62. import org.openspcoop2.core.registry.Operation;
  63. import org.openspcoop2.core.registry.PortType;
  64. import org.openspcoop2.core.registry.PortaDominio;
  65. import org.openspcoop2.core.registry.ProtocolProperty;
  66. import org.openspcoop2.core.registry.Resource;
  67. import org.openspcoop2.core.registry.Ruolo;
  68. import org.openspcoop2.core.registry.Scope;
  69. import org.openspcoop2.core.registry.constants.CostantiRegistroServizi;
  70. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  71. import org.openspcoop2.core.registry.utils.RegistroServiziUtils;
  72. import org.openspcoop2.protocol.abstraction.Erogazione;
  73. import org.openspcoop2.protocol.abstraction.Fruizione;
  74. import org.openspcoop2.protocol.abstraction.constants.CostantiAbstraction;
  75. import org.openspcoop2.protocol.abstraction.csv.Deserializer;
  76. import org.openspcoop2.protocol.abstraction.template.TemplateErogazione;
  77. import org.openspcoop2.protocol.abstraction.template.TemplateFruizione;
  78. import org.openspcoop2.protocol.basic.Costanti;
  79. import org.openspcoop2.protocol.basic.archive.abstraction.ErogazioneConverter;
  80. import org.openspcoop2.protocol.basic.archive.abstraction.FruizioneConverter;
  81. import org.openspcoop2.protocol.information_missing.Openspcoop2;
  82. import org.openspcoop2.protocol.sdk.ProtocolException;
  83. import org.openspcoop2.protocol.sdk.archive.Archive;
  84. import org.openspcoop2.protocol.sdk.archive.ArchiveAccordoCooperazione;
  85. import org.openspcoop2.protocol.sdk.archive.ArchiveAccordoServizioComposto;
  86. import org.openspcoop2.protocol.sdk.archive.ArchiveAccordoServizioParteComune;
  87. import org.openspcoop2.protocol.sdk.archive.ArchiveAccordoServizioParteSpecifica;
  88. import org.openspcoop2.protocol.sdk.archive.ArchiveActivePolicy;
  89. import org.openspcoop2.protocol.sdk.archive.ArchiveAllarme;
  90. import org.openspcoop2.protocol.sdk.archive.ArchiveAttributeAuthority;
  91. import org.openspcoop2.protocol.sdk.archive.ArchiveConfigurationPolicy;
  92. import org.openspcoop2.protocol.sdk.archive.ArchiveFruitore;
  93. import org.openspcoop2.protocol.sdk.archive.ArchiveGruppo;
  94. import org.openspcoop2.protocol.sdk.archive.ArchiveIdCorrelazione;
  95. import org.openspcoop2.protocol.sdk.archive.ArchivePdd;
  96. import org.openspcoop2.protocol.sdk.archive.ArchivePluginArchivio;
  97. import org.openspcoop2.protocol.sdk.archive.ArchivePluginClasse;
  98. import org.openspcoop2.protocol.sdk.archive.ArchivePortaApplicativa;
  99. import org.openspcoop2.protocol.sdk.archive.ArchivePortaDelegata;
  100. import org.openspcoop2.protocol.sdk.archive.ArchiveRuolo;
  101. import org.openspcoop2.protocol.sdk.archive.ArchiveScope;
  102. import org.openspcoop2.protocol.sdk.archive.ArchiveServizioApplicativo;
  103. import org.openspcoop2.protocol.sdk.archive.ArchiveSoggetto;
  104. import org.openspcoop2.protocol.sdk.archive.ArchiveTokenPolicy;
  105. import org.openspcoop2.protocol.sdk.archive.ArchiveUrlInvocazioneRegola;
  106. import org.openspcoop2.protocol.sdk.archive.MapPlaceholder;
  107. import org.openspcoop2.protocol.sdk.constants.ArchiveVersion;
  108. import org.openspcoop2.protocol.sdk.registry.IConfigIntegrationReader;
  109. import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
  110. import org.openspcoop2.utils.Utilities;
  111. import org.openspcoop2.utils.io.ZipUtilities;
  112. import org.openspcoop2.utils.resources.FileSystemUtilities;
  113. import org.slf4j.Logger;


  114. /**
  115.  * Classe utilizzata per lavorare sui package
  116.  *
  117.  *
  118.  * @author Poli Andrea (apoli@link.it)
  119.  * @author $Author$
  120.  * @version $Rev$, $Date$
  121.  */

  122. public class ZIPReadUtils  {

  123.    
  124.    
  125.     protected Logger log = null;
  126.    
  127.     protected IRegistryReader registryReader;
  128.     protected IConfigIntegrationReader configIntegrationReader;
  129.    
  130.     protected org.openspcoop2.core.registry.utils.serializer.JaxbDeserializer jaxbRegistryDeserializer = null;
  131.     protected org.openspcoop2.core.config.utils.serializer.JaxbDeserializer jaxbConfigDeserializer = null;
  132.     protected org.openspcoop2.core.plugins.utils.serializer.JaxbDeserializer jaxbPluginDeserializer = null;
  133.     protected org.openspcoop2.core.controllo_traffico.utils.serializer.JaxbDeserializer jaxbControlloTrafficoDeserializer = null;
  134.     protected org.openspcoop2.core.allarmi.utils.serializer.JaxbDeserializer jaxbAllarmeDeserializer = null;
  135.     protected org.openspcoop2.protocol.information_missing.utils.serializer.JaxbDeserializer jaxbInformationMissingDeserializer = null;
  136.    
  137.     private org.openspcoop2.protocol.abstraction.utils.serializer.JaxbDeserializer jaxbAbstractionDeserializer = null;
  138.     private ErogazioneConverter _erogazioneConverter = null;
  139.     private FruizioneConverter _fruizioneConverter = null;
  140.     private ErogazioneConverter getErogazioneConverter() throws ProtocolException {
  141.         if(this._erogazioneConverter==null) {
  142.             _initializeConverter();
  143.         }
  144.         return this._erogazioneConverter;
  145.     }
  146.     private FruizioneConverter getFruizioneConverter() throws ProtocolException {
  147.         if(this._fruizioneConverter==null) {
  148.             _initializeConverter();
  149.         }
  150.         return this._fruizioneConverter;
  151.     }
  152.     private synchronized void _initializeConverter() throws ProtocolException {
  153.         if(this._erogazioneConverter==null) {
  154.             this._erogazioneConverter = new ErogazioneConverter(this.log,this);
  155.         }
  156.         if(this._fruizioneConverter==null) {
  157.             this._fruizioneConverter = new FruizioneConverter(this.log,this);
  158.         }
  159.     }
  160.    
  161.     private TemplateErogazione templateErogazione;
  162.     private List<Erogazione> erogazioni;
  163.     private List<byte[]> csvErogazioni;
  164.     private byte[]csvFormatErogazione;
  165.     private byte[]csvMappingErogazione;
  166.     private byte[]csvTemplateErogazione;
  167.     private synchronized void initializeErogazioni() throws ProtocolException{
  168.         if(this.templateErogazione==null){
  169.             this.templateErogazione = new TemplateErogazione();
  170.             this.erogazioni = new ArrayList<Erogazione>();
  171.             this.csvErogazioni = new ArrayList<byte[]>();
  172.         }
  173.     }
  174.    
  175.     private TemplateFruizione templateFruizione;
  176.     private List<Fruizione> fruizioni;
  177.     private List<byte[]> csvFruizioni;
  178.     private byte[]csvFormatFruizione;
  179.     private byte[]csvMappingFruizione;
  180.     private byte[]csvTemplateFruizione;
  181.     private synchronized void initializeFruizioni() throws ProtocolException{
  182.         if(this.templateFruizione==null){
  183.             this.templateFruizione = new TemplateFruizione();
  184.             this.fruizioni = new ArrayList<Fruizione>();
  185.             this.csvFruizioni = new ArrayList<byte[]>();
  186.         }
  187.     }
  188.    
  189.     public ZIPReadUtils(Logger log,IRegistryReader registryReader,IConfigIntegrationReader configIntegrationReader) throws ProtocolException{
  190.         this.log = log;
  191.        
  192.         this.registryReader = registryReader;
  193.         this.configIntegrationReader = configIntegrationReader;
  194.        
  195.         this.jaxbRegistryDeserializer = new org.openspcoop2.core.registry.utils.serializer.JaxbDeserializer();
  196.         this.jaxbConfigDeserializer = new org.openspcoop2.core.config.utils.serializer.JaxbDeserializer();
  197.         this.jaxbPluginDeserializer = new org.openspcoop2.core.plugins.utils.serializer.JaxbDeserializer();
  198.         this.jaxbControlloTrafficoDeserializer = new org.openspcoop2.core.controllo_traffico.utils.serializer.JaxbDeserializer();
  199.         this.jaxbAllarmeDeserializer = new org.openspcoop2.core.allarmi.utils.serializer.JaxbDeserializer();
  200.         this.jaxbInformationMissingDeserializer = new org.openspcoop2.protocol.information_missing.utils.serializer.JaxbDeserializer();
  201.        
  202.         // abstract
  203.         this.jaxbAbstractionDeserializer = new org.openspcoop2.protocol.abstraction.utils.serializer.JaxbDeserializer();
  204.     }
  205.    
  206.    
  207.    
  208.    
  209.    
  210.    
  211.     /* ----- Unmarshall  ----- */
  212.    
  213.     /**
  214.      * Ritorna la rappresentazione java di un archivio
  215.      *
  216.      * @param zip byte[]
  217.      * @return Archive
  218.      * @throws ProtocolException
  219.      */
  220.     public Archive getArchive(byte[] zip,MapPlaceholder placeholder,boolean validationDocuments) throws ProtocolException{
  221.         File tmp = null;
  222.         FileOutputStream fout = null;
  223.         try{
  224.             tmp = FileSystemUtilities.createTempFile("openspcoop", "."+org.openspcoop2.protocol.basic.Costanti.OPENSPCOOP_ARCHIVE_EXT);
  225.            
  226.             fout = new FileOutputStream(tmp);
  227.             fout.write(zip);
  228.             fout.flush();
  229.             fout.close();
  230.            
  231.             return getArchive(tmp,placeholder,validationDocuments);
  232.            
  233.         }catch(Exception e){
  234. //          if(tmp!=null)
  235. //              throw new ProtocolException("["+tmp.getAbsolutePath()+"] "+ e.getMessage(),e);
  236. //          else
  237.             throw new ProtocolException(e.getMessage(),e);
  238.         }finally{
  239.             try{
  240.                 if(fout!=null)
  241.                     fout.close();
  242.                 if(tmp!=null) {
  243.                     if(!tmp.delete()) {
  244.                         // ignore
  245.                     }
  246.                 }
  247.             }catch(Exception eClose){
  248.                 // close
  249.             }
  250.         }
  251.        
  252.     }
  253.    
  254.     /**
  255.      * Ritorna la rappresentazione java di un archivio
  256.      *
  257.      * @param fileName File
  258.      * @return Archive
  259.      * @throws ProtocolException
  260.      */
  261.     public Archive getArchive(String fileName,MapPlaceholder placeholder,boolean validationDocuments) throws ProtocolException{
  262.         return getArchive(new File(fileName),placeholder,validationDocuments);
  263.     }
  264.    
  265.     /**
  266.      * Ritorna la rappresentazione java di un archivio
  267.      *
  268.      * @param zip File
  269.      * @return Archive
  270.      * @throws ProtocolException
  271.      */
  272.     public Archive getArchive(File zip,MapPlaceholder placeholder,boolean validationDocuments) throws ProtocolException{
  273.         ZipFile zipFile = null;
  274.         try{
  275.             zipFile = new ZipFile(zip);
  276.             return getArchive(zipFile,placeholder,validationDocuments);
  277.         }catch(Exception e){
  278.             throw new ProtocolException(e.getMessage(),e);
  279.         }finally{
  280.             try{
  281.                 if(zipFile!=null)
  282.                     zipFile.close();
  283.             }catch(Exception eClose){
  284.                 // close
  285.             }
  286.         }
  287.     }
  288.        
  289.     /**
  290.      * Ritorna la rappresentazione java di un archivio
  291.      *
  292.      * @param m InputStream
  293.      * @return Archive
  294.      * @throws ProtocolException
  295.      */
  296.     public Archive getArchive(InputStream m,MapPlaceholder placeholder,boolean validationDocuments) throws ProtocolException{
  297.         ByteArrayOutputStream bout = null;
  298.         try{
  299.             bout = new ByteArrayOutputStream();
  300.             byte[]read = new byte[1024];
  301.             int letti = 0;
  302.             while( (letti=m.read(read))>=0 ){
  303.                 bout.write(read, 0, letti);
  304.             }
  305.             bout.flush();
  306.             bout.close();
  307.             m.close();
  308.            
  309.             return getArchive(bout.toByteArray(),placeholder,validationDocuments);
  310.            
  311.         }catch(Exception e){
  312.             throw new ProtocolException(e.getMessage(),e);
  313.         }finally{
  314.             try{
  315.                 if(bout!=null){
  316.                     bout.close();
  317.                 }
  318.             }catch(Exception eClose){
  319.                 // close
  320.             }
  321.         }
  322.     }
  323.    

  324.     /**
  325.      * Ritorna la rappresentazione java di un archivio
  326.      *
  327.      * @param zip File
  328.      * @return Archive
  329.      * @throws ProtocolException
  330.      */
  331.     public Archive getArchive(ZipFile zip,MapPlaceholder placeholder,boolean validationDocuments) throws ProtocolException{
  332.         try{
  333.             Archive archivio = new Archive();
  334.            
  335.             if(placeholder==null){
  336.                 placeholder = new MapPlaceholder();
  337.             }
  338.            
  339.             ArchiveIdCorrelazione idCorrelazione = new ArchiveIdCorrelazione(ZIPUtils.ID_CORRELAZIONE_DEFAULT);
  340.             idCorrelazione.setDescrizione(zip.getName()); // come descrizione viene usato il nome dell'archivio zip
  341.            
  342.             // ArchiveVersion
  343.             ArchiveVersion archiveVersion = ArchiveVersion.V_UNDEFINED;
  344.             String openspcoopVersion = null;
  345.                        
  346.             // ExtendedInfoManager
  347.             ExtendedInfoManager extendedInfoManager = ExtendedInfoManager.getInstance();
  348.             Map<String, PortaDelegata> mapKeyForExtendedInfoPortaDelegata = new HashMap<>();
  349.             boolean existsExtendsConfigForPortaDelegata = extendedInfoManager.newInstanceExtendedInfoPortaDelegata()!=null;
  350.             Map<String, PortaApplicativa> mapKeyForExtendedInfoPortaApplicativa = new HashMap<>();
  351.             boolean existsExtendsConfigForPortaApplicativa = extendedInfoManager.newInstanceExtendedInfoPortaApplicativa()!=null;
  352.            
  353.             // Map per identificativi soggetti
  354.             Map<String, IDSoggetto> mapKeySoggetti = new HashMap<>();
  355.            
  356.             // Map per identificativi fruitori
  357.             Map<String, IDSoggetto> mapKeyFruitori = new HashMap<>();
  358.            
  359.             // Map per identificativi accordi
  360.             Map<String, IdentificativoAccordo> mapKeyAccordi = new HashMap<>();
  361.            
  362.             // Map per identificativi documenti
  363.             Map<String, IdentificativoDocumento> mapKeyDocumenti = new HashMap<>();
  364.            
  365.             // Map per identificativi protocol properties
  366.             Map<String, IdentificativoProprietaProtocollo> mapKeyProtocolProperties = new HashMap<>();
  367.            
  368.             // Map per nomi-file e nomi servizi applicativi
  369.             Map<String, IdentificativoServizioApplicativo> mapKeyServiziApplicativi = new HashMap<>();
  370.            
  371.             String rootDir = null;
  372.            
  373.             Iterator<ZipEntry> it = ZipUtilities.entries(zip, true);
  374.             while (it.hasNext()) {
  375.                 ZipEntry zipEntry = it.next();
  376.                 String entryName = ZipUtilities.operativeSystemConversion(zipEntry.getName());
  377.                
  378.                 /**System.out.println("FILE NAME:  "+entryName);
  379.                 System.out.println("SIZE:  "+entry.getSize());*/

  380.                 // Il codice dopo fissa il problema di inserire una directory nel package.
  381.                 // Commentare la riga sotto per ripristinare il vecchio comportamento.
  382.                 if(rootDir==null){
  383.                     // Calcolo ROOT DIR
  384.                     rootDir=ZipUtilities.getRootDir(entryName);
  385.                 }
  386.                
  387.                 if(zipEntry.isDirectory()) {
  388.                     continue; // directory
  389.                 }
  390.                 else {
  391.                     FileDataSource fds = new FileDataSource(entryName);
  392.                     String nome = fds.getName();
  393.                     String tipo = nome.substring(nome.lastIndexOf(".")+1,nome.length());
  394.                     tipo = tipo.toUpperCase();
  395.                     //System.out.println("VERIFICARE NAME["+nome+"] TIPO["+tipo+"]");
  396.                    
  397.                     InputStream inputStream = zip.getInputStream(zipEntry);
  398.                     byte[]content = Utilities.getAsByteArray(inputStream);
  399.                     // NOTA: non deve essere effettuato qua poiche il contenuto pu0 non essere 'xml'.
  400.                     //       vedi csv ....
  401.                     //xml = placeholder.replace(xml);
  402.                     //ByteArrayInputStream bin = new ByteArrayInputStream(xml);
  403.                     ByteArrayInputStream bin = null;
  404.                     try{
  405.                        
  406.                         // ********** archiveVersion ****************
  407.                         if(entryName.equals((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_VERSION_FILE_NAME)) ){
  408.                             archiveVersion = ArchiveVersion.toArchiveVersion(content);
  409.                             openspcoopVersion = ArchiveVersion.toProductVersion(content);
  410.                             this.log.debug("Version ["+archiveVersion+"] product["+openspcoopVersion+"]");
  411.                         }
  412.                                                
  413.                         // ********** configurazione ****************
  414.                         else if(entryName.startsWith((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_CONFIGURAZIONE_DIR+File.separatorChar)) ){
  415.                             byte[] xml = placeholder.replace(content);
  416.                             if(entryName.contains(File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_EXTENDED_DIR+File.separatorChar)){
  417.                                 this.readConfigurazioneExtended(archivio, bin, xml, entryName, validationDocuments, extendedInfoManager);
  418.                             }
  419.                             else{
  420.                                 bin = new ByteArrayInputStream(xml);
  421.                                 this.readConfigurazione(archivio, bin, xml, entryName, validationDocuments);
  422.                             }
  423.                         }
  424.                        
  425.                         // ********** configurazione - url di invocazione ****************
  426.                         else if(entryName.startsWith((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_URL_INVOCAZIONE_DIR+File.separatorChar)) ){
  427.                             byte[] xml = placeholder.replace(content);
  428.                             if(entryName.contains(File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_URL_INVOCAZIONE_REGOLE_DIR+File.separatorChar)){
  429.                                 bin = new ByteArrayInputStream(xml);
  430.                                 this.readUrlInvocazioneRegola(archivio, bin, xml, entryName, validationDocuments, idCorrelazione);
  431.                             }
  432.                             else {
  433.                                 bin = new ByteArrayInputStream(xml);
  434.                                 this.readUrlInvocazione(archivio, bin, xml, entryName, validationDocuments);
  435.                             }
  436.                         }
  437.                        
  438.                         // ********** controllo traffico ****************
  439.                         else if(entryName.startsWith((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_CONTROLLO_TRAFFICO_DIR+File.separatorChar)) ){
  440.                             byte[] xml = placeholder.replace(content);
  441.                             if(entryName.contains(File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_CONTROLLO_TRAFFICO_CONFIG_POLICY_DIR+File.separatorChar)){
  442.                                 bin = new ByteArrayInputStream(xml);
  443.                                 this.readControlloTraffico_configurazionePolicy(archivio, bin, xml, entryName, validationDocuments, idCorrelazione);
  444.                             }
  445.                             else if(entryName.contains(File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_CONTROLLO_TRAFFICO_ACTIVE_POLICY_DIR+File.separatorChar)){
  446.                                 bin = new ByteArrayInputStream(xml);
  447.                                 this.readControlloTraffico_attivazionePolicy(archivio, bin, xml, entryName, validationDocuments, idCorrelazione);
  448.                             }
  449.                             else {
  450.                                 bin = new ByteArrayInputStream(xml);
  451.                                 this.readControlloTraffico_configurazione(archivio, bin, xml, entryName, validationDocuments);
  452.                             }
  453.                         }
  454.                        
  455.                         // ********** allarmi ****************
  456.                         else if(entryName.startsWith((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_ALLARMI_DIR+File.separatorChar)) ){
  457.                             byte[] xml = placeholder.replace(content);
  458.                             bin = new ByteArrayInputStream(xml);
  459.                             this.readAllarme(archivio, bin, xml, entryName, validationDocuments, idCorrelazione);
  460.                         }
  461.                        
  462.                         // ********** token policies ****************
  463.                         else if(entryName.startsWith((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_TOKEN_POLICIES_DIR+File.separatorChar)) ){
  464.                             byte[] xml = placeholder.replace(content);
  465.                             if(entryName.contains(File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_TOKEN_POLICIES_VALIDATION_DIR+File.separatorChar)){
  466.                                 bin = new ByteArrayInputStream(xml);
  467.                                 this.readTokenValidationPolicy(archivio, bin, xml, entryName, validationDocuments, idCorrelazione);
  468.                             }
  469.                             else if(entryName.contains(File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_TOKEN_POLICIES_RETRIEVE_DIR+File.separatorChar)){
  470.                                 bin = new ByteArrayInputStream(xml);
  471.                                 this.readTokenRetrievePolicy(archivio, bin, xml, entryName, validationDocuments, idCorrelazione);
  472.                             }
  473.                             else {
  474.                                 throw new ProtocolException("Elemento ["+entryName+"] non atteso");
  475.                             }
  476.                         }
  477.                        
  478.                         // ********** attribute authority ****************
  479.                         else if(entryName.startsWith((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_ATTRIBUTE_AUTHORITY_DIR+File.separatorChar)) ){
  480.                             byte[] xml = placeholder.replace(content);
  481.                             if(entryName.contains(File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_ATTRIBUTE_AUTHORITY_RETRIEVE_DIR+File.separatorChar)){
  482.                                 bin = new ByteArrayInputStream(xml);
  483.                                 this.readAttributeAuthority(archivio, bin, xml, entryName, validationDocuments, idCorrelazione);
  484.                             }
  485.                             else {
  486.                                 throw new ProtocolException("Elemento ["+entryName+"] non atteso");
  487.                             }
  488.                         }
  489.                        
  490.                         // ********** plugins ****************
  491.                         else if(entryName.startsWith((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_PLUGINS_DIR+File.separatorChar)) ){
  492.                             byte[] xml = placeholder.replace(content);
  493.                             if(entryName.contains(File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_PLUGINS_CLASSI_DIR+File.separatorChar)){
  494.                                 bin = new ByteArrayInputStream(xml);
  495.                                 this.readPluginClasse(archivio, bin, xml, entryName, validationDocuments, idCorrelazione);
  496.                             }
  497.                             else if(entryName.contains(File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_PLUGINS_ARCHIVI_DIR+File.separatorChar)){
  498.                                 bin = new ByteArrayInputStream(xml);
  499.                                 this.readPluginArchivio(archivio, bin, xml, entryName, validationDocuments, idCorrelazione);
  500.                             }
  501.                             else {
  502.                                 throw new ProtocolException("Elemento ["+entryName+"] non atteso");
  503.                             }
  504.                         }
  505.                        
  506.                         // ********** pdd ****************
  507.                         else if(entryName.startsWith((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_PORTE_DOMINIO_DIR+File.separatorChar)) ){
  508.                             byte[] xml = placeholder.replace(content);
  509.                             bin = new ByteArrayInputStream(xml);
  510.                             this.readPortaDominio(archivio, bin, xml, entryName, validationDocuments, idCorrelazione);
  511.                         }
  512.                        
  513.                         // ********** gruppi ****************
  514.                         else if(entryName.startsWith((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_GRUPPI_DIR+File.separatorChar)) ){
  515.                             byte[] xml = placeholder.replace(content);
  516.                             bin = new ByteArrayInputStream(xml);
  517.                             this.readGruppo(archivio, bin, xml, entryName, validationDocuments, idCorrelazione);
  518.                         }
  519.                        
  520.                         // ********** ruoli ****************
  521.                         else if(entryName.startsWith((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_RUOLI_DIR+File.separatorChar)) ){
  522.                             byte[] xml = placeholder.replace(content);
  523.                             bin = new ByteArrayInputStream(xml);
  524.                             this.readRuolo(archivio, bin, xml, entryName, validationDocuments, idCorrelazione);
  525.                         }
  526.                        
  527.                         // ********** scope ****************
  528.                         else if(entryName.startsWith((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_SCOPE_DIR+File.separatorChar)) ){
  529.                             byte[] xml = placeholder.replace(content);
  530.                             bin = new ByteArrayInputStream(xml);
  531.                             this.readScope(archivio, bin, xml, entryName, validationDocuments, idCorrelazione);
  532.                         }
  533.                        
  534.                         // ********** informationMissing ********************
  535.                         else if(entryName.equals((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_INFORMATION_MISSING)) ){
  536.                             byte[] xml = placeholder.replace(content);
  537.                             bin = new ByteArrayInputStream(xml);
  538.                             this.readInformationMissing(archivio, bin, xml, entryName, validationDocuments);
  539.                         }
  540.                        
  541.                         // ********** soggetti/* ********************
  542.                         else if(entryName.startsWith((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_SOGGETTI_DIR+File.separatorChar)) ){
  543.                            
  544.                             byte[] xml = null;
  545.                             if(entryName.endsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_ATTACHMENT_SUFFIX_CONTENT)) {
  546.                                 xml = content; // System.out.println("NO PLACEHOLDER PER '"+entryName+"'");
  547.                             }
  548.                             else {
  549.                                 xml = placeholder.replace(content);
  550.                             }
  551.                             bin = new ByteArrayInputStream(xml);
  552.                                                        
  553.                             String name = entryName.substring((rootDir+Costanti.OPENSPCOOP2_ARCHIVE_SOGGETTI_DIR+File.separatorChar).length());
  554.                            
  555.                             if(name.contains((File.separatorChar+""))==false){
  556.                                
  557.                                 throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+Costanti.OPENSPCOOP2_ARCHIVE_SOGGETTI_DIR+
  558.                                         "] deve essere presenta una ulteriore directory contenente la struttura <tipo>_<nome> che descrive il soggetto e ulteriori file e/o directory che definiscono gli elementi del soggetto");
  559.                                
  560.                             }
  561.                             else{
  562.                                
  563.                                 // comprendo tipo e nome soggetto
  564.                                 String tipoNomeSoggetto = name.substring(0,name.indexOf(File.separatorChar));
  565.                                 if(tipoNomeSoggetto==null || "".equals(tipoNomeSoggetto) || !tipoNomeSoggetto.contains("_")){
  566.                                     throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+Costanti.OPENSPCOOP2_ARCHIVE_SOGGETTI_DIR+
  567.                                             "] deve essere presenta una ulteriore directory contenente la struttura <tipo>_<nome> che descrive il soggetto. Il nome utilizzato per la directory non e' conforme alla struttura attesa <tipo>_<nome>");
  568.                                 }
  569.                                 tipoNomeSoggetto = tipoNomeSoggetto.trim();
  570.                                 String tipoSoggetto = null;
  571.                                 String nomeSoggetto = null;
  572.                                 if(tipoNomeSoggetto.equals("_")){
  573.                                     // caso eccezionale senza ne tipo ne nome
  574.                                 }
  575.                                 else if(tipoNomeSoggetto.startsWith("_")){
  576.                                     // caso eccezionale con solo il nome
  577.                                     nomeSoggetto = tipoNomeSoggetto.substring(1);
  578.                                 }
  579.                                 else if(tipoNomeSoggetto.endsWith("_")){
  580.                                     // caso eccezionale con solo il tipo
  581.                                     tipoSoggetto = tipoNomeSoggetto.substring(0,tipoNomeSoggetto.length()-1);
  582.                                 }
  583.                                 else{
  584.                                     // caso normale
  585.                                     tipoSoggetto = tipoNomeSoggetto.split("_")[0];
  586.                                     nomeSoggetto = tipoNomeSoggetto.split("_")[1];
  587.                                     if(tipoSoggetto==null || "".equals(tipoSoggetto)){
  588.                                         throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+Costanti.OPENSPCOOP2_ARCHIVE_SOGGETTI_DIR+
  589.                                                 "] deve essere presenta una ulteriore directory contenente la struttura <tipo>_<nome> che descrive il soggetto. Il nome utilizzato per la directory non e' conforme alla struttura attesa <tipo>_<nome>: tipo non identificato");
  590.                                     }
  591.                                     if(nomeSoggetto==null || "".equals(nomeSoggetto)){
  592.                                         throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+Costanti.OPENSPCOOP2_ARCHIVE_SOGGETTI_DIR+
  593.                                                 "] deve essere presenta una ulteriore directory contenente la struttura <tipo>_<nome> che descrive il soggetto. Il nome utilizzato per la directory non e' conforme alla struttura attesa <tipo>_<nome>: nome non identificato");
  594.                                     }
  595.                                 }
  596.                                
  597.                                 // provo a vedere se ho già gestito l'entry come chiave identificativo del soggetto
  598.                                 if(mapKeySoggetti.containsKey(tipoNomeSoggetto)) {
  599.                                     IDSoggetto id = mapKeySoggetti.get(tipoNomeSoggetto);
  600.                                     if(id!=null) {
  601.                                         // converto dati identificativi del soggetto
  602.                                         tipoSoggetto = id.getTipo();
  603.                                         nomeSoggetto = id.getNome();
  604.                                     }
  605.                                 }
  606.                                
  607.                                 // comprendo parte restante
  608.                                 String nomeFile = name.substring((tipoNomeSoggetto.length()+1),name.length());
  609.                                 if(nomeFile==null){
  610.                                     throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+Costanti.OPENSPCOOP2_ARCHIVE_SOGGETTI_DIR+
  611.                                             "] deve essere presenta una ulteriore directory contenente la struttura <tipo>_<nome> che descrive il soggetto e ulteriori file e/o directory che definiscono gli elementi del soggetto: non sono stati trovati ulteriori file");
  612.                                 }
  613.                                
  614.                                 if(!nomeFile.contains((File.separatorChar+""))){
  615.                                    
  616.                                     // ------------ soggetto --------------------
  617.                                     if(Costanti.OPENSPCOOP2_ARCHIVE_SOGGETTI_FILE_NAME_ID.equals(nomeFile)) {
  618.                                         String s = null;
  619.                                         try {
  620.                                             s = new String(xml);
  621.                                             if(s.endsWith("\n") && s.length()>1){
  622.                                                 s = s.substring(0, s.length()-1);
  623.                                             }
  624.                                             IDSoggetto idSoggetto = IDSoggetto.toIDSoggetto(s);
  625.                                             mapKeySoggetti.put(tipoNomeSoggetto, idSoggetto);
  626.                                         }catch(Exception e) {
  627.                                             throw new ProtocolException("Elemento ["+entryName+"] contiene degli identificativi del soggetto ("+s+") non validi rispetto al pattern atteso (tipo/nome): "
  628.                                                     +e.getMessage(),e);
  629.                                         }
  630.                                     }
  631.                                     else {
  632.                                         this.readSoggetto(archivio, bin, xml, entryName, tipoSoggetto, nomeSoggetto, validationDocuments, idCorrelazione);
  633.                                     }
  634.                                    
  635.                                 }
  636.                                 else{

  637.                                     // ------------ protocolProperties del soggetto ------------
  638.                                     if(nomeFile.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_PROTOCOL_PROPERTIES+File.separatorChar)){

  639.                                         org.openspcoop2.core.registry.Soggetto soggettoRegistroServizi = null;
  640.                                         String key = ArchiveSoggetto.buildKey(tipoSoggetto, nomeSoggetto);
  641.                                         if(archivio.getSoggetti().containsKey(key)){
  642.                                             soggettoRegistroServizi = archivio.getSoggetti().get(key).getSoggettoRegistro();
  643.                                         }
  644.                                         else {
  645.                                             throw new ProtocolException("Elemento ["+entryName+"] errato. Non risulta la definizione del soggetto ["+tipoSoggetto+"/"+nomeSoggetto+"]");
  646.                                         }
  647.                                        
  648.                                         List<ProtocolProperty> listPP = new ArrayList<>();
  649.                                         if(soggettoRegistroServizi.sizeProtocolPropertyList()>0) {
  650.                                             for (ProtocolProperty protocolProperty : soggettoRegistroServizi.getProtocolPropertyList()) {
  651.                                                 if(protocolProperty.getTipoProprietario()==null) {
  652.                                                     protocolProperty.setTipoProprietario(ProprietariProtocolProperty.SOGGETTO.name());
  653.                                                 }
  654.                                                 listPP.add(protocolProperty);
  655.                                             }
  656.                                         }
  657.                                         processProtocolProperty(nomeFile, archiveVersion, entryName, xml,
  658.                                                 ProprietarioProprietaProtocollo.SOGGETTO,
  659.                                                 tipoSoggetto, nomeSoggetto, null, null,
  660.                                                 null, null,
  661.                                                 mapKeyProtocolProperties, listPP, null);
  662.                                        
  663.                                     }
  664.                                    
  665.                                     // ------------ servizio applicativo --------------------
  666.                                     else if(nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_SERVIZI_APPLICATIVI_DIR+File.separatorChar)) ){
  667.                                        
  668.                                         String nomeFileServizioApplicativo = nomeFile.substring((Costanti.OPENSPCOOP2_ARCHIVE_SERVIZI_APPLICATIVI_DIR+File.separatorChar).length());
  669.                                         //System.out.println("nomeFileServizioApplicativo: "+nomeFileServizioApplicativo);
  670.                                                                                
  671.                                         if(nomeFileServizioApplicativo.contains((File.separatorChar+""))==false){
  672.                                             ServizioApplicativo sa = this.readServizioApplicativo(archivio, bin, xml, entryName, tipoSoggetto, nomeSoggetto, validationDocuments, idCorrelazione);
  673.                                            
  674.                                             IdentificativoServizioApplicativo identificativoServizioApplicativo = new IdentificativoServizioApplicativo();
  675.                                             identificativoServizioApplicativo.nome = sa.getNome();
  676.                                             identificativoServizioApplicativo.tipoSoggetto = tipoSoggetto;
  677.                                             identificativoServizioApplicativo.nomeSoggetto = nomeSoggetto;
  678.                                             String nomeFileServizioApplicativoSenzaEstensioni = nomeFileServizioApplicativo.substring(0, nomeFileServizioApplicativo.indexOf(".xml"));
  679.                                             //System.out.println("ADD KEY["+nomeFileServizioApplicativoSenzaEstensioni+"] nome["+identificativoServizioApplicativo.nome+"]");
  680.                                             mapKeyServiziApplicativi.put(nomeFileServizioApplicativoSenzaEstensioni, identificativoServizioApplicativo);
  681.                                         }
  682.                                         else {
  683.                                             String nomeFileServizioApplicativoSenzaEstensioni = nomeFileServizioApplicativo.substring(0, nomeFileServizioApplicativo.indexOf(File.separatorChar+""));
  684.                                             //System.out.println("nomeFileServizioApplicativoSenzaEstensioni: "+nomeFileServizioApplicativoSenzaEstensioni);
  685.                                                                                        
  686.                                             //String nomeServizioApplicativo = nomeFileServizioApplicativo.substring(0, nomeFileServizioApplicativo.indexOf(File.separatorChar));
  687.                                             String nomeServizioApplicativo = null;
  688.                                             if(mapKeyServiziApplicativi.containsKey(nomeFileServizioApplicativoSenzaEstensioni)){
  689.                                                 nomeServizioApplicativo = mapKeyServiziApplicativi.get(nomeFileServizioApplicativoSenzaEstensioni).nome;
  690.                                             }
  691.                                             else {
  692.                                                 throw new ProtocolException("Elemento ["+entryName+"] errato. Non risulta la definizione dell'applicativo con nome file '"+nomeFileServizioApplicativoSenzaEstensioni+"' (soggetto "+tipoSoggetto+"/"+nomeSoggetto+")");
  693.                                             }
  694.                                            
  695.                                             String nomeFileSenzaServizioApplicativo = nomeFileServizioApplicativo.substring(nomeFileServizioApplicativo.indexOf(File.separatorChar)+1);
  696.                                             this.readProprietaServizioApplicativo(archivio, content, entryName, tipoSoggetto, nomeSoggetto, nomeServizioApplicativo, nomeFileSenzaServizioApplicativo,
  697.                                                     archiveVersion, mapKeyProtocolProperties);
  698.                                         }
  699.                                     }
  700.                                    
  701.                                     // ------------ porta delegata --------------------
  702.                                     else if(nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_PORTE_DELEGATE_DIR+File.separatorChar)) ){
  703.                                         if(nomeFile.contains(File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_EXTENDED_DIR+File.separatorChar)){
  704.                                             String key = this.getKeyPortaForExtendedInfo(tipoNomeSoggetto, nomeFile);
  705.                                             PortaDelegata pd = mapKeyForExtendedInfoPortaDelegata.get(key);
  706.                                             this.readPortaDelegataExtended(pd, bin, xml, entryName, validationDocuments, extendedInfoManager);
  707.                                         }
  708.                                         else{
  709.                                             PortaDelegata pd = this.readPortaDelegata(archivio, bin, xml, entryName, tipoSoggetto, nomeSoggetto, validationDocuments, idCorrelazione);
  710.                                             if(existsExtendsConfigForPortaDelegata){
  711.                                                 String key = this.getKeyPortaForExtendedInfo(tipoNomeSoggetto, nomeFile);
  712.                                                 mapKeyForExtendedInfoPortaDelegata.put(key, pd);
  713.                                             }
  714.                                         }
  715.                                     }
  716.                                    
  717.                                     // ------------ porta applicativa --------------------
  718.                                     else if(nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_PORTE_APPLICATIVE_DIR+File.separatorChar)) ){
  719.                                         if(nomeFile.contains(File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_EXTENDED_DIR+File.separatorChar)){
  720.                                             String key = this.getKeyPortaForExtendedInfo(tipoNomeSoggetto, nomeFile);
  721.                                             PortaApplicativa pa = mapKeyForExtendedInfoPortaApplicativa.get(key);
  722.                                             this.readPortaApplicativaExtended(pa, bin, xml, entryName, validationDocuments, extendedInfoManager);
  723.                                         }
  724.                                         else{
  725.                                             PortaApplicativa pa = this.readPortaApplicativa(archivio, bin, xml, entryName, tipoSoggetto, nomeSoggetto, validationDocuments, idCorrelazione);
  726.                                             if(existsExtendsConfigForPortaApplicativa){
  727.                                                 String key = this.getKeyPortaForExtendedInfo(tipoNomeSoggetto, nomeFile);
  728.                                                 mapKeyForExtendedInfoPortaApplicativa.put(key, pa);
  729.                                             }
  730.                                         }
  731.                                     }
  732.                                    
  733.                                     // ------------ accordi -------------------
  734.                                     else if( (nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_COMUNE_DIR+File.separatorChar)))
  735.                                             ||
  736.                                             (nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_COMPOSTO_DIR+File.separatorChar)))
  737.                                             ||
  738.                                             (nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_SPECIFICA_DIR+File.separatorChar)))
  739.                                             ||
  740.                                             (nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_COOPERAZIONE_DIR+File.separatorChar))) ){
  741.                                        
  742.                                         String nomeFileAccordo = null;
  743.                                         String directoryAccordo = null;
  744.                                         if( nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_COMUNE_DIR+File.separatorChar)) ){
  745.                                             directoryAccordo = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_COMUNE_DIR;
  746.                                         }
  747.                                         else if( nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_COMPOSTO_DIR+File.separatorChar)) ){
  748.                                             directoryAccordo = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_COMPOSTO_DIR;
  749.                                         }
  750.                                         else if( nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_SPECIFICA_DIR+File.separatorChar)) ){
  751.                                             directoryAccordo = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_SPECIFICA_DIR;
  752.                                         }
  753.                                         else if( nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_COOPERAZIONE_DIR+File.separatorChar)) ){
  754.                                             directoryAccordo = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_COOPERAZIONE_DIR;
  755.                                         }
  756.                                         nomeFileAccordo = nomeFile.substring((directoryAccordo+File.separatorChar).length());
  757.                                        
  758.                                         if(nomeFileAccordo.contains((File.separatorChar+""))==false){
  759.                                            
  760.                                             throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+directoryAccordo+
  761.                                                     "] deve essere presenta una ulteriore directory contenente la struttura <nome>[_<versione>] che descrive l'accordo e ulteriori file e/o directory che definiscono gli elementi dell'accordo");
  762.                                            
  763.                                         }
  764.                                         else{
  765.                                            
  766.                                             // nome file contenente nome accordo e versione (codificati in maniera compatibile al file system)
  767.                                             String nomeVersioneAccordo = nomeFileAccordo.substring(0,nomeFileAccordo.indexOf(File.separatorChar));
  768.                                             if(nomeVersioneAccordo==null || "".equals(nomeVersioneAccordo) || "_".equals(nomeVersioneAccordo) ||
  769.                                                     nomeVersioneAccordo.startsWith("_") || nomeVersioneAccordo.endsWith("_")){
  770.                                                 throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+directoryAccordo+
  771.                                                         "] deve essere presenta una ulteriore directory contenente la struttura <nome>[_<versione>] che descrive l'accordo. Il nome utilizzato per la directory non e' conforme alla struttura attesa <nome>[_<versione>]");
  772.                                             }
  773.                                             nomeVersioneAccordo = nomeVersioneAccordo.trim();
  774.                                            
  775.                                             // comprendo parte restante
  776.                                             String nomeFileSenzaAccordo = nomeFileAccordo.substring((nomeVersioneAccordo.length()+1),nomeFileAccordo.length());
  777.                                             if(nomeFileSenzaAccordo==null){
  778.                                                 throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+directoryAccordo+
  779.                                                         "] deve essere presenta una ulteriore directory contenente la struttura <nome>[_<versione> che descrive l'accordo e ulteriori file e/o directory che definiscono gli elementi dell'accordo: non sono stati trovati ulteriori file");
  780.                                             }
  781.                                            
  782.                                             // ------------ accordo servizio parte comune -------------------
  783.                                             // ------------ accordo servizio composto -------------------
  784.                                             // ------------ accordo cooperazione -------------------
  785.                                             if( nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_COMUNE_DIR+File.separatorChar)) ||
  786.                                                     nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_COMPOSTO_DIR+File.separatorChar)) ||
  787.                                                     nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_COOPERAZIONE_DIR+File.separatorChar))
  788.                                                     ){
  789.                                                
  790.                                                 // comprendo nome ed eventuale versione dell'accordo
  791.                                                 String versioneAccordo = null;
  792.                                                 String nomeAccordo = null;
  793.                                                 boolean findIdAccordo = false;
  794.                                                 if(ArchiveVersion.V_UNDEFINED.equals(archiveVersion)){
  795.                                                     if(nomeVersioneAccordo.contains("_")){
  796.                                                         nomeAccordo = nomeVersioneAccordo.split("_")[0];
  797.                                                         versioneAccordo = nomeVersioneAccordo.split("_")[1];
  798.                                                         if(versioneAccordo==null || "".equals(versioneAccordo)){
  799.                                                             throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+directoryAccordo+
  800.                                                                     "] deve essere presenta una ulteriore directory contenente la struttura <nome>[_<versione>] che descrive l'accordo. Il nome utilizzato per la directory non e' conforme alla struttura attesa <nome>[_<versione>]: versione non identificata");
  801.                                                         }
  802.                                                     }
  803.                                                     else{
  804.                                                         nomeAccordo = nomeVersioneAccordo;
  805.                                                     }
  806.                                                     if(nomeAccordo==null || "".equals(nomeAccordo)){
  807.                                                         throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+directoryAccordo+
  808.                                                                 "] deve essere presenta una ulteriore directory contenente la struttura <nome>[_<versione>] che descrive l'accordo. Il nome utilizzato per la directory non e' conforme alla struttura attesa <nome>[_<versione>]: nome non identificato");
  809.                                                     }
  810.                                                 }
  811.                                                 else{
  812.                                                     IdentificativoAccordo idAccordo = null;
  813.                                                     String keyAccordo = getKeyAccordo(tipoSoggetto, nomeSoggetto, nomeVersioneAccordo, nomeFile);
  814.                                                     if( nomeFileSenzaAccordo.equals(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME) ){
  815.                                                         String identificativo = this.readLineId(xml);
  816.                                                         if(identificativo.contains(" ")){
  817.                                                             nomeAccordo = identificativo.split(" ")[0];
  818.                                                             versioneAccordo = identificativo.split(" ")[1];
  819.                                                             if(versioneAccordo==null || "".equals(versioneAccordo)){
  820.                                                                 throw new ProtocolException("Elemento ["+entryName+"] errato. Il Contenuto ["+identificativo+
  821.                                                                         "] non è corretto, deve essere presente una struttura '<nome> <versione>' che descrive l'identificativo dell'accordo: versione non identificata");
  822.                                                             }
  823.                                                         }
  824.                                                         else{
  825.                                                             nomeAccordo = identificativo;
  826.                                                         }
  827.                                                         if(nomeAccordo==null || "".equals(nomeAccordo)){
  828.                                                             throw new ProtocolException("Elemento ["+entryName+"] errato. Il Contenuto ["+identificativo+
  829.                                                                     "] non è corretto, deve essere presenta una struttura '<nome>[ <versione>]' che descrive identificativo dell'accordo: nome non identificato");
  830.                                                         }
  831.                                                         idAccordo = new IdentificativoAccordo();
  832.                                                         idAccordo.nome = nomeAccordo;
  833.                                                         idAccordo.versione = versioneAccordo;
  834.                                                         mapKeyAccordi.put(keyAccordo, idAccordo);
  835.                                                         findIdAccordo = true;
  836.                                                     }
  837.                                                     else{
  838.                                                         idAccordo = mapKeyAccordi.get(keyAccordo);
  839.                                                         if(idAccordo==null){
  840.                                                             throw new ProtocolException("Elemento ["+entryName+"] errato. Non è stato trovato precedentemente il file ["+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME+"] contenente l'identificativo dell'accordo");
  841.                                                         }
  842.                                                         nomeAccordo = idAccordo.nome;
  843.                                                         versioneAccordo = idAccordo.versione;
  844.                                                     }
  845.                                                 }  
  846.                                                
  847.                                                 if(!findIdAccordo){
  848.                                                
  849.                                                     // ------------ accordo servizio parte comune -------------------
  850.                                                     if( nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_COMUNE_DIR+File.separatorChar)) ){
  851.                                                         this.readAccordoServizioParteComune(archivio, bin, xml, entryName, tipoSoggetto, nomeSoggetto,
  852.                                                                 nomeFileSenzaAccordo,nomeAccordo,versioneAccordo,false, validationDocuments, idCorrelazione,
  853.                                                                 archiveVersion, mapKeyDocumenti, mapKeyProtocolProperties);
  854.                                                     }
  855.                                                     // ------------ accordo servizio composto -------------------
  856.                                                     else if( nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_COMPOSTO_DIR+File.separatorChar)) ){
  857.                                                         this.readAccordoServizioParteComune(archivio, bin, xml, entryName, tipoSoggetto, nomeSoggetto,
  858.                                                                 nomeFileSenzaAccordo,nomeAccordo,versioneAccordo,true, validationDocuments, idCorrelazione,
  859.                                                                 archiveVersion, mapKeyDocumenti, mapKeyProtocolProperties);
  860.                                                     }
  861.                                                     // ------------ accordo cooperazione -------------------
  862.                                                     else if( nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_COOPERAZIONE_DIR+File.separatorChar)) ){
  863.                                                         this.readAccordoCooperazione(archivio, bin, xml, entryName, tipoSoggetto, nomeSoggetto,
  864.                                                                 nomeFileSenzaAccordo,nomeAccordo,versioneAccordo, validationDocuments, idCorrelazione,
  865.                                                                 archiveVersion, mapKeyDocumenti, mapKeyProtocolProperties);
  866.                                                     }
  867.                                                    
  868.                                                 }
  869.                                             }
  870.                                            
  871.                                             // ------------ accordo servizio parte specifica -------------------
  872.                                             else if( nomeFile.startsWith((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_SPECIFICA_DIR+File.separatorChar)) ){
  873.                                                
  874.                                                 // comprendo tipo, nome ed eventuale versione dell'accordo
  875.                                                 String versioneServizio = null;
  876.                                                 String nomeServizio = null;
  877.                                                 String tipoServizio = null;
  878.                                                 boolean findIdAccordo = false;
  879.                                                 if(ArchiveVersion.V_UNDEFINED.equals(archiveVersion)){
  880.                                                     // parte specifica tipo_nome[_versione]
  881.                                                     if(nomeVersioneAccordo.contains("_")==false){
  882.                                                         throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+directoryAccordo+
  883.                                                                 "] deve essere presenta una ulteriore directory contenente la struttura tipo_nome[_versione] che descrive l'accordo. Il nome utilizzato per la directory non e' conforme alla struttura attesa tipo_nome[_versione]");
  884.                                                     }
  885.                                                     int indexType = nomeVersioneAccordo.indexOf("_");
  886.                                                     if(indexType<=0){
  887.                                                         throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+directoryAccordo+
  888.                                                                 "] deve essere presenta una ulteriore directory contenente la struttura tipo_nome[_versione] che descrive l'accordo. Il nome utilizzato per la directory non e' conforme alla struttura attesa tipo_nome[_versione]: tipo non trovato (index:"+indexType+")");
  889.                                                     }
  890.                                                     tipoServizio = nomeVersioneAccordo.substring(0, indexType);
  891.                                                    
  892.                                                     if(indexType==nomeVersioneAccordo.length()){
  893.                                                         throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+directoryAccordo+
  894.                                                                 "] deve essere presenta una ulteriore directory contenente la struttura tipo_nome[_versione] che descrive l'accordo. Il nome utilizzato per la directory non e' conforme alla struttura attesa tipo_nome[_versione]: nome e versione non trovati");
  895.                                                     }
  896.                                                     String _nomeVersione = nomeVersioneAccordo.substring(indexType, nomeVersioneAccordo.length());
  897.                                                     if(_nomeVersione==null){
  898.                                                         throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+directoryAccordo+
  899.                                                                 "] deve essere presenta una ulteriore directory contenente la struttura tipo_nome[_versione] che descrive l'accordo. Il nome utilizzato per la directory non e' conforme alla struttura attesa tipo_nome[_versione]: nome e versione non trovati");
  900.                                                     }
  901.                                                     if(_nomeVersione.contains("_")==false){
  902.                                                         nomeServizio = _nomeVersione;
  903.                                                     }
  904.                                                     else{
  905.                                                         int indexVersione = _nomeVersione.lastIndexOf("_");
  906.                                                         if(indexVersione<=0){
  907.                                                             throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+directoryAccordo+
  908.                                                                     "] deve essere presenta una ulteriore directory contenente la struttura tipo_nome[_versione] che descrive l'accordo. Il nome utilizzato per la directory non e' conforme alla struttura attesa tipo_nome[_versione]: versione non trovata (index:"+indexVersione+")");
  909.                                                         }
  910.                                                         nomeServizio = _nomeVersione.substring(0, indexVersione);
  911.                                                    
  912.                                                         if(indexVersione==_nomeVersione.length()){
  913.                                                             throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+directoryAccordo+
  914.                                                                     "] deve essere presenta una ulteriore directory contenente la struttura tipo_nome[_versione] che descrive l'accordo. Il nome utilizzato per la directory non e' conforme alla struttura attesa tipo_nome[_versione]: versione non trovata dopo aver localizzato il nome");
  915.                                                         }
  916.                                                         versioneServizio = _nomeVersione.substring(indexVersione, _nomeVersione.length());
  917.                                                         if(versioneServizio==null){
  918.                                                             throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+directoryAccordo+
  919.                                                                     "] deve essere presenta una ulteriore directory contenente la struttura tipo_nome[_versione] che descrive l'accordo. Il nome utilizzato per la directory non e' conforme alla struttura attesa tipo_nome[_versione]: versione non trovata");
  920.                                                         }
  921.                                                     }
  922.                                                 }
  923.                                                 else{
  924.                                                     IdentificativoAccordo idAccordo = null;
  925.                                                     String keyAccordo = getKeyAccordo(tipoSoggetto, nomeSoggetto, nomeVersioneAccordo, nomeFile);
  926.                                                     if( nomeFileSenzaAccordo.equals(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME) ){
  927.                                                         String identificativo = this.readLineId(xml);
  928.                                                         if(!identificativo.contains(" ")){
  929.                                                             throw new ProtocolException("Elemento ["+entryName+"] errato. Il Contenuto ["+identificativo+
  930.                                                                     "] non è corretto, deve essere presente una struttura '<tipo> <nome> <versione>' che descrive l'identificativo dell'accordo: ' ' non trovato");
  931.                                                         }
  932.                                                         String [] tmp = identificativo.split(" ");
  933.                                                         if(tmp.length>2){
  934.                                                             tipoServizio = identificativo.split(" ")[0];
  935.                                                             nomeServizio = identificativo.split(" ")[1];
  936.                                                             versioneServizio = identificativo.split(" ")[2];
  937.                                                             if(versioneServizio==null || "".equals(versioneServizio)){
  938.                                                                 throw new ProtocolException("Elemento ["+entryName+"] errato. Il Contenuto ["+identificativo+
  939.                                                                         "] non è corretto, deve essere presente una struttura '<tipo> <nome> <versione>' che descrive l'identificativo dell'accordo: versione non identificata");
  940.                                                             }
  941.                                                         }
  942.                                                         else{
  943.                                                             tipoServizio = identificativo.split(" ")[0];
  944.                                                             nomeServizio = identificativo.split(" ")[1];
  945.                                                         }
  946.                                                         if(tipoServizio==null || "".equals(tipoServizio)){
  947.                                                             throw new ProtocolException("Elemento ["+entryName+"] errato. Il Contenuto ["+identificativo+
  948.                                                                     "] non è corretto, deve essere presenta una struttura '<tipo> <nome> [<versione>]' che descrive identificativo dell'accordo: tipo non identificato");
  949.                                                         }
  950.                                                         if(nomeServizio==null || "".equals(nomeServizio)){
  951.                                                             throw new ProtocolException("Elemento ["+entryName+"] errato. Il Contenuto ["+identificativo+
  952.                                                                     "] non è corretto, deve essere presenta una struttura '<tipo> <nome> [<versione>]' che descrive identificativo dell'accordo: nome non identificato");
  953.                                                         }
  954.                                                         idAccordo = new IdentificativoAccordo();
  955.                                                         idAccordo.tipo = tipoServizio;
  956.                                                         idAccordo.nome = nomeServizio;
  957.                                                         idAccordo.versione = versioneServizio;
  958.                                                         mapKeyAccordi.put(keyAccordo, idAccordo);
  959.                                                         findIdAccordo = true;
  960.                                                     }
  961.                                                     else{
  962.                                                         idAccordo = mapKeyAccordi.get(keyAccordo);
  963.                                                         if(idAccordo==null){
  964.                                                             throw new ProtocolException("Elemento ["+entryName+"] errato. Non è stato trovato precedentemente il file ["+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME+"] contenente l'identificativo dell'accordo");
  965.                                                         }
  966.                                                         tipoServizio = idAccordo.tipo;
  967.                                                         nomeServizio = idAccordo.nome;
  968.                                                         versioneServizio = idAccordo.versione;
  969.                                                     }
  970.                                                 }
  971.                                                
  972.                                                 if(findIdAccordo==false){
  973.                                                    
  974.                                                     // ------------ accordo servizio parte specifica -------------------
  975.                                                     this.readAccordoServizioParteSpecifica(archivio, bin, xml, entryName, tipoSoggetto, nomeSoggetto,
  976.                                                                 nomeFileSenzaAccordo,tipoServizio,nomeServizio,versioneServizio, validationDocuments, idCorrelazione,
  977.                                                                 archiveVersion, mapKeyDocumenti, mapKeyProtocolProperties,
  978.                                                                 mapKeyFruitori);
  979.                                                 }
  980.                                                
  981.                                             }

  982.                                         }
  983.                                        
  984.                                     }
  985.                                    
  986.                                     // others ?
  987.                                     else{
  988.                                         throw new ProtocolException("Elemento ["+entryName+"] non atteso");
  989.                                     }
  990.                                    
  991.                                 }
  992.                             }
  993.                         }
  994.                                                
  995.                         // others ?
  996.                         else{
  997.                             bin = new ByteArrayInputStream(content);
  998.                             this.readExternalArchive(rootDir, archivio, bin, content, entryName, validationDocuments);
  999.                         }
  1000.                                                
  1001.                     }finally{
  1002.                         try{
  1003.                             if(inputStream!=null){
  1004.                                 inputStream.close();
  1005.                             }
  1006.                         }catch(Exception eClose){
  1007.                             // close
  1008.                         }
  1009.                         try{
  1010.                             if(bin!=null){
  1011.                                 bin.close();
  1012.                             }
  1013.                         }catch(Exception eClose){
  1014.                             // close
  1015.                         }
  1016.                     }
  1017.                 }
  1018.             }
  1019.                
  1020.             // finalize
  1021.             this.finalizeArchive(archivio,validationDocuments);
  1022.            
  1023.             return archivio;

  1024.         }catch(Exception e){
  1025.             throw new ProtocolException(e.getMessage(),e);
  1026.         }
  1027.     }
  1028.    
  1029.     private String getKeyAccordo(String tipoSoggetto, String nomeSoggetto, String nomeVersioneAccordo, String nomeFile){
  1030.         StringBuilder bf = new StringBuilder();
  1031.         bf.append(tipoSoggetto==null?"":tipoSoggetto);
  1032.         bf.append("_");
  1033.         bf.append(nomeSoggetto==null?"":nomeSoggetto);
  1034.         bf.append("_");
  1035.         bf.append(nomeVersioneAccordo==null?"":nomeVersioneAccordo);
  1036.         bf.append("_");
  1037.         if( nomeFile.contains((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_COMUNE_DIR+File.separatorChar)) ){
  1038.             bf.append(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_COMUNE_DIR);
  1039.         }
  1040.         else if( nomeFile.contains((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_COMPOSTO_DIR+File.separatorChar)) ){
  1041.             bf.append(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_COMPOSTO_DIR);
  1042.         }
  1043.         else if( nomeFile.contains((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_SPECIFICA_DIR+File.separatorChar)) ){
  1044.             bf.append(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_SPECIFICA_DIR);
  1045.         }
  1046.         else if( nomeFile.contains((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_COOPERAZIONE_DIR+File.separatorChar)) ){
  1047.             bf.append(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_COOPERAZIONE_DIR);
  1048.         }
  1049.         return bf.toString();
  1050.     }
  1051.    
  1052.     private String getKeyDocumento(String tipoSoggetto, String nomeSoggetto, String nomeAccordo, String versioneAccordo, String nomeFile, String nomeDocumento){
  1053.         StringBuilder bf = new StringBuilder();
  1054.         bf.append(this.getKeyAccordo(tipoSoggetto, nomeSoggetto,
  1055.                 (nomeAccordo==null?"":nomeAccordo) + (versioneAccordo==null?"":versioneAccordo),
  1056.                 nomeFile));
  1057.         bf.append("_");
  1058.         if(nomeFile.contains(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_ALLEGATI+File.separatorChar)){
  1059.             bf.append(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_ALLEGATI);
  1060.         }
  1061.         else if(nomeFile.contains(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_SEMIFORMALI+File.separatorChar)){
  1062.             bf.append(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_SEMIFORMALI);
  1063.         }
  1064.         else if(nomeFile.contains(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_LIVELLI_SERVIZIO+File.separatorChar)){
  1065.             bf.append(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_LIVELLI_SERVIZIO);
  1066.         }
  1067.         else if(nomeFile.contains(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_SICUREZZA+File.separatorChar)){
  1068.             bf.append(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_SICUREZZA);
  1069.         }
  1070.         else if(nomeFile.contains(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_COORDINAMENTO+File.separatorChar)){
  1071.             bf.append(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_COORDINAMENTO);
  1072.         }
  1073.         bf.append("_");
  1074.         bf.append(nomeDocumento);
  1075.         return bf.toString();
  1076.     }
  1077.    
  1078.     private String getKeyProtocolProperty(String tipoSoggetto, String nomeSoggetto, String nomeAccordo, String versioneAccordo,
  1079.             String tipoSoggettoFruitore, String nomeSoggettoFruitore,
  1080.             ProprietarioProprietaProtocollo proprietario,
  1081.             String nomeDocumento){
  1082.         StringBuilder bf = new StringBuilder();
  1083.         bf.append(proprietario.name());
  1084.         bf.append("_");
  1085.         if(ProprietarioProprietaProtocollo.ACCORDO_COOPERAZIONE.equals(proprietario) ||
  1086.                 ProprietarioProprietaProtocollo.ACCORDO_SERVIZIO_PARTE_COMUNE.equals(proprietario)  ||
  1087.                 ProprietarioProprietaProtocollo.ACCORDO_SERVIZIO_PARTE_SPECIFICA.equals(proprietario) ||
  1088.                 ProprietarioProprietaProtocollo.FRUITORE.equals(proprietario) ) {
  1089.             bf.append(tipoSoggetto==null?"":tipoSoggetto);
  1090.             bf.append("_");
  1091.             bf.append(nomeSoggetto==null?"":nomeSoggetto);
  1092.             bf.append("_");
  1093.             String nomeVersioneAccordo = (nomeAccordo==null?"":nomeAccordo) + (versioneAccordo==null?"":versioneAccordo);
  1094.             bf.append(nomeVersioneAccordo);
  1095.         }
  1096.         else if(ProprietarioProprietaProtocollo.SOGGETTO.equals(proprietario) ||
  1097.                 ProprietarioProprietaProtocollo.SERVIZIO_APPLICATIVO.equals(proprietario)) {
  1098.             bf.append(tipoSoggetto==null?"":tipoSoggetto);
  1099.             bf.append("_");
  1100.             bf.append(nomeSoggetto==null?"":nomeSoggetto);
  1101.         }
  1102.         bf.append("_");
  1103.         if(ProprietarioProprietaProtocollo.FRUITORE.equals(proprietario)) {
  1104.             bf.append(tipoSoggetto==null?"":tipoSoggettoFruitore);
  1105.             bf.append("_");
  1106.             bf.append(nomeSoggetto==null?"":nomeSoggettoFruitore);
  1107.             bf.append("_");
  1108.         }
  1109.         if(ProprietarioProprietaProtocollo.SERVIZIO_APPLICATIVO.equals(proprietario)) {
  1110.             bf.append(nomeAccordo==null?"":nomeAccordo);
  1111.             bf.append("_");
  1112.         }
  1113.        
  1114.         bf.append("_");
  1115.         bf.append(nomeDocumento);
  1116.         return bf.toString();
  1117.     }
  1118.    
  1119.     private String getKeyPortaForExtendedInfo(String tipoNomeSoggetto, String nomeFile){
  1120.         String nomePortaSuFileSystem = nomeFile.substring(nomeFile.lastIndexOf(File.separatorChar));
  1121.         if(nomePortaSuFileSystem.endsWith(".xml")){
  1122.             nomePortaSuFileSystem = nomePortaSuFileSystem.substring(0,nomePortaSuFileSystem.length()-4);
  1123.         }
  1124.         else if(nomePortaSuFileSystem.endsWith(Costanti.OPENSPCOOP2_ARCHIVE_EXTENDED_FILE_EXT)){
  1125.             nomePortaSuFileSystem = nomeFile.substring(0,nomeFile.lastIndexOf(File.separatorChar));
  1126.             if(nomePortaSuFileSystem.contains(File.separatorChar+"")){
  1127.                 nomePortaSuFileSystem = nomePortaSuFileSystem.substring(nomePortaSuFileSystem.lastIndexOf(File.separatorChar));
  1128.             }
  1129.         }
  1130.         String key = tipoNomeSoggetto + nomePortaSuFileSystem;
  1131.         return key;
  1132.     }
  1133.    
  1134.     public void finalizeArchive(Archive archivio,boolean validationDocuments) throws ProtocolException{
  1135.         if(this.csvErogazioni!=null){
  1136.             Deserializer deserializer = new Deserializer(validationDocuments, this.log);
  1137.             for (byte[] erogazioneCsv : this.csvErogazioni) {
  1138.                 this.erogazioni.addAll(deserializer.toErogazione(this.csvTemplateErogazione, this.csvFormatErogazione, this.csvMappingErogazione, erogazioneCsv));
  1139.             }
  1140.         }
  1141.         if(this.erogazioni!=null){
  1142.             for (Erogazione erogazione : this.erogazioni) {
  1143.                 this.getErogazioneConverter().fillArchive(archivio, erogazione, this.templateErogazione, this.registryReader, this.configIntegrationReader, validationDocuments);
  1144.             }
  1145.         }

  1146.         if(this.csvFruizioni!=null){
  1147.             Deserializer deserializer = new Deserializer(validationDocuments, this.log);
  1148.             for (byte[] fruizioneCsv : this.csvFruizioni) {
  1149.                 this.fruizioni.addAll(deserializer.toFruizione(this.csvTemplateFruizione, this.csvFormatFruizione, this.csvMappingFruizione, fruizioneCsv));
  1150.             }
  1151.         }
  1152.         if(this.fruizioni!=null){
  1153.             for (Fruizione fruizione : this.fruizioni) {
  1154.                 this.getFruizioneConverter().fillArchive(archivio, fruizione, this.templateFruizione, this.registryReader, this.configIntegrationReader, validationDocuments);
  1155.             }
  1156.        
  1157.         }
  1158.     }
  1159.    
  1160.     public void readExternalArchive(String rootDir, Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments) throws ProtocolException{
  1161.         if(entryName.startsWith((rootDir+CostantiAbstraction.EROGAZIONI_DIR+File.separatorChar)) ){
  1162.            
  1163.             String name = entryName.substring((rootDir+CostantiAbstraction.EROGAZIONI_DIR+File.separatorChar).length());
  1164.             if(name.contains((File.separatorChar+""))){
  1165.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+CostantiAbstraction.EROGAZIONI_DIR+
  1166.                         "] non devono essere presenti ulteriori directory");
  1167.             }
  1168.             if(this.templateErogazione==null){
  1169.                 this.initializeErogazioni();
  1170.             }
  1171.             if(name.equals(CostantiAbstraction.TEMPLATE_FILE) ){
  1172.                 this.templateErogazione.updateTemplates(xml);
  1173.             }
  1174.             else if(name.equals(CostantiAbstraction.CSV_FORMAT_FILE) ){
  1175.                 this.csvFormatErogazione = xml;
  1176.             }
  1177.             else if(name.equals(CostantiAbstraction.CSV_MAPPING_FILE) ){
  1178.                 this.csvMappingErogazione = xml;
  1179.             }
  1180.             else if(name.equals(CostantiAbstraction.CSV_TEMPLATE_FILE) ){
  1181.                 this.csvTemplateErogazione = xml;
  1182.             }
  1183.             else if(name.endsWith(CostantiAbstraction.XML_EXTENSION)){
  1184.                 try{
  1185.                     if(validationDocuments){
  1186.                         org.openspcoop2.protocol.abstraction.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1187.                     }
  1188.                     Erogazione erogazione = this.jaxbAbstractionDeserializer.readErogazione(xml);
  1189.                     this.erogazioni.add(erogazione);
  1190.                 }catch(Exception eDeserializer){
  1191.                     String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1192.                     throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (erogazione) non valida rispetto allo schema (Abstraction): "
  1193.                             +eDeserializer.getMessage(),eDeserializer);
  1194.                 }
  1195.             }
  1196.             else if(name.endsWith(CostantiAbstraction.CSV_EXTENSION)){
  1197.                 this.csvErogazioni.add(xml);
  1198.             }
  1199.             else{
  1200.                 throw new ProtocolException("Elemento ["+entryName+"] non atteso. Sono supportati solamente i formati 'xml' e 'csv' oltre a poter fornire i seguente files: '"+
  1201.                         CostantiAbstraction.TEMPLATE_FILE+"','"+
  1202.                         CostantiAbstraction.CSV_FORMAT_FILE+"','"+
  1203.                         CostantiAbstraction.CSV_MAPPING_FILE+"','"+
  1204.                         CostantiAbstraction.CSV_TEMPLATE_FILE+"'");
  1205.             }
  1206.            
  1207.         }
  1208.         else if(entryName.startsWith((rootDir+CostantiAbstraction.FRUIZIONI_DIR+File.separatorChar)) ){
  1209.            
  1210.             String name = entryName.substring((rootDir+CostantiAbstraction.FRUIZIONI_DIR+File.separatorChar).length());
  1211.             if(name.contains((File.separatorChar+""))){
  1212.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+CostantiAbstraction.FRUIZIONI_DIR+
  1213.                         "] non devono essere presenti ulteriori directory");
  1214.             }
  1215.             if(this.templateFruizione==null){
  1216.                 this.initializeFruizioni();
  1217.             }
  1218.             if(name.equals(CostantiAbstraction.TEMPLATE_FILE) ){
  1219.                 this.templateFruizione.updateTemplates(xml);
  1220.             }
  1221.             else if(name.equals(CostantiAbstraction.CSV_FORMAT_FILE) ){
  1222.                 this.csvFormatFruizione = xml;
  1223.             }
  1224.             else if(name.equals(CostantiAbstraction.CSV_MAPPING_FILE) ){
  1225.                 this.csvMappingFruizione = xml;
  1226.             }
  1227.             else if(name.equals(CostantiAbstraction.CSV_TEMPLATE_FILE) ){
  1228.                 this.csvTemplateFruizione = xml;
  1229.             }
  1230.             else if(name.endsWith(CostantiAbstraction.XML_EXTENSION)){
  1231.                 try{
  1232.                     if(validationDocuments){
  1233.                         org.openspcoop2.protocol.abstraction.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1234.                     }
  1235.                     Fruizione fruizione = this.jaxbAbstractionDeserializer.readFruizione(xml);
  1236.                     this.fruizioni.add(fruizione);
  1237.                 }catch(Exception eDeserializer){
  1238.                     String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1239.                     throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (fruizione) non valida rispetto allo schema (Abstraction): "
  1240.                             +eDeserializer.getMessage(),eDeserializer);
  1241.                 }
  1242.             }
  1243.             else if(name.endsWith(CostantiAbstraction.CSV_EXTENSION)){
  1244.                 this.csvFruizioni.add(xml);
  1245.             }
  1246.             else{
  1247.                 throw new ProtocolException("Elemento ["+entryName+"] non atteso. Sono supportati solamente i formati 'xml' e 'csv' oltre a poter fornire i seguenti files: '"+
  1248.                         CostantiAbstraction.TEMPLATE_FILE+"','"+
  1249.                         CostantiAbstraction.CSV_FORMAT_FILE+"','"+
  1250.                         CostantiAbstraction.CSV_MAPPING_FILE+"','"+
  1251.                         CostantiAbstraction.CSV_TEMPLATE_FILE+"'");
  1252.             }
  1253.                        
  1254.         }
  1255.         else{
  1256.             throw new ProtocolException("Elemento ["+entryName+"] non atteso");
  1257.         }
  1258.     }
  1259.    
  1260.     public void readConfigurazione(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments) throws ProtocolException{
  1261.         try{
  1262.             if(validationDocuments){
  1263.                 org.openspcoop2.core.config.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1264.             }
  1265.             Configurazione configurazione = this.jaxbConfigDeserializer.readConfigurazione(xml);
  1266.             if(archivio.getConfigurazionePdD()!=null){
  1267.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di una configurazione della pdd");
  1268.             }
  1269.             archivio.setConfigurazionePdD(configurazione);
  1270.         }catch(Exception eDeserializer){
  1271.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1272.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (configurazione) non valida rispetto allo schema (ConfigurazionePdD): "
  1273.                     +eDeserializer.getMessage(),eDeserializer);
  1274.         }
  1275.     }
  1276.    
  1277.     public void readConfigurazioneExtended(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments,ExtendedInfoManager extendedInfoManager) throws ProtocolException{
  1278.         try{
  1279.             if(archivio.getConfigurazionePdD()==null){
  1280.                 //throw new ProtocolException("Non è possibile indicare una configurazione estesa senza indicare anche la configurazione generale");
  1281.                 // Caso speciale dove è presente solo l'extended info
  1282.                 archivio.setConfigurazionePdD(new Configurazione());
  1283.             }
  1284.             Object o = extendedInfoManager.newInstanceExtendedInfoConfigurazione().deserialize(this.log, archivio.getConfigurazionePdD(), xml);
  1285.             archivio.getConfigurazionePdD().addExtendedInfo(o);
  1286.         }catch(Exception eDeserializer){
  1287.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1288.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (configurazione-extended) non valida: "
  1289.                     +eDeserializer.getMessage(),eDeserializer);
  1290.         }
  1291.     }
  1292.    
  1293.     public void readControlloTraffico_configurazione(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments) throws ProtocolException{
  1294.         try{
  1295.             if(validationDocuments){
  1296.                 org.openspcoop2.core.controllo_traffico.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1297.             }
  1298.             org.openspcoop2.core.controllo_traffico.ConfigurazioneGenerale configurazione = this.jaxbControlloTrafficoDeserializer.readConfigurazioneGenerale(xml);
  1299.             if(archivio.getControlloTraffico_configurazione()!=null){
  1300.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di una configurazione di controllo del traffico");
  1301.             }
  1302.             archivio.setControlloTraffico_configurazione(configurazione);
  1303.         }catch(Exception eDeserializer){
  1304.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1305.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (configurazione) non valida rispetto allo schema (ControlloTraffico): "
  1306.                     +eDeserializer.getMessage(),eDeserializer);
  1307.         }
  1308.     }
  1309.    
  1310.     public void readControlloTraffico_configurazionePolicy(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1311.         try{
  1312.             if(validationDocuments){
  1313.                 org.openspcoop2.core.controllo_traffico.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1314.             }
  1315.             org.openspcoop2.core.controllo_traffico.ConfigurazionePolicy policy = this.jaxbControlloTrafficoDeserializer.readConfigurazionePolicy(xml);
  1316.             String key = ArchiveConfigurationPolicy.buildKey(policy.getIdPolicy());
  1317.             if(archivio.getControlloTraffico_configurationPolicies().containsKey(key)){
  1318.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di una configurazione di policy con key ["+key+"]");
  1319.             }
  1320.             archivio.getControlloTraffico_configurationPolicies().add(key,new ArchiveConfigurationPolicy(policy,idCorrelazione));
  1321.         }catch(Exception eDeserializer){
  1322.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1323.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (configurazione-policy) non valida rispetto allo schema (ControlloTraffico): "
  1324.                     +eDeserializer.getMessage(),eDeserializer);
  1325.         }
  1326.     }
  1327.    
  1328.     public void readControlloTraffico_attivazionePolicy(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1329.         try{
  1330.             if(validationDocuments){
  1331.                 org.openspcoop2.core.controllo_traffico.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1332.             }
  1333.             org.openspcoop2.core.controllo_traffico.AttivazionePolicy policy = this.jaxbControlloTrafficoDeserializer.readAttivazionePolicy(xml);
  1334.             RuoloPolicy ruoloPorta = null;
  1335.             String nomePorta = null;
  1336.             if(policy!=null && policy.getFiltro()!=null) {
  1337.                 ruoloPorta = policy.getFiltro().getRuoloPorta();
  1338.                 nomePorta = policy.getFiltro().getNomePorta();
  1339.             }
  1340.             if(policy==null) {
  1341.                 throw new ProtocolException("Policy is null");
  1342.             }
  1343.             String key = ArchiveActivePolicy.buildKey(ruoloPorta, nomePorta, policy.getAlias());
  1344.             if(archivio.getControlloTraffico_activePolicies().containsKey(key)){
  1345.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere più di un'attivazione di policy con key ["+key+"]");
  1346.             }
  1347.             archivio.getControlloTraffico_activePolicies().add(key,new ArchiveActivePolicy(policy,idCorrelazione));
  1348.         }catch(Exception eDeserializer){
  1349.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1350.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (attivazione-policy) non valida rispetto allo schema (ControlloTraffico): "
  1351.                     +eDeserializer.getMessage(),eDeserializer);
  1352.         }
  1353.     }
  1354.    
  1355.     public void readAllarme(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1356.         try{
  1357.             if(validationDocuments){
  1358.                 org.openspcoop2.core.allarmi.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1359.             }
  1360.             org.openspcoop2.core.allarmi.Allarme allarme = this.jaxbAllarmeDeserializer.readAllarme(xml);
  1361.             RuoloPorta ruoloPorta = null;
  1362.             String nomePorta = null;
  1363.             if(allarme!=null && allarme.getFiltro()!=null) {
  1364.                 ruoloPorta = allarme.getFiltro().getRuoloPorta();
  1365.                 nomePorta = allarme.getFiltro().getNomePorta();
  1366.             }
  1367.             if(allarme==null) {
  1368.                 throw new ProtocolException("Allarme is null");
  1369.             }
  1370.             String key = ArchiveAllarme.buildKey(ruoloPorta, nomePorta, allarme.getAlias());
  1371.             if(archivio.getAllarmi().containsKey(key)){
  1372.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere più di un'allarme con key ["+key+"]");
  1373.             }
  1374.             archivio.getAllarmi().add(key,new ArchiveAllarme(allarme,idCorrelazione));
  1375.         }catch(Exception eDeserializer){
  1376.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1377.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (allarme) non valida rispetto allo schema (Allarmi): "
  1378.                     +eDeserializer.getMessage(),eDeserializer);
  1379.         }
  1380.     }
  1381.    
  1382.     public void readTokenValidationPolicy(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1383.         try{
  1384.             if(validationDocuments){
  1385.                 org.openspcoop2.core.config.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1386.             }
  1387.             org.openspcoop2.core.config.GenericProperties policy = this.jaxbConfigDeserializer.readGenericProperties(xml);
  1388.             String key = ArchiveTokenPolicy.buildKey(policy.getTipo(), policy.getNome());
  1389.             if(archivio.getToken_validation_policies().containsKey(key)){
  1390.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di una policy di token validation con key ["+key+"]");
  1391.             }
  1392.             archivio.getToken_validation_policies().add(key,new ArchiveTokenPolicy(policy,idCorrelazione));
  1393.         }catch(Exception eDeserializer){
  1394.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1395.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (token-policy) non valida rispetto allo schema (ConfigurazionePdD): "
  1396.                     +eDeserializer.getMessage(),eDeserializer);
  1397.         }
  1398.     }
  1399.    
  1400.     public void readTokenRetrievePolicy(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1401.         try{
  1402.             if(validationDocuments){
  1403.                 org.openspcoop2.core.config.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1404.             }
  1405.             org.openspcoop2.core.config.GenericProperties policy = this.jaxbConfigDeserializer.readGenericProperties(xml);
  1406.             String key = ArchiveTokenPolicy.buildKey(policy.getTipo(), policy.getNome());
  1407.             if(archivio.getToken_retrieve_policies().containsKey(key)){
  1408.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di una policy di token retrieve con key ["+key+"]");
  1409.             }
  1410.             archivio.getToken_retrieve_policies().add(key,new ArchiveTokenPolicy(policy,idCorrelazione));
  1411.         }catch(Exception eDeserializer){
  1412.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1413.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (token-policy) non valida rispetto allo schema (ConfigurazionePdD): "
  1414.                     +eDeserializer.getMessage(),eDeserializer);
  1415.         }
  1416.     }
  1417.    
  1418.     public void readAttributeAuthority(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1419.         try{
  1420.             if(validationDocuments){
  1421.                 org.openspcoop2.core.config.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1422.             }
  1423.             org.openspcoop2.core.config.GenericProperties policy = this.jaxbConfigDeserializer.readGenericProperties(xml);
  1424.             String key = ArchiveAttributeAuthority.buildKey(policy.getTipo(), policy.getNome());
  1425.             if(archivio.getAttributeAuthorities().containsKey(key)){
  1426.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di una attribute authority con key ["+key+"]");
  1427.             }
  1428.             archivio.getAttributeAuthorities().add(key,new ArchiveAttributeAuthority(policy,idCorrelazione));
  1429.         }catch(Exception eDeserializer){
  1430.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1431.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (attribute authority) non valida rispetto allo schema (ConfigurazionePdD): "
  1432.                     +eDeserializer.getMessage(),eDeserializer);
  1433.         }
  1434.     }
  1435.    
  1436.     public void readPluginClasse(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1437.         try{
  1438.             if(validationDocuments){
  1439.                 org.openspcoop2.core.plugins.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1440.             }
  1441.             org.openspcoop2.core.plugins.Plugin plugin = this.jaxbPluginDeserializer.readPlugin(xml);
  1442.             String key = ArchivePluginClasse.buildKey(plugin.getTipoPlugin(), plugin.getTipo());
  1443.             if(archivio.getPlugin_classi().containsKey(key)){
  1444.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di un plugin con key ["+key+"]");
  1445.             }
  1446.             archivio.getPlugin_classi().add(key,new ArchivePluginClasse(plugin,idCorrelazione));
  1447.         }catch(Exception eDeserializer){
  1448.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1449.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (plugin-classe) non valida rispetto allo schema (Plugins): "
  1450.                     +eDeserializer.getMessage(),eDeserializer);
  1451.         }
  1452.     }
  1453.    
  1454.     public void readPluginArchivio(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1455.         try{
  1456.             if(validationDocuments){
  1457.                 org.openspcoop2.core.config.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1458.             }
  1459.             org.openspcoop2.core.config.RegistroPlugin plugin = this.jaxbConfigDeserializer.readRegistroPlugin(xml);
  1460.             String key = ArchivePluginArchivio.buildKey(plugin.getNome());
  1461.             if(archivio.getPlugin_archivi().containsKey(key)){
  1462.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di un archivio plugin con key ["+key+"]");
  1463.             }
  1464.             archivio.getPlugin_archivi().add(key,new ArchivePluginArchivio(plugin,idCorrelazione));
  1465.         }catch(Exception eDeserializer){
  1466.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1467.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (plugin-archivio) non valida rispetto allo schema (ConfigurazionePdD): "
  1468.                     +eDeserializer.getMessage(),eDeserializer);
  1469.         }
  1470.     }
  1471.    
  1472.     public void readUrlInvocazioneRegola(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1473.         try{
  1474.             if(validationDocuments){
  1475.                 org.openspcoop2.core.config.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1476.             }
  1477.             org.openspcoop2.core.config.ConfigurazioneUrlInvocazioneRegola regola = this.jaxbConfigDeserializer.readConfigurazioneUrlInvocazioneRegola(xml);
  1478.             String key = ArchiveUrlInvocazioneRegola.buildKey(regola.getNome());
  1479.             if(archivio.getConfigurazionePdD_urlInvocazione_regole().containsKey(key)){
  1480.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di una regola proxy pass con key ["+key+"]");
  1481.             }
  1482.             archivio.getConfigurazionePdD_urlInvocazione_regole().add(key,new ArchiveUrlInvocazioneRegola(regola,idCorrelazione));
  1483.         }catch(Exception eDeserializer){
  1484.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1485.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (regola proxy-pass) non valida rispetto allo schema (ConfigurazionePdD): "
  1486.                     +eDeserializer.getMessage(),eDeserializer);
  1487.         }
  1488.     }
  1489.    
  1490.     public void readUrlInvocazione(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments) throws ProtocolException{
  1491.         try{
  1492.             if(validationDocuments){
  1493.                 org.openspcoop2.core.config.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1494.             }
  1495.             org.openspcoop2.core.config.ConfigurazioneUrlInvocazione configurazioneUrlInvocazione = this.jaxbConfigDeserializer.readConfigurazioneUrlInvocazione(xml);
  1496.             if(archivio.getConfigurazionePdD_urlInvocazione()!=null){
  1497.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di una configurazione della url di invocazione");
  1498.             }
  1499.             archivio.setConfigurazionePdD_urlInvocazione(configurazioneUrlInvocazione);
  1500.         }catch(Exception eDeserializer){
  1501.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1502.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (configurazione url invocazione) non valida rispetto allo schema (ConfigurazionePdD): "
  1503.                     +eDeserializer.getMessage(),eDeserializer);
  1504.         }
  1505.     }
  1506.    
  1507.    
  1508.     public void readPortaDominio(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1509.         try{
  1510.             if(validationDocuments){
  1511.                 org.openspcoop2.core.registry.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1512.             }
  1513.             PortaDominio pdd = this.jaxbRegistryDeserializer.readPortaDominio(xml);
  1514.             String key = ArchivePdd.buildKey(pdd.getNome());
  1515.             if(archivio.getPdd().containsKey(key)){
  1516.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di una pdd con key ["+key+"]");
  1517.             }
  1518.             archivio.getPdd().add(key,new ArchivePdd(pdd,idCorrelazione));
  1519.         }catch(Exception eDeserializer){
  1520.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1521.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (porta-dominio) non valida rispetto allo schema (RegistroServizi): "
  1522.                     +eDeserializer.getMessage(),eDeserializer);
  1523.         }
  1524.     }
  1525.    
  1526.     public void readGruppo(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1527.         try{
  1528.             if(validationDocuments){
  1529.                 org.openspcoop2.core.registry.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1530.             }
  1531.             Gruppo gruppo = this.jaxbRegistryDeserializer.readGruppo(xml);
  1532.             String key = ArchiveGruppo.buildKey(gruppo.getNome());
  1533.             if(archivio.getGruppi().containsKey(key)){
  1534.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di un gruppo con key ["+key+"]");
  1535.             }
  1536.             archivio.getGruppi().add(key,new ArchiveGruppo(gruppo,idCorrelazione));
  1537.         }catch(Exception eDeserializer){
  1538.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1539.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (gruppo) non valida rispetto allo schema (RegistroServizi): "
  1540.                     +eDeserializer.getMessage(),eDeserializer);
  1541.         }
  1542.     }
  1543.    
  1544.     public void readRuolo(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1545.         try{
  1546.             if(validationDocuments){
  1547.                 org.openspcoop2.core.registry.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1548.             }
  1549.             Ruolo ruolo = this.jaxbRegistryDeserializer.readRuolo(xml);
  1550.             String key = ArchiveRuolo.buildKey(ruolo.getNome());
  1551.             if(archivio.getRuoli().containsKey(key)){
  1552.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di un ruolo con key ["+key+"]");
  1553.             }
  1554.             archivio.getRuoli().add(key,new ArchiveRuolo(ruolo,idCorrelazione));
  1555.         }catch(Exception eDeserializer){
  1556.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1557.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (ruolo) non valida rispetto allo schema (RegistroServizi): "
  1558.                     +eDeserializer.getMessage(),eDeserializer);
  1559.         }
  1560.     }
  1561.    
  1562.     public void readScope(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1563.         try{
  1564.             if(validationDocuments){
  1565.                 org.openspcoop2.core.registry.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1566.             }
  1567.             Scope scope = this.jaxbRegistryDeserializer.readScope(xml);
  1568.             String key = ArchiveScope.buildKey(scope.getNome());
  1569.             if(archivio.getScope().containsKey(key)){
  1570.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di uno scope con key ["+key+"]");
  1571.             }
  1572.             archivio.getScope().add(key,new ArchiveScope(scope,idCorrelazione));
  1573.         }catch(Exception eDeserializer){
  1574.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1575.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (scope) non valida rispetto allo schema (RegistroServizi): "
  1576.                     +eDeserializer.getMessage(),eDeserializer);
  1577.         }
  1578.     }
  1579.    
  1580.     public void readInformationMissing(Archive archivio,InputStream bin,byte[]xml,String entryName,boolean validationDocuments) throws ProtocolException{
  1581.         try{
  1582.            
  1583.             // verifica
  1584.             Openspcoop2 informationMissingOp2 = null;
  1585.             if(archivio.getInformationMissing()!=null){
  1586.                 informationMissingOp2 = archivio.getInformationMissing();
  1587.             }
  1588.            
  1589.             // conversione
  1590.             if(informationMissingOp2!=null){
  1591.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Una definizione xml di informationMissing e' presente piu' di una volta");
  1592.             }
  1593.             if(validationDocuments){
  1594.                 org.openspcoop2.protocol.information_missing.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1595.             }
  1596.             informationMissingOp2 = this.jaxbInformationMissingDeserializer.readOpenspcoop2(xml);

  1597.             // add
  1598.             archivio.setInformationMissing(informationMissingOp2);
  1599.            
  1600.         }catch(Exception eDeserializer){
  1601.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1602.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (informationMissing) non valida rispetto allo schema informationMissing.xsd: "
  1603.                     +eDeserializer.getMessage(),eDeserializer);
  1604.         }
  1605.     }
  1606.    
  1607.     public void readSoggetto(Archive archivio,InputStream bin,byte[]xml,String entryName,String tipoSoggetto,String nomeSoggetto,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1608.         boolean registro = false;
  1609.         String schema = null;
  1610.         if(RegistroServiziUtils.isRegistroServizi(xml, CostantiRegistroServizi.LOCAL_NAME_SOGGETTO)){
  1611.             registro = true;
  1612.             schema = "RegistroServizi";
  1613.         }
  1614.         else if(ConfigurazionePdDUtils.isConfigurazionePdD(xml, CostantiConfigurazione.LOCAL_NAME_SOGGETTO)){
  1615.             registro = false;
  1616.             schema = "ConfigurazionePdD";
  1617.         }
  1618.         else{
  1619.             throw new ProtocolException("Elemento ["+entryName+"] errato. Attesa una definizione del soggetto che contenga informazioni di registro (namespace: "+
  1620.                         CostantiRegistroServizi.TARGET_NAMESPACE+") o di configurazione ("+CostantiConfigurazione.TARGET_NAMESPACE+")");
  1621.         }
  1622.        
  1623.         try{
  1624.            
  1625.             // verifica
  1626.             if(tipoSoggetto==null || nomeSoggetto==null){
  1627.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Non è possibile fornire una definizione di soggetto all'interna di una directory che non definisce il tipo o il nome del soggetto");
  1628.             }
  1629.             org.openspcoop2.core.registry.Soggetto soggettoRegistroServizi = null;
  1630.             org.openspcoop2.core.config.Soggetto soggettoConfigurazione = null;
  1631.             String key = ArchiveSoggetto.buildKey(tipoSoggetto, nomeSoggetto);
  1632.             if(archivio.getSoggetti().containsKey(key)){
  1633.                 ArchiveSoggetto archiveSoggetto = archivio.getSoggetti().remove(key);
  1634.                 soggettoRegistroServizi = archiveSoggetto.getSoggettoRegistro();
  1635.                 soggettoConfigurazione = archiveSoggetto.getSoggettoConfigurazione();
  1636.             }
  1637.            
  1638.            
  1639.             // conversione
  1640.             if(registro){
  1641.                 if(soggettoRegistroServizi!=null){
  1642.                     throw new ProtocolException("Elemento ["+entryName+"] errato. Una definizione xml del soggetto con tipologia ("+schema+") e' presente piu' di una volta");
  1643.                 }
  1644.                 if(validationDocuments){
  1645.                     org.openspcoop2.core.registry.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1646.                 }
  1647.                 soggettoRegistroServizi = this.jaxbRegistryDeserializer.readSoggetto(xml);
  1648.                 if(!tipoSoggetto.equals(soggettoRegistroServizi.getTipo())){
  1649.                     throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml del soggetto ("+schema+") contiene un tipo ["+
  1650.                             soggettoRegistroServizi.getTipo()+"] differente da quello indicato ["+tipoSoggetto+"] nella directory che contiene la definizione");
  1651.                 }
  1652.                 if(!nomeSoggetto.equals(soggettoRegistroServizi.getNome())){
  1653.                     throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml del soggetto ("+schema+") contiene un nome ["+
  1654.                             soggettoRegistroServizi.getNome()+"] differente da quello indicato ["+nomeSoggetto+"] nella directory che contiene la definizione");
  1655.                 }
  1656.             }
  1657.             else {
  1658.                 if(soggettoConfigurazione!=null){
  1659.                     throw new ProtocolException("Elemento ["+entryName+"] errato. Una definizione xml del soggetto con tipologia ("+schema+") e' presente piu' di una volta");
  1660.                 }
  1661.                 if(validationDocuments){
  1662.                     org.openspcoop2.core.config.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1663.                 }
  1664.                 soggettoConfigurazione = this.jaxbConfigDeserializer.readSoggetto(xml);
  1665.                 if(!tipoSoggetto.equals(soggettoConfigurazione.getTipo())){
  1666.                     throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml del soggetto ("+schema+") contiene un tipo ["+
  1667.                             soggettoConfigurazione.getTipo()+"] differente da quello indicato ["+tipoSoggetto+"] nella directory che contiene la definizione");
  1668.                 }
  1669.                 if(!nomeSoggetto.equals(soggettoConfigurazione.getNome())){
  1670.                     throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml del soggetto ("+schema+") contiene un nome ["+
  1671.                             soggettoConfigurazione.getNome()+"] differente da quello indicato ["+nomeSoggetto+"] nella directory che contiene la definizione");
  1672.                 }
  1673.             }
  1674.            
  1675.             // add
  1676.             if(soggettoConfigurazione!=null && soggettoRegistroServizi!=null)
  1677.                 archivio.getSoggetti().add(key,new ArchiveSoggetto(soggettoConfigurazione, soggettoRegistroServizi, idCorrelazione));
  1678.             else if(soggettoConfigurazione!=null){
  1679.                 archivio.getSoggetti().add(key,new ArchiveSoggetto(soggettoConfigurazione, idCorrelazione));
  1680.             }
  1681.             else{
  1682.                 archivio.getSoggetti().add(key,new ArchiveSoggetto(soggettoRegistroServizi, idCorrelazione));
  1683.             }
  1684.            
  1685.         }catch(Exception eDeserializer){
  1686.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1687.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (soggetto) non valida rispetto allo schema ("+schema+"): "
  1688.                     +eDeserializer.getMessage(),eDeserializer);
  1689.         }
  1690.        
  1691.     }
  1692.    
  1693.     public ServizioApplicativo readServizioApplicativo(Archive archivio,InputStream bin,byte[]xml,String entryName,String tipoSoggetto,String nomeSoggetto,boolean validationDocuments,
  1694.             ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1695.         try{
  1696.             if(validationDocuments){
  1697.                 org.openspcoop2.core.config.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1698.             }
  1699.             ServizioApplicativo sa = this.jaxbConfigDeserializer.readServizioApplicativo(xml);
  1700.             sa.setTipoSoggettoProprietario(tipoSoggetto);
  1701.             sa.setNomeSoggettoProprietario(nomeSoggetto);
  1702.             String tipoSoggettoKey = (tipoSoggetto!=null ? tipoSoggetto : "" );
  1703.             String nomeSoggettoKey = (nomeSoggetto!=null ? nomeSoggetto : "" );
  1704.             String key = ArchiveServizioApplicativo.buildKey(tipoSoggettoKey, nomeSoggettoKey, sa.getNome());
  1705.             if(archivio.getServiziApplicativi().containsKey(key)){
  1706.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di un servizio applicativo con key ["+key+"]");
  1707.             }
  1708.             archivio.getServiziApplicativi().add(key,new ArchiveServizioApplicativo(sa,idCorrelazione,true));
  1709.             return sa;
  1710.         }catch(Exception eDeserializer){
  1711.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1712.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (servizio-applicativo) non valida rispetto allo schema (ConfigurazionePdD): "
  1713.                     +eDeserializer.getMessage(),eDeserializer);
  1714.         }
  1715.     }
  1716.     public void readProprietaServizioApplicativo(Archive archivio,byte[]content,String entryName, String tipoSoggetto, String nomeSoggetto, String nomeSA,
  1717.             String nomeFileSenzaServizioApplicativo, ArchiveVersion archiveVersion,
  1718.             Map<String, IdentificativoProprietaProtocollo> mapKeyProtocolProperties) throws ProtocolException {
  1719.         org.openspcoop2.core.config.ServizioApplicativo servizioApplicativo = null;
  1720.         String key = ArchiveServizioApplicativo.buildKey(tipoSoggetto, nomeSoggetto, nomeSA);
  1721.         if(archivio.getServiziApplicativi().containsKey(key)){
  1722.             servizioApplicativo = archivio.getServiziApplicativi().get(key).getServizioApplicativo();
  1723.         }
  1724.         else {
  1725.             throw new ProtocolException("Elemento ["+entryName+"] errato. Non risulta la definizione dell'applicativo ["+tipoSoggetto+"/"+nomeSoggetto+" "+nomeSA+"]");
  1726.         }
  1727.        
  1728.         List<org.openspcoop2.core.config.ProtocolProperty> listPP = new ArrayList<>();
  1729.         if(servizioApplicativo.sizeProtocolPropertyList()>0) {
  1730.             for (org.openspcoop2.core.config.ProtocolProperty protocolProperty : servizioApplicativo.getProtocolPropertyList()) {
  1731.                 if(protocolProperty.getTipoProprietario()==null) {
  1732.                     protocolProperty.setTipoProprietario(ProprietariProtocolProperty.SERVIZIO_APPLICATIVO.name());
  1733.                 }
  1734.                 listPP.add(protocolProperty);
  1735.             }
  1736.         }
  1737.        
  1738.         processProtocolPropertyConfig(nomeFileSenzaServizioApplicativo, archiveVersion, entryName, content,
  1739.                 ProprietarioProprietaProtocollo.SERVIZIO_APPLICATIVO,
  1740.                 tipoSoggetto, nomeSoggetto, nomeSA,
  1741.                 mapKeyProtocolProperties, listPP, null);
  1742.        
  1743.     }
  1744.    
  1745.     public PortaDelegata readPortaDelegata(Archive archivio,InputStream bin,byte[]xml,String entryName,String tipoSoggetto,String nomeSoggetto,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1746.         try{
  1747.             if(validationDocuments){
  1748.                 org.openspcoop2.core.config.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1749.             }
  1750.             PortaDelegata pd = this.jaxbConfigDeserializer.readPortaDelegata(xml);
  1751.            
  1752.             // backward compatibility
  1753.             if("openspcoop".equals(pd.getAutorizzazione())){
  1754.                 pd.setAutorizzazione(TipoAutorizzazione.AUTHENTICATED.getValue());
  1755.             }
  1756.            
  1757.             pd.setTipoSoggettoProprietario(tipoSoggetto);
  1758.             pd.setNomeSoggettoProprietario(nomeSoggetto);
  1759.             String nome = pd.getNome();
  1760.             String tipoSoggettoKey = (tipoSoggetto!=null ? tipoSoggetto : "" );
  1761.             String nomeSoggettoKey = (nomeSoggetto!=null ? nomeSoggetto : "" );
  1762.             String key = ArchivePortaDelegata.buildKey(tipoSoggettoKey, nomeSoggettoKey, nome);
  1763.             if(archivio.getPorteDelegate().containsKey(key)){
  1764.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di una porta con key ["+key+"]");
  1765.             }
  1766.             archivio.getPorteDelegate().add(key,new ArchivePortaDelegata(pd,idCorrelazione,true));
  1767.             return pd;
  1768.         }catch(Exception eDeserializer){
  1769.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1770.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (porta-delegata) non valida rispetto allo schema (ConfigurazionePdD): "
  1771.                     +eDeserializer.getMessage(),eDeserializer);
  1772.         }
  1773.     }
  1774.    
  1775.     public void readPortaDelegataExtended(PortaDelegata pd,InputStream bin,byte[]xml,String entryName,boolean validationDocuments,ExtendedInfoManager extendedInfoManager) throws ProtocolException{
  1776.         try{
  1777.             if(pd==null){
  1778.                 throw new ProtocolException("Non è possibile indicare una configurazione estesa senza indicare anche la definizione della porta delegata");
  1779.             }
  1780.             Object o = extendedInfoManager.newInstanceExtendedInfoPortaDelegata().deserialize(this.log, pd, xml);
  1781.             pd.addExtendedInfo(o);
  1782.         }catch(Exception eDeserializer){
  1783.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1784.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (porta-delegata-extended) non valida: "
  1785.                     +eDeserializer.getMessage(),eDeserializer);
  1786.         }
  1787.     }
  1788.    
  1789.     public PortaApplicativa readPortaApplicativa(Archive archivio,InputStream bin,byte[]xml,String entryName,String tipoSoggetto,String nomeSoggetto,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione) throws ProtocolException{
  1790.         try{
  1791.             if(validationDocuments){
  1792.                 org.openspcoop2.core.config.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1793.             }
  1794.             PortaApplicativa pa = this.jaxbConfigDeserializer.readPortaApplicativa(xml);
  1795.             pa.setTipoSoggettoProprietario(tipoSoggetto);
  1796.             pa.setNomeSoggettoProprietario(nomeSoggetto);
  1797.             String tipoSoggettoKey = (tipoSoggetto!=null ? tipoSoggetto : "" );
  1798.             String nomeSoggettoKey = (nomeSoggetto!=null ? nomeSoggetto : "" );
  1799.             String key = ArchivePortaApplicativa.buildKey(tipoSoggettoKey, nomeSoggettoKey, pa.getNome());
  1800.             if(archivio.getPorteApplicative().containsKey(key)){
  1801.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di una porta con key ["+key+"]");
  1802.             }
  1803.             archivio.getPorteApplicative().add(key,new ArchivePortaApplicativa(pa,idCorrelazione,true));
  1804.             return pa;
  1805.         }catch(Exception eDeserializer){
  1806.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1807.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (porta-applicativa) non valida rispetto allo schema (ConfigurazionePdD): "
  1808.                     +eDeserializer.getMessage(),eDeserializer);
  1809.         }
  1810.     }
  1811.    
  1812.     public void readPortaApplicativaExtended(PortaApplicativa pa,InputStream bin,byte[]xml,String entryName,boolean validationDocuments,ExtendedInfoManager extendedInfoManager) throws ProtocolException{
  1813.         try{
  1814.             if(pa==null){
  1815.                 throw new ProtocolException("Non è possibile indicare una configurazione estesa senza indicare anche la definizione della porta applicativa");
  1816.             }
  1817.             Object o = extendedInfoManager.newInstanceExtendedInfoPortaApplicativa().deserialize(this.log, pa, xml);
  1818.             pa.addExtendedInfo(o);
  1819.         }catch(Exception eDeserializer){
  1820.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1821.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (porta-applicativa-extended) non valida: "
  1822.                     +eDeserializer.getMessage(),eDeserializer);
  1823.         }
  1824.     }
  1825.    
  1826.     public static final String USE_VERSION_XML_BEAN = "USE_VERSION_XML_BEAN";
  1827.    
  1828.     public void readAccordoServizioParteComune(Archive archivio,InputStream bin,byte[]xml,String entryName,String tipoSoggetto,String nomeSoggetto,
  1829.             String nomeFileSenzaAccordo,String nomeAccordo,String versioneAccordo, boolean servizioComposto,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione,
  1830.             ArchiveVersion archiveVersion,
  1831.             Map<String, IdentificativoDocumento> mapKeyDocumenti,
  1832.             Map<String, IdentificativoProprietaProtocollo> mapKeyProtocolProperties) throws ProtocolException{
  1833.        
  1834.         Integer versioneAccordoInt = null;
  1835.         try{
  1836.             if(versioneAccordo!=null && USE_VERSION_XML_BEAN.equals(versioneAccordo)==false){
  1837.                 versioneAccordoInt = Integer.parseInt(versioneAccordo);
  1838.             }
  1839.         }catch(Exception e){
  1840.             throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) nel path contiene una versione errata: "+e.getMessage());
  1841.         }
  1842.        
  1843.         String key = null;
  1844.         String tipoSoggettoKey = (tipoSoggetto!=null ? tipoSoggetto : "" );
  1845.         String nomeSoggettoKey = (nomeSoggetto!=null ? nomeSoggetto : "" );
  1846.         Integer versioneKey = (versioneAccordoInt!=null ? versioneAccordoInt : -1 );
  1847.         if(servizioComposto){
  1848.             key = ArchiveAccordoServizioComposto.buildKey(tipoSoggettoKey, nomeSoggettoKey, nomeAccordo, versioneKey);
  1849.         }else{
  1850.             key = ArchiveAccordoServizioParteComune.buildKey(tipoSoggettoKey, nomeSoggettoKey, nomeAccordo, versioneKey);
  1851.         }
  1852.        
  1853.         if(nomeFileSenzaAccordo.contains((File.separatorChar+""))==false){
  1854.            
  1855.             // definizione dell'accordo
  1856.             try{
  1857.                 if(validationDocuments){
  1858.                     org.openspcoop2.core.registry.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  1859.                 }
  1860.                 AccordoServizioParteComune aspc = this.jaxbRegistryDeserializer.readAccordoServizioParteComune(xml);
  1861.                
  1862.                 // soggetto referente
  1863.                 if(aspc.getSoggettoReferente()==null){
  1864.                     aspc.setSoggettoReferente(new IdSoggetto());
  1865.                 }
  1866.                 if(tipoSoggetto!=null){
  1867.                     if(aspc.getSoggettoReferente().getTipo()!=null && !aspc.getSoggettoReferente().getTipo().equals(tipoSoggetto)){
  1868.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene un soggetto referente con tipo ["+
  1869.                                 aspc.getSoggettoReferente().getTipo()+"] differente da quello indicato ["+tipoSoggetto+"] nella directory che contiene la definizione");
  1870.                     }
  1871.                 }
  1872.                 if(nomeSoggetto!=null){
  1873.                     if(aspc.getSoggettoReferente().getNome()!=null && !aspc.getSoggettoReferente().getNome().equals(nomeSoggetto)){
  1874.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene un soggetto referente con nome ["+
  1875.                                 aspc.getSoggettoReferente().getNome()+"] differente da quello indicato ["+nomeSoggetto+"] nella directory che contiene la definizione");
  1876.                     }
  1877.                 }
  1878.                 aspc.getSoggettoReferente().setTipo(tipoSoggetto);
  1879.                 aspc.getSoggettoReferente().setNome(nomeSoggetto);

  1880.                 // nome e versione check quello indicato nell'accordo rispetto a quello indicato
  1881.                 // - nome della directory (old version)
  1882.                 // - file idAccordo (new version)
  1883.                 if(ArchiveVersion.V_UNDEFINED.equals(archiveVersion)){
  1884.                     String convertName = ZIPUtils.oldMethod_convertCharNonPermessiQualsiasiSistemaOperativo(aspc.getNome(),false);
  1885.                     if(!convertName.equals(nomeAccordo)){
  1886.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene un nome ["+
  1887.                                 aspc.getNome()+"] (fileSystemName:"+convertName+") differente da quello indicato ["+nomeAccordo+"] nella directory che contiene la definizione");
  1888.                     }
  1889.                     if(USE_VERSION_XML_BEAN.equals(versioneAccordo)==false){
  1890.                         if(versioneAccordoInt!=null){
  1891.                             if(aspc.getVersione()!=null){
  1892.                                 if(aspc.getVersione().intValue()!= versioneAccordoInt.intValue()){
  1893.                                     throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene una versione ["+
  1894.                                             aspc.getVersione()+"] (fileSystemName:"+versioneAccordo+") differente da quella indicato ["+versioneAccordoInt+"] nella directory che contiene la definizione");
  1895.                                 }
  1896.                             }
  1897.                             aspc.setVersione(versioneAccordoInt);
  1898.                         }
  1899.                     }
  1900.                 }
  1901.                 else{
  1902.                     if(!aspc.getNome().equals(nomeAccordo)){
  1903.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene un nome ["+
  1904.                                 aspc.getNome()+"] differente da quello indicato ["+nomeAccordo+"] nel file ["+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME+"]");
  1905.                     }
  1906.                     if(USE_VERSION_XML_BEAN.equals(versioneAccordo)==false){
  1907.                         if(versioneAccordoInt!=null){
  1908.                             if(aspc.getVersione()!=null && aspc.getVersione().intValue()!= versioneAccordoInt.intValue()){
  1909.                                 throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene una versione ["+
  1910.                                             aspc.getVersione()+"] differente da quella indicata ["+versioneAccordoInt+"] nel file ["+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME+"]");
  1911.                             }
  1912.                         }
  1913.                         aspc.setVersione(versioneAccordoInt);
  1914.                     }
  1915.                 }
  1916.                
  1917.                 // servizio composto
  1918.                 if(servizioComposto){
  1919.                     if(aspc.getServizioComposto()==null){
  1920.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) non contiene le informazioni obbligatorie in un servizio composto");
  1921.                     }
  1922.                     if(archivio.getAccordiServizioComposto().containsKey(key)){
  1923.                         throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di un accordo con key ["+key+"]");
  1924.                     }
  1925.                     archivio.getAccordiServizioComposto().add(key,new ArchiveAccordoServizioComposto(aspc,idCorrelazione,true));
  1926.                 }
  1927.                 else{
  1928.                     if(aspc.getServizioComposto()!=null){
  1929.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene le informazioni per un servizio composto, ma l'accordo e' stato definito tra gli accordi di servizio parte comune");
  1930.                     }
  1931.                     if(archivio.getAccordiServizioParteComune().containsKey(key)){
  1932.                         throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di un accordo con key ["+key+"]");
  1933.                     }
  1934.                     archivio.getAccordiServizioParteComune().add(key,new ArchiveAccordoServizioParteComune(aspc,idCorrelazione,true));
  1935.                 }          

  1936.             }catch(Exception eDeserializer){
  1937.                 String xmlString = this.toStringXmlElementForErrorMessage(xml);
  1938.                 throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (accordo-servizio-parte-comune) non valida rispetto allo schema (RegistroServizi): "
  1939.                         +eDeserializer.getMessage(),eDeserializer);
  1940.             }
  1941.            
  1942.         }
  1943.         else{
  1944.            
  1945.             // recupero archivio precedentemente letto
  1946.             AccordoServizioParteComune as = null;
  1947.             if(servizioComposto){
  1948.                 if(archivio.getAccordiServizioComposto().containsKey(key)==false){
  1949.                     throw new ProtocolException("Elemento ["+entryName+"] non atteso. Non è possibile fornire dei documenti di un accordo senza fornire la definizione xml dell'accordo");
  1950.                 }
  1951.                 as = archivio.getAccordiServizioComposto().get(key).getAccordoServizioParteComune();
  1952.             }else{
  1953.                 if(archivio.getAccordiServizioParteComune().containsKey(key)==false){
  1954.                     throw new ProtocolException("Elemento ["+entryName+"] non atteso. Non è possibile fornire dei documenti di un accordo senza fornire la definizione xml dell'accordo");
  1955.                 }
  1956.                 as = archivio.getAccordiServizioParteComune().get(key).getAccordoServizioParteComune();
  1957.             }
  1958.            
  1959.             // wsdl
  1960.             if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_WSDL+File.separatorChar)){
  1961.                
  1962.                 if(nomeFileSenzaAccordo.equalsIgnoreCase(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_WSDL+File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_INTERFACCIA_DEFINITORIA)){
  1963.                     as.setByteWsdlDefinitorio(xml);
  1964.                 }
  1965.                 else if(nomeFileSenzaAccordo.equalsIgnoreCase(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_WSDL+File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_CONCETTUALE_WSDL)){
  1966.                     as.setByteWsdlConcettuale(xml);
  1967.                 }
  1968.                 else if(nomeFileSenzaAccordo.equalsIgnoreCase(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_WSDL+File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_LOGICO_EROGATORE_WSDL)){
  1969.                     as.setByteWsdlLogicoErogatore(xml);
  1970.                 }
  1971.                 else if(nomeFileSenzaAccordo.equalsIgnoreCase(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_WSDL+File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_LOGICO_FRUITORE_WSDL)){
  1972.                     as.setByteWsdlLogicoFruitore(xml);
  1973.                 }
  1974.                
  1975.             }
  1976.            
  1977.             // specifica conversazioni
  1978.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_CONVERSAZIONI+File.separatorChar)){
  1979.                
  1980.                 if(nomeFileSenzaAccordo.equalsIgnoreCase(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_WSDL+File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_SPECIFICA_CONVERSIONE_CONCETTUALE)){
  1981.                     as.setByteSpecificaConversazioneConcettuale(xml);
  1982.                 }
  1983.                 else if(nomeFileSenzaAccordo.equalsIgnoreCase(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_WSDL+File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_SPECIFICA_CONVERSIONE_LOGICA_EROGATORE)){
  1984.                     as.setByteSpecificaConversazioneErogatore(xml);
  1985.                 }
  1986.                 else if(nomeFileSenzaAccordo.equalsIgnoreCase(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_WSDL+File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_SPECIFICA_CONVERSIONE_LOGICA_FRUITORE)){
  1987.                     as.setByteSpecificaConversazioneFruitore(xml);
  1988.                 }
  1989.                
  1990.             }
  1991.            
  1992.             // allegati
  1993.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_ALLEGATI+File.separatorChar)){
  1994.                
  1995.                 processDocument(nomeFileSenzaAccordo, Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_ALLEGATI, archiveVersion, entryName, xml,
  1996.                         tipoSoggetto, nomeSoggetto, nomeAccordo, versioneAccordo, mapKeyDocumenti, as.getAllegatoList());
  1997.                
  1998.             }
  1999.            
  2000.             // specificheSemiformali
  2001.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_SEMIFORMALI+File.separatorChar)){
  2002.                
  2003.                 processDocument(nomeFileSenzaAccordo, Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_SEMIFORMALI, archiveVersion, entryName, xml,
  2004.                         tipoSoggetto, nomeSoggetto, nomeAccordo, versioneAccordo, mapKeyDocumenti, as.getSpecificaSemiformaleList());
  2005.                
  2006.             }
  2007.            
  2008.             // specificheCoordinamento
  2009.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_COORDINAMENTO+File.separatorChar)){
  2010.                
  2011.                 if(servizioComposto==false){
  2012.                     throw new ProtocolException("Elemento ["+entryName+"] non atteso. Non è possibile fornire dei documenti di specifica di coordinamento per un accordo non registrato come servizio composto");
  2013.                 }
  2014.                
  2015.                 processDocument(nomeFileSenzaAccordo, Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_COORDINAMENTO, archiveVersion, entryName, xml,
  2016.                         tipoSoggetto, nomeSoggetto, nomeAccordo, versioneAccordo, mapKeyDocumenti, as.getServizioComposto().getSpecificaCoordinamentoList());
  2017.                
  2018.             }
  2019.            
  2020.             // protocolProperties
  2021.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_PROTOCOL_PROPERTIES+File.separatorChar)){

  2022.                 List<ProtocolProperty> listPP = new ArrayList<>();
  2023.                 HashMap<String,Long> mapIdToLong = new HashMap<>();        
  2024.                 _updateListProtocolProperties(as, listPP, mapIdToLong);
  2025.                 processProtocolProperty(nomeFileSenzaAccordo, archiveVersion, entryName, xml,
  2026.                         ProprietarioProprietaProtocollo.ACCORDO_SERVIZIO_PARTE_COMUNE,
  2027.                         tipoSoggetto, nomeSoggetto, nomeAccordo, versioneAccordo,
  2028.                         null, null,
  2029.                         mapKeyProtocolProperties, listPP, mapIdToLong);
  2030.                
  2031.             }
  2032.         }
  2033.        
  2034.     }
  2035.    
  2036.     private void _updateListProtocolProperties(AccordoServizioParteComune as,
  2037.             List<ProtocolProperty> listPP, HashMap<String,Long> mapIdToLong) {
  2038.         long idLongForMap = 1;
  2039.         if(as.sizeProtocolPropertyList()>0) {
  2040.             for (ProtocolProperty protocolProperty : as.getProtocolPropertyList()) {
  2041.                 if(protocolProperty.getTipoProprietario()==null) {
  2042.                     protocolProperty.setTipoProprietario(ProprietariProtocolProperty.ACCORDO_SERVIZIO_PARTE_COMUNE.name());
  2043.                 }
  2044.                 listPP.add(protocolProperty);
  2045.             }
  2046.         }
  2047.         if(as.sizeAzioneList()>0) {
  2048.             for (Azione az : as.getAzioneList()) {
  2049.                 if(az.sizeProtocolPropertyList()>0) {
  2050.                     String key = buildKeyPPAccordoParteComuneItem(ProprietariProtocolProperty.AZIONE_ACCORDO, az.getNome());
  2051.                     Long idLong = idLongForMap++;
  2052.                     mapIdToLong.put(key,idLong);
  2053.                     for (ProtocolProperty protocolProperty : az.getProtocolPropertyList()) {
  2054.                         if(protocolProperty.getTipoProprietario()==null) {
  2055.                             protocolProperty.setTipoProprietario(ProprietariProtocolProperty.AZIONE_ACCORDO.name());
  2056.                         }
  2057.                         protocolProperty.setIdProprietario(idLong);
  2058.                         listPP.add(protocolProperty);
  2059.                     }
  2060.                 }
  2061.             }
  2062.         }
  2063.         if(as.sizePortTypeList()>0) {
  2064.             for (PortType pt : as.getPortTypeList()) {
  2065.                 if(pt.sizeProtocolPropertyList()>0) {
  2066.                     String key = buildKeyPPAccordoParteComuneItem(ProprietariProtocolProperty.PORT_TYPE, pt.getNome());
  2067.                     Long idLong = idLongForMap++;
  2068.                     mapIdToLong.put(key,idLong);
  2069.                     for (ProtocolProperty protocolProperty : pt.getProtocolPropertyList()) {
  2070.                         if(protocolProperty.getTipoProprietario()==null) {
  2071.                             protocolProperty.setTipoProprietario(ProprietariProtocolProperty.PORT_TYPE.name());
  2072.                         }
  2073.                         protocolProperty.setIdProprietario(idLong);
  2074.                         listPP.add(protocolProperty);
  2075.                     }
  2076.                 }
  2077.                 if(pt.sizeAzioneList()>0) {
  2078.                     for (Operation op : pt.getAzioneList()) {
  2079.                         if(op.sizeProtocolPropertyList()>0) {
  2080.                             String key = buildKeyPPAccordoParteComuneItem(ProprietariProtocolProperty.OPERATION, op.getNome());
  2081.                             Long idLong = idLongForMap++;
  2082.                             mapIdToLong.put(key,idLong);
  2083.                             for (ProtocolProperty protocolProperty : op.getProtocolPropertyList()) {
  2084.                                 if(protocolProperty.getTipoProprietario()==null) {
  2085.                                     protocolProperty.setTipoProprietario(ProprietariProtocolProperty.OPERATION.name());
  2086.                                 }
  2087.                                 protocolProperty.setIdProprietario(idLong);
  2088.                                 listPP.add(protocolProperty);
  2089.                             }
  2090.                         }
  2091.                     }
  2092.                 }
  2093.             }
  2094.         }
  2095.         if(as.sizeResourceList()>0) {
  2096.             for (Resource resource : as.getResourceList()) {
  2097.                 if(resource.sizeProtocolPropertyList()>0) {
  2098.                     String key = buildKeyPPAccordoParteComuneItem(ProprietariProtocolProperty.RESOURCE, resource.getNome());
  2099.                     Long idLong = idLongForMap++;
  2100.                     mapIdToLong.put(key,idLong);
  2101.                     for (ProtocolProperty protocolProperty : resource.getProtocolPropertyList()) {
  2102.                         if(protocolProperty.getTipoProprietario()==null) {
  2103.                             protocolProperty.setTipoProprietario(ProprietariProtocolProperty.RESOURCE.name());
  2104.                         }
  2105.                         protocolProperty.setIdProprietario(idLong);
  2106.                         listPP.add(protocolProperty);
  2107.                     }
  2108.                 }
  2109.             }
  2110.         }

  2111.     }

  2112.     public void readAccordoServizioParteSpecifica(Archive archivio,InputStream bin,byte[]xml,String entryName,String tipoSoggetto,String nomeSoggetto,
  2113.             String nomeFileSenzaAccordo,String tipoServizio,String nomeServizio,String versioneServizio,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione,
  2114.             ArchiveVersion archiveVersion,
  2115.             Map<String, IdentificativoDocumento> mapKeyDocumenti,
  2116.             Map<String, IdentificativoProprietaProtocollo> mapKeyProtocolProperties,
  2117.             Map<String, IDSoggetto> mapKeyFruitori) throws ProtocolException{
  2118.        
  2119.         Integer versioneServizioInt = null;
  2120.         try{
  2121.             if(versioneServizio!=null && USE_VERSION_XML_BEAN.equals(versioneServizio)==false){
  2122.                 versioneServizioInt = Integer.parseInt(versioneServizio);
  2123.             }
  2124.         }catch(Exception e){
  2125.             throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) nel path contiene una versione errata: "+e.getMessage());
  2126.         }
  2127.        
  2128.         String tipoSoggettoKey = (tipoSoggetto!=null ? tipoSoggetto : "" );
  2129.         String nomeSoggettoKey = (nomeSoggetto!=null ? nomeSoggetto : "" );
  2130.         Integer versioneKey = (versioneServizioInt!=null ? versioneServizioInt : -1 );
  2131.         String key = ArchiveAccordoServizioParteSpecifica.buildKey(tipoSoggettoKey, nomeSoggettoKey, tipoServizio, nomeServizio, versioneKey);
  2132.        
  2133.         if(!nomeFileSenzaAccordo.contains((File.separatorChar+""))){
  2134.            
  2135.             // definizione dell'accordo
  2136.             try{
  2137.                 if(validationDocuments){
  2138.                     org.openspcoop2.core.registry.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  2139.                 }
  2140.                 AccordoServizioParteSpecifica asps = this.jaxbRegistryDeserializer.readAccordoServizioParteSpecifica(xml);
  2141.                
  2142.                 // soggetto erogatore
  2143.                 asps.setTipoSoggettoErogatore(tipoSoggetto);
  2144.                 asps.setNomeSoggettoErogatore(nomeSoggetto);
  2145.                
  2146.                 // nome e versione check quello indicato nell'accordo rispetto a quello indicato
  2147.                 // - nome della directory (old version)
  2148.                 // - file idAccordo (new version)
  2149.                 if(ArchiveVersion.V_UNDEFINED.equals(archiveVersion)){              
  2150.                     String convertName = ZIPUtils.oldMethod_convertCharNonPermessiQualsiasiSistemaOperativo(asps.getNome(),false);
  2151.                     if(!convertName.equals(nomeServizio)){
  2152.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene un nome ["+
  2153.                                 asps.getNome()+"] (fileSystemName:"+convertName+") differente da quello indicato ["+nomeServizio+"] nella directory che contiene la definizione");
  2154.                     }
  2155.                     String convertTipo = ZIPUtils.oldMethod_convertCharNonPermessiQualsiasiSistemaOperativo(asps.getTipo(),false);
  2156.                     if(!convertTipo.equals(tipoServizio)){
  2157.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene un tipo ["+
  2158.                                 asps.getTipo()+"] (fileSystemName:"+convertTipo+") differente da quello indicato ["+tipoServizio+"] nella directory che contiene la definizione");
  2159.                     }
  2160.                     if(USE_VERSION_XML_BEAN.equals(versioneServizio)==false){
  2161.                         if(versioneServizioInt!=null){
  2162.                             if(asps.getVersione()!=null){
  2163.                                 if(asps.getVersione().intValue()!= versioneServizioInt.intValue()){
  2164.                                     throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene una versione ["+
  2165.                                             asps.getVersione()+"] (fileSystemName:"+versioneServizio+") differente da quella indicato ["+versioneServizioInt+"] nella directory che contiene la definizione");
  2166.                                 }
  2167.                             }
  2168.                             asps.setVersione(versioneServizioInt);
  2169.                         }
  2170.                     }
  2171.                 }
  2172.                 else{
  2173.                     if(!asps.getNome().equals(nomeServizio)){
  2174.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene un nome ["+
  2175.                                 asps.getNome()+"] differente da quello indicato ["+nomeServizio+"] nel file ["+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME+"]");
  2176.                     }
  2177.                     if(!asps.getTipo().equals(tipoServizio)){
  2178.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene un tipo ["+
  2179.                                 asps.getNome()+"] differente da quello indicato ["+tipoServizio+"] nel file ["+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME+"]");
  2180.                     }
  2181.                     if(USE_VERSION_XML_BEAN.equals(versioneServizio)==false){
  2182.                         if(versioneServizioInt!=null){
  2183.                             if(asps.getVersione()!=null && asps.getVersione().intValue()!= versioneServizioInt.intValue()){
  2184.                                 throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene una versione ["+
  2185.                                         asps.getVersione()+"] differente da quella indicata ["+versioneServizio+"] nel file ["+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME+"]");
  2186.                             }
  2187.                         }
  2188.                         asps.setVersione(versioneServizioInt);
  2189.                     }
  2190.                 }
  2191.                    
  2192.                 // check fruizioni
  2193.                 if(asps.sizeFruitoreList()>0){
  2194.                     throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) non deve contenere fruizioni (eventuali fruizioni devono essere configurate nella struttura apposita)");
  2195.                 }
  2196.                
  2197.                 // add
  2198.                 if(archivio.getAccordiServizioParteSpecifica().containsKey(key)){
  2199.                     throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di un accordo con key ["+key+"]");
  2200.                 }
  2201.                 archivio.getAccordiServizioParteSpecifica().add(key,new ArchiveAccordoServizioParteSpecifica(asps,idCorrelazione,true));
  2202.    
  2203.             }catch(Exception eDeserializer){
  2204.                 String xmlString = this.toStringXmlElementForErrorMessage(xml);
  2205.                 throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (accordo-servizio-parte-specifica) non valida rispetto allo schema (RegistroServizi): "
  2206.                         +eDeserializer.getMessage(),eDeserializer);
  2207.             }
  2208.            
  2209.         }
  2210.         else{
  2211.            
  2212.             // recupero archivio precedentemente letto
  2213.             ArchiveAccordoServizioParteSpecifica archiveASPS = null;
  2214.             AccordoServizioParteSpecifica as = null;
  2215.             if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_DIR+File.separatorChar)==false){
  2216.                 if(archivio.getAccordiServizioParteSpecifica().containsKey(key)==false){
  2217.                     throw new ProtocolException("Elemento ["+entryName+"] non atteso. Non è possibile fornire dei documenti di un accordo senza fornire la definizione xml dell'accordo");
  2218.                 }
  2219.                 archiveASPS = archivio.getAccordiServizioParteSpecifica().get(key);
  2220.                 as = archiveASPS.getAccordoServizioParteSpecifica();
  2221.             }
  2222.            
  2223.             // mapping PA
  2224.             if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_MAPPING+File.separatorChar) &&
  2225.                     nomeFileSenzaAccordo.endsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_SERVIZIO_PARTE_SPECIFICA_MAPPING_PA_SUFFIX)){
  2226.                 readAccordoServizioParteSpecifica_PortaApplicativaAssociata(archiveASPS, bin, xml, entryName);
  2227.             }
  2228.            
  2229.             // wsdl
  2230.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_WSDL+File.separatorChar)){
  2231.                
  2232.                 if(as!=null) {
  2233.                     if(nomeFileSenzaAccordo.equalsIgnoreCase(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_WSDL+File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_IMPLEMENTATIVO_EROGATORE_WSDL)){
  2234.                         as.setByteWsdlImplementativoErogatore(xml);
  2235.                     }
  2236.                     else if(nomeFileSenzaAccordo.equalsIgnoreCase(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_WSDL+File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_IMPLEMENTATIVO_FRUITORE_WSDL)){
  2237.                         as.setByteWsdlImplementativoFruitore(xml);
  2238.                     }
  2239.                 }
  2240.                
  2241.             }
  2242.            
  2243.             // allegati
  2244.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_ALLEGATI+File.separatorChar)){
  2245.                
  2246.                 if(as!=null) {
  2247.                     processDocument(nomeFileSenzaAccordo, Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_ALLEGATI, archiveVersion, entryName, xml,
  2248.                             tipoSoggetto, nomeSoggetto, tipoServizio, nomeServizio, versioneServizio, mapKeyDocumenti, as.getAllegatoList());
  2249.                 }
  2250.                
  2251.             }
  2252.            
  2253.             // specificheSemiformali
  2254.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_SEMIFORMALI+File.separatorChar)){
  2255.                
  2256.                 if(as!=null) {
  2257.                     processDocument(nomeFileSenzaAccordo, Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_SEMIFORMALI, archiveVersion, entryName, xml,
  2258.                             tipoSoggetto, nomeSoggetto, tipoServizio, nomeServizio, versioneServizio, mapKeyDocumenti, as.getSpecificaSemiformaleList());
  2259.                 }
  2260.                
  2261.             }
  2262.            
  2263.             // specificheLivelliServizio
  2264.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_LIVELLI_SERVIZIO+File.separatorChar)){
  2265.                
  2266.                 if(as!=null) {
  2267.                     processDocument(nomeFileSenzaAccordo, Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_LIVELLI_SERVIZIO, archiveVersion, entryName, xml,
  2268.                             tipoSoggetto, nomeSoggetto, tipoServizio, nomeServizio, versioneServizio, mapKeyDocumenti, as.getSpecificaLivelloServizioList());
  2269.                 }
  2270.                
  2271.             }
  2272.            
  2273.             // specificheSicurezza
  2274.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_SICUREZZA+File.separatorChar)){
  2275.                
  2276.                 if(as!=null) {
  2277.                     processDocument(nomeFileSenzaAccordo, Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_SICUREZZA, archiveVersion, entryName, xml,
  2278.                             tipoSoggetto, nomeSoggetto, tipoServizio, nomeServizio, versioneServizio, mapKeyDocumenti, as.getSpecificaSicurezzaList());
  2279.                 }
  2280.                
  2281.             }
  2282.            
  2283.             // protocolProperties
  2284.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_PROTOCOL_PROPERTIES+File.separatorChar)){

  2285.                 List<ProtocolProperty> listPP = new ArrayList<>();
  2286.                 if(as!=null && as.sizeProtocolPropertyList()>0) {
  2287.                     for (ProtocolProperty protocolProperty : as.getProtocolPropertyList()) {
  2288.                         if(protocolProperty.getTipoProprietario()==null) {
  2289.                             protocolProperty.setTipoProprietario(ProprietariProtocolProperty.ACCORDO_SERVIZIO_PARTE_SPECIFICA.name());
  2290.                         }
  2291.                         listPP.add(protocolProperty);
  2292.                     }
  2293.                 }
  2294.                 processProtocolProperty(nomeFileSenzaAccordo, archiveVersion, entryName, xml,
  2295.                         ProprietarioProprietaProtocollo.ACCORDO_SERVIZIO_PARTE_SPECIFICA,
  2296.                         tipoSoggetto, nomeSoggetto, tipoServizio+"/"+nomeServizio, versioneServizio,
  2297.                         null, null,
  2298.                         mapKeyProtocolProperties, listPP, null);
  2299.                
  2300.             }
  2301.            
  2302.             // fruitori (politiche di sicurezza)
  2303.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_DIR+File.separatorChar) &&
  2304.                     nomeFileSenzaAccordo.endsWith(Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_SERVIZI_APPLICATIVI_AUTORIZZATI)){
  2305.                
  2306.                 // NOP per backward compatibility
  2307.             }
  2308.            
  2309.             // fruitori (Mapping Fruitore - PortaDelegata)
  2310.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_DIR+File.separatorChar) &&
  2311.                     nomeFileSenzaAccordo.endsWith(Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_MAPPING_PD_SUFFIX)){
  2312.                
  2313.                 this.readAccordoServizioParteSpecifica_Fruitore_PortaDelegataAssociata(archivio, bin, xml, entryName,
  2314.                         nomeFileSenzaAccordo,
  2315.                         tipoSoggetto, nomeSoggetto, tipoServizio, nomeServizio, versioneServizio,
  2316.                         validationDocuments, idCorrelazione,
  2317.                         mapKeyFruitori);
  2318.             }
  2319.            
  2320.             // fruitori
  2321.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_DIR+File.separatorChar)){
  2322.                    
  2323.                 this.readAccordoServizioParteSpecifica_Fruitore(archivio, bin, xml, entryName,
  2324.                         nomeFileSenzaAccordo.substring((Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_DIR+File.separatorChar).length()),
  2325.                         tipoSoggetto, nomeSoggetto, tipoServizio, nomeServizio, versioneServizio,
  2326.                         validationDocuments, idCorrelazione,
  2327.                         archiveVersion,
  2328.                         mapKeyProtocolProperties,
  2329.                         mapKeyFruitori);
  2330.                
  2331.             }
  2332.            
  2333.         }
  2334.        
  2335.     }
  2336.    
  2337.     public void readAccordoServizioParteSpecifica_PortaApplicativaAssociata(ArchiveAccordoServizioParteSpecifica archiveASPS,InputStream bin,byte[]xml,String entryName) throws ProtocolException{
  2338.        
  2339.         // *** leggo porta applicativa associata ****
  2340.        
  2341.         try{
  2342.             if(archiveASPS==null){
  2343.                 throw new ProtocolException("Elemento ["+entryName+"] non atteso. Non è possibile fornire il mapping con la PA senza fornire la definizione xml dell'accordo di servizio parte specifica");
  2344.             }
  2345.            
  2346.             String idLine = this.readLineId(xml);
  2347.             if(idLine==null || "".equals(idLine)){
  2348.                 throw new ProtocolException("id non contiene valori");
  2349.             }
  2350.             if(idLine.endsWith("\n")) {
  2351.                 idLine = idLine.substring(0, idLine.length()-1);
  2352.             }
  2353.             String [] tmp = idLine.split(" ");
  2354.             if(tmp.length<3) {
  2355.                 throw new ProtocolException("Attesi almeno tre valori separati da spazio (nomeRegola nomePorta isDefault [descrizione])");
  2356.             }
  2357.             String nomeRegola = tmp[0];
  2358.             String nomePorta = tmp[1];
  2359.             boolean isDefault = false;
  2360.             try {
  2361.                 isDefault = Boolean.parseBoolean(tmp[2]);
  2362.             }catch(Exception e) {
  2363.                 throw new ProtocolException("Attesi tre valori separati da spazio (nomeRegola nomePorta isDefault) in cui l'ultimo valore di tipo booleano: "+e.getMessage(),e);
  2364.             }
  2365.             String descrizione = null;
  2366.             if(tmp.length>3) {
  2367.                 String primeTreInfo = nomeRegola +" "+nomePorta+" "+isDefault+" ";
  2368.                 descrizione = idLine.substring(primeTreInfo.length());
  2369.             }
  2370.            
  2371.             MappingErogazionePortaApplicativa mapping = new MappingErogazionePortaApplicativa();
  2372.             mapping.setNome(nomeRegola);
  2373.             mapping.setIdServizio(IDServizioFactory.getInstance().getIDServizioFromAccordo(archiveASPS.getAccordoServizioParteSpecifica()));
  2374.             IDPortaApplicativa idPA = new IDPortaApplicativa();
  2375.             idPA.setNome(nomePorta);
  2376.             mapping.setIdPortaApplicativa(idPA);
  2377.             mapping.setDefault(isDefault);
  2378.             mapping.setDescrizione(descrizione);
  2379.            
  2380.             if(archiveASPS.getMappingPorteApplicativeAssociate()==null) {
  2381.                 archiveASPS.setMappingPorteApplicativeAssociate(new ArrayList<>());
  2382.             }
  2383.             archiveASPS.getMappingPorteApplicativeAssociate().add(mapping);
  2384.            
  2385.         }catch(Exception eDeserializer){
  2386.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  2387.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura id (mapping asps-pa) non valida: "
  2388.                     +eDeserializer.getMessage(),eDeserializer);
  2389.         }
  2390.     }
  2391.    
  2392.     public void readAccordoServizioParteSpecifica_Fruitore(Archive archivio,InputStream bin,byte[]xml,String entryName,String nomeFileSenzaAccordo,
  2393.             String tipoSoggetto, String nomeSoggetto, String tipoServizio, String nomeServizio, String versioneServizio,
  2394.             boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione,
  2395.             ArchiveVersion archiveVersion,
  2396.             Map<String, IdentificativoProprietaProtocollo> mapKeyProtocolProperties,
  2397.             Map<String, IDSoggetto> mapKeyFruitori) throws ProtocolException{
  2398.        
  2399.         Integer versioneServizioInt = null;
  2400.         try{
  2401.             if(versioneServizio!=null && !USE_VERSION_XML_BEAN.equals(versioneServizio)){
  2402.                 versioneServizioInt = Integer.parseInt(versioneServizio);
  2403.             }
  2404.         }catch(Exception e){
  2405.             throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) nel path contiene una versione errata: "+e.getMessage());
  2406.         }
  2407.        
  2408.         String tipoSoggettoKey = (tipoSoggetto!=null ? tipoSoggetto : "" );
  2409.         String nomeSoggettoKey = (nomeSoggetto!=null ? nomeSoggetto : "" );
  2410.         Integer versioneKey = (versioneServizioInt!=null ? versioneServizioInt : -1 );

  2411.         if(!nomeFileSenzaAccordo.contains((File.separatorChar+""))){
  2412.            
  2413.             if(entryName.endsWith(".id")) {
  2414.                 // dati identificativi del fruitore
  2415.                 String s = null;
  2416.                 try {
  2417.                     // comprendo tipo e nome soggetto
  2418.                     String tipoNomeSoggettoFruitore = nomeFileSenzaAccordo.substring(nomeFileSenzaAccordo.indexOf(File.separatorChar)+1,(nomeFileSenzaAccordo.length()-".id".length()));
  2419.                     if(tipoNomeSoggettoFruitore==null || "".equals(tipoNomeSoggettoFruitore) || !tipoNomeSoggettoFruitore.contains("_")){
  2420.                         throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_DIR+
  2421.                                 "] deve essere presenta una ulteriore directory contenente la struttura <tipo>_<nome> che descrive il soggetto. Il nome utilizzato per la directory non e' conforme alla struttura attesa <tipo>_<nome>");
  2422.                     }
  2423.                    
  2424.                     s = new String(xml);
  2425.                     if(s.endsWith("\n") && s.length()>1){
  2426.                         s = s.substring(0, s.length()-1);
  2427.                     }
  2428.                     IDSoggetto idSoggetto = IDSoggetto.toIDSoggetto(s);
  2429.                     mapKeyFruitori.put(tipoNomeSoggettoFruitore, idSoggetto);
  2430.                 }catch(Exception e) {
  2431.                     throw new ProtocolException("Elemento ["+entryName+"] contiene degli identificativi del frutore ("+s+") non validi rispetto al pattern atteso (tipo/nome): "
  2432.                             +e.getMessage(),e);
  2433.                 }
  2434.             }
  2435.             else {
  2436.                 // definizione del fruitore
  2437.                 try{
  2438.                     if(validationDocuments){
  2439.                         org.openspcoop2.core.registry.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  2440.                     }
  2441.                    
  2442.                     if(USE_VERSION_XML_BEAN.equals(versioneServizio)){
  2443.                         // devo recuperare la versione dell'accordo
  2444.                         String keyAccordo = ArchiveAccordoServizioParteSpecifica.buildKey(tipoSoggettoKey, nomeSoggettoKey, nomeServizio, tipoServizio, versioneKey);
  2445.                         versioneKey = archivio.getAccordiServizioParteSpecifica().get(keyAccordo).getAccordoServizioParteSpecifica().getVersione();
  2446.                         versioneServizioInt = versioneKey;
  2447.                     }
  2448.                    
  2449.                     Fruitore fruitore = this.jaxbRegistryDeserializer.readFruitore(xml);
  2450.                     String keyFruitore = ArchiveFruitore.buildKey(fruitore.getTipo(), fruitore.getNome(), tipoSoggettoKey, nomeSoggettoKey, tipoServizio, nomeServizio, versioneServizioInt);
  2451.                     if(archivio.getAccordiFruitori().containsKey(keyFruitore)){
  2452.                         throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di un fruitore con key ["+keyFruitore+"]");
  2453.                     }
  2454.                    
  2455.                     IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(tipoServizio, nomeServizio, tipoSoggetto, nomeSoggetto, versioneServizioInt);
  2456.                     archivio.getAccordiFruitori().add(keyFruitore,new ArchiveFruitore(idServizio,fruitore,idCorrelazione,true));
  2457.                 }catch(Exception eDeserializer){
  2458.                     String xmlString = this.toStringXmlElementForErrorMessage(xml);
  2459.                     throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (fruitore) non valida rispetto allo schema (RegistroServizi): "
  2460.                             +eDeserializer.getMessage(),eDeserializer);
  2461.                 }
  2462.             }
  2463.            
  2464.         }
  2465.        
  2466.         else {
  2467.            
  2468.             // comprendo tipo e nome soggetto fruitore
  2469.             String tipoNomeSoggettoFruitore = nomeFileSenzaAccordo.substring(0,nomeFileSenzaAccordo.indexOf(File.separatorChar));
  2470.             if(tipoNomeSoggettoFruitore==null || "".equals(tipoNomeSoggettoFruitore) || !tipoNomeSoggettoFruitore.contains("_")){
  2471.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_DIR+
  2472.                         "] deve essere presenta una ulteriore directory contenente la struttura <tipo>_<nome> che descrive il soggetto. Il nome utilizzato per la directory non e' conforme alla struttura attesa <tipo>_<nome>");
  2473.             }
  2474.             tipoNomeSoggettoFruitore = tipoNomeSoggettoFruitore.trim();
  2475.             String tipoSoggettoFruitore = null;
  2476.             String nomeSoggettoFruitore = null;
  2477.             if(tipoNomeSoggettoFruitore.equals("_")){
  2478.                 // caso eccezionale senza ne tipo ne nome
  2479.             }
  2480.             else if(tipoNomeSoggettoFruitore.startsWith("_")){
  2481.                 // caso eccezionale con solo il nome
  2482.                 nomeSoggettoFruitore = tipoNomeSoggettoFruitore.substring(1);
  2483.             }
  2484.             else if(tipoNomeSoggettoFruitore.endsWith("_")){
  2485.                 // caso eccezionale con solo il tipo
  2486.                 tipoSoggettoFruitore = tipoNomeSoggettoFruitore.substring(0,tipoNomeSoggettoFruitore.length()-1);
  2487.             }
  2488.             else{
  2489.                 // caso normale
  2490.                 tipoSoggettoFruitore = tipoNomeSoggettoFruitore.split("_")[0];
  2491.                 nomeSoggettoFruitore = tipoNomeSoggettoFruitore.split("_")[1];
  2492.                 if(tipoSoggettoFruitore==null || "".equals(tipoSoggettoFruitore)){
  2493.                     throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_DIR+
  2494.                             "] deve essere presenta una ulteriore directory contenente la struttura <tipo>_<nome> che descrive il soggetto. Il nome utilizzato per la directory non e' conforme alla struttura attesa <tipo>_<nome>: tipo non identificato");
  2495.                 }
  2496.                 if(nomeSoggettoFruitore==null || "".equals(nomeSoggettoFruitore)){
  2497.                     throw new ProtocolException("Elemento ["+entryName+"] errato. Dopo la directory ["+Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_DIR+
  2498.                             "] deve essere presenta una ulteriore directory contenente la struttura <tipo>_<nome> che descrive il soggetto. Il nome utilizzato per la directory non e' conforme alla struttura attesa <tipo>_<nome>: nome non identificato");
  2499.                 }
  2500.             }
  2501.            
  2502.             // provo a vedere se ho già gestito l'entry come chiave identificativo del soggetto
  2503.             if(mapKeyFruitori!=null && mapKeyFruitori.containsKey(tipoNomeSoggettoFruitore)) {
  2504.                 IDSoggetto id = mapKeyFruitori.get(tipoNomeSoggettoFruitore);
  2505.                 if(id!=null) {
  2506.                     // converto dati identificativi del soggetto
  2507.                     tipoSoggettoFruitore = id.getTipo();
  2508.                     nomeSoggettoFruitore = id.getNome();
  2509.                 }
  2510.             }
  2511.            
  2512.             // recupero archivio precedentemente letto
  2513.             String keyFruitore = ArchiveFruitore.buildKey(tipoSoggettoFruitore, nomeSoggettoFruitore, tipoSoggettoKey, nomeSoggettoKey, tipoServizio, nomeServizio, versioneServizioInt);
  2514.             ArchiveFruitore archiveFruitore = null;
  2515.             Fruitore fruitore = null;
  2516.             if(!archivio.getAccordiFruitori().containsKey(keyFruitore)){
  2517.                 throw new ProtocolException("Elemento ["+entryName+"] non atteso. Non è possibile fornire delle proprietà di protocollo di un fruitore senza fornire la definizione xml del fruitore");
  2518.             }
  2519.             archiveFruitore = archivio.getAccordiFruitori().get(keyFruitore);
  2520.             fruitore = archiveFruitore.getFruitore();
  2521.            
  2522.             nomeFileSenzaAccordo = nomeFileSenzaAccordo.substring((tipoNomeSoggettoFruitore+File.separatorChar).length());
  2523.            
  2524.             if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_PROTOCOL_PROPERTIES+File.separatorChar)){

  2525.                 List<ProtocolProperty> listPP = new ArrayList<>();
  2526.                 if(fruitore.sizeProtocolPropertyList()>0) {
  2527.                     for (ProtocolProperty protocolProperty : fruitore.getProtocolPropertyList()) {
  2528.                         if(protocolProperty.getTipoProprietario()==null) {
  2529.                             protocolProperty.setTipoProprietario(ProprietariProtocolProperty.FRUITORE.name());
  2530.                         }
  2531.                         listPP.add(protocolProperty);
  2532.                     }
  2533.                 }
  2534.                 processProtocolProperty(nomeFileSenzaAccordo, archiveVersion, entryName, xml,
  2535.                         ProprietarioProprietaProtocollo.FRUITORE,
  2536.                         tipoSoggetto, nomeSoggetto, tipoServizio+"/"+nomeServizio, versioneServizio,
  2537.                         tipoSoggettoFruitore, nomeSoggettoFruitore,
  2538.                         mapKeyProtocolProperties, listPP, null);
  2539.                
  2540.             }
  2541.            
  2542.         }
  2543.     }
  2544.    
  2545.     public void readAccordoServizioParteSpecifica_Fruitore_PortaDelegataAssociata(Archive archivio,InputStream bin,byte[]xml,String entryName,
  2546.             String nomeFileSenzaAccordo,
  2547.             String tipoSoggetto, String nomeSoggetto, String tipoServizio, String nomeServizio, String versioneServizio,
  2548.             boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione,
  2549.             Map<String, IDSoggetto> mapKeyFruitori) throws ProtocolException{
  2550.        
  2551.         // *** comprendo tipo e nome fruitore ****
  2552.        
  2553.         String prefixError = "Elemento ["+entryName+"] errato. Dopo la directory ["+Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_DIR+
  2554.                 "] il file che termina con ["+Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_MAPPING_PD_SUFFIX+
  2555.                 "] deve essere contenuto in una directory definita tramite la struttura <tipo>_<nome> che descrive il soggetto fruitore.";
  2556.        
  2557.         // comprendo tipo e nome soggetto
  2558.         String nomeServizioMappingPD = nomeFileSenzaAccordo.substring(nomeFileSenzaAccordo.lastIndexOf(File.separatorChar),nomeFileSenzaAccordo.length());
  2559.         String tipoNomeSoggettoFruitore = nomeFileSenzaAccordo.substring((Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_DIR+File.separatorChar).length(),
  2560.                 nomeFileSenzaAccordo.length()-
  2561.                 /**(File.separatorChar+Costanti.OPENSPCOOP2_ARCHIVE_FRUITORE_MAPPING_PD).length());*/
  2562.                 nomeServizioMappingPD.length());
  2563.         if(tipoNomeSoggettoFruitore==null || "".equals(tipoNomeSoggettoFruitore) || !tipoNomeSoggettoFruitore.contains("_")){
  2564.             throw new ProtocolException(prefixError+" Il nome utilizzato per la directory non e' conforme alla struttura attesa <tipo>_<nome>");
  2565.         }
  2566.         tipoNomeSoggettoFruitore = tipoNomeSoggettoFruitore.trim();
  2567.         String tipoSoggettoFruitore = null;
  2568.         String nomeSoggettoFruitore = null;
  2569.         if(tipoNomeSoggettoFruitore.equals("_")){
  2570.             // caso eccezionale senza ne tipo ne nome
  2571.         }
  2572.         else if(tipoNomeSoggettoFruitore.startsWith("_")){
  2573.             // caso eccezionale con solo il nome
  2574.             nomeSoggettoFruitore = tipoNomeSoggettoFruitore.substring(1);
  2575.         }
  2576.         else if(tipoNomeSoggettoFruitore.endsWith("_")){
  2577.             // caso eccezionale con solo il tipo
  2578.             tipoSoggettoFruitore = tipoNomeSoggettoFruitore.substring(0,tipoNomeSoggettoFruitore.length()-1);
  2579.         }
  2580.         else{
  2581.             // caso normale
  2582.             tipoSoggettoFruitore = tipoNomeSoggettoFruitore.split("_")[0];
  2583.             nomeSoggettoFruitore = tipoNomeSoggettoFruitore.split("_")[1];
  2584.             if(tipoSoggettoFruitore==null || "".equals(tipoSoggettoFruitore)){
  2585.                 throw new ProtocolException(prefixError+" Il nome utilizzato per la directory non e' conforme alla struttura attesa <tipo>_<nome>: tipo non identificato");
  2586.             }
  2587.             if(nomeSoggettoFruitore==null || "".equals(nomeSoggettoFruitore)){
  2588.                 throw new ProtocolException(prefixError+" Il nome utilizzato per la directory non e' conforme alla struttura attesa <tipo>_<nome>: nome non identificato");
  2589.             }
  2590.         }
  2591.        
  2592.         // provo a vedere se ho già gestito l'entry come chiave identificativo del soggetto
  2593.         if(mapKeyFruitori!=null && mapKeyFruitori.containsKey(tipoNomeSoggettoFruitore)) {
  2594.             IDSoggetto id = mapKeyFruitori.get(tipoNomeSoggettoFruitore);
  2595.             if(id!=null) {
  2596.                 // converto dati identificativi del soggetto
  2597.                 tipoSoggettoFruitore = id.getTipo();
  2598.                 nomeSoggettoFruitore = id.getNome();
  2599.             }
  2600.         }
  2601.        
  2602.         // *** leggo porta delegata associata ****
  2603.        
  2604.         Integer versioneServizioInt = null;
  2605.         try{
  2606.             if(versioneServizio!=null && !USE_VERSION_XML_BEAN.equals(versioneServizio)){
  2607.                 versioneServizioInt = Integer.parseInt(versioneServizio);
  2608.             }
  2609.         }catch(Exception e){
  2610.             throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) nel path contiene una versione errata: "+e.getMessage());
  2611.         }
  2612.        
  2613.         String tipoSoggettoFruitoreKey = (tipoSoggettoFruitore!=null ? tipoSoggettoFruitore : "" );
  2614.         String nomeSoggettoFruitoreKey = (nomeSoggettoFruitore!=null ? nomeSoggettoFruitore : "" );
  2615.         String tipoSoggettoKey = (tipoSoggetto!=null ? tipoSoggetto : "" );
  2616.         String nomeSoggettoKey = (nomeSoggetto!=null ? nomeSoggetto : "" );
  2617.         Integer versioneKey = (versioneServizioInt!=null ? versioneServizioInt : -1 );
  2618.        
  2619.         try{
  2620.             String idLine = this.readLineId(xml);
  2621.             if(idLine==null || "".equals(idLine)){
  2622.                 throw new ProtocolException("id non contiene valori");
  2623.             }
  2624.             if(idLine.endsWith("\n")) {
  2625.                 idLine = idLine.substring(0, idLine.length()-1);
  2626.             }
  2627.             String [] tmp = idLine.split(" ");
  2628.             if(tmp.length<3) {
  2629.                 throw new ProtocolException("Attesi almeno tre valori separati da spazio (nomeRegola nomePorta isDefault [descrizione])");
  2630.             }
  2631.             String nomeRegola = tmp[0];
  2632.             String nomePorta = tmp[1];
  2633.             boolean isDefault = false;
  2634.             try {
  2635.                 isDefault = Boolean.parseBoolean(tmp[2]);
  2636.             }catch(Exception e) {
  2637.                 throw new ProtocolException("Attesi tre valori separati da spazio (nomeRegola nomePorta isDefault) in cui l'ultimo valore di tipo booleano: "+e.getMessage(),e);
  2638.             }
  2639.             String descrizione = null;
  2640.             if(tmp.length>3) {
  2641.                 String primeTreInfo = nomeRegola +" "+nomePorta+" "+isDefault+" ";
  2642.                 descrizione = idLine.substring(primeTreInfo.length());
  2643.             }
  2644.            
  2645.             String keyFruitore = ArchiveFruitore.buildKey(tipoSoggettoFruitoreKey, nomeSoggettoFruitoreKey, tipoSoggettoKey, nomeSoggettoKey, tipoServizio, nomeServizio, versioneKey);
  2646.             if(!archivio.getAccordiFruitori().containsKey(keyFruitore)){
  2647.                 throw new ProtocolException("Elemento ["+entryName+"] non atteso. Non è possibile fornire un mapping con la porta delegata senza fornire la definizione xml della fruizione");
  2648.             }
  2649.            
  2650.             ArchiveFruitore archiveFruitore = archivio.getAccordiFruitori().get(keyFruitore);
  2651.             MappingFruizionePortaDelegata mapping = new MappingFruizionePortaDelegata();
  2652.             mapping.setNome(nomeRegola);
  2653.             mapping.setIdServizio(archiveFruitore.getIdAccordoServizioParteSpecifica());
  2654.             mapping.setIdFruitore(archiveFruitore.getIdSoggettoFruitore());
  2655.             IDPortaDelegata idPD = new IDPortaDelegata();
  2656.             idPD.setNome(nomePorta);
  2657.             mapping.setIdPortaDelegata(idPD);
  2658.             mapping.setDefault(isDefault);
  2659.             mapping.setDescrizione(descrizione);
  2660.            
  2661.             if(archiveFruitore.getMappingPorteDelegateAssociate()==null) {
  2662.                 archiveFruitore.setMappingPorteDelegateAssociate(new ArrayList<>());
  2663.             }
  2664.             archiveFruitore.getMappingPorteDelegateAssociate().add(mapping);
  2665.            
  2666.         }catch(Exception eDeserializer){
  2667.             String xmlString = this.toStringXmlElementForErrorMessage(xml);
  2668.             throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura csv (mapping fruizione-pd) non valida: "
  2669.                     +eDeserializer.getMessage(),eDeserializer);
  2670.         }
  2671.     }
  2672.    
  2673.    
  2674.     public void readAccordoCooperazione(Archive archivio,InputStream bin,byte[]xml,String entryName,String tipoSoggetto,String nomeSoggetto,
  2675.             String nomeFileSenzaAccordo,String nomeAccordo,String versioneAccordo,boolean validationDocuments, ArchiveIdCorrelazione idCorrelazione,
  2676.             ArchiveVersion archiveVersion,
  2677.             Map<String, IdentificativoDocumento> mapKeyDocumenti,
  2678.             Map<String, IdentificativoProprietaProtocollo> mapKeyProtocolProperties) throws ProtocolException{
  2679.        
  2680.         Integer versioneAccordoInt = null;
  2681.         try{
  2682.             if(versioneAccordo!=null && USE_VERSION_XML_BEAN.equals(versioneAccordo)==false){
  2683.                 versioneAccordoInt = Integer.parseInt(versioneAccordo);
  2684.             }
  2685.         }catch(Exception e){
  2686.             throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) nel path contiene una versione errata: "+e.getMessage());
  2687.         }
  2688.        
  2689.         String tipoSoggettoKey = (tipoSoggetto!=null ? tipoSoggetto : "" );
  2690.         String nomeSoggettoKey = (nomeSoggetto!=null ? nomeSoggetto : "" );
  2691.         Integer versioneKey = (versioneAccordoInt!=null ? versioneAccordoInt : -1 );
  2692.         String key = ArchiveAccordoCooperazione.buildKey(tipoSoggettoKey, nomeSoggettoKey, nomeAccordo, versioneKey);
  2693.        
  2694.         if(nomeFileSenzaAccordo.contains((File.separatorChar+""))==false){
  2695.            
  2696.             // definizione dell'accordo
  2697.             try{
  2698.                 if(validationDocuments){
  2699.                     org.openspcoop2.core.registry.utils.XSDValidator.getXSDValidator(this.log).valida(bin);
  2700.                 }
  2701.                 AccordoCooperazione ac = this.jaxbRegistryDeserializer.readAccordoCooperazione(xml);
  2702.                
  2703.                 // soggetto referente
  2704.                 if(ac.getSoggettoReferente()==null){
  2705.                     ac.setSoggettoReferente(new IdSoggetto());
  2706.                 }
  2707.                 if(tipoSoggetto!=null){
  2708.                     if(ac.getSoggettoReferente().getTipo()!=null && !ac.getSoggettoReferente().getTipo().equals(tipoSoggetto)){
  2709.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene un soggetto referente con tipo ["+
  2710.                                 ac.getSoggettoReferente().getTipo()+"] differente da quello indicato ["+tipoSoggetto+"] nella directory che contiene la definizione");
  2711.                     }
  2712.                 }
  2713.                 if(nomeSoggetto!=null){
  2714.                     if(ac.getSoggettoReferente().getNome()!=null && !ac.getSoggettoReferente().getNome().equals(nomeSoggetto)){
  2715.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene un soggetto referente con nome ["+
  2716.                                 ac.getSoggettoReferente().getNome()+"] differente da quello indicato ["+nomeSoggetto+"] nella directory che contiene la definizione");
  2717.                     }
  2718.                 }
  2719.                 ac.getSoggettoReferente().setTipo(tipoSoggetto);
  2720.                 ac.getSoggettoReferente().setNome(nomeSoggetto);
  2721.                
  2722.                 // nome e versione check quello indicato nell'accordo rispetto a quello indicato
  2723.                 // - nome della directory (old version)
  2724.                 // - file idAccordo (new version)
  2725.                 if(ArchiveVersion.V_UNDEFINED.equals(archiveVersion)){
  2726.                     String convertName = ZIPUtils.oldMethod_convertCharNonPermessiQualsiasiSistemaOperativo(ac.getNome(),false);
  2727.                     if(!convertName.equals(nomeAccordo)){
  2728.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene un nome ["+
  2729.                                 ac.getNome()+"] (fileSystemName:"+convertName+") differente da quello indicato ["+nomeAccordo+"] nella directory che contiene la definizione");
  2730.                     }
  2731.                     if(USE_VERSION_XML_BEAN.equals(versioneAccordo)==false){
  2732.                         if(versioneAccordoInt!=null){
  2733.                             if(ac.getVersione()!=null){
  2734.                                 if(ac.getVersione().intValue()!= versioneAccordoInt.intValue()){
  2735.                                     throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene una versione ["+
  2736.                                             ac.getVersione()+"] (fileSystemName:"+versioneAccordo+") differente da quella indicato ["+versioneAccordoInt+"] nella directory che contiene la definizione");
  2737.                                 }
  2738.                             }
  2739.                             ac.setVersione(versioneAccordoInt);
  2740.                         }
  2741.                     }
  2742.                 }
  2743.                 else{
  2744.                     if(!ac.getNome().equals(nomeAccordo)){
  2745.                         throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene un nome ["+
  2746.                                 ac.getNome()+"] differente da quello indicato ["+nomeAccordo+"] nel file ["+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME+"]");
  2747.                     }
  2748.                     if(USE_VERSION_XML_BEAN.equals(versioneAccordo)==false){
  2749.                         if(versioneAccordoInt!=null){
  2750.                             if(ac.getVersione()!=null && ac.getVersione().intValue()!= versioneAccordoInt.intValue()){
  2751.                                 throw new ProtocolException("Elemento ["+entryName+"] errato. La definizione xml dell'accordo (RegistroServizi) contiene una versione ["+
  2752.                                         ac.getVersione()+"] differente da quella indicata ["+versioneAccordo+"] nel file ["+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME+"]");
  2753.                             }
  2754.                         }
  2755.                         ac.setVersione(versioneAccordoInt);
  2756.                     }
  2757.                 }
  2758.                
  2759.                 // add
  2760.                 if(archivio.getAccordiCooperazione().containsKey(key)){
  2761.                     throw new ProtocolException("Elemento ["+entryName+"] errato. Risulta esistere piu' di un accordo con key ["+key+"]");
  2762.                 }
  2763.                 archivio.getAccordiCooperazione().add(key,new ArchiveAccordoCooperazione(ac,idCorrelazione,true));      

  2764.             }catch(Exception eDeserializer){
  2765.                 String xmlString = this.toStringXmlElementForErrorMessage(xml);
  2766.                 throw new ProtocolException(xmlString+"Elemento ["+entryName+"] contiene una struttura xml (accordo-cooperazione) non valida rispetto allo schema (RegistroServizi): "
  2767.                         +eDeserializer.getMessage(),eDeserializer);
  2768.             }
  2769.            
  2770.         }
  2771.         else{
  2772.            
  2773.             // recupero archivio precedentemente letto
  2774.             AccordoCooperazione ac = null;
  2775.             if(archivio.getAccordiCooperazione().containsKey(key)==false){
  2776.                 throw new ProtocolException("Elemento ["+entryName+"] non atteso. Non è possibile fornire dei documenti di un accordo senza fornire la definizione xml dell'accordo");
  2777.             }
  2778.             ac = archivio.getAccordiCooperazione().get(key).getAccordoCooperazione();
  2779.            
  2780.             // allegati
  2781.             if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_ALLEGATI+File.separatorChar)){
  2782.                
  2783.                 processDocument(nomeFileSenzaAccordo, Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_ALLEGATI, archiveVersion, entryName, xml,
  2784.                         tipoSoggetto, nomeSoggetto, nomeAccordo, versioneAccordo, mapKeyDocumenti, ac.getAllegatoList());
  2785.                
  2786.             }
  2787.            
  2788.             // specificheSemiformali
  2789.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_SEMIFORMALI+File.separatorChar)){
  2790.                
  2791.                 processDocument(nomeFileSenzaAccordo, Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_SPECIFICHE_SEMIFORMALI, archiveVersion, entryName, xml,
  2792.                         tipoSoggetto, nomeSoggetto, nomeAccordo, versioneAccordo, mapKeyDocumenti, ac.getSpecificaSemiformaleList());
  2793.                
  2794.             }
  2795.            
  2796.            
  2797.             // protocolProperties
  2798.             else if(nomeFileSenzaAccordo.startsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_PROTOCOL_PROPERTIES+File.separatorChar)){

  2799.                 List<ProtocolProperty> listPP = new ArrayList<>();
  2800.                 if(ac.sizeProtocolPropertyList()>0) {
  2801.                     for (ProtocolProperty protocolProperty : ac.getProtocolPropertyList()) {
  2802.                         if(protocolProperty.getTipoProprietario()==null) {
  2803.                             protocolProperty.setTipoProprietario(ProprietariProtocolProperty.ACCORDO_COOPERAZIONE.name());
  2804.                         }
  2805.                         listPP.add(protocolProperty);
  2806.                     }
  2807.                 }
  2808.                 processProtocolProperty(nomeFileSenzaAccordo, archiveVersion, entryName, xml,
  2809.                         ProprietarioProprietaProtocollo.ACCORDO_COOPERAZIONE,
  2810.                         tipoSoggetto, nomeSoggetto, nomeAccordo, versioneAccordo,
  2811.                         null, null,
  2812.                         mapKeyProtocolProperties, listPP, null);
  2813.                
  2814.             }
  2815.            
  2816.         }
  2817.        
  2818.     }
  2819.    
  2820.     private void processDocument(String nomeFileSenzaAccordo,String tipoDir, ArchiveVersion archiveVersion, String entryName, byte[] xml,
  2821.             String tipoSoggetto, String nomeSoggetto, String tipoServizio, String nomeServizio, String versioneServizio,
  2822.             Map<String, IdentificativoDocumento> mapKeyDocumenti, List<Documento> documenti) throws ProtocolException{
  2823.         this.processDocument(nomeFileSenzaAccordo, tipoDir, archiveVersion, entryName, xml, tipoSoggetto, nomeSoggetto,
  2824.                 tipoServizio+nomeServizio, versioneServizio, mapKeyDocumenti, documenti);
  2825.     }
  2826.     private void processDocument(String nomeFileSenzaAccordo,String tipoDir, ArchiveVersion archiveVersion, String entryName, byte[] xml,
  2827.             String tipoSoggetto, String nomeSoggetto, String nomeAccordo, String versioneAccordo,
  2828.             Map<String, IdentificativoDocumento> mapKeyDocumenti, List<Documento> documenti) throws ProtocolException{
  2829.         String nomeDocumento = nomeFileSenzaAccordo.substring((tipoDir+File.separatorChar).length());
  2830.         if(ArchiveVersion.V_UNDEFINED.equals(archiveVersion)){
  2831.            
  2832.             this.getDocument(documenti, nomeDocumento, null, entryName, archiveVersion).setByteContenuto(xml);
  2833.            
  2834.         }else{
  2835.             String nomeDocumentoSenzaEstensione = nomeDocumento;
  2836.             if(nomeDocumento.contains(".")==false){
  2837.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Per i documenti è attesa una estensione");
  2838.             }
  2839.             nomeDocumentoSenzaEstensione = nomeDocumento.substring(0,nomeDocumento.lastIndexOf("."));
  2840.             String keyDocumento = getKeyDocumento(tipoSoggetto, nomeSoggetto, nomeAccordo, versioneAccordo, entryName, nomeDocumentoSenzaEstensione);
  2841.             if(nomeFileSenzaAccordo.endsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_ATTACHMENT_SUFFIX_ID)){
  2842.                 String tmp = new String(xml);
  2843.                 IdentificativoDocumento identificativoDocumento = new IdentificativoDocumento();
  2844.                 identificativoDocumento.tipo = tmp.split(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME_INTERNAL_SEPARATOR)[0];
  2845.                 identificativoDocumento.nome = tmp.substring(identificativoDocumento.tipo.length()+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME_INTERNAL_SEPARATOR.length());
  2846.                 // fix file editati a mano
  2847.                 identificativoDocumento.tipo = identificativoDocumento.tipo.trim();
  2848.                 identificativoDocumento.nome = identificativoDocumento.nome.trim();
  2849.                 if(identificativoDocumento.nome.endsWith("\n") && identificativoDocumento.nome.length()>1) {
  2850.                     identificativoDocumento.nome = identificativoDocumento.nome.substring(0, identificativoDocumento.nome.length()-1);
  2851.                 }
  2852.                 mapKeyDocumenti.put(keyDocumento, identificativoDocumento);
  2853.             }
  2854.             else if(nomeFileSenzaAccordo.endsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_ATTACHMENT_SUFFIX_CONTENT)){
  2855.                 IdentificativoDocumento identificativoDocumento = mapKeyDocumenti.get(keyDocumento);
  2856.                 if(identificativoDocumento==null){
  2857.                     throw new ProtocolException("Elemento ["+entryName+"] errato. Non è stato rilevato precedentemente il corrispettivo file contenente l'identificativo (con estensione '"+
  2858.                                 Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_ATTACHMENT_SUFFIX_ID+"')");
  2859.                 }
  2860.                 this.getDocument(documenti, identificativoDocumento.nome, identificativoDocumento.tipo, entryName, archiveVersion).setByteContenuto(xml);
  2861.             }
  2862.             else {
  2863.                 throw new ProtocolException("Elemento ["+entryName+"] non atteso.");
  2864.             }
  2865.         }
  2866.     }
  2867.     private Documento getDocument(List<Documento> documenti, String nome, String tipo, String entryName, ArchiveVersion archiveVersion) throws ProtocolException{
  2868.        
  2869.         List<Character> permitPoint = new ArrayList<Character>();
  2870.         permitPoint.add('.');
  2871.                
  2872.         for (Documento documento : documenti) {
  2873.            
  2874.             String fileName = documento.getFile();
  2875.             if(ArchiveVersion.V_UNDEFINED.equals(archiveVersion)){
  2876.                 fileName = ZIPUtils.oldMethod_convertCharNonPermessiQualsiasiSistemaOperativo(fileName,true,permitPoint);
  2877.             }
  2878.                
  2879.             if(nome.equals(fileName)){
  2880.                 if(ArchiveVersion.V_UNDEFINED.equals(archiveVersion)){
  2881.                     return documento;
  2882.                 }
  2883.                 else{
  2884.                     if(tipo.equals(documento.getTipo())){
  2885.                         return documento;
  2886.                     }
  2887.                 }
  2888.             }
  2889.         }
  2890.         throw new ProtocolException("Elemento ["+entryName+"] non atteso. Non è possibile fornire un documento di un accordo senza definirlo anche all'interno della definizione xml dell'accordo");
  2891.     }
  2892.    
  2893.    
  2894.    
  2895.     private void processProtocolProperty(String nomeFileSenzaAccordo,ArchiveVersion archiveVersion, String entryName, byte[] xml,
  2896.             ProprietarioProprietaProtocollo proprietario,
  2897.             String tipoSoggetto, String nomeSoggetto, String nomeAccordo, String versioneAccordo,
  2898.             String tipoSoggettoFruitore, String nomeSoggettoFruitore,
  2899.             Map<String, IdentificativoProprietaProtocollo> mapKeyProtocolProperties,
  2900.             List<ProtocolProperty> protocolProperties,
  2901.             HashMap<String,Long> mapIdToLong) throws ProtocolException{
  2902.         String nomePP = nomeFileSenzaAccordo.substring((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_PROTOCOL_PROPERTIES+File.separatorChar).length());
  2903.        
  2904.         String nomePPSenzaEstensione = nomePP;
  2905.         if(nomePP.contains(".")==false){
  2906.             throw new ProtocolException("Elemento ["+entryName+"] errato. Per le protocol properties è attesa una estensione");
  2907.         }
  2908.         nomePPSenzaEstensione = nomePP.substring(0,nomePP.lastIndexOf("."));
  2909.         String keyProtocolProperty = getKeyProtocolProperty(tipoSoggetto, nomeSoggetto, nomeAccordo, versioneAccordo,
  2910.                 tipoSoggettoFruitore, nomeSoggettoFruitore, proprietario, nomePPSenzaEstensione);
  2911.         if(nomeFileSenzaAccordo.endsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_ATTACHMENT_SUFFIX_ID)){
  2912.             String tmp = new String(xml);
  2913.             IdentificativoProprietaProtocollo identificativoPP = new IdentificativoProprietaProtocollo();
  2914.             identificativoPP.tipo = ProprietariProtocolProperty.valueOf(tmp.split(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME_INTERNAL_SEPARATOR)[0]);
  2915.             int prefixLength = identificativoPP.tipo.name().length()+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME_INTERNAL_SEPARATOR.length();
  2916.             if(ProprietariProtocolProperty.AZIONE_ACCORDO.equals(identificativoPP.tipo) ||
  2917.                     ProprietariProtocolProperty.PORT_TYPE.equals(identificativoPP.tipo) ||
  2918.                     ProprietariProtocolProperty.OPERATION.equals(identificativoPP.tipo) ||
  2919.                     ProprietariProtocolProperty.RESOURCE.equals(identificativoPP.tipo)) {
  2920.                 identificativoPP.idProprietario = tmp.split(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME_INTERNAL_SEPARATOR)[1];
  2921.                 prefixLength+=identificativoPP.idProprietario.length()+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME_INTERNAL_SEPARATOR.length();
  2922.             }
  2923.             identificativoPP.nome = tmp.substring(prefixLength);
  2924.             mapKeyProtocolProperties.put(keyProtocolProperty, identificativoPP);
  2925.         }
  2926.         else if(nomeFileSenzaAccordo.endsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_ATTACHMENT_SUFFIX_CONTENT)){
  2927.             IdentificativoProprietaProtocollo identificativoPP = mapKeyProtocolProperties.get(keyProtocolProperty);
  2928.             if(identificativoPP==null){
  2929.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Non è stato rilevato precedentemente il corrispettivo file contenente l'identificativo (con estensione '"+
  2930.                             Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_ATTACHMENT_SUFFIX_ID+"')");
  2931.             }
  2932.             this.getProtocolProperty(proprietario, protocolProperties,
  2933.                     identificativoPP.nome, identificativoPP.tipo,
  2934.                     identificativoPP.idProprietario, mapIdToLong,
  2935.                     entryName).setByteFile(xml);
  2936.         }
  2937.         else {
  2938.             throw new ProtocolException("Elemento ["+entryName+"] non atteso.");
  2939.         }

  2940.     }
  2941.     private String buildKeyPPAccordoParteComuneItem(ProprietariProtocolProperty tipo,String idProprietario) {
  2942.         return tipo.name()+"_"+idProprietario;
  2943.     }
  2944.     private ProtocolProperty getProtocolProperty(ProprietarioProprietaProtocollo proprietario,
  2945.             List<ProtocolProperty> protocolProperties, String nome, ProprietariProtocolProperty tipo,
  2946.             String idProprietario, HashMap<String,Long> mapIdToLong,
  2947.             String entryName) throws ProtocolException{
  2948.            
  2949.         for (ProtocolProperty pp : protocolProperties) {
  2950.             if(pp.getTipoProprietario().equals(tipo.name()) && pp.getName().equals(nome)) {
  2951.                 if(mapIdToLong==null || ProprietariProtocolProperty.ACCORDO_SERVIZIO_PARTE_COMUNE.equals(tipo)) {
  2952.                     return pp;
  2953.                 }
  2954.                 else {
  2955.                     String key = buildKeyPPAccordoParteComuneItem(tipo, idProprietario);
  2956.                     Long l = mapIdToLong.get(key);
  2957.                     if(l.longValue() == pp.getIdProprietario().longValue()) {
  2958.                         return pp;
  2959.                     }
  2960.                 }
  2961.             }
  2962.         }
  2963.         throw new ProtocolException("Elemento ["+entryName+"] non atteso. Non è possibile fornire una proprietà di protocollo senza definirlo anche all'interno della definizione xml ("+proprietario.name()+")");
  2964.     }
  2965.    
  2966.    
  2967.    
  2968.     private void processProtocolPropertyConfig(String nomeFileSenzaId,ArchiveVersion archiveVersion, String entryName, byte[] xml,
  2969.             ProprietarioProprietaProtocollo proprietario,
  2970.             String tipoSoggetto, String nomeSoggetto, String nome,
  2971.             Map<String, IdentificativoProprietaProtocollo> mapKeyProtocolProperties,
  2972.             List<org.openspcoop2.core.config.ProtocolProperty> protocolProperties,
  2973.             HashMap<String,Long> mapIdToLong) throws ProtocolException{
  2974.         String nomePP = nomeFileSenzaId.substring((Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_DIR_PROTOCOL_PROPERTIES+File.separatorChar).length());
  2975.        
  2976.         String nomePPSenzaEstensione = nomePP;
  2977.         if(nomePP.contains(".")==false){
  2978.             throw new ProtocolException("Elemento ["+entryName+"] errato. Per le protocol properties è attesa una estensione");
  2979.         }
  2980.         nomePPSenzaEstensione = nomePP.substring(0,nomePP.lastIndexOf("."));
  2981.         String keyProtocolProperty = getKeyProtocolProperty(tipoSoggetto, nomeSoggetto, nome, null, null, null, proprietario, nomePPSenzaEstensione);
  2982.         if(nomeFileSenzaId.endsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_ATTACHMENT_SUFFIX_ID)){
  2983.             String tmp = new String(xml);
  2984.             IdentificativoProprietaProtocollo identificativoPP = new IdentificativoProprietaProtocollo();
  2985.             identificativoPP.tipo = ProprietariProtocolProperty.valueOf(tmp.split(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME_INTERNAL_SEPARATOR)[0]);
  2986.             int prefixLength = identificativoPP.tipo.name().length()+Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_ID_FILE_NAME_INTERNAL_SEPARATOR.length();
  2987.             identificativoPP.nome = tmp.substring(prefixLength);
  2988.             mapKeyProtocolProperties.put(keyProtocolProperty, identificativoPP);
  2989.         }
  2990.         else if(nomeFileSenzaId.endsWith(Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_ATTACHMENT_SUFFIX_CONTENT)){
  2991.             IdentificativoProprietaProtocollo identificativoPP = mapKeyProtocolProperties.get(keyProtocolProperty);
  2992.             if(identificativoPP==null){
  2993.                 throw new ProtocolException("Elemento ["+entryName+"] errato. Non è stato rilevato precedentemente il corrispettivo file contenente l'identificativo (con estensione '"+
  2994.                             Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_ATTACHMENT_SUFFIX_ID+"')");
  2995.             }
  2996.             this.getProtocolPropertyConfig(proprietario, protocolProperties,
  2997.                     identificativoPP.nome, identificativoPP.tipo,
  2998.                     identificativoPP.idProprietario, mapIdToLong,
  2999.                     entryName).setByteFile(xml);
  3000.         }
  3001.         else {
  3002.             throw new ProtocolException("Elemento ["+entryName+"] non atteso.");
  3003.         }

  3004.     }
  3005.     private org.openspcoop2.core.config.ProtocolProperty getProtocolPropertyConfig(ProprietarioProprietaProtocollo proprietario,
  3006.             List<org.openspcoop2.core.config.ProtocolProperty> protocolProperties, String nome, ProprietariProtocolProperty tipo,
  3007.             String idProprietario, HashMap<String,Long> mapIdToLong,
  3008.             String entryName) throws ProtocolException{
  3009.            
  3010.         for (org.openspcoop2.core.config.ProtocolProperty pp : protocolProperties) {
  3011.             if(pp.getTipoProprietario().equals(tipo.name()) && pp.getName().equals(nome)) {
  3012.                 return pp;
  3013.             }
  3014.         }
  3015.         throw new ProtocolException("Elemento ["+entryName+"] non atteso. Non è possibile fornire una proprietà di protocollo senza definirlo anche all'interno della definizione xml ("+proprietario.name()+")");
  3016.     }
  3017.    
  3018.    
  3019.    
  3020.     protected String toStringXmlElementForErrorMessage(byte[]xml){
  3021.         return xml!=null ? "Xml: ["+new String(xml)+"] \n" : "Xml Undefined. \n";
  3022.     }
  3023.    
  3024.     private String readLineId(byte[] xml) throws IOException {
  3025.         // Elimino eventuali \n
  3026.         StringReader sr = new StringReader(new String(xml));
  3027.         BufferedReader br = new BufferedReader(sr);
  3028.         String identificativo = br.readLine();
  3029.         br.close();
  3030.         sr.close();
  3031.         return identificativo;
  3032.     }
  3033. }

  3034. class IdentificativoAccordo{
  3035.    
  3036.     protected String tipo; // solo per aps
  3037.     protected String nome;
  3038.     protected String versione;
  3039.    
  3040. }

  3041. class IdentificativoDocumento{
  3042.    
  3043.     protected String nome;
  3044.     protected String tipo;
  3045.    
  3046. }

  3047. class IdentificativoProprietaProtocollo{
  3048.    
  3049.     protected String nome;
  3050.     protected String idProprietario;
  3051.     protected ProprietariProtocolProperty tipo;
  3052.    
  3053. }

  3054. class IdentificativoServizioApplicativo{
  3055.    
  3056.     protected String tipoSoggetto;
  3057.     protected String nomeSoggetto;
  3058.     protected String nome;
  3059.    
  3060. }

  3061. enum ProprietarioProprietaProtocollo{
  3062.    
  3063.     SOGGETTO,
  3064.     ACCORDO_COOPERAZIONE,
  3065.     ACCORDO_SERVIZIO_PARTE_COMUNE,
  3066.     ACCORDO_SERVIZIO_PARTE_SPECIFICA,
  3067.     FRUITORE,
  3068.     SERVIZIO_APPLICATIVO
  3069.    
  3070. }