SPCoopEsitoBuilder.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.builder;

import javax.xml.soap.SOAPBody;

import org.openspcoop2.message.OpenSPCoop2MessageFactory;
import org.openspcoop2.protocol.basic.Costanti;
import org.openspcoop2.protocol.basic.builder.EsitoBuilder;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.builder.EsitoTransazione;
import org.openspcoop2.protocol.sdk.builder.ProprietaErroreApplicativo;
import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
import org.openspcoop2.protocol.spcoop.constants.SPCoopCostanti;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Classe che implementa, in base al protocollo SPCoop, l'interfaccia {@link org.openspcoop2.protocol.sdk.builder.IEsitoBuilder}
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class SPCoopEsitoBuilder extends EsitoBuilder {

	public SPCoopEsitoBuilder(IProtocolFactory<?> protocolFactory) throws ProtocolException {
		super(protocolFactory);
	}
	
	@Override
	public EsitoTransazione getEsitoMessaggioApplicativo(OpenSPCoop2MessageFactory messageFactory,
			ProprietaErroreApplicativo erroreApplicativo,SOAPBody body,String tipoContext, String erroreGovway, String internalErrorCodeGovWay) throws ProtocolException{
		Node childNode = body.getFirstChild();
		if(childNode!=null){
			if(childNode.getNextSibling()==null){

				if("MessaggioDiErroreApplicativo".equals(childNode.getLocalName()) &&
						SPCoopCostanti.NAMESPACE_ECCEZIONE_APPLICATIVA_EGOV.equals(childNode.getNamespaceURI())){
					NodeList elements = childNode.getChildNodes();
					if(elements!=null){
						for(int i=0;i<elements.getLength();i++){
							Node elem = elements.item(i);
							if("Eccezione".equals(elem.getLocalName())){
								NodeList elementsEccezione = elem.getChildNodes();
								if(elementsEccezione!=null){
									for(int j=0;j<elementsEccezione.getLength();j++){
										Node tipoEccezione = elementsEccezione.item(j);
										if(SPCoopCostanti.ECCEZIONE_PROCESSAMENTO_SPCOOP.equals(tipoEccezione.getLocalName())){
											NamedNodeMap attr = tipoEccezione.getAttributes();
											if(attr!=null){
												Node at = attr.getNamedItem("codiceEccezione");
												if(at!=null){
													String value = at.getNodeValue();
													String prefixFaultCode = null;
													if(erroreApplicativo!=null)
														prefixFaultCode = erroreApplicativo.getFaultPrefixCode();
													if(prefixFaultCode==null){
														prefixFaultCode=Costanti.ERRORE_INTEGRAZIONE_PREFIX_CODE;
													}
													boolean prefixOpv2 = value.startsWith(prefixFaultCode);
													
													if(!prefixOpv2 && internalErrorCodeGovWay!=null) {
														if(internalErrorCodeGovWay.startsWith(prefixFaultCode)) {
															prefixOpv2 = true;
															value = internalErrorCodeGovWay;
														}									
													}

													if(prefixOpv2){
														value = value.substring(prefixFaultCode.length());
														int valueInt = Integer.parseInt(value);
														if(valueInt>=400 && valueInt<=499){
															return this.esitiProperties.convertToEsitoTransazione(EsitoTransazioneName.ERRORE_PROCESSAMENTO_PDD_4XX, tipoContext);
														}else if(valueInt>=500 && valueInt<=599){
															return this.esitiProperties.convertToEsitoTransazione(EsitoTransazioneName.ERRORE_PROCESSAMENTO_PDD_5XX, tipoContext);
														}else{
															return this.esitiProperties.convertToEsitoTransazione(EsitoTransazioneName.ERRORE_PROCESSAMENTO_PDD_5XX, tipoContext);
														}
													}else{
														return this.esitiProperties.convertToEsitoTransazione(EsitoTransazioneName.ERRORE_PROCESSAMENTO_PDD_5XX, tipoContext); // ???
													}
												}
											}
										}
										else if(SPCoopCostanti.ECCEZIONE_VALIDAZIONE_BUSTA_SPCOOP.equals(tipoEccezione.getLocalName())){
											return this.esitiProperties.convertToEsitoTransazione(EsitoTransazioneName.ERRORE_PROTOCOLLO, tipoContext);
										}
									}
								}
							}
						}
					}
				}
			}
		}
		return null;
	}

}