ErroreApplicativoMessageUtils.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.builder;
import java.util.Iterator;
import javax.xml.namespace.QName;
import javax.xml.soap.Detail;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPFault;
import org.openspcoop2.core.eccezione.router_details.Dettaglio;
import org.openspcoop2.core.eccezione.router_details.DettaglioRouting;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.message.constants.MessageType;
import org.openspcoop2.message.soap.SoapUtils;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.utils.date.DateManager;
import org.openspcoop2.utils.xml.AbstractXMLUtils;
import org.slf4j.Logger;
import org.w3c.dom.Element;
/**
* ErroreApplicativoMessageUtils
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class ErroreApplicativoMessageUtils {
public static void addPrefixToElement(Element elementErroreApplicativo,String prefix){
//workAround per ovviare poi al problema axiom: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.
// che si verifica in detailFaultPulito.addChildElement(eccezioneDetailApplicativo) del metodo insertErroreApplicativoIntoSOAPFault_engine di questa classe
//elementErroreApplicativo.setPrefix(prefix);
}
public static void addErroreApplicativoIntoSOAPFaultDetail(SOAPElement erroreApplicativo,
OpenSPCoop2Message msg, Logger log) throws ProtocolException{
try{
if(msg==null)
throw new ProtocolException("Messaggio non presente");
SOAPBody soapBody = msg.castAsSoap().getSOAPBody();
if(soapBody==null)
throw new ProtocolException("SOAPBody non presente");
SOAPFault fault = null;
if(soapBody.hasFault()==false)
throw new ProtocolException("SOAPFault non presente");
else
fault = soapBody.getFault();
if(fault==null)
throw new ProtocolException("SOAPFault is null");
Detail detail = fault.getDetail();
if(detail==null){
detail = fault.addDetail();
detail = fault.getDetail();
}
if(detail!=null){
detail.addChildElement(erroreApplicativo);
}
msg.saveChanges();
}catch(Exception e){
log.error("Errore durante la costruzione del messaggio di errore applicativo (InsertDetail)",e);
throw new ProtocolException("Errore durante la costruzione del messaggio di errore (InsertDetail)",e);
}
}
@Deprecated
public static void insertErroreApplicativoIntoSOAPFault(SOAPElement erroreApplicativo,
OpenSPCoop2Message msg, Logger log) throws ProtocolException{
try{
if(msg==null)
throw new ProtocolException("Messaggio non presente");
SOAPBody soapBody = msg.castAsSoap().getSOAPBody();
if(soapBody==null)
throw new ProtocolException("SOAPBody non presente");
SOAPFault faultOriginale = null;
if(soapBody.hasFault()==false)
throw new ProtocolException("SOAPFault non presente");
else
faultOriginale = soapBody.getFault();
if(faultOriginale==null)
throw new ProtocolException("SOAPFault is null");
QName nameDetail = null;
if(MessageType.SOAP_12.equals(msg.getMessageType())){
nameDetail = new QName(org.openspcoop2.message.constants.Costanti.SOAP12_ENVELOPE_NAMESPACE,"Detail");
}
else{
nameDetail = new QName("detail");
}
SOAPElement detailsFaultOriginale = null;
Iterator<?> itDetailsOriginali = faultOriginale.getChildElements(nameDetail);
if(itDetailsOriginali!=null && itDetailsOriginali.hasNext()){
detailsFaultOriginale = (SOAPElement) itDetailsOriginali.next();
}
String faultActor = faultOriginale.getFaultActor(); // in soap1.2 e' il role
Name faultCode = faultOriginale.getFaultCodeAsName();
Iterator<?> faultSubCode = null;
String faultNode = null;
if(MessageType.SOAP_12.equals(msg.getMessageType())){
faultSubCode = faultOriginale.getFaultSubcodes();
faultNode = faultOriginale.getFaultNode();
}
String faultString = faultOriginale.getFaultString();
soapBody.removeChild(soapBody.getFault());
//msg.saveChanges();
SOAPFault faultPulito = soapBody.addFault();
if(faultActor != null)
faultPulito.setFaultActor(faultActor);
if(faultCode!=null)
faultPulito.setFaultCode(faultCode);
if(faultSubCode!=null){
while (faultSubCode.hasNext()) {
QName faultSubCodeQname = (QName) faultSubCode.next();
faultPulito.appendFaultSubcode(faultSubCodeQname);
}
}
if(faultNode!=null){
faultPulito.setFaultNode(faultNode);
}
if(faultString!=null)
SoapUtils.setFaultString(faultPulito , faultString);
Detail detailFaultPulito = faultPulito.addDetail();
detailFaultPulito = faultPulito.getDetail();
if(detailsFaultOriginale!=null){
Iterator<?> it = detailsFaultOriginale.getChildElements();
while (it.hasNext()) {
Object o = it.next();
if(o instanceof SOAPElement){
SOAPElement elem = (SOAPElement) o;
detailFaultPulito.addChildElement(elem);
}
}
}
detailFaultPulito.addChildElement(erroreApplicativo);
msg.saveChanges();
}catch(Exception e){
log.error("Errore durante la costruzione del messaggio di errore applicativo (InsertDetail)",e);
throw new ProtocolException("Errore durante la costruzione del messaggio di errore (InsertDetail)",e);
}
}
public static void insertRoutingErrorInSOAPFault(IDSoggetto identitaRouter,String idFunzione,String msgErrore,OpenSPCoop2Message msg,
Logger log, AbstractXMLUtils xmlUtils) throws ProtocolException{
try{
if(msg==null)
throw new ProtocolException("Messaggio non presente");
DettaglioRouting dettaglioRouting = new DettaglioRouting();
// dominio
org.openspcoop2.core.eccezione.router_details.Dominio dominio = new org.openspcoop2.core.eccezione.router_details.Dominio();
org.openspcoop2.core.eccezione.router_details.DominioSoggetto dominioSoggetto = new org.openspcoop2.core.eccezione.router_details.DominioSoggetto();
dominioSoggetto.setType(identitaRouter.getTipo());
dominioSoggetto.setBase(identitaRouter.getNome());
dominio.setOrganization(dominioSoggetto);
dominio.setId(identitaRouter.getCodicePorta());
dominio.setModule(idFunzione);
dettaglioRouting.setDomain(dominio);
// oraRegistrazione
dettaglioRouting.setTimestamp(DateManager.getDate());
// dettaglio
Dettaglio dettaglio = new Dettaglio();
dettaglio.setDescription(msgErrore);
dettaglio.setState(org.openspcoop2.core.eccezione.router_details.constants.Costanti.ESITO_ERRORE);
dettaglioRouting.setDetail(dettaglio);
byte[]xmlDettaglioRouting = org.openspcoop2.core.eccezione.router_details.utils.XMLUtils.generateDettaglioRouting(dettaglioRouting);
Element elementDettaglioRouting = xmlUtils.newElement(xmlDettaglioRouting);
addPrefixToElement(elementDettaglioRouting,"op2RoutingDetail");
SOAPFactory sf = SoapUtils.getSoapFactory(msg.getFactory(), msg.getMessageType());
SOAPElement dettaglioRoutingElementSOAP = sf.createElement(elementDettaglioRouting);
addErroreApplicativoIntoSOAPFaultDetail(dettaglioRoutingElementSOAP, msg, log);
}catch(Exception e){
log.error("Errore durante la costruzione del messaggio di errore",e);
throw new ProtocolException("Errore durante la costruzione del messaggio di errore",e);
}
}
}