SPCoopArchive.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.spcoop.archive;

  21. import java.io.ByteArrayOutputStream;
  22. import java.io.InputStream;
  23. import java.io.OutputStream;
  24. import java.util.List;

  25. import org.openspcoop2.core.id.IDAccordo;
  26. import org.openspcoop2.core.id.IDAccordoCooperazione;
  27. import org.openspcoop2.core.id.IDServizio;
  28. import org.openspcoop2.core.registry.AccordoServizioParteComune;
  29. import org.openspcoop2.core.registry.Operation;
  30. import org.openspcoop2.core.registry.PortType;
  31. import org.openspcoop2.core.registry.constants.CostantiRegistroServizi;
  32. import org.openspcoop2.protocol.basic.archive.BasicArchive;
  33. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  34. import org.openspcoop2.protocol.sdk.ProtocolException;
  35. import org.openspcoop2.protocol.sdk.archive.Archive;
  36. import org.openspcoop2.protocol.sdk.archive.ArchiveAccordoCooperazione;
  37. import org.openspcoop2.protocol.sdk.archive.ArchiveAccordoServizioComposto;
  38. import org.openspcoop2.protocol.sdk.archive.ArchiveAccordoServizioParteComune;
  39. import org.openspcoop2.protocol.sdk.archive.ArchiveAccordoServizioParteSpecifica;
  40. import org.openspcoop2.protocol.sdk.archive.ArchiveEsitoDelete;
  41. import org.openspcoop2.protocol.sdk.archive.ArchiveEsitoImport;
  42. import org.openspcoop2.protocol.sdk.archive.ArchiveEsitoImportDetail;
  43. import org.openspcoop2.protocol.sdk.archive.ArchiveMode;
  44. import org.openspcoop2.protocol.sdk.archive.ArchiveModeType;
  45. import org.openspcoop2.protocol.sdk.archive.ExportMode;
  46. import org.openspcoop2.protocol.sdk.archive.ImportMode;
  47. import org.openspcoop2.protocol.sdk.archive.MapPlaceholder;
  48. import org.openspcoop2.protocol.sdk.archive.MappingModeTypesExtensions;
  49. import org.openspcoop2.protocol.sdk.constants.ArchiveStatoImport;
  50. import org.openspcoop2.protocol.sdk.constants.ArchiveType;
  51. import org.openspcoop2.protocol.sdk.registry.IConfigIntegrationReader;
  52. import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
  53. import org.openspcoop2.protocol.spcoop.config.SPCoopProperties;
  54. import org.openspcoop2.protocol.spcoop.constants.SPCoopCostantiArchivi;
  55. import org.openspcoop2.utils.Utilities;
  56. import org.slf4j.Logger;

  57. import it.gov.spcoop.sica.dao.Costanti;
  58. import it.gov.spcoop.sica.wsbl.ConceptualBehavior;

  59. /**
  60.  * SPCoopArchive
  61.  *
  62.  * @author Poli Andrea (apoli@link.it)
  63.  * @author $Author$
  64.  * @version $Rev$, $Date$
  65.  */
  66. public class SPCoopArchive extends BasicArchive {

  67.     private SPCoopArchiveImport importEngine = null;
  68.     private SPCoopArchiveExport exportEngine = null;
  69.     private SPCoopProperties spcoopProperties = null;
  70.    
  71.     public SPCoopArchive(Logger log, IProtocolFactory<?> protocolFactory) throws ProtocolException {
  72.         super(protocolFactory);
  73.         this.importEngine = new SPCoopArchiveImport(protocolFactory);
  74.         this.exportEngine = new SPCoopArchiveExport(protocolFactory);
  75.         this.spcoopProperties = SPCoopProperties.getInstance(log);
  76.     }

  77.    
  78.    
  79.    
  80.    
  81.     /* ----- Utilita' generali ----- */
  82.    
  83.     @Override
  84.     public MappingModeTypesExtensions getMappingTypesExtensions(ArchiveMode mode)
  85.             throws ProtocolException {
  86.        
  87.         if(this.spcoopProperties.isGestionePackageSICA() && SPCoopCostantiArchivi.CNIPA_MODE.equals(mode) ||
  88.             SPCoopCostantiArchivi.EXPORT_MODE_COMPATIBILITA_CLIENT_SICA.equals(mode) ||
  89.             SPCoopCostantiArchivi.EXPORT_MODE_INFORMAZIONI_COMPLETE.equals(mode) ){

  90.             MappingModeTypesExtensions m = new MappingModeTypesExtensions();
  91.                        
  92.             m.add(org.openspcoop2.protocol.basic.Costanti.OPENSPCOOP_ARCHIVE_EXT,
  93.                         SPCoopCostantiArchivi.TYPE_ALL,
  94.                         SPCoopCostantiArchivi.TYPE_APC,
  95.                         SPCoopCostantiArchivi.TYPE_APS,
  96.                         SPCoopCostantiArchivi.TYPE_ADC,
  97.                         SPCoopCostantiArchivi.TYPE_ASC);
  98.            
  99.             m.add(Costanti.ESTENSIONE_ACCORDO_SERVIZIO_PARTE_COMUNE,
  100.                         ArchiveType.ACCORDO_SERVIZIO_PARTE_COMUNE,
  101.                         SPCoopCostantiArchivi.TYPE_APC,
  102.                         SPCoopCostantiArchivi.TYPE_ALL);
  103.            
  104.             m.add(Costanti.ESTENSIONE_ACCORDO_SERVIZIO_PARTE_SPECIFICA,
  105.                         ArchiveType.ACCORDO_SERVIZIO_PARTE_SPECIFICA,
  106.                         SPCoopCostantiArchivi.TYPE_APS,
  107.                         SPCoopCostantiArchivi.TYPE_ALL);
  108.            
  109.             m.add(Costanti.ESTENSIONE_ACCORDO_COOPERAZIONE,
  110.                         ArchiveType.ACCORDO_COOPERAZIONE,
  111.                         SPCoopCostantiArchivi.TYPE_ADC,
  112.                         SPCoopCostantiArchivi.TYPE_ALL);
  113.            
  114.             m.add(Costanti.ESTENSIONE_ACCORDO_SERVIZIO_COMPOSTO,
  115.                         ArchiveType.ACCORDO_SERVIZIO_COMPOSTO,
  116.                         SPCoopCostantiArchivi.TYPE_ASC,
  117.                         SPCoopCostantiArchivi.TYPE_ALL);
  118.            
  119.             return m;
  120.         }
  121.         else{
  122.             return super.getMappingTypesExtensions(mode);
  123.         }
  124.     }
  125.    
  126.     /**
  127.      * Imposta per ogni portType e operation presente nell'accordo fornito come parametro
  128.      * le informazioni di protocollo analizzando i documenti interni agli archivi
  129.      */
  130.     @Override
  131.     public void setProtocolInfo(AccordoServizioParteComune accordoServizioParteComune) throws ProtocolException{
  132.        
  133.         super.setProtocolInfo(accordoServizioParteComune);
  134.        
  135.         try{
  136.            
  137.             String operationAsincronaRichiesta = null;
  138.             String operationAsincronaRisposta = null;
  139.             boolean presenzaWSBLLogicoFruitore = false;
  140.            
  141.             if(accordoServizioParteComune.getByteSpecificaConversazioneConcettuale()!=null){
  142.                
  143.                 byte [] wsbl = accordoServizioParteComune.getByteSpecificaConversazioneConcettuale();
  144.                
  145.                 if(!it.gov.spcoop.sica.wsbl.driver.XMLUtils.isConceptualBehavior(wsbl)){
  146.                     if(it.gov.spcoop.sica.wsbl.driver.XMLUtils.isMessageBehavior(wsbl)){
  147.                         throw new Exception("La specifica di conversazione concettuale non e' un documento WSBL ConceptualBehavior, ma erroneamente un documento WSBL MessageBehavior");
  148.                     }else{
  149.                         throw new Exception("La specifica di conversazione concettuale non e' un documento WSBL ConceptualBehavior");
  150.                     }
  151.                 }
  152.    
  153.                 ConceptualBehavior wsblConcettuale = it.gov.spcoop.sica.wsbl.driver.XMLUtils.getConceptualBehavior(this.getProtocolFactory().getLogger(),wsbl);
  154.                 String[]operazioniAsincrone = it.gov.spcoop.sica.wsbl.driver.XMLUtils.getOperazioniAsincrone(wsblConcettuale);
  155.                
  156.                 operationAsincronaRichiesta = operazioniAsincrone[0];
  157.                 operationAsincronaRisposta = operazioniAsincrone[1];
  158.                 //System.out.println("1: "+operazioniAsincrone[0]);
  159.                 //System.out.println("2: "+operazioniAsincrone[1]);
  160.                
  161.                 if(accordoServizioParteComune.getByteSpecificaConversazioneFruitore()!=null){
  162.                     presenzaWSBLLogicoFruitore = it.gov.spcoop.sica.wsbl.driver.XMLUtils.isMessageBehavior(wsbl);
  163.                 }
  164.            
  165.                
  166.                 // Verifico profilo di collaborazione e correlazione in base ai valori presenti nel WSBL
  167.                 // Verifico come nome:
  168.                 // 1. azione
  169.                 // 2. servizio_azione
  170.                 for (PortType ptOpenSPCoop : accordoServizioParteComune.getPortTypeList()) {
  171.                    
  172.                     for (Operation opOpenSPCoop : ptOpenSPCoop.getAzioneList()) {
  173.                        
  174.                         // 1. azione
  175.                         String tmp = opOpenSPCoop.getNome();
  176.                         if(tmp.equals(operationAsincronaRichiesta) || tmp.equals(operationAsincronaRisposta)){
  177.                             if(presenzaWSBLLogicoFruitore){
  178.                                 opOpenSPCoop.setProfiloCollaborazione(CostantiRegistroServizi.ASINCRONO_SIMMETRICO);
  179.                             }else{
  180.                                 opOpenSPCoop.setProfiloCollaborazione(CostantiRegistroServizi.ASINCRONO_ASIMMETRICO);
  181.                             }
  182.                             opOpenSPCoop.setProfAzione(CostantiRegistroServizi.PROFILO_AZIONE_RIDEFINITO);
  183.                             if(tmp.equals(operationAsincronaRisposta)){
  184.                                 opOpenSPCoop.setCorrelata(operationAsincronaRichiesta);
  185.                                 // search servizio della richiesta
  186.                                 for (PortType ptSearch : accordoServizioParteComune.getPortTypeList()) {
  187.                                     boolean found = false;
  188.                                     for (Operation opSearch : ptSearch.getAzioneList()) {
  189.                                         if(opSearch!=null && opSearch.getNome().equals(operationAsincronaRichiesta)){
  190.                                             opOpenSPCoop.setCorrelataServizio(ptSearch.getNome());
  191.                                             found = true;
  192.                                             break;
  193.                                         }
  194.                                     }
  195.                                     if(found){
  196.                                         break;
  197.                                     }
  198.                                 }
  199.                             }
  200.                         }
  201.                        
  202.                         else {
  203.                             // 2. servizio_azione
  204.                             int lengthServizioAzione = (ptOpenSPCoop.getNome().length()+1+opOpenSPCoop.getNome().length());
  205.                             boolean richiesta = (operationAsincronaRichiesta!=null)
  206.                                 && (operationAsincronaRichiesta.length()==lengthServizioAzione)
  207.                                 && (operationAsincronaRichiesta.startsWith(ptOpenSPCoop.getNome()))
  208.                                 && (operationAsincronaRichiesta.endsWith(opOpenSPCoop.getNome()));
  209.                             boolean risposta = (operationAsincronaRisposta!=null)
  210.                                 && (operationAsincronaRisposta.length()==lengthServizioAzione)
  211.                                 && (operationAsincronaRisposta.startsWith(ptOpenSPCoop.getNome()))
  212.                                 && (operationAsincronaRisposta.endsWith(opOpenSPCoop.getNome()));
  213.                             if(richiesta || risposta){
  214.                                 //System.out.println("TROVATO ["+richiesta+"] ["+risposta+"]");
  215.                                 if(presenzaWSBLLogicoFruitore){
  216.                                     opOpenSPCoop.setProfiloCollaborazione(CostantiRegistroServizi.ASINCRONO_SIMMETRICO);
  217.                                 }else{
  218.                                     opOpenSPCoop.setProfiloCollaborazione(CostantiRegistroServizi.ASINCRONO_ASIMMETRICO);
  219.                                 }
  220.                                 opOpenSPCoop.setProfAzione(CostantiRegistroServizi.PROFILO_AZIONE_RIDEFINITO);
  221.                                 //System.out.println("PROFILO ["+opOpenSPCoop.getProfiloCollaborazione()+"]");
  222.                                 if(risposta){
  223.                                     // search servizio della richiesta
  224.                                     for (PortType ptSearch : accordoServizioParteComune.getPortTypeList()) {
  225.                                         boolean found = false;
  226.                                         for (Operation opSearch : ptSearch.getAzioneList()) {
  227.                                             int lengthServizioAzioneSearch = (ptSearch.getNome().length()+1+opSearch.getNome().length());
  228.                                             boolean richiestaSearch = (operationAsincronaRichiesta.length()==lengthServizioAzioneSearch)
  229.                                                 && (operationAsincronaRichiesta.startsWith(ptSearch.getNome()))
  230.                                                 && (operationAsincronaRichiesta.endsWith(opSearch.getNome()));
  231.                                             if(richiestaSearch){
  232.                                                 opOpenSPCoop.setCorrelata(opSearch.getNome());
  233.                                                 opOpenSPCoop.setCorrelataServizio(ptSearch.getNome());
  234.                                                 //System.out.println("TROVATA CORRELAZIONE ["+opOpenSPCoop.getCorrelata()+"] ["+opOpenSPCoop.getCorrelataServizio()+"]");
  235.                                                 found = true;
  236.                                                 break;
  237.                                             }
  238.                                         }
  239.                                         if(found){
  240.                                             break;
  241.                                         }
  242.                                     }
  243.                                 }
  244.                             }
  245.                         }
  246.                     }
  247.                 }
  248.             }
  249.            
  250.         }catch(Exception e){
  251.             throw new ProtocolException(e.getMessage(),e);
  252.         }
  253.     }
  254.    
  255.    
  256.    
  257.    
  258.    
  259.    
  260.    
  261.    
  262.     /* ----- Utilita' generali di interpretazione di un Esito ----- */
  263.    
  264.     private String toString(ArchiveEsitoImport archive, boolean importOperation){
  265.        
  266.         StringBuilder bfEsito = new StringBuilder();
  267.        
  268.         // Nel CNIPA ci sono sempre e solo un oggetto.
  269.        
  270.         // Accordi di Cooperazione
  271.         if(archive.getAccordiCooperazione().size()>0){
  272.             bfEsito.append("Accordo di Cooperazione\n");
  273.             try{
  274.                 ArchiveEsitoImportDetail archiveAccordoCooperazione = archive.getAccordiCooperazione().get(0);
  275.                 IDAccordoCooperazione idAccordoCooperazione = ((ArchiveAccordoCooperazione)archiveAccordoCooperazione.getArchiveObject()).getIdAccordoCooperazione();
  276.                 String uriAccordo = this.idAccordoCooperazioneFactory.getUriFromIDAccordo(idAccordoCooperazione);
  277.                 bfEsito.append("\t- [").append(uriAccordo).append("] ");
  278.                 this.esitoUtils.serializeStato(archiveAccordoCooperazione, bfEsito, importOperation);
  279.             }catch(Exception e){
  280.                 bfEsito.append("\t- non importato: ").append(e.getMessage());
  281.             }
  282.         }
  283.        
  284.        
  285.         // Accordi di Servizio Parte Comune
  286.         else if(archive.getAccordiServizioParteComune().size()>0){
  287.             bfEsito.append("Accordi di Servizio Parte Comune\n");
  288.             try{
  289.                 ArchiveEsitoImportDetail archiveAccordoServizioParteComune = archive.getAccordiServizioParteComune().get(0);
  290.                 IDAccordo idAccordo = ((ArchiveAccordoServizioParteComune)archiveAccordoServizioParteComune.getArchiveObject()).getIdAccordoServizioParteComune();
  291.                 String uriAccordo = this.idAccordoFactory.getUriFromIDAccordo(idAccordo);
  292.                 bfEsito.append("\t- [").append(uriAccordo).append("] ");
  293.                 this.esitoUtils.serializeStato(archiveAccordoServizioParteComune, bfEsito, importOperation);
  294.             }catch(Exception e){
  295.                 bfEsito.append("\t- non importato: ").append(e.getMessage());
  296.             }
  297.         }
  298.        
  299.        
  300.         // Accordi di Servizio Parte Specifica (implementano accordi di servizio parte comune)
  301.         else if(archive.getAccordiServizioParteSpecifica().size()>0){
  302.             bfEsito.append("Accordi di Servizio Parte Specifica\n");
  303.             try{
  304.                 ArchiveEsitoImportDetail archiveAccordoServizioParteSpecifica = archive.getAccordiServizioParteSpecifica().get(0);
  305.                 IDServizio idServizio = ((ArchiveAccordoServizioParteSpecifica)archiveAccordoServizioParteSpecifica.getArchiveObject()).getIdAccordoServizioParteSpecifica();
  306.                 String uriAccordo = this.idServizioFactory.getUriFromIDServizio(idServizio);
  307.                 bfEsito.append("\t- [").append(uriAccordo).append("] ");
  308.                 this.esitoUtils.serializeStato(archiveAccordoServizioParteSpecifica, bfEsito, importOperation);
  309.                 if(archiveAccordoServizioParteSpecifica.getState()!=null &&
  310.                         (ArchiveStatoImport.CREATED.equals(archiveAccordoServizioParteSpecifica.getState())) ||
  311.                         ArchiveStatoImport.UPDATED.equals(archiveAccordoServizioParteSpecifica.getState())) {
  312.                     if(archive.getPorteApplicative().size()>0) {
  313.                         bfEsito.append("\n\n!!Attenzione!!: E' stata creata un'erogazione con stato disabilitato.\n\tDefinire correttamente il connettore ed abilitare l'erogazione per renderla operativa");
  314.                     }
  315.                     else if(archive.getPorteDelegate().size()>0) {
  316.                         bfEsito.append("\n\n!!Attenzione!!: E' stata creata una fruizione con stato disabilitato.\n\tDefinire correttamente il connettore ed abilitare la fruizione per renderla operativa");
  317.                     }
  318.                 }
  319.             }catch(Exception e){
  320.                 bfEsito.append("\t- non importato: ").append(e.getMessage());
  321.             }
  322.         }
  323.        
  324.        
  325.         // Accordi di Servizio Composto
  326.         else if(archive.getAccordiServizioComposto().size()>0){
  327.             bfEsito.append("Accordi di Servizio Composto\n");
  328.             try{
  329.                 ArchiveEsitoImportDetail archiveAccordoServizioComposto = archive.getAccordiServizioComposto().get(0);
  330.                 IDAccordo idAccordo = ((ArchiveAccordoServizioComposto)archiveAccordoServizioComposto.getArchiveObject()).getIdAccordoServizioParteComune();
  331.                 String uriAccordo = this.idAccordoFactory.getUriFromIDAccordo(idAccordo);
  332.                 bfEsito.append("\t- [").append(uriAccordo).append("] ");
  333.                 this.esitoUtils.serializeStato(archiveAccordoServizioComposto, bfEsito, importOperation);
  334.             }catch(Exception e){
  335.                 bfEsito.append("\t- non importato: ").append(e.getMessage());
  336.             }
  337.         }
  338.        
  339.        
  340.         // Accordi di Servizio Parte Specifica (implementano accordi di servizio composto)
  341.         if(archive.getAccordiServizioParteSpecificaServiziComposti().size()>0){
  342.             bfEsito.append("Accordi di Servizio Composto Parte Specifica\n");
  343.             try{
  344.                 ArchiveEsitoImportDetail archiveAccordoServizioParteSpecifica = archive.getAccordiServizioParteSpecificaServiziComposti().get(0);
  345.                 IDServizio idServizio = ((ArchiveAccordoServizioParteSpecifica)archiveAccordoServizioParteSpecifica.getArchiveObject()).getIdAccordoServizioParteSpecifica();
  346.                 String uriAccordo = this.idServizioFactory.getUriFromIDServizio(idServizio);
  347.                 bfEsito.append("\t- [").append(uriAccordo).append("] ");
  348.                 this.esitoUtils.serializeStato(archiveAccordoServizioParteSpecifica, bfEsito, importOperation);
  349.             }catch(Exception e){
  350.                 bfEsito.append("\t- non importato: ").append(e.getMessage());
  351.             }
  352.         }
  353.        
  354.         return bfEsito.toString();
  355.     }
  356.    
  357.    
  358.    
  359.    
  360.    
  361.    
  362.    
  363.    
  364.    
  365.    
  366.     /* ----- Import ----- */
  367.    
  368.     @Override
  369.     public List<ImportMode> getImportModes() throws ProtocolException {
  370.         List<ImportMode> list = super.getImportModes();
  371.         if(this.spcoopProperties.isGestionePackageSICA()) {
  372.             list.add(new ImportMode(SPCoopCostantiArchivi.CNIPA_MODE));
  373.         }
  374.         return list;
  375.     }

  376.     @Override
  377.     public Archive importArchive(byte[]archive,ArchiveMode mode,ArchiveModeType type,
  378.             IRegistryReader registryReader,IConfigIntegrationReader configIntegrationReader,
  379.             boolean validationDocuments, MapPlaceholder placeholder) throws ProtocolException {
  380.        
  381.         if(org.openspcoop2.protocol.basic.Costanti.OPENSPCOOP_IMPORT_ARCHIVE_MODE.equals(mode)){
  382.             return super.importArchive(archive, mode, type, registryReader,configIntegrationReader,
  383.                     validationDocuments, placeholder);
  384.         }
  385.         else if(SPCoopCostantiArchivi.CNIPA_MODE.equals(mode)){
  386.            
  387.             if(SPCoopCostantiArchivi.TYPE_APC.equals(type)){
  388.                 try{
  389.                     return this.importEngine.buildAccordoServizioParteComune(archive, registryReader,validationDocuments);
  390.                 }catch(SPCoopConvertToPackageCNIPAException e){
  391.                     throw new ProtocolException(e.getMessage(), e);
  392.                 }
  393.             }
  394.             else if(SPCoopCostantiArchivi.TYPE_ASC.equals(type)){
  395.                 try{
  396.                     return this.importEngine.buildAccordoServizioComposto(archive, registryReader,validationDocuments);
  397.                 }catch(SPCoopConvertToPackageCNIPAException e){
  398.                     throw new ProtocolException(e.getMessage(), e);
  399.                 }
  400.             }
  401.             else if(SPCoopCostantiArchivi.TYPE_APS.equals(type)){
  402.                 try{
  403.                     return this.importEngine.buildAccordoServizioParteSpecifica(archive, registryReader,validationDocuments);
  404.                 }catch(SPCoopConvertToPackageCNIPAException e){
  405.                     throw new ProtocolException(e.getMessage(), e);
  406.                 }
  407.             }
  408.             else if(SPCoopCostantiArchivi.TYPE_ADC.equals(type)){
  409.                 try{
  410.                     return this.importEngine.buildAccordoCooperazione(archive, registryReader);
  411.                 }catch(SPCoopConvertToPackageCNIPAException e){
  412.                     throw new ProtocolException(e.getMessage(), e);
  413.                 }
  414.             }
  415.             else if(SPCoopCostantiArchivi.TYPE_ALL.equals(type)){
  416.                 try{
  417.                     return this.importEngine.buildAccordoServizioParteComune(archive, registryReader,validationDocuments);
  418.                 }catch(SPCoopConvertToPackageCNIPAException eAPC){
  419.                     try{
  420.                         return this.importEngine.buildAccordoServizioComposto(archive, registryReader,validationDocuments);
  421.                     }catch(SPCoopConvertToPackageCNIPAException eAComposto){
  422.                         try{
  423.                             return this.importEngine.buildAccordoServizioParteSpecifica(archive, registryReader,validationDocuments);
  424.                         }catch(SPCoopConvertToPackageCNIPAException eAPS){
  425.                             try{
  426.                                 return this.importEngine.buildAccordoCooperazione(archive, registryReader);
  427.                             }catch(SPCoopConvertToPackageCNIPAException eADC){
  428.                                 throw new ProtocolException("L'archivio fornito non e' stato possibile interpretarlo come nessuno dei package supportati (per ottenere maggiori dettagli re-importarlo indicando un tipo specifico): "+
  429.                                             SPCoopCostantiArchivi.TYPE_APC
  430.                                             +","+
  431.                                             SPCoopCostantiArchivi.TYPE_APS
  432.                                             +","+
  433.                                             SPCoopCostantiArchivi.TYPE_ASC
  434.                                             +","+
  435.                                             SPCoopCostantiArchivi.TYPE_ADC);
  436.                             }
  437.                         }
  438.                     }
  439.                 }
  440.             }
  441.             else{
  442.                 throw new ProtocolException("Type ["+type+"] unknown");
  443.             }
  444.         }
  445.         else{
  446.             throw new ProtocolException("Mode ["+mode+"] unknown");
  447.         }      
  448.            
  449.     }
  450.    
  451.     @Override
  452.     public Archive importArchive(InputStream archive,ArchiveMode mode,ArchiveModeType type,
  453.             IRegistryReader registryReader, IConfigIntegrationReader configIntegrationReader,
  454.             boolean validationDocuments, MapPlaceholder placeholder) throws ProtocolException {
  455.        
  456.         byte[] bytes = null;
  457.         try{
  458.             bytes = Utilities.getAsByteArray(archive);
  459.         }
  460.         catch(Exception e){
  461.             throw new ProtocolException(e.getMessage(),e);
  462.         }
  463.         finally{
  464.             try{
  465.                 if(archive!=null){
  466.                     archive.close();
  467.                 }
  468.             }catch(Exception eClose){
  469.                 // close
  470.             }
  471.         }
  472.         return this.importArchive(bytes, mode, type, registryReader, configIntegrationReader,
  473.                 validationDocuments, placeholder);
  474.     }
  475.    
  476.     @Override
  477.     public void finalizeImportArchive(Archive archive,ArchiveMode mode,ArchiveModeType type,
  478.             IRegistryReader registryReader,IConfigIntegrationReader configIntegrationReader,
  479.             boolean validationDocuments, MapPlaceholder placeholder) throws ProtocolException {
  480.         if(org.openspcoop2.protocol.basic.Costanti.OPENSPCOOP_IMPORT_ARCHIVE_MODE.equals(mode)){
  481.             super.finalizeImportArchive(archive, mode, type, registryReader,configIntegrationReader,
  482.                     validationDocuments, placeholder);
  483.         }
  484.         else if(SPCoopCostantiArchivi.CNIPA_MODE.equals(mode)){
  485.            
  486.             if(SPCoopCostantiArchivi.TYPE_APC.equals(type)){
  487.                 // nop;
  488.             }
  489.             else if(SPCoopCostantiArchivi.TYPE_ASC.equals(type)){
  490.                 // nop;
  491.             }
  492.             else if(SPCoopCostantiArchivi.TYPE_APS.equals(type)){
  493.                 try{
  494.                     this.importEngine.finalizeAccordoServizioParteSpecifica(archive, registryReader,validationDocuments);
  495.                 }catch(SPCoopConvertToPackageCNIPAException e){
  496.                     throw new ProtocolException(e.getMessage(), e);
  497.                 }
  498.             }
  499.             else if(SPCoopCostantiArchivi.TYPE_ADC.equals(type)){
  500.                 // nop;
  501.             }
  502.             else if(SPCoopCostantiArchivi.TYPE_ALL.equals(type)){
  503.                 try{
  504.                     this.importEngine.finalizeAccordoServizioParteSpecifica(archive, registryReader,validationDocuments);
  505.                 }catch(SPCoopConvertToPackageCNIPAException e){
  506.                     throw new ProtocolException(e.getMessage(), e);
  507.                 }
  508.             }
  509.             else{
  510.                 throw new ProtocolException("Type ["+type+"] unknown");
  511.             }
  512.         }
  513.         else{
  514.             throw new ProtocolException("Mode ["+mode+"] unknown");
  515.         }
  516.     }
  517.    
  518.     @Override
  519.     public String toString(ArchiveEsitoImport esito, ArchiveMode archiveMode) throws ProtocolException{
  520.         if(org.openspcoop2.protocol.basic.Costanti.OPENSPCOOP_IMPORT_ARCHIVE_MODE.equals(archiveMode)){
  521.             return super.toString(esito, archiveMode);
  522.         }
  523.         else if(SPCoopCostantiArchivi.CNIPA_MODE.equals(archiveMode)){
  524.             return this.toString(esito,true);
  525.         }
  526.         else{
  527.             throw new ProtocolException("Mode ["+archiveMode+"] unknown");
  528.         }  
  529.     }
  530.    
  531.     @Override
  532.     public String toString(ArchiveEsitoDelete esito, ArchiveMode archiveMode) throws ProtocolException{
  533.         if(org.openspcoop2.protocol.basic.Costanti.OPENSPCOOP_IMPORT_ARCHIVE_MODE.equals(archiveMode)){
  534.             return super.toString(esito, archiveMode);
  535.         }
  536.         else if(SPCoopCostantiArchivi.CNIPA_MODE.equals(archiveMode)){
  537.             return this.toString(esito,false);
  538.         }
  539.         else{
  540.             throw new ProtocolException("Mode ["+archiveMode+"] unknown");
  541.         }
  542.     }
  543.    
  544.    
  545.    
  546.    
  547.    
  548.    
  549.     /* ----- Export ----- */
  550.    
  551.     @Override
  552.     public List<ExportMode> getExportModes(ArchiveType archiveType) throws ProtocolException {
  553.         List<ExportMode> list = super.getExportModes(archiveType);
  554.         if(this.spcoopProperties.isGestionePackageSICA()) {
  555.             switch (archiveType) {
  556.             case ACCORDO_SERVIZIO_PARTE_COMUNE:
  557.             case ACCORDO_SERVIZIO_PARTE_SPECIFICA:
  558.             case ACCORDO_SERVIZIO_COMPOSTO:
  559.             case ACCORDO_COOPERAZIONE:
  560.                 ExportMode exportSICA = new ExportMode(SPCoopCostantiArchivi.EXPORT_MODE_COMPATIBILITA_CLIENT_SICA);
  561.                 ExportMode exportComplete = new ExportMode(SPCoopCostantiArchivi.EXPORT_MODE_INFORMAZIONI_COMPLETE);
  562.                 list.add(exportSICA);
  563.                 list.add(exportComplete);
  564.                 break;
  565.             default:
  566.                 break;
  567.             }
  568.         }
  569.         return list;
  570.     }
  571.    
  572.     @Override
  573.     public byte[] exportArchive(Archive archive, ArchiveMode mode,
  574.             IRegistryReader registroReader, IConfigIntegrationReader configIntegrationReader)
  575.             throws ProtocolException {
  576.        
  577.         if(org.openspcoop2.protocol.basic.Costanti.OPENSPCOOP_EXPORT_ARCHIVE_MODE.equals(mode)){
  578.             return super.exportArchive(archive, mode, registroReader, configIntegrationReader);
  579.         }
  580.         else if(SPCoopCostantiArchivi.EXPORT_MODE_COMPATIBILITA_CLIENT_SICA.equals(mode) ||
  581.                 SPCoopCostantiArchivi.EXPORT_MODE_INFORMAZIONI_COMPLETE.equals(mode)){
  582.             try{
  583.                 ByteArrayOutputStream bout = new ByteArrayOutputStream();
  584.                 this.exportEngine.exportArchive(archive, mode, registroReader, bout);
  585.                 bout.flush();
  586.                 bout.close();
  587.                 return bout.toByteArray();
  588.             }catch(Exception e){
  589.                 throw new ProtocolException(e.getMessage(),e);
  590.             }
  591.         }
  592.         else{
  593.             throw new ProtocolException("Mode ["+mode+"] unknown");
  594.         }  
  595.        
  596.     }

  597.     @Override
  598.     public void exportArchive(Archive archive, OutputStream out, ArchiveMode mode,
  599.             IRegistryReader registroReader, IConfigIntegrationReader configIntegrationReader)
  600.             throws ProtocolException {
  601.         if(org.openspcoop2.protocol.basic.Costanti.OPENSPCOOP_EXPORT_ARCHIVE_MODE.equals(mode)){
  602.             super.exportArchive(archive, out, mode, registroReader, configIntegrationReader);
  603.         }
  604.         else if(SPCoopCostantiArchivi.EXPORT_MODE_COMPATIBILITA_CLIENT_SICA.equals(mode) ||
  605.                 SPCoopCostantiArchivi.EXPORT_MODE_INFORMAZIONI_COMPLETE.equals(mode)){
  606.             this.exportEngine.exportArchive(archive, mode, registroReader, out);
  607.         }
  608.         else{
  609.             throw new ProtocolException("Mode ["+mode+"] unknown");
  610.         }  
  611.     }

  612.    


  613.    
  614. }