BasicArchive.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.basic.archive;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.wsdl.BindingOperation;
import javax.xml.namespace.QName;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.Operation;
import org.openspcoop2.core.registry.PortType;
import org.openspcoop2.core.registry.Resource;
import org.openspcoop2.core.registry.ResourceParameter;
import org.openspcoop2.core.registry.ResourceRepresentation;
import org.openspcoop2.core.registry.ResourceRepresentationJson;
import org.openspcoop2.core.registry.ResourceRepresentationXml;
import org.openspcoop2.core.registry.ResourceRequest;
import org.openspcoop2.core.registry.ResourceResponse;
import org.openspcoop2.core.registry.constants.CostantiRegistroServizi;
import org.openspcoop2.core.registry.constants.FormatoSpecifica;
import org.openspcoop2.core.registry.constants.HttpMethod;
import org.openspcoop2.core.registry.constants.ParameterType;
import org.openspcoop2.core.registry.constants.ProfiloCollaborazione;
import org.openspcoop2.core.registry.constants.RepresentationType;
import org.openspcoop2.core.registry.constants.RepresentationXmlType;
import org.openspcoop2.core.registry.constants.ServiceBinding;
import org.openspcoop2.core.registry.driver.IDAccordoCooperazioneFactory;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.core.registry.wsdl.AccordoServizioWrapperUtilities;
import org.openspcoop2.message.xml.MessageXMLUtils;
import org.openspcoop2.protocol.basic.BasicComponentFactory;
import org.openspcoop2.protocol.basic.Costanti;
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.ArchiveEsitoDelete;
import org.openspcoop2.protocol.sdk.archive.ArchiveEsitoImport;
import org.openspcoop2.protocol.sdk.archive.ArchiveMode;
import org.openspcoop2.protocol.sdk.archive.ArchiveModeType;
import org.openspcoop2.protocol.sdk.archive.ExportMode;
import org.openspcoop2.protocol.sdk.archive.IArchive;
import org.openspcoop2.protocol.sdk.archive.ImportMode;
import org.openspcoop2.protocol.sdk.archive.MapPlaceholder;
import org.openspcoop2.protocol.sdk.archive.MappingModeTypesExtensions;
import org.openspcoop2.protocol.sdk.constants.ArchiveType;
import org.openspcoop2.protocol.sdk.registry.IConfigIntegrationReader;
import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
import org.openspcoop2.utils.rest.ApiFactory;
import org.openspcoop2.utils.rest.ApiFormats;
import org.openspcoop2.utils.rest.ApiReaderConfig;
import org.openspcoop2.utils.rest.IApiReader;
import org.openspcoop2.utils.rest.ParseWarningException;
import org.openspcoop2.utils.rest.api.Api;
import org.openspcoop2.utils.rest.api.ApiBodyParameter;
import org.openspcoop2.utils.rest.api.ApiCookieParameter;
import org.openspcoop2.utils.rest.api.ApiHeaderParameter;
import org.openspcoop2.utils.rest.api.ApiOperation;
import org.openspcoop2.utils.rest.api.ApiReference;
import org.openspcoop2.utils.rest.api.ApiRequestDynamicPathParameter;
import org.openspcoop2.utils.rest.api.ApiRequestFormParameter;
import org.openspcoop2.utils.rest.api.ApiRequestQueryParameter;
import org.openspcoop2.utils.rest.api.ApiResponse;
import org.openspcoop2.utils.transport.http.HttpRequestMethod;
import org.openspcoop2.utils.wsdl.DefinitionWrapper;
import org.openspcoop2.utils.wsdl.WSDLUtilities;
import org.openspcoop2.utils.xml.AbstractXMLUtils;
import org.slf4j.Logger;
import org.w3c.dom.Document;
/**
* BasicArchive
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class BasicArchive extends BasicComponentFactory implements IArchive {
protected IDAccordoCooperazioneFactory idAccordoCooperazioneFactory;
protected IDAccordoFactory idAccordoFactory;
protected IDServizioFactory idServizioFactory;
protected EsitoUtils esitoUtils;
public BasicArchive(IProtocolFactory<?> protocolFactory) throws ProtocolException{
super(protocolFactory);
this.idAccordoCooperazioneFactory = IDAccordoCooperazioneFactory.getInstance();
this.idAccordoFactory = IDAccordoFactory.getInstance();
this.idServizioFactory = IDServizioFactory.getInstance();
this.esitoUtils = new EsitoUtils(protocolFactory);
}
/* ----- Utilita' generali ----- */
@Override
public MappingModeTypesExtensions getMappingTypesExtensions(ArchiveMode mode)
throws ProtocolException {
MappingModeTypesExtensions m = new MappingModeTypesExtensions();
m.add(Costanti.OPENSPCOOP_ARCHIVE_EXT, Costanti.OPENSPCOOP_ARCHIVE_MODE_TYPE);
return m;
}
private static boolean normalizeDescription255 = false;
public static boolean isNormalizeDescription255() {
return normalizeDescription255;
}
public static void setNormalizeDescription255(boolean normalizeDescription255) {
BasicArchive.normalizeDescription255 = normalizeDescription255;
}
private static boolean normalizeDescription4000 = false;
public static boolean isNormalizeDescription4000() {
return normalizeDescription4000;
}
public static void setNormalizeDescription4000(boolean normalizeDescription4000) {
BasicArchive.normalizeDescription4000 = normalizeDescription4000;
}
private String normalizeDescriptionApi(String description) {
if(BasicArchive.normalizeDescription255) {
return normalizeDescriptionEngine(description, 255);
}
else if(BasicArchive.normalizeDescription4000) {
return normalizeDescriptionEngine(description, 4000);
}
else {
return description;
}
}
private String normalizeDescriptionOtherElementApi(String description) {
return normalizeDescriptionEngine(description, 255);
}
private String normalizeDescriptionEngine(String description, int maxSize) {
if(description==null) {
return null;
}
String descr = description;
while(descr.contains("\r")) {
descr = descr.replace("\r", "");
}
int offset = 15; // uso maxSize-15 per essere sicuro che finisca in oracle con caratteri strani (value too large for column "GOVWAY330"."ACCORDI"."DESCRIZIONE" (actual: 257, maximum: 255))
if(descr.length()<=(maxSize-offset)) {
return descr;
}
else {
int ulterioreOffset = 10;
if(maxSize==4000) {
ulterioreOffset = 50;
}
return descr.substring(0, ((maxSize-ulterioreOffset)-offset))+ " ...";
}
}
/**
* Imposta per ogni portType e operation presente nell'accordo fornito come parametro
* le informazioni di protocollo analizzando i documenti interni agli archivi
*/
@Override
public void setProtocolInfo(AccordoServizioParteComune accordoServizioParteComune) throws ProtocolException{
setProtocolInfoEngine(accordoServizioParteComune, this.protocolFactory.getLogger());
}
public void setProtocolInfo(AccordoServizioParteComune accordoServizioParteComune,Logger log) throws ProtocolException{
setProtocolInfoEngine(accordoServizioParteComune, log);
}
private void setProtocolInfoEngine(AccordoServizioParteComune accordoServizioParteComune,Logger log) throws ProtocolException{
// NOTA non usare in questo metodo e nel metodo _setProtocolInfo il protocolFactory e dipendenze su di uno specifico protocollo.
// Viene usato dal meccanismo di import per definire la struttura di un accordo in base al wsdl, indipendentemente dallo specifico protocollo
if(ServiceBinding.SOAP.equals(accordoServizioParteComune.getServiceBinding())) {
if(accordoServizioParteComune.sizePortTypeList()>0){
throw new ProtocolException("Protocol Info already exists");
}
if(accordoServizioParteComune.getFormatoSpecifica()==null || FormatoSpecifica.WSDL_11.equals(accordoServizioParteComune.getFormatoSpecifica())) {
byte[] wsdlConcettuale = accordoServizioParteComune.getByteWsdlConcettuale();
if(wsdlConcettuale!=null){
setProtocolInfoFromWsdlEngine(wsdlConcettuale, accordoServizioParteComune, "Concettuale", log);
}
else{
if(accordoServizioParteComune.getByteWsdlLogicoErogatore()!=null){
setProtocolInfoFromWsdlEngine(accordoServizioParteComune.getByteWsdlLogicoErogatore(), accordoServizioParteComune, "LogicoErogatore", log);
}
if(accordoServizioParteComune.getByteWsdlLogicoFruitore()!=null){
setProtocolInfoFromWsdlEngine(accordoServizioParteComune.getByteWsdlLogicoFruitore(), accordoServizioParteComune, "LogicoFruitore", log);
}
}
}
}
else {
if(accordoServizioParteComune.sizeResourceList()>0){
throw new ProtocolException("Protocol Info already exists");
}
if(accordoServizioParteComune.getFormatoSpecifica()!=null) {
byte[] wsdlConcettuale = accordoServizioParteComune.getByteWsdlConcettuale();
if(wsdlConcettuale!=null){
switch (accordoServizioParteComune.getFormatoSpecifica()) {
case WADL:
setProtocolInfoFromRestInterfaceEngine(wsdlConcettuale, accordoServizioParteComune, ApiFormats.WADL, log);
break;
case SWAGGER_2:
setProtocolInfoFromRestInterfaceEngine(wsdlConcettuale, accordoServizioParteComune, ApiFormats.SWAGGER_2, log);
break;
case OPEN_API_3:
setProtocolInfoFromRestInterfaceEngine(wsdlConcettuale, accordoServizioParteComune, ApiFormats.OPEN_API_3, log);
break;
default:
// altre interfacce non supportate per rest
break;
}
}
}
}
}
private void setProtocolInfoFromWsdlEngine(byte [] wsdlBytes,AccordoServizioParteComune accordoServizioParteComune,String tipo,Logger log) throws ProtocolException{
try{
AbstractXMLUtils xmlUtils = MessageXMLUtils.DEFAULT;
WSDLUtilities wsdlUtilities = new WSDLUtilities(xmlUtils);
Document d = xmlUtils.newDocument(wsdlBytes);
wsdlUtilities.removeTypes(d);
DefinitionWrapper wsdl = new DefinitionWrapper(d,xmlUtils,false,false);
// port types
Map<?, ?> porttypesWSDL = wsdl.getAllPortTypes();
if(porttypesWSDL==null || porttypesWSDL.size()<=0){
throw new ProtocolException("WSDL"+tipo+" corrotto: non contiene la definizione di nessun port-type");
}
if(porttypesWSDL!=null && porttypesWSDL.size()>0){
Iterator<?> it = porttypesWSDL.keySet().iterator();
while(it.hasNext()){
javax.xml.namespace.QName key = (javax.xml.namespace.QName) it.next();
javax.wsdl.PortType ptWSDL = (javax.wsdl.PortType) porttypesWSDL.get(key);
String ptName = ptWSDL.getQName().getLocalPart();
// cerco portType
boolean foundPortType = false;
PortType ptOpenSPCoop = null;
for (PortType ptCheck : accordoServizioParteComune.getPortTypeList()) {
if(ptCheck.getNome().equals(ptName)){
ptOpenSPCoop = ptCheck;
foundPortType = true;
break;
}
}
// cerco binding (se il wsdl contiene la parte implementativa)
Map<?, ?> bindingsWSDL = wsdl.getAllBindings();
javax.wsdl.Binding bindingWSDL = null;
if(bindingsWSDL!=null && bindingsWSDL.size()>0){
Iterator<?> itBinding = bindingsWSDL.keySet().iterator();
while (itBinding.hasNext()) {
javax.xml.namespace.QName tmp = (javax.xml.namespace.QName) itBinding.next();
if(tmp!=null){
javax.wsdl.Binding tmpBinding = wsdl.getBinding(tmp);
if(tmpBinding!=null && tmpBinding.getPortType()!=null &&
tmpBinding.getPortType().getQName()!=null &&
ptName.equals(tmpBinding.getPortType().getQName().getLocalPart())){
bindingWSDL = tmpBinding;
break;
}
}
}
}
// se non esiste creo il port-type
if(ptOpenSPCoop==null){
ptOpenSPCoop = new PortType();
ptOpenSPCoop.setNome(ptName);
ptOpenSPCoop.setProfiloCollaborazione(CostantiRegistroServizi.SINCRONO);
ptOpenSPCoop.setProfiloPT(CostantiRegistroServizi.PROFILO_AZIONE_RIDEFINITO);
ptOpenSPCoop.setFiltroDuplicati(CostantiRegistroServizi.ABILITATO);
}
// Calcolo profilo del port-type
ProfiloCollaborazione profiloPt = accordoServizioParteComune.getProfiloCollaborazione();
if(CostantiRegistroServizi.PROFILO_AZIONE_RIDEFINITO.equals(ptOpenSPCoop.getProfiloPT()) && ptOpenSPCoop.getProfiloCollaborazione()!=null) {
profiloPt = ptOpenSPCoop.getProfiloCollaborazione();
}
// SoapBinding
if(bindingWSDL!=null){
AccordoServizioWrapperUtilities.setPortTypeSoapBindingStyle(bindingWSDL, log, ptOpenSPCoop);
}
// itero sulle operation
for(int i=0; i<ptWSDL.getOperations().size();i++){
javax.wsdl.Operation opWSDL = (javax.wsdl.Operation) ptWSDL.getOperations().get(i);
String opNome = opWSDL.getName();
boolean foundOperation = false;
Operation opOpenSPCoop = null;
for (Operation opCheck : ptOpenSPCoop.getAzioneList()) {
if(opCheck.getNome().equals(opNome)){
foundOperation = true;
break;
}
}
if(foundOperation){
continue;// gia definito in un altro wsdl (normale e correlato) ??
}
// imposto dati base operazione
opOpenSPCoop = new Operation();
opOpenSPCoop.setNome(opNome);
opOpenSPCoop.setProfAzione(CostantiRegistroServizi.PROFILO_AZIONE_RIDEFINITO);
opOpenSPCoop.setFiltroDuplicati(CostantiRegistroServizi.ABILITATO);
// Prendo la definizione del messaggio di input
HashMap<String,QName> mapPartQNameInput = new HashMap<>();
AccordoServizioWrapperUtilities.addMessageInputOperation(opWSDL, log, opOpenSPCoop, mapPartQNameInput);
// Prendo la definizione del messaggio di output
HashMap<String,QName> mapPartQNameOutput = new HashMap<>();
AccordoServizioWrapperUtilities.addMessageOutputOperation(opWSDL, log, opOpenSPCoop, mapPartQNameOutput);
// profilo di collaborazione (non basta guardare l'output, poiche' puo' avere poi un message vuoto e quindi equivale a non avere l'output)
/**if(opWSDL.getOutput()!=null){*/
ProfiloCollaborazione profiloOp = null;
if(opOpenSPCoop.getMessageOutput()!=null){
profiloOp = CostantiRegistroServizi.SINCRONO;
}else{
profiloOp = CostantiRegistroServizi.ONEWAY;
}
opOpenSPCoop.setProfiloCollaborazione(profiloOp);
if(profiloPt.equals(profiloOp)) {
opOpenSPCoop.setProfAzione(CostantiRegistroServizi.PROFILO_AZIONE_DEFAULT);
}
// cerco operation binding (se il wsdl contiene la parte implementativa)
if(bindingWSDL!=null){
List<?> bindingsOperation = bindingWSDL.getBindingOperations();
for(int j=0; j<bindingsOperation.size();j++){
BindingOperation bindingOperationWSDL = (BindingOperation) bindingsOperation.get(j);
if(bindingOperationWSDL.getOperation()!=null &&
opNome.equals(bindingOperationWSDL.getOperation().getName())){
// SoapBinding Operation
AccordoServizioWrapperUtilities.
setOperationSoapBindingInformation(bindingOperationWSDL, log,
opOpenSPCoop, ptOpenSPCoop);
// Raccolgo Message-Input
if(opOpenSPCoop.getMessageInput()!=null){
AccordoServizioWrapperUtilities.
setMessageInputSoapBindingInformation(bindingOperationWSDL, log,
opOpenSPCoop, ptOpenSPCoop, mapPartQNameInput,
wsdl.getTargetNamespace());
}
// Raccolgo Message-Output
if(opOpenSPCoop.getMessageOutput()!=null){
AccordoServizioWrapperUtilities.
setMessageOutputSoapBindingInformation(bindingOperationWSDL, log,
opOpenSPCoop, ptOpenSPCoop, mapPartQNameOutput,
wsdl.getTargetNamespace());
}
}
}
}
// aggiunto l'azione al port type
ptOpenSPCoop.addAzione(opOpenSPCoop);
}
if(!foundPortType){
accordoServizioParteComune.addPortType(ptOpenSPCoop);
}
}
}
}catch(Exception e){
throw new ProtocolException(e.getMessage(),e);
}
}
private static final String TROVATO_PARAMETRO_COOKIE_PREFIX = "Trovato parametro cookie '";
private static final String TROVATO_PARAMETRO_HEADER_PREFIX = "Trovato parametro header '";
private static final String SENZA_TIPO_SUFFIX = "' senza tipo";
private static final String SENZA_SCHEMA_SUFFIX = "' senza schema";
private void setProtocolInfoFromRestInterfaceEngine(byte [] bytes,AccordoServizioParteComune accordoServizioParteComune,ApiFormats format,Logger log) throws ProtocolException{
try {
ApiReaderConfig config = new ApiReaderConfig();
config.setProcessInclude(false);
IApiReader apiReader = ApiFactory.newApiReader(format);
apiReader.init(log, bytes, config);
Api api = apiReader.read();
try {
boolean usingFromSetProtocolInfo = true;
api.validate(usingFromSetProtocolInfo, false);
}catch(ParseWarningException warning) {
// ignore
}
if(
(accordoServizioParteComune.getDescrizione()==null || "".equals(accordoServizioParteComune.getDescrizione()))
&&
(api.getDescription()!=null)
){
accordoServizioParteComune.setDescrizione(this.normalizeDescriptionApi(api.getDescription()));
}
if(api.sizeOperations()>0) {
for (ApiOperation apiOp : api.getOperations()) {
// cerco resource
Resource resourceOpenSPCoop = null;
for (Resource resourceCheck : accordoServizioParteComune.getResourceList()) {
if(resourceCheck.getPath()!=null && resourceCheck.getMethod()!=null) {
HttpRequestMethod httpMethodCheck = HttpRequestMethod.valueOf(resourceCheck.getMethod().getValue());
if(resourceCheck.getPath().equals(apiOp.getPath()) &&
httpMethodCheck!=null &&
httpMethodCheck.equals(apiOp.getHttpMethod())) {
resourceOpenSPCoop = resourceCheck;
break;
}
}
}
// se non esiste creo la risorsa
if(resourceOpenSPCoop==null){
resourceOpenSPCoop = new Resource();
resourceOpenSPCoop.setNome(APIUtils.normalizeResourceName(apiOp.getHttpMethod(), apiOp.getPath()));
resourceOpenSPCoop.setDescrizione(this.normalizeDescriptionOtherElementApi(apiOp.getDescription()));
resourceOpenSPCoop.setMethod(HttpMethod.toEnumConstant(apiOp.getHttpMethod().name()));
resourceOpenSPCoop.setPath(apiOp.getPath());
accordoServizioParteComune.addResource(resourceOpenSPCoop);
}
// Richiesta
if(resourceOpenSPCoop.getRequest()==null) {
resourceOpenSPCoop.setRequest(new ResourceRequest());
}
if(apiOp.getRequest()!=null) {
if(apiOp.getRequest().sizeBodyParameters()>0) {
for (ApiBodyParameter body : apiOp.getRequest().getBodyParameters()) {
String mediaType = body.getMediaType();
ResourceRepresentation rr = null;
for (ResourceRepresentation rrCheck : resourceOpenSPCoop.getRequest().getRepresentationList()) {
if(mediaType.equals(rrCheck.getMediaType())) {
rr = rrCheck;
break;
}
}
if(rr==null) {
rr = new ResourceRepresentation();
rr.setMediaType(mediaType);
resourceOpenSPCoop.getRequest().addRepresentation(rr);
}
rr.setNome(body.getName());
rr.setDescrizione(this.normalizeDescriptionOtherElementApi(body.getDescription()));
if(body.getElement()!=null) {
if(body.getElement() instanceof QName) {
QName qname = (QName)body.getElement();
rr.setRepresentationType(RepresentationType.XML);
ResourceRepresentationXml xml = new ResourceRepresentationXml();
xml.setXmlType(RepresentationXmlType.ELEMENT);
xml.setNome(qname.getLocalPart());
xml.setNamespace(qname.getNamespaceURI());
rr.setXml(xml);
}
else if(body.getElement() instanceof String) {
String jsonType = (String)body.getElement();
rr.setRepresentationType(RepresentationType.JSON);
ResourceRepresentationJson json = new ResourceRepresentationJson();
json.setTipo(jsonType);
rr.setJson(json);
}
else if(body.getElement() instanceof ApiReference) {
ApiReference apiRef = (ApiReference) body.getElement();
String jsonType = apiRef.getType();
rr.setRepresentationType(RepresentationType.JSON);
ResourceRepresentationJson json = new ResourceRepresentationJson();
json.setTipo(apiRef.getSchemaRef()+"#"+jsonType);
rr.setJson(json);
}
else {
rr.setRepresentationType(null);
rr.setJson(null);
rr.setXml(null);
}
}
else {
rr.setRepresentationType(null);
rr.setJson(null);
rr.setXml(null);
}
}
}
if(apiOp.getRequest().sizeCookieParameters()>0) {
for (ApiCookieParameter cookie : apiOp.getRequest().getCookieParameters()) {
String nome = cookie.getName();
if(nome==null) {
throw new ProtocolException("Trovato parametro cookie senza nome");
}
ResourceParameter rp = null;
for (ResourceParameter rpCheck : resourceOpenSPCoop.getRequest().getParameterList()) {
if(ParameterType.COOKIE.equals(rpCheck.getParameterType()) && nome.equals(rpCheck.getNome())) {
rp = rpCheck;
break;
}
}
if(rp==null) {
rp = new ResourceParameter();
rp.setParameterType(ParameterType.COOKIE);
rp.setNome(cookie.getName());
resourceOpenSPCoop.getRequest().addParameter(rp);
}
rp.setDescrizione(this.normalizeDescriptionOtherElementApi(cookie.getDescription()));
rp.setRequired(cookie.isRequired());
if(cookie.getApiParameterSchema()!=null) {
String type = cookie.getApiParameterSchema().getType();
if(type==null) {
throw new ProtocolException(TROVATO_PARAMETRO_COOKIE_PREFIX+rp.getNome()+SENZA_TIPO_SUFFIX);
}
rp.setTipo(type);
rp.setRestrizioni(cookie.getApiParameterSchema().toString());
}
else {
throw new ProtocolException(TROVATO_PARAMETRO_COOKIE_PREFIX+rp.getNome()+SENZA_SCHEMA_SUFFIX);
}
}
}
if(apiOp.getRequest().sizeDynamicPathParameters()>0) {
for (ApiRequestDynamicPathParameter dynamicPath : apiOp.getRequest().getDynamicPathParameters()) {
String nome = dynamicPath.getName();
if(nome==null) {
throw new ProtocolException("Trovato parametro dynamic path senza nome");
}
ResourceParameter rp = null;
for (ResourceParameter rpCheck : resourceOpenSPCoop.getRequest().getParameterList()) {
if(ParameterType.DYNAMIC_PATH.equals(rpCheck.getParameterType()) && nome.equals(rpCheck.getNome())) {
rp = rpCheck;
break;
}
}
if(rp==null) {
rp = new ResourceParameter();
rp.setParameterType(ParameterType.DYNAMIC_PATH);
rp.setNome(dynamicPath.getName());
resourceOpenSPCoop.getRequest().addParameter(rp);
}
rp.setDescrizione(this.normalizeDescriptionOtherElementApi(dynamicPath.getDescription()));
rp.setRequired(dynamicPath.isRequired());
if(dynamicPath.getApiParameterSchema()!=null) {
String type = dynamicPath.getApiParameterSchema().getType();
if(type==null) {
throw new ProtocolException("Trovato parametro dynamic path '"+rp.getNome()+SENZA_TIPO_SUFFIX);
}
rp.setTipo(type);
rp.setRestrizioni(dynamicPath.getApiParameterSchema().toString());
}
else {
throw new ProtocolException("Trovato parametro dynamic path '"+rp.getNome()+SENZA_SCHEMA_SUFFIX);
}
}
}
if(apiOp.getRequest().sizeFormParameters()>0) {
for (ApiRequestFormParameter form : apiOp.getRequest().getFormParameters()) {
String nome = form.getName();
if(nome==null) {
throw new ProtocolException("Trovato parametro form senza nome");
}
ResourceParameter rp = null;
for (ResourceParameter rpCheck : resourceOpenSPCoop.getRequest().getParameterList()) {
if(ParameterType.FORM.equals(rpCheck.getParameterType()) && nome.equals(rpCheck.getNome())) {
rp = rpCheck;
break;
}
}
if(rp==null) {
rp = new ResourceParameter();
rp.setParameterType(ParameterType.FORM);
rp.setNome(form.getName());
resourceOpenSPCoop.getRequest().addParameter(rp);
}
rp.setDescrizione(this.normalizeDescriptionOtherElementApi(form.getDescription()));
rp.setRequired(form.isRequired());
if(form.getApiParameterSchema()!=null) {
String type = form.getApiParameterSchema().getType();
if(type==null) {
throw new ProtocolException("Trovato parametro form '"+rp.getNome()+SENZA_TIPO_SUFFIX);
}
rp.setTipo(type);
rp.setRestrizioni(form.getApiParameterSchema().toString());
}
else {
throw new ProtocolException("Trovato parametro form '"+rp.getNome()+SENZA_SCHEMA_SUFFIX);
}
}
}
if(apiOp.getRequest().sizeHeaderParameters()>0) {
for (ApiHeaderParameter header : apiOp.getRequest().getHeaderParameters()) {
String nome = header.getName();
if(nome==null) {
throw new ProtocolException("Trovato parametro header senza nome");
}
ResourceParameter rp = null;
for (ResourceParameter rpCheck : resourceOpenSPCoop.getRequest().getParameterList()) {
if(ParameterType.HEADER.equals(rpCheck.getParameterType()) && nome.equals(rpCheck.getNome())) {
rp = rpCheck;
break;
}
}
if(rp==null) {
rp = new ResourceParameter();
rp.setParameterType(ParameterType.HEADER);
rp.setNome(header.getName());
resourceOpenSPCoop.getRequest().addParameter(rp);
}
rp.setDescrizione(this.normalizeDescriptionOtherElementApi(header.getDescription()));
rp.setRequired(header.isRequired());
if(header.getApiParameterSchema()!=null) {
String type = header.getApiParameterSchema().getType();
if(type==null) {
throw new ProtocolException(TROVATO_PARAMETRO_HEADER_PREFIX+rp.getNome()+SENZA_TIPO_SUFFIX);
}
rp.setTipo(type);
rp.setRestrizioni(header.getApiParameterSchema().toString());
}
else {
throw new ProtocolException(TROVATO_PARAMETRO_HEADER_PREFIX+rp.getNome()+SENZA_SCHEMA_SUFFIX);
}
}
}
if(apiOp.getRequest().sizeQueryParameters()>0) {
for (ApiRequestQueryParameter query : apiOp.getRequest().getQueryParameters()) {
String nome = query.getName();
if(nome==null) {
throw new ProtocolException("Trovato parametro query senza nome");
}
ResourceParameter rp = null;
for (ResourceParameter rpCheck : resourceOpenSPCoop.getRequest().getParameterList()) {
if(ParameterType.QUERY.equals(rpCheck.getParameterType()) && nome.equals(rpCheck.getNome())) {
rp = rpCheck;
break;
}
}
if(rp==null) {
rp = new ResourceParameter();
rp.setParameterType(ParameterType.QUERY);
rp.setNome(query.getName());
resourceOpenSPCoop.getRequest().addParameter(rp);
}
rp.setDescrizione(this.normalizeDescriptionOtherElementApi(query.getDescription()));
rp.setRequired(query.isRequired());
if(query.getApiParameterSchema()!=null) {
String type = query.getApiParameterSchema().getType();
if(type==null) {
throw new ProtocolException("Trovato parametro query '"+rp.getNome()+SENZA_TIPO_SUFFIX);
}
rp.setTipo(type);
rp.setRestrizioni(query.getApiParameterSchema().toString());
}
else {
throw new ProtocolException("Trovato parametro query '"+rp.getNome()+SENZA_SCHEMA_SUFFIX);
}
}
}
}
// Risposta
if(apiOp.sizeResponses()>0) {
for (ApiResponse apiResponse : apiOp.getResponses()) {
int status = apiResponse.getHttpReturnCode();
boolean defaultResponse = apiResponse.isDefaultHttpReturnCode();
ResourceResponse resourceOpenSPCoopResponse = null;
for (ResourceResponse resourceCheck : resourceOpenSPCoop.getResponseList()) {
if( (status == resourceCheck.getStatus()) || (defaultResponse && ApiResponse.isDefaultHttpReturnCode(resourceCheck.getStatus()))) {
resourceOpenSPCoopResponse = resourceCheck;
break;
}
}
if(resourceOpenSPCoopResponse==null) {
resourceOpenSPCoopResponse = new ResourceResponse();
if(defaultResponse) {
resourceOpenSPCoopResponse.setStatus(ApiResponse.getDefaultHttpReturnCode());
}
else {
resourceOpenSPCoopResponse.setStatus(status);
}
resourceOpenSPCoop.addResponse(resourceOpenSPCoopResponse);
}
resourceOpenSPCoopResponse.setDescrizione(this.normalizeDescriptionOtherElementApi(apiResponse.getDescription()));
if(apiResponse.sizeBodyParameters()>0) {
for (ApiBodyParameter body : apiResponse.getBodyParameters()) {
String mediaType = body.getMediaType();
ResourceRepresentation rr = null;
for (ResourceRepresentation rrCheck : resourceOpenSPCoopResponse.getRepresentationList()) {
if(mediaType.equals(rrCheck.getMediaType())) {
rr = rrCheck;
break;
}
}
if(rr==null) {
rr = new ResourceRepresentation();
rr.setMediaType(mediaType);
resourceOpenSPCoopResponse.addRepresentation(rr);
}
rr.setNome(body.getName());
rr.setDescrizione(this.normalizeDescriptionOtherElementApi(body.getDescription()));
if(body.getElement()!=null) {
if(body.getElement() instanceof QName) {
QName qname = (QName)body.getElement();
rr.setRepresentationType(RepresentationType.XML);
ResourceRepresentationXml xml = new ResourceRepresentationXml();
xml.setXmlType(RepresentationXmlType.ELEMENT);
xml.setNome(qname.getLocalPart());
xml.setNamespace(qname.getNamespaceURI());
rr.setXml(xml);
}
else if(body.getElement() instanceof String) {
String jsonType = (String)body.getElement();
rr.setRepresentationType(RepresentationType.JSON);
ResourceRepresentationJson json = new ResourceRepresentationJson();
json.setTipo(jsonType);
rr.setJson(json);
}
else if(body.getElement() instanceof ApiReference) {
ApiReference apiRef = (ApiReference) body.getElement();
String jsonType = apiRef.getType();
rr.setRepresentationType(RepresentationType.JSON);
ResourceRepresentationJson json = new ResourceRepresentationJson();
json.setTipo(apiRef.getSchemaRef()+"#"+jsonType);
rr.setJson(json);
}
else {
rr.setRepresentationType(null);
rr.setJson(null);
rr.setXml(null);
}
}
else {
rr.setRepresentationType(null);
rr.setJson(null);
rr.setXml(null);
}
}
}
if(apiResponse.sizeCookieParameters()>0) {
for (ApiCookieParameter cookie : apiResponse.getCookieParameters()) {
String nome = cookie.getName();
if(nome==null) {
throw new ProtocolException("Trovato parametro cookie nella risposta senza nome");
}
ResourceParameter rp = null;
for (ResourceParameter rpCheck : resourceOpenSPCoopResponse.getParameterList()) {
if(ParameterType.COOKIE.equals(rpCheck.getParameterType()) && nome.equals(rpCheck.getNome())) {
rp = rpCheck;
break;
}
}
if(rp==null) {
rp = new ResourceParameter();
rp.setParameterType(ParameterType.COOKIE);
rp.setNome(cookie.getName());
resourceOpenSPCoopResponse.addParameter(rp);
}
rp.setDescrizione(this.normalizeDescriptionOtherElementApi(cookie.getDescription()));
rp.setRequired(cookie.isRequired());
if(cookie.getApiParameterSchema()!=null) {
String type = cookie.getApiParameterSchema().getType();
if(type==null) {
throw new ProtocolException(TROVATO_PARAMETRO_COOKIE_PREFIX+rp.getNome()+"' nella risposta senza tipo");
}
rp.setTipo(type);
rp.setRestrizioni(cookie.getApiParameterSchema().toString());
}
else {
throw new ProtocolException(TROVATO_PARAMETRO_COOKIE_PREFIX+rp.getNome()+"' nella risposta senza schema");
}
}
}
if(apiResponse.sizeHeaderParameters()>0) {
for (ApiHeaderParameter header : apiResponse.getHeaderParameters()) {
String nome = header.getName();
if(nome==null) {
throw new ProtocolException("Trovato parametro header nella risposta senza nome");
}
ResourceParameter rp = null;
for (ResourceParameter rpCheck : resourceOpenSPCoopResponse.getParameterList()) {
if(ParameterType.HEADER.equals(rpCheck.getParameterType()) && nome.equals(rpCheck.getNome())) {
rp = rpCheck;
break;
}
}
if(rp==null) {
rp = new ResourceParameter();
rp.setParameterType(ParameterType.HEADER);
rp.setNome(header.getName());
resourceOpenSPCoopResponse.addParameter(rp);
}
rp.setDescrizione(this.normalizeDescriptionOtherElementApi(header.getDescription()));
rp.setRequired(header.isRequired());
if(header.getApiParameterSchema()!=null) {
String type = header.getApiParameterSchema().getType();
if(type==null) {
throw new ProtocolException(TROVATO_PARAMETRO_HEADER_PREFIX+rp.getNome()+"' nella risposta senza tipo");
}
rp.setTipo(type);
rp.setRestrizioni(header.getApiParameterSchema().toString());
}
else {
throw new ProtocolException(TROVATO_PARAMETRO_HEADER_PREFIX+rp.getNome()+"' nella risposta senza schema");
}
}
}
}
}
}
}
// Check nomi univoci delle risorse
if(accordoServizioParteComune.sizeResourceList()>0) {
boolean foundEquals = true;
while (foundEquals) {
foundEquals = false;
for (int i = 0; i < accordoServizioParteComune.sizeResourceList(); i++) {
Resource resource = accordoServizioParteComune.getResource(i);
List<Resource> lR = new ArrayList<>();
for (Resource resourceCheck : accordoServizioParteComune.getResourceList()) {
if(resourceCheck.getNome().equals(resource.getNome())) {
lR.add(resourceCheck);
}
}
if(lR.size()>1) {
for (int j = 0; j < lR.size(); j++) {
Resource resourceDaModificare = lR.get(j);
String newName = resourceDaModificare.getNome();
if(newName.length()>250) {
newName = newName.substring(0, 250)+"_"+(j+1);
}
else {
newName = newName +"_"+(j+1);
}
resourceDaModificare.setNome(newName);
}
foundEquals = true;
}
}
}
}
}catch(Exception e){
throw new ProtocolException(e.getMessage(),e);
}
}
/* ----- Import ----- */
@Override
public List<ImportMode> getImportModes() throws ProtocolException {
List<ImportMode> list = new ArrayList<>();
list.add(Costanti.OPENSPCOOP_IMPORT_ARCHIVE_MODE);
return list;
}
@Override
public Archive importArchive(byte[]archive,ArchiveMode mode,ArchiveModeType type,
IRegistryReader registryReader,IConfigIntegrationReader configIntegrationReader,
boolean validationDocuments, MapPlaceholder placeholder) throws ProtocolException {
ZIPReadUtils zipUtils = new ZIPReadUtils(this.protocolFactory.getLogger(),registryReader,configIntegrationReader);
return zipUtils.getArchive(archive,placeholder,validationDocuments);
}
@Override
public Archive importArchive(InputStream archive,ArchiveMode mode,ArchiveModeType type,
IRegistryReader registryReader,IConfigIntegrationReader configIntegrationReader,
boolean validationDocuments, MapPlaceholder placeholder) throws ProtocolException {
try{
ZIPReadUtils zipUtils = new ZIPReadUtils(this.protocolFactory.getLogger(),registryReader,configIntegrationReader);
return zipUtils.getArchive(archive,placeholder,validationDocuments);
}finally{
try{
if(archive!=null){
archive.close();
}
}catch(Exception eClose){
// close
}
}
}
@Override
public void finalizeImportArchive(Archive archive,ArchiveMode mode,ArchiveModeType type,
IRegistryReader registryReader,IConfigIntegrationReader configIntegrationReader,
boolean validationDocuments, MapPlaceholder placeholder) throws ProtocolException {
// nop
}
@Override
public String toString(ArchiveEsitoImport esito, ArchiveMode archiveMode) throws ProtocolException{
return this.esitoUtils.toString(esito,true,true);
}
@Override
public String toString(ArchiveEsitoDelete esito, ArchiveMode archiveMode) throws ProtocolException{
return this.esitoUtils.toString(esito,true,false);
}
/* ----- Export ----- */
@Override
public List<ExportMode> getExportModes(ArchiveType archiveType)
throws ProtocolException {
List<ExportMode> list = new ArrayList<>();
list.add((ExportMode)Costanti.OPENSPCOOP_EXPORT_ARCHIVE_MODE.clone()); // vengono supportati tutti i tipi
return list;
}
@Override
public MappingModeTypesExtensions getExportMappingTypesExtensions(Archive archive, ArchiveMode mode,
IRegistryReader registroReader, IConfigIntegrationReader configIntegrationReader) throws ProtocolException{
return this.getMappingTypesExtensions(mode); // basic ignora archive
}
@Override
public byte[] exportArchive(Archive archive, ArchiveMode mode,
IRegistryReader registryReader,IConfigIntegrationReader configIntegrationReader)
throws ProtocolException {
ZIPWriteUtils zipUtils = new ZIPWriteUtils(super.getProtocolFactory().getLogger(),registryReader,configIntegrationReader);
return zipUtils.generateArchive(archive);
}
@Override
public void exportArchive(Archive archive, OutputStream out, ArchiveMode mode,
IRegistryReader registryReader,IConfigIntegrationReader configIntegrationReader)
throws ProtocolException {
ZIPWriteUtils zipUtils = new ZIPWriteUtils(super.getProtocolFactory().getLogger(),registryReader,configIntegrationReader);
zipUtils.generateArchive(archive, out);
}
}