PreInRequestHandler.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.sdi.utils;

import java.util.Map;

import org.openspcoop2.core.constants.TipoPdD;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.core.handlers.HandlerException;
import org.openspcoop2.pdd.core.handlers.PreInRequestContext;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.openspcoop2.pdd.services.connector.messages.ConnectorInMessage;
import org.openspcoop2.protocol.sdi.constants.SDICostanti;
import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioRiceviFile;
import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioRiceviNotifica;
import org.openspcoop2.protocol.sdk.state.URLProtocolContext;

/**
 * PreInRequestHandler
 * 
 * @author Andrea Poli (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class PreInRequestHandler implements org.openspcoop2.pdd.core.handlers.PreInRequestHandler {

	@Override
	public void invoke(PreInRequestContext context) throws HandlerException {
		
		try{
		
			if(!TipoPdD.DELEGATA.equals(context.getTipoPorta())){
				return;
			}
						
			if(context.getTransportContext()==null){
				return;
			}
			
			Map<String, Object> transportContext = context.getTransportContext();
			Object inMessageObject = transportContext.get(PreInRequestContext.SERVLET_REQUEST);
			if(inMessageObject==null || (!(inMessageObject instanceof ConnectorInMessage))){
				return;
			}
			
			ConnectorInMessage inMessage = (ConnectorInMessage) inMessageObject;
			if(inMessage.getURLProtocolContext()==null){
				return;
			}
			
			if(!URLProtocolContext.PDtoSOAP_FUNCTION.equals(inMessage.getURLProtocolContext().getFunction()) &&
					!URLProtocolContext.PDtoSOAP_FUNCTION_GOVWAY.equals(inMessage.getURLProtocolContext().getFunction())){
				return;
			}
			if(!SDICostanti.SDI_PROTOCOL_NAME.equals(inMessage.getURLProtocolContext().getProtocolName())){
				return;
			}
			
			// Appendo l'azione dopo la versione
			String sdiFatturazioneAttiva = "/"+SDICostantiServizioRiceviFile.SDI_SERVIZIO_RICEVI_FILE+"/";
			String sdiFatturazioneAttivaConTipo = "/sdi_"+SDICostantiServizioRiceviFile.SDI_SERVIZIO_RICEVI_FILE+"/";
			boolean attiva = false;
			String sdiFatturazionePassiva = "/"+SDICostantiServizioRiceviNotifica.SDI_SERVIZIO_RICEVI_NOTIFICA+"/";
			String sdiFatturazionePassivaConTipo = "/sdi_"+SDICostantiServizioRiceviNotifica.SDI_SERVIZIO_RICEVI_NOTIFICA+"/";
			@SuppressWarnings("unused")
			boolean passiva = false;
			if( inMessage.getURLProtocolContext().getFunctionParameters().contains(sdiFatturazioneAttiva) 
					||
				inMessage.getURLProtocolContext().getFunctionParameters().contains(sdiFatturazioneAttivaConTipo)){
				String requestUri = inMessage.getURLProtocolContext().getRequestURI();
				String params =  inMessage.getURLProtocolContext().getFunctionParameters();
				if(requestUri.endsWith("/")==false) {
					requestUri = requestUri + "/";
				}
				if(params.endsWith("/")==false) {
					params = params + "/";
				}
				requestUri = requestUri + SDICostantiServizioRiceviFile.SDI_SERVIZIO_RICEVI_FILE_AZIONE_RICEVI_FILE;
				params = params + SDICostantiServizioRiceviFile.SDI_SERVIZIO_RICEVI_FILE_AZIONE_RICEVI_FILE;
				inMessage.getURLProtocolContext().setRequestURI(requestUri);
				inMessage.getURLProtocolContext().setFunctionParameters(params);
				attiva = true;
			}
			else if( inMessage.getURLProtocolContext().getFunctionParameters().contains(sdiFatturazionePassiva)
					||
					inMessage.getURLProtocolContext().getFunctionParameters().contains(sdiFatturazionePassivaConTipo)){
				String requestUri = inMessage.getURLProtocolContext().getRequestURI();
				String params =  inMessage.getURLProtocolContext().getFunctionParameters();
				if(requestUri.endsWith("/")==false) {
					requestUri = requestUri + "/";
				}
				if(params.endsWith("/")==false) {
					params = params + "/";
				}
				requestUri = requestUri + SDICostantiServizioRiceviNotifica.SDI_SERVIZIO_NOTIFICA_ESITO_AZIONE_NOTIFICA_ESITO;
				params = params + SDICostantiServizioRiceviNotifica.SDI_SERVIZIO_NOTIFICA_ESITO_AZIONE_NOTIFICA_ESITO;
				inMessage.getURLProtocolContext().setRequestURI(requestUri);
				inMessage.getURLProtocolContext().setFunctionParameters(params);
				passiva = true;
			}
			else {
				return;
			}
			
			if(attiva) {
				String valoreUrl = null;
				if(inMessage.getURLProtocolContext().getParameters()!=null &&
						inMessage.getURLProtocolContext().getParameters().size()>0){
					valoreUrl = inMessage.getURLProtocolContext().getParameterFirstValue(SDICostantiServizioRiceviFile.RICEVI_FILE_INTEGRAZIONE_URLBASED_TIPO_FILE);
				}
				
				String valoreHeader = null;
				if(inMessage.getURLProtocolContext().getHeaders()!=null &&
						inMessage.getURLProtocolContext().getHeaders().size()>0){
					valoreHeader = inMessage.getURLProtocolContext().getHeaderFirstValue(SDICostantiServizioRiceviFile.RICEVI_FILE_INTEGRAZIONE_TRASPORTO_TIPO_FILE_1);
					if(valoreHeader==null){
						valoreHeader = inMessage.getURLProtocolContext().getHeaderFirstValue(SDICostantiServizioRiceviFile.RICEVI_FILE_INTEGRAZIONE_TRASPORTO_TIPO_FILE_2);
					}
				}
				
				if(valoreUrl==null && valoreHeader==null){
					//return;
					// Bug Fix: OP-752
					// forzo xml che gestiro' comunque come attachment
					valoreHeader = SDICostanti.SDI_TIPO_FATTURA_XML;
				}
				String valore = null;
				if(valoreUrl!=null){
					valore = valoreUrl;
				}
				else{
					valore = valoreHeader;
				}
				
				boolean imbustamentoSOAP = false;
				if(SDICostanti.SDI_TIPO_FATTURA_ZIP.equalsIgnoreCase(valore)){
					imbustamentoSOAP = true;
				}
				else if(SDICostanti.SDI_TIPO_FATTURA_P7M.equalsIgnoreCase(valore)){
					imbustamentoSOAP = true;
				}
				
				// Bug Fix: OP-752
				// USO Comunque il tunnel SOAP altrimenti l'xml viene modificato e la firma non e' piu' valida
				// Uso esattamente il codice sopra con il contentType per zip e p7m:
				imbustamentoSOAP = true;
				
				if(imbustamentoSOAP){
					OpenSPCoop2Properties openSPCoopProperties = OpenSPCoop2Properties.getInstance();
					context.getTransportContext().put(openSPCoopProperties.getTunnelSOAPKeyWord_urlBased(), "true");
					context.getTransportContext().put(openSPCoopProperties.getTunnelSOAPKeyWordMimeType_urlBased(),"application/octet-stream");
				}
			}
			else if(passiva) {
				// Bug Fix: OP-752
				// USO Comunque il tunnel SOAP altrimenti l'xml viene modificato e la firma non e' piu' valida
				// Le notifiche inviate non sono firmate, ma se lo fossero questo fix risolverebbe il problema.
				// Non capisco perche' se cmq attivo questo canale poi l'xpath per mtom non funziona
				OpenSPCoop2Properties openSPCoopProperties = OpenSPCoop2Properties.getInstance();
				context.getTransportContext().put(openSPCoopProperties.getTunnelSOAPKeyWord_urlBased(), "true");
				context.getTransportContext().put(openSPCoopProperties.getTunnelSOAPKeyWordMimeType_urlBased(),"application/octet-stream");
			}
			
		}catch(Exception e){
			OpenSPCoop2Logger.getLoggerOpenSPCoopCore().error("PreInRequestHandler error: "+e.getMessage(),e);
		}
		
		
		
	}

}