SPCoopArchiveExport.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.protocol.spcoop.archive;
import it.gov.spcoop.sica.dao.AccordoServizioComposto;
import it.gov.spcoop.sica.dao.Costanti;
import it.gov.spcoop.sica.dao.driver.XMLUtils;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.openspcoop2.core.constants.TipiConnettore;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoCooperazione;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.ConfigurazioneServizio;
import org.openspcoop2.core.registry.Connettore;
import org.openspcoop2.core.registry.Property;
import org.openspcoop2.core.registry.Soggetto;
import org.openspcoop2.core.registry.constants.StatiAccordo;
import org.openspcoop2.core.registry.driver.IDAccordoCooperazioneFactory;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.archive.Archive;
import org.openspcoop2.protocol.sdk.archive.ArchiveMode;
import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
import org.openspcoop2.protocol.spcoop.constants.SPCoopCostantiArchivi;
import org.openspcoop2.protocol.spcoop.sica.SICAtoOpenSPCoopContext;
import org.openspcoop2.protocol.spcoop.sica.SICAtoOpenSPCoopUtilities;
/**
* SPCoopArchiveExport
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class SPCoopArchiveExport {
private IProtocolFactory<?> protocolFactory = null;
private Logger logger = null;
public SPCoopArchiveExport(IProtocolFactory<?> protocolFactory){
this.protocolFactory = protocolFactory;
this.logger = this.protocolFactory.getLogger();
}
public void exportArchive(Archive archive,ArchiveMode archiveMode,IRegistryReader registryReader,OutputStream out) throws ProtocolException{
int countArchiveForExport = 0;
if(archive.getAccordiServizioParteComune()!=null){
countArchiveForExport+=archive.getAccordiServizioParteComune().size();
}
if(archive.getAccordiServizioComposto()!=null){
countArchiveForExport+=archive.getAccordiServizioComposto().size();
}
if(archive.getAccordiCooperazione()!=null){
countArchiveForExport+=archive.getAccordiCooperazione().size();
}
if(archive.getAccordiServizioParteSpecifica()!=null){
countArchiveForExport+=archive.getAccordiServizioParteSpecifica().size();
}
boolean multiArchive = countArchiveForExport>1;
boolean clientSICACompatibility = SPCoopCostantiArchivi.EXPORT_MODE_COMPATIBILITA_CLIENT_SICA.equals(archiveMode);
try{
if(multiArchive){
multiArchive(out, archive, clientSICACompatibility, registryReader);
}
else{
if(archive.getAccordiServizioParteComune()!=null && archive.getAccordiServizioParteComune().size()==1){
this.exportAccordoServizio(archive.getAccordiServizioParteComune().get(0).getAccordoServizioParteComune(),
out, clientSICACompatibility, registryReader, false);
}
else if(archive.getAccordiServizioComposto()!=null && archive.getAccordiServizioComposto().size()==1){
this.exportAccordoServizio(archive.getAccordiServizioComposto().get(0).getAccordoServizioParteComune(),
out, clientSICACompatibility, registryReader, true);
}
else if(archive.getAccordiServizioParteSpecifica()!=null && archive.getAccordiServizioParteSpecifica().size()==1){
this.exportAccordoServizio(archive.getAccordiServizioParteSpecifica().get(0).getAccordoServizioParteSpecifica(),
out, clientSICACompatibility, registryReader);
}
else if(archive.getAccordiCooperazione()!=null && archive.getAccordiCooperazione().size()==1){
this.exportAccordoCooperazione(archive.getAccordiCooperazione().get(0).getAccordoCooperazione(),
out, clientSICACompatibility, registryReader);
}
}
}catch(ProtocolException pExc){
throw pExc;
}
catch(Exception e){
throw new ProtocolException("Conversione archivio non riuscita: "+e.getMessage(),e);
}
}
private void multiArchive(OutputStream out,Archive archive,boolean clientSICACompatibility,IRegistryReader registryReader) throws Exception{
ZipOutputStream zip = new ZipOutputStream(out);
if(archive.getAccordiServizioParteComune()!=null && archive.getAccordiServizioParteComune().size()>1){
for (int i = 0; i < archive.getAccordiServizioParteComune().size(); i++) {
AccordoServizioParteComune accordo = archive.getAccordiServizioParteComune().get(i).getAccordoServizioParteComune();
String filename = accordo.getNome();
if(accordo.getSoggettoReferente()!=null){
filename+="_"+accordo.getSoggettoReferente().getTipo()+accordo.getSoggettoReferente().getNome();
}
if(accordo.getVersione()!=null){
filename+="_"+accordo.getVersione();
}
filename += "." + Costanti.ESTENSIONE_ACCORDO_SERVIZIO_PARTE_COMUNE;
zip.putNextEntry(new ZipEntry(filename));
ByteArrayOutputStream bout = new ByteArrayOutputStream();
this.exportAccordoServizio(accordo, bout, clientSICACompatibility, registryReader,false);
bout.flush();
bout.close();
zip.write(bout.toByteArray());
zip.closeEntry();
}
}
if(archive.getAccordiServizioComposto()!=null && archive.getAccordiServizioComposto().size()>1){
for (int i = 0; i < archive.getAccordiServizioComposto().size(); i++) {
AccordoServizioParteComune accordo = archive.getAccordiServizioComposto().get(i).getAccordoServizioParteComune();
String filename = accordo.getNome();
if(accordo.getSoggettoReferente()!=null){
filename+="_"+accordo.getSoggettoReferente().getTipo()+accordo.getSoggettoReferente().getNome();
}
if(accordo.getVersione()!=null){
filename+="_"+accordo.getVersione();
}
filename += "." + Costanti.ESTENSIONE_ACCORDO_SERVIZIO_COMPOSTO;
zip.putNextEntry(new ZipEntry(filename));
ByteArrayOutputStream bout = new ByteArrayOutputStream();
this.exportAccordoServizio(accordo, bout, clientSICACompatibility, registryReader,true);
bout.flush();
bout.close();
zip.write(bout.toByteArray());
zip.closeEntry();
}
}
if(archive.getAccordiServizioParteSpecifica()!=null && archive.getAccordiServizioParteSpecifica().size()>1){
for (int i = 0; i < archive.getAccordiServizioParteSpecifica().size(); i++) {
AccordoServizioParteSpecifica accordo = archive.getAccordiServizioParteSpecifica().get(i).getAccordoServizioParteSpecifica();
String filename = accordo.getTipo()+accordo.getNome();
filename+="_"+accordo.getTipoSoggettoErogatore()+accordo.getNomeSoggettoErogatore();
if(accordo.getVersione()!=null){
filename+="_"+accordo.getVersione().intValue();
}
filename += "." + Costanti.ESTENSIONE_ACCORDO_SERVIZIO_PARTE_SPECIFICA;
zip.putNextEntry(new ZipEntry(filename));
ByteArrayOutputStream bout = new ByteArrayOutputStream();
this.exportAccordoServizio(accordo, bout, clientSICACompatibility, registryReader);
bout.flush();
bout.close();
zip.write(bout.toByteArray());
zip.closeEntry();
}
}
if(archive.getAccordiCooperazione()!=null && archive.getAccordiCooperazione().size()>1){
for (int i = 0; i < archive.getAccordiCooperazione().size(); i++) {
AccordoCooperazione accordo = archive.getAccordiCooperazione().get(i).getAccordoCooperazione();
String filename = accordo.getNome();
if(accordo.getSoggettoReferente()!=null){
filename+="_"+accordo.getSoggettoReferente().getTipo()+accordo.getSoggettoReferente().getNome();
}
if(accordo.getVersione()!=null){
filename+="_"+accordo.getVersione();
}
filename += "." + Costanti.ESTENSIONE_ACCORDO_COOPERAZIONE;
zip.putNextEntry(new ZipEntry(filename));
ByteArrayOutputStream bout = new ByteArrayOutputStream();
this.exportAccordoCooperazione(accordo, bout, clientSICACompatibility, registryReader);
bout.flush();
bout.close();
zip.write(bout.toByteArray());
zip.closeEntry();
}
}
zip.flush();
zip.close();
}
private void exportAccordoServizio(AccordoServizioParteComune accordo,OutputStream out,
boolean clientSICACompatibility,IRegistryReader registryReader,boolean servizioComposto) throws ProtocolException, SPCoopConvertToPackageCNIPAException{
String uriAccordo = null;
try{
uriAccordo = IDAccordoFactory.getInstance().getUriFromAccordo(accordo);
SICAtoOpenSPCoopContext sicaContext = new SICAtoOpenSPCoopContext();
sicaContext.setSICAClientCompatibility(clientSICACompatibility);
String tipoAccordo = "Accordo di Servizio Parte Comune";
if(servizioComposto){
tipoAccordo = "Accordo di Servizio Composto";
}
// *** Verifica informazioni presenti nel package ***
// stato
if(StatiAccordo.finale.toString().equals(accordo.getStatoPackage())==false){
throw new Exception(tipoAccordo+" in uno stato non finale ["+accordo.getStatoPackage()+"]");
}
// descrizione
if(accordo.getDescrizione()==null){
if(accordo.getSoggettoReferente()!=null)
accordo.setDescrizione(tipoAccordo+" (Versione:"+accordo.getVersione()+") "+
accordo.getNome()+" con soggetto referente "+accordo.getSoggettoReferente().getTipo()+"/"+accordo.getSoggettoReferente().getNome());
else
accordo.setDescrizione(tipoAccordo+" (Versione:"+accordo.getVersione()+") "+
accordo.getNome());
}
// *** impostazione mapping soggetto con codice IPA ***
// Imposto CodiceIPA per Referente e erogatori servizi componenti (in caso di servizio composto)
SPCoopArchiveExportUtils.setCodiceIPA(accordo, sicaContext, registryReader);
// Imposto uriAPS per Servizi che sono servizi componenti
SPCoopArchiveExportUtils.setURI_APS(accordo, sicaContext, registryReader);
// *** Trasformazione in package CNIPA ***
XMLUtils xmlSICAUtilities = new XMLUtils(sicaContext,this.logger);
byte[]archivio = null;
if(servizioComposto){
AccordoServizioComposto asc = SICAtoOpenSPCoopUtilities.accordoServizioComposto_openspcoopToSica(registryReader, accordo,sicaContext,this.logger);
archivio = xmlSICAUtilities.generateAccordoServizioComposto(asc);
}else{
it.gov.spcoop.sica.dao.AccordoServizioParteComune aspc = SICAtoOpenSPCoopUtilities.accordoServizioParteComune_openspcoopToSica(registryReader, accordo,sicaContext,this.logger);
archivio = xmlSICAUtilities.generateAccordoServizioParteComune(aspc);
}
out.write(archivio);
}catch(Exception e){
throw new ProtocolException("Conversione archivio ["+uriAccordo+"] non riuscita: "+e.getMessage(),e);
}
}
private void exportAccordoServizio(AccordoServizioParteSpecifica accordo,OutputStream out,
boolean clientSICACompatibility,IRegistryReader registryReader) throws ProtocolException, SPCoopConvertToPackageCNIPAException{
String uriAccordo = null;
try{
uriAccordo = IDServizioFactory.getInstance().getUriFromAccordo(accordo);
SICAtoOpenSPCoopContext sicaContext = new SICAtoOpenSPCoopContext();
sicaContext.setSICAClientCompatibility(clientSICACompatibility);
String tipoAccordo = "Accordo di Servizio Parte Specifica";
// *** Verifica informazioni presenti nel package ***
// stato
if(StatiAccordo.finale.toString().equals(accordo.getStatoPackage())==false){
throw new Exception(tipoAccordo+" in uno stato non finale ["+accordo.getStatoPackage()+"]");
}
// descrizione
if(accordo.getDescrizione()==null){
accordo.setDescrizione(tipoAccordo+" (Versione:"+accordo.getVersione()+" Tipo:"+accordo.getTipo()+") "+
accordo.getNome()+" con soggetto referente "+accordo.getTipoSoggettoErogatore()+"/"+accordo.getNomeSoggettoErogatore());
}
// connettore
if(accordo.getConfigurazioneServizio()!=null && accordo.getConfigurazioneServizio().getConnettore()!=null &&
!TipiConnettore.DISABILITATO.toString().equals(accordo.getConfigurazioneServizio().getConnettore().getTipo()) &&
!TipiConnettore.HTTP.toString().equals(accordo.getConfigurazioneServizio().getConnettore().getTipo()) &&
!TipiConnettore.HTTPS.toString().equals(accordo.getConfigurazioneServizio().getConnettore().getTipo())){
throw new Exception("Accordo di servizio parte specifica possiede un connettore ("+accordo.getConfigurazioneServizio().getConnettore().getTipo()+") non utilizzabile nella rete SPC");
}
if(accordo.getConfigurazioneServizio()==null || accordo.getConfigurazioneServizio().getConnettore()==null ||
TipiConnettore.DISABILITATO.toString().equals(accordo.getConfigurazioneServizio().getConnettore().getTipo())){
// imposto connettore del soggetto erogatore
Soggetto soggettoErogatore = registryReader.getSoggetto(new IDSoggetto(accordo.getTipoSoggettoErogatore(),accordo.getNomeSoggettoErogatore()));
if(soggettoErogatore.getConnettore()!=null && !TipiConnettore.DISABILITATO.toString().equals(soggettoErogatore.getConnettore().getTipo()) &&
!TipiConnettore.HTTP.toString().equals(soggettoErogatore.getConnettore().getTipo()) &&
!TipiConnettore.HTTPS.toString().equals(soggettoErogatore.getConnettore().getTipo())){
throw new Exception("Accordo di servizio parte specifica non possiede un connettore e soggetto erogatore "+
accordo.getTipoSoggettoErogatore()+"/"+accordo.getNomeSoggettoErogatore()+
" possiede un connettore ("+soggettoErogatore.getConnettore().getTipo()+") non utilizzabile nella rete SPC");
}
else if(soggettoErogatore.getConnettore()==null || TipiConnettore.DISABILITATO.toString().equals(soggettoErogatore.getConnettore().getTipo()) ){
throw new Exception("Sia l'Accordo di servizio parte specifica che il soggetto erogatore non possiedono un connettore");
}
else{
Connettore cSoggettoErogatore = soggettoErogatore.getConnettore();
if(accordo.getConfigurazioneServizio()==null){
accordo.setConfigurazioneServizio(new ConfigurazioneServizio());
}
if(accordo.getConfigurazioneServizio().getConnettore()==null){
accordo.getConfigurazioneServizio().setConnettore(new Connettore());
}
accordo.getConfigurazioneServizio().getConnettore().setCustom(cSoggettoErogatore.getCustom()!=null && cSoggettoErogatore.getCustom());
accordo.getConfigurazioneServizio().getConnettore().setTipo(cSoggettoErogatore.getTipo());
while(accordo.getConfigurazioneServizio().getConnettore().sizePropertyList()>0){
accordo.getConfigurazioneServizio().getConnettore().removeProperty(0);
}
for(int i=0; i<cSoggettoErogatore.sizePropertyList(); i++){
Property cp = new Property();
cp.setNome(cSoggettoErogatore.getProperty(i).getNome());
cp.setValore(cSoggettoErogatore.getProperty(i).getValore());
accordo.getConfigurazioneServizio().getConnettore().addProperty(cp);
}
}
}
// *** impostazione mapping soggetto con codice IPA ***
IDAccordo idAccordoServizioParteComune = IDAccordoFactory.getInstance().getIDAccordoFromUri(accordo.getAccordoServizioParteComune());
IDServizio idS = IDServizioFactory.getInstance().getIDServizioFromValues(accordo.getTipo(), accordo.getNome(),
accordo.getTipoSoggettoErogatore(), accordo.getNomeSoggettoErogatore(),
accordo.getVersione());
SPCoopArchiveExportUtils.setCodiceIPA(idS, idAccordoServizioParteComune, sicaContext, registryReader);
// *** Trasformazione in package CNIPA ***
XMLUtils xmlSICAUtilities = new XMLUtils(sicaContext,this.logger);
AccordoServizioParteComune as = null;
AccordoServizioParteComune asIncludereWSDLParteSpecifica = null;
if(sicaContext.isWSDL_XSD_accordiParteSpecifica_gestioneParteComune()){
as = registryReader.getAccordoServizioParteComune(idAccordoServizioParteComune,true, true);
asIncludereWSDLParteSpecifica = as;
}else{
as = registryReader.getAccordoServizioParteComune(idAccordoServizioParteComune);
}
boolean implementazioneAccordoServizioComposto = as.getServizioComposto()!=null;
// Trasformazione da openspcoop a sica
it.gov.spcoop.sica.dao.AccordoServizioParteSpecifica aspc =
SICAtoOpenSPCoopUtilities.accordoServizioParteSpecifica_openspcoopToSica(registryReader,accordo,implementazioneAccordoServizioComposto,
asIncludereWSDLParteSpecifica,sicaContext,this.logger);
byte[]archivio = xmlSICAUtilities.generateAccordoServizioParteSpecifica(aspc);
out.write(archivio);
}catch(Exception e){
throw new ProtocolException("Conversione archivio ["+uriAccordo+"] non riuscita: "+e.getMessage(),e);
}
}
private void exportAccordoCooperazione(AccordoCooperazione accordo,OutputStream out,
boolean clientSICACompatibility,IRegistryReader registryReader) throws ProtocolException, SPCoopConvertToPackageCNIPAException{
String uriAccordo = null;
try{
uriAccordo = IDAccordoCooperazioneFactory.getInstance().getUriFromAccordo(accordo);
SICAtoOpenSPCoopContext sicaContext = new SICAtoOpenSPCoopContext();
sicaContext.setSICAClientCompatibility(clientSICACompatibility);
String tipoAccordo = "Accordo di Cooperazione";
// *** Verifica informazioni presenti nel package ***
// stato
if(StatiAccordo.finale.toString().equals(accordo.getStatoPackage())==false){
throw new Exception(tipoAccordo+" in uno stato non finale ["+accordo.getStatoPackage()+"]");
}
// descrizione
if(accordo.getDescrizione()==null){
if(accordo.getSoggettoReferente()!=null)
accordo.setDescrizione(tipoAccordo+" (Versione:"+accordo.getVersione()+") "+
accordo.getNome()+" con soggetto referente "+accordo.getSoggettoReferente().getTipo()+"/"+accordo.getSoggettoReferente().getNome());
else
accordo.setDescrizione(tipoAccordo+" (Versione:"+accordo.getVersione()+") "+
accordo.getNome());
}
// *** impostazione mapping soggetto con codice IPA ***
// Imposto CodiceIPA memorizzato per Coordinatore, partecipanti e erogatori servizi composti
SPCoopArchiveExportUtils.setCodiceIPA(accordo, sicaContext, registryReader);
// *** Trasformazione in package CNIPA ***
XMLUtils xmlSICAUtilities = new XMLUtils(sicaContext,this.logger);
it.gov.spcoop.sica.dao.AccordoCooperazione ac_sica = SICAtoOpenSPCoopUtilities.accordoCooperazione_openspcoopToSica(registryReader,accordo,sicaContext,this.logger);
byte[]archivio = xmlSICAUtilities.generateAccordoCooperazione(ac_sica);
out.write(archivio);
}catch(Exception e){
throw new ProtocolException("Conversione archivio ["+uriAccordo+"] non riuscita: "+e.getMessage(),e);
}
}
}