ConnettoreNULL.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.pdd.core.connettori;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.openspcoop2.core.config.ResponseCachingConfigurazione;
import org.openspcoop2.core.transazioni.constants.TipoMessaggio;
import org.openspcoop2.message.OpenSPCoop2MessageFactory;
import org.openspcoop2.message.OpenSPCoop2SoapMessage;
import org.openspcoop2.message.constants.Costanti;
import org.openspcoop2.message.constants.MessageRole;
import org.openspcoop2.message.constants.MessageType;
import org.openspcoop2.message.soap.TunnelSoapUtils;
import org.openspcoop2.pdd.core.Utilities;
import org.openspcoop2.utils.date.DateManager;
import org.openspcoop2.utils.io.DumpByteArrayOutputStream;
import org.openspcoop2.utils.transport.TransportUtils;
import org.openspcoop2.utils.transport.http.HttpConstants;
/**
* Classe utilizzata per effettuare consegne di messaggi Soap, attraverso
* l'invocazione di un server http.
*
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class ConnettoreNULL extends ConnettoreBase {
@Override
public String getProtocollo() {
return "";
}
public static final String LOCATION = "govway://dev/null";
/* ******** METODI ******** */
@Override
protected boolean initializePreSend(ResponseCachingConfigurazione responseCachingConfig, ConnettoreMsg request) {
if(this.initialize(request, false, responseCachingConfig)==false){
return false;
}
return true;
}
@Override
protected boolean send(ConnettoreMsg request) {
this.codice = 200;
try{
// Tipologia di servizio
MessageType requestMessageType = this.requestMsg.getMessageType();
OpenSPCoop2SoapMessage soapMessageRequest = null;
if(this.debug)
this.logger.debug("Tipologia Servizio: "+this.requestMsg.getServiceBinding());
if(this.isSoap){
soapMessageRequest = this.requestMsg.castAsSoap();
}
// Collezione header di trasporto per dump
Map<String, List<String>> propertiesTrasportoDebug = null;
if(this.isDumpBinarioRichiesta()) {
propertiesTrasportoDebug = new HashMap<>();
}
// Impostazione Content-Type
String contentTypeRichiesta = null;
if(this.debug)
this.logger.debug("Impostazione content type...");
if(this.isSoap){
if(this.sbustamentoSoap && soapMessageRequest.countAttachments()>0 && TunnelSoapUtils.isTunnelOpenSPCoopSoap(soapMessageRequest)){
contentTypeRichiesta = TunnelSoapUtils.getContentTypeTunnelOpenSPCoopSoap(soapMessageRequest.getSOAPBody());
}else{
contentTypeRichiesta = this.requestMsg.getContentType();
}
if(contentTypeRichiesta==null){
throw new Exception("Content-Type del messaggio da spedire non definito");
}
}
else{
contentTypeRichiesta = this.requestMsg.getContentType();
// Content-Type non obbligatorio in REST
}
if(this.debug)
this.logger.info("Impostazione Content-Type ["+contentTypeRichiesta+"]",false);
if(contentTypeRichiesta!=null){
setRequestHeader(HttpConstants.CONTENT_TYPE, contentTypeRichiesta, this.logger, propertiesTrasportoDebug);
}
// Impostazione Proprieta del trasporto
if(this.debug)
this.logger.debug("Impostazione header di trasporto...");
this.forwardHttpRequestHeader();
if(this.propertiesTrasporto != null){
Iterator<String> keys = this.propertiesTrasporto.keySet().iterator();
while (keys.hasNext()) {
String key = (String) keys.next();
List<String> values = this.propertiesTrasporto.get(key);
if(this.debug) {
if(values!=null && !values.isEmpty()) {
for (String value : values) {
this.logger.info("Set Transport Header ["+key+"]=["+value+"]",false);
}
}
}
setRequestHeader(key, values, this.logger, propertiesTrasportoDebug);
}
}
// Aggiunga del SoapAction Header in caso di richiesta SOAP
// spostato sotto il forwardHeader per consentire alle trasformazioni di modificarla
if(this.isSoap && this.sbustamentoSoap == false){
if(this.debug)
this.logger.debug("Impostazione soap action...");
boolean existsTransportProperties = false;
if(TransportUtils.containsKey(this.propertiesTrasporto, Costanti.SOAP11_MANDATORY_HEADER_HTTP_SOAP_ACTION)){
this.soapAction = TransportUtils.getFirstValue(this.propertiesTrasporto, Costanti.SOAP11_MANDATORY_HEADER_HTTP_SOAP_ACTION);
existsTransportProperties = (this.soapAction!=null);
}
if(!existsTransportProperties) {
this.soapAction = soapMessageRequest.getSoapAction();
}
if(this.soapAction==null){
this.soapAction="\"OpenSPCoop\"";
}
if(MessageType.SOAP_11.equals(this.requestMsg.getMessageType()) && !existsTransportProperties){
// NOTA non quotare la soap action, per mantenere la trasparenza della PdD
setRequestHeader(Costanti.SOAP11_MANDATORY_HEADER_HTTP_SOAP_ACTION,this.soapAction, propertiesTrasportoDebug);
}
if(this.debug)
this.logger.info("SOAP Action inviata ["+this.soapAction+"]",false);
}
// SIMULAZIONE WRITE_TO
boolean consumeRequestMessage = true;
if(this.debug)
this.logger.debug("Serializzazione (consume-request-message:"+consumeRequestMessage+")...");
if(this.isDumpBinarioRichiesta()) {
DumpByteArrayOutputStream bout = null;
boolean close = true;
try {
bout = new DumpByteArrayOutputStream(this.dumpBinario_soglia, this.dumpBinario_repositoryFile, this.idTransazione,
TipoMessaggio.RICHIESTA_USCITA_DUMP_BINARIO.getValue());
this.emitDiagnosticStartDumpBinarioRichiestaUscita();
if(this.isSoap && this.sbustamentoSoap){
this.logger.debug("Sbustamento...");
TunnelSoapUtils.sbustamentoMessaggio(soapMessageRequest,bout);
}else{
this.requestMsg.writeTo(bout, consumeRequestMessage);
}
bout.flush();
bout.close();
close = false;
this.dataRichiestaInoltrata = DateManager.getDate();
this.dumpBinarioRichiestaUscita(bout, requestMessageType, contentTypeRichiesta, this.location, propertiesTrasportoDebug);
}finally {
try {
if(close && bout!=null) {
bout.close();
}
}catch(Throwable t) {
// ignore
}
try {
if(bout!=null) {
bout.clearResources();
}
}catch(Throwable t) {
this.logger.error("Release resources failed: "+t.getMessage(),t);
}
}
}
else {
org.apache.commons.io.output.NullOutputStream nullOutputStream = org.apache.commons.io.output.NullOutputStream.INSTANCE;
if(this.isSoap && this.sbustamentoSoap){
this.logger.debug("Sbustamento...");
TunnelSoapUtils.sbustamentoMessaggio(soapMessageRequest,nullOutputStream);
}else{
this.requestMsg.writeTo(nullOutputStream, consumeRequestMessage);
}
nullOutputStream.flush();
nullOutputStream.close();
this.dataRichiestaInoltrata = DateManager.getDate();
}
}catch(Exception e){
this.eccezioneProcessamento = e;
this.logger.error("Riscontrato errore durante la writeTo",e);
this.errore = "Riscontrato errore durante la writeTo: " +this.readExceptionMessageFromException(e);
return false;
}
try{
/* ------------ PostOutRequestHandler ------------- */
this.postOutRequest();
}catch(Exception e){
this.eccezioneProcessamento = e;
this.logger.error("Riscontrato errore durante la gestione PostOutRequestHandler",e);
this.errore = "Riscontrato errore durante la gestione PostOutRequestHandler: " +this.readExceptionMessageFromException(e);
return false;
}
// org.openspcoop2.utils.io.notifier.NotifierInputStreamParams notifierInputStreamParams = null;
// try{
//
// /* ------------ PreInResponseHandler ------------- */
// this.preInResponse();
//
// // Lettura risposta parametri NotifierInputStream per la risposta
// if(this.preInResponseContext!=null){
// notifierInputStreamParams = this.preInResponseContext.getNotifierInputStreamParams();
// }
//
// }catch(Exception e){
// this.eccezioneProcessamento = e;
// ConnettoreNULL.log.error("Riscontrato errore durante la gestione PreInResponseHandler",e);
// this.errore = "Riscontrato errore durante la gestione PreInResponseHandler: " +e.getMessage();
// return false;
// }
try{
OpenSPCoop2MessageFactory messageFactory = Utilities.getOpenspcoop2MessageFactory(this.logger.getLogger(),this.requestMsg, this.requestInfo, MessageRole.RESPONSE);
this.responseMsg = messageFactory.createEmptyMessage(this.requestMsg.getMessageType(),MessageRole.RESPONSE);
}catch(Exception e){
this.eccezioneProcessamento = e;
this.logger.error("Riscontrato errore durante la generazione di un msg SoapVuoto",e);
this.errore = "Riscontrato errore durante la generazione di un msg SoapVuoto: " +this.readExceptionMessageFromException(e);
return false;
}
return true;
}
private void setRequestHeader(String key, String value, ConnettoreLogger logger, Map<String, List<String>> propertiesTrasportoDebug) throws Exception {
List<String> list = new ArrayList<>();
list.add(value);
this.setRequestHeader(key, list, logger, propertiesTrasportoDebug);
}
private void setRequestHeader(String key, List<String> values, ConnettoreLogger logger, Map<String, List<String>> propertiesTrasportoDebug) throws Exception {
if(this.debug) {
if(values!=null && !values.isEmpty()) {
for (String value : values) {
this.logger.info("Set proprietà trasporto ["+key+"]=["+value+"]",false);
}
}
}
setRequestHeader(key, values, propertiesTrasportoDebug);
}
@Override
protected void setRequestHeader(String key,List<String> values) throws Exception {
// nop
}
/**
* Ritorna l'informazione su dove il connettore sta spedendo il messaggio
*
* @return location di inoltro del messaggio
* @throws ConnettoreException
*/
@Override
public String getLocation() throws ConnettoreException{
// Il connettore NULL ho possiede possibilita' di consegnare su di una url
//return ConnettoreUtils.buildLocationWithURLBasedParameter(this.requestMsg, this.propertiesUrlBased, LOCATION);
return LOCATION;
}
}