IntegrationManagerUtility.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.services.skeleton;

import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.message.OpenSPCoop2SoapMessage;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.protocol.manifest.Openspcoop2;
import org.openspcoop2.protocol.sdk.AbstractEccezioneBuilderParameter;
import org.openspcoop2.protocol.sdk.EccezioneIntegrazioneBuilderParameters;
import org.openspcoop2.protocol.sdk.EccezioneProtocolloBuilderParameters;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
import org.openspcoop2.protocol.utils.ErroriProperties;
import org.w3c.dom.Node;

/**
 * IntegrationManagerUtility
 *
 * @author apoli@link.it
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class IntegrationManagerUtility {

	public static void readAndSetProtocol(javax.servlet.http.HttpServletRequest req,String pathinfo) throws IntegrationManagerException{
		
		//System.out.println("PATH INFO["+pathinfo+"]");
		String protocol = (String) req.getAttribute(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME.getValue());
		//System.out.println("PROTOCOLLO ["+protocol+"]");
		if(protocol!=null){
			
			//System.out.println("INIZIALIZZO IM con INPUT PROTOCOL ["+protocol+"]");
			// verifico che sia un protocollo
			try{
				ProtocolFactoryManager.getInstance().getProtocolFactoryByName(protocol);
			} catch(ProtocolException e) {
				
				// vedo se quello che mi è errivato è un contesto altrimeni rilancio la prima eccezione
				boolean ok = false;
				try{
					Openspcoop2 manifest = ProtocolFactoryManager.getInstance().getProtocolManifest(protocol);
					req.setAttribute(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME.getValue(), manifest.getProtocol().getName());
					ok = true;
				} catch(ProtocolException eInternal) {}
				
				if(ok==false){
					throw new RuntimeException(e);
				}
			}
			
		}
		else  {
		
			// rimuovo il nome del contesto, rimane protocol/IntegrationManager
			pathinfo = pathinfo.substring(pathinfo.indexOf("/", 1) + 1);
			// prendo la prima parola: protocol
			String protocolName = pathinfo;
			if(pathinfo.indexOf("/") != -1){
				try{
					String servletPath = pathinfo.substring(0, pathinfo.indexOf("/"));
					if(servletPath.equals("PA") || servletPath.equals("PD") || servletPath.equals("PDtoSOAP") || servletPath.equals("IntegrationManager")) {
						servletPath = "@EMPTY@";//CostantiPdD.OPENSPCOOP_PROTOCOL_EMPTY_CONTEXT;
					}
					//System.out.println("INIZIALIZZO IM con SERVLET PATH ["+servletPath+"]");
					Openspcoop2 manifest = ProtocolFactoryManager.getInstance().getProtocolManifest(servletPath);
					protocolName = manifest.getProtocol().getName();
				} catch(ProtocolException e) {
					throw new RuntimeException(e);
				}
			}
			
			req.setAttribute(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME.getValue(), protocolName);
			
		}
		
	}
	
	
    /**
	 * Mappa una risposta di errore applicativo XML in una eccezione IntegrationManagerException
	 *
	 * @param xml XML su cui effettuare il mapping
	 * @return la protocol exception
	 * 
	 */
	public static IntegrationManagerException mapXMLIntoProtocolException(IProtocolFactory<?> protocolFactory,String xml,String prefixCodiceErroreApplicativoIntegrazione, 
			IntegrationFunctionError functionError, ErroriProperties erroriProperties) throws Exception{
		org.openspcoop2.message.xml.MessageXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;
		org.w3c.dom.Document document = xmlUtils.newDocument(xml.getBytes());
		return IntegrationManagerUtility.mapXMLIntoProtocolException(protocolFactory,document.getFirstChild(),prefixCodiceErroreApplicativoIntegrazione, 
				functionError, erroriProperties);
	}
	
	public static IntegrationManagerException mapXMLIntoProtocolException(IProtocolFactory<?> protocolFactory,Node xml,String prefixCodiceErroreApplicativoIntegrazione, 
			IntegrationFunctionError functionError, ErroriProperties erroriProperties) throws Exception{
		
		AbstractEccezioneBuilderParameter eccezione = 
				protocolFactory.createErroreApplicativoBuilder().readErroreApplicativo(xml, prefixCodiceErroreApplicativoIntegrazione);
		IntegrationManagerException exc = null;
		if(eccezione instanceof EccezioneProtocolloBuilderParameters){
			EccezioneProtocolloBuilderParameters eccBusta = (EccezioneProtocolloBuilderParameters) eccezione;
			exc = new IntegrationManagerException(protocolFactory, eccBusta.getEccezioneProtocollo(), 
					functionError, erroriProperties);
		}
		else{
			EccezioneIntegrazioneBuilderParameters eccIntegrazione = (EccezioneIntegrazioneBuilderParameters) eccezione;
			exc = new IntegrationManagerException(protocolFactory, eccIntegrazione.getErroreIntegrazione(), 
					functionError, erroriProperties);
		}
		
		exc.setOraRegistrazione(protocolFactory.createTraduttore().getDate_protocolFormat(eccezione.getOraRegistrazione()));
		exc.setIdentificativoFunzione(eccezione.getIdFunzione());
		exc.setIdentificativoPorta(eccezione.getDominioPorta().getCodicePorta());

		return exc;

	}
	
	
	public static IntegrationManagerException mapMessageIntoProtocolException(OpenSPCoop2SoapMessage message, String faultCode, String faultString, IDSoggetto identitaPdD, String identificativoFunzione) throws Exception {
	
		Object govwayPrefixCodeInContextProperty = message.getContextProperty(org.openspcoop2.message.constants.Costanti.ERRORE_GOVWAY_PREFIX_CODE);
		Object govwayCodeInContextProperty = message.getContextProperty(org.openspcoop2.message.constants.Costanti.ERRORE_GOVWAY_CODE);
		if(govwayPrefixCodeInContextProperty!=null && govwayCodeInContextProperty!=null){
			return new IntegrationManagerException(message, faultCode, faultString, identitaPdD, identificativoFunzione);
		}
		
		return null;

	}
}