ErroreApplicativoBuilder.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.io.ByteArrayInputStream;
import java.security.SecureRandom;
import java.util.Date;
import javax.xml.namespace.QName;
import javax.xml.soap.Detail;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPFault;
import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.constants.TipoPdD;
import org.openspcoop2.core.eccezione.details.DettaglioEccezione;
import org.openspcoop2.core.eccezione.errore_applicativo.CodiceEccezione;
import org.openspcoop2.core.eccezione.errore_applicativo.DatiCooperazione;
import org.openspcoop2.core.eccezione.errore_applicativo.Dominio;
import org.openspcoop2.core.eccezione.errore_applicativo.DominioSoggetto;
import org.openspcoop2.core.eccezione.errore_applicativo.Eccezione;
import org.openspcoop2.core.eccezione.errore_applicativo.ErroreApplicativo;
import org.openspcoop2.core.eccezione.errore_applicativo.Servizio;
import org.openspcoop2.core.eccezione.errore_applicativo.Soggetto;
import org.openspcoop2.core.eccezione.errore_applicativo.SoggettoIdentificativo;
import org.openspcoop2.core.eccezione.errore_applicativo.constants.TipoEccezione;
import org.openspcoop2.core.eccezione.errore_applicativo.utils.XMLUtils;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.message.OpenSPCoop2MessageFactory;
import org.openspcoop2.message.OpenSPCoop2MessageParseResult;
import org.openspcoop2.message.OpenSPCoop2SoapMessage;
import org.openspcoop2.message.config.ConfigurationRFC7807;
import org.openspcoop2.message.config.IntegrationErrorReturnConfiguration;
import org.openspcoop2.message.constants.MessageRole;
import org.openspcoop2.message.constants.MessageType;
import org.openspcoop2.message.exception.ParseException;
import org.openspcoop2.message.soap.SOAPFaultCode;
import org.openspcoop2.message.soap.SoapUtils;
import org.openspcoop2.protocol.basic.BasicComponentFactory;
import org.openspcoop2.protocol.basic.Costanti;
import org.openspcoop2.protocol.basic.Utilities;
import org.openspcoop2.protocol.sdk.AbstractEccezioneBuilderParameter;
import org.openspcoop2.protocol.sdk.Context;
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.builder.ProprietaErroreApplicativo;
import org.openspcoop2.protocol.sdk.config.ITraduttore;
import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione;
import org.openspcoop2.protocol.sdk.constants.CostantiProtocollo;
import org.openspcoop2.protocol.sdk.constants.ErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.ErroreIntegrazione;
import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
import org.openspcoop2.protocol.sdk.constants.SubCodiceErrore;
import org.openspcoop2.protocol.sdk.constants.TipoErroreApplicativo;
import org.openspcoop2.protocol.utils.ErroriProperties;
import org.openspcoop2.utils.date.DateManager;
import org.openspcoop2.utils.rest.problem.JsonSerializer;
import org.openspcoop2.utils.rest.problem.ProblemRFC7807;
import org.openspcoop2.utils.rest.problem.ProblemRFC7807Builder;
import org.openspcoop2.utils.rest.problem.XmlSerializer;
import org.openspcoop2.utils.transport.http.HttpConstants;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* ErroreApplicativoBuilder
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class ErroreApplicativoBuilder extends BasicComponentFactory implements org.openspcoop2.protocol.sdk.builder.IErroreApplicativoBuilder {
private static java.util.Random _rnd = null;
private static synchronized void initRandom() {
if(_rnd==null) {
_rnd = new SecureRandom();
}
}
public static java.util.Random getRandom() {
if(_rnd==null) {
initRandom();
}
return _rnd;
}
protected ITraduttore traduttore;
protected OpenSPCoop2MessageFactory errorFactory = null;
protected org.openspcoop2.message.xml.MessageXMLUtils xmlUtils;
protected boolean omitXMLDeclaration;
public ErroreApplicativoBuilder(IProtocolFactory<?> factory) throws ProtocolException{
super(factory);
this.xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;
this.traduttore = factory.createTraduttore();
this.errorFactory = OpenSPCoop2MessageFactory.getDefaultMessageFactory();
this.omitXMLDeclaration = false;
}
public boolean isOmitXMLDeclaration() {
return this.omitXMLDeclaration;
}
public void setOmitXMLDeclaration(boolean omitXMLDeclaration) {
this.omitXMLDeclaration = omitXMLDeclaration;
}
// NAMESPACE
@Override
public String getNamespaceEccezioneProtocollo(String defaultNamespace){
if(defaultNamespace!=null && StringUtils.isNotEmpty(defaultNamespace)) {
return defaultNamespace;
}
else {
return Costanti.ERRORE_PROTOCOLLO_NAMESPACE;
}
}
@Override
public QName getQNameEccezioneProtocollo(String defaultNamespace, String codice){
return new QName(this.getNamespaceEccezioneProtocollo(defaultNamespace),
codice,
Costanti.ERRORE_PROTOCOLLO_PREFIX);
}
@Override
public String getNamespaceEccezioneIntegrazione(String defaultNamespace){
if(defaultNamespace!=null && StringUtils.isNotEmpty(defaultNamespace)) {
return defaultNamespace;
}
else {
return Costanti.ERRORE_INTEGRAZIONE_NAMESPACE;
}
}
@Override
public QName getQNameEccezioneIntegrazione(String defaultNamespace, String codice){
return new QName(getNamespaceEccezioneIntegrazione(defaultNamespace),
codice,
Costanti.ERRORE_INTEGRAZIONE_PREFIX);
}
// UTILITY DI RICONOSCIMENTO
@Override
public boolean isErroreApplicativo(Node node){
if(node==null){
return false;
}
return this.isErroreApplicativo(node.getNamespaceURI(), node.getLocalName());
}
@Override
public boolean isErroreApplicativo(String namespace, String localName){
if(org.openspcoop2.core.eccezione.errore_applicativo.constants.Costanti.ROOT_LOCAL_NAME_ERRORE_APPLICATIVO.equals(localName) &&
org.openspcoop2.core.eccezione.errore_applicativo.constants.Costanti.TARGET_NAMESPACE.equals(namespace)
){
return true;
}
return false;
}
// BUILDER
@Override
public OpenSPCoop2Message toMessage(
EccezioneProtocolloBuilderParameters parameters)
throws ProtocolException {
return _buildErroreApplicativo_OpenSPCoop2Message(parameters, null);
}
@Override
public OpenSPCoop2Message toMessage(
EccezioneIntegrazioneBuilderParameters parameters)
throws ProtocolException {
return _buildErroreApplicativo_OpenSPCoop2Message(null,parameters);
}
@Override
public SOAPElement toSoapElement(EccezioneProtocolloBuilderParameters parameters) throws ProtocolException{
CodeDetailsError nop = new CodeDetailsError();
return this._buildErroreApplicativo_SoapElement(nop, parameters, null);
}
@Override
public SOAPElement toSoapElement(EccezioneIntegrazioneBuilderParameters parameters) throws ProtocolException{
CodeDetailsError nop = new CodeDetailsError();
return this._buildErroreApplicativo_SoapElement(nop, null,parameters);
}
@Override
public Element toElement(EccezioneProtocolloBuilderParameters parameters) throws ProtocolException{
CodeDetailsError nop = new CodeDetailsError();
return this._buildErroreApplicativo_Element(nop, parameters, null);
}
@Override
public Element toElement(EccezioneIntegrazioneBuilderParameters parameters) throws ProtocolException{
CodeDetailsError nop = new CodeDetailsError();
return this._buildErroreApplicativo_Element(nop, null,parameters);
}
@Override
public String toString(TipoErroreApplicativo tipoErroreApplicativo,
EccezioneProtocolloBuilderParameters parameters)
throws ProtocolException {
CodeDetailsError nop = new CodeDetailsError();
return this._buildErroreApplicativo_String(tipoErroreApplicativo, this.omitXMLDeclaration, nop, parameters, null);
}
@Override
public String toString(TipoErroreApplicativo tipoErroreApplicativo,
EccezioneIntegrazioneBuilderParameters parameters)
throws ProtocolException {
CodeDetailsError nop = new CodeDetailsError();
return this._buildErroreApplicativo_String(tipoErroreApplicativo, this.omitXMLDeclaration, nop, null,parameters);
}
@Override
public byte[] toByteArray(TipoErroreApplicativo tipoErroreApplicativo,
EccezioneProtocolloBuilderParameters parameters)
throws ProtocolException {
CodeDetailsError nop = new CodeDetailsError();
return this._buildErroreApplicativo_ByteArray(tipoErroreApplicativo, this.omitXMLDeclaration, nop, parameters, null);
}
@Override
public byte[] toByteArray(TipoErroreApplicativo tipoErroreApplicativo,
EccezioneIntegrazioneBuilderParameters parameters)
throws ProtocolException {
CodeDetailsError nop = new CodeDetailsError();
return this._buildErroreApplicativo_ByteArray(tipoErroreApplicativo, this.omitXMLDeclaration, nop, null,parameters);
}
// PARSER
@Override
public AbstractEccezioneBuilderParameter readErroreApplicativo(TipoErroreApplicativo tipoErroreApplicativo, String erroreApplicativo,String prefixCodiceErroreApplicativoIntegrazione) throws ProtocolException{
return readErroreApplicativo(tipoErroreApplicativo,erroreApplicativo.getBytes(),prefixCodiceErroreApplicativoIntegrazione);
}
@Override
public AbstractEccezioneBuilderParameter readErroreApplicativo(TipoErroreApplicativo tipoErroreApplicativo, byte[] erroreApplicativo,String prefixCodiceErroreApplicativoIntegrazione) throws ProtocolException{
ErroreApplicativo erroreApplicativoObject = null;
switch (tipoErroreApplicativo) {
case JSON:
try{
erroreApplicativoObject = XMLUtils.getErroreApplicativoFromJson(this.log, new ByteArrayInputStream(erroreApplicativo));
}catch(Exception e){
throw new ProtocolException("JSon fornito non contiene un errore applicativo per il protocollo "+this.getProtocolFactory().getProtocol()+": "+e.getMessage(),e);
}
break;
default:
if(XMLUtils.isErroreApplicativo(erroreApplicativo)==false){
throw new ProtocolException("XML fornito non contiene un errore applicativo per il protocollo "+this.getProtocolFactory().getProtocol());
}
try{
erroreApplicativoObject = XMLUtils.getErroreApplicativo(this.log, erroreApplicativo);
}catch(Exception e){
throw new ProtocolException("Xml fornito non contiene un errore applicativo per il protocollo "+this.getProtocolFactory().getProtocol()+": "+e.getMessage(),e);
}
break;
}
return _parseErroreApplicativo(erroreApplicativoObject, prefixCodiceErroreApplicativoIntegrazione);
}
@Override
public AbstractEccezioneBuilderParameter readErroreApplicativo(Node erroreApplicativo,String prefixCodiceErroreApplicativoIntegrazione) throws ProtocolException{
if(this.isErroreApplicativo(erroreApplicativo)==false){
throw new ProtocolException("Node fornito non contiene un errore applicativo per il protocollo "+this.getProtocolFactory().getProtocol());
}
try{
byte[] xmlBytes = this.xmlUtils.toByteArray(erroreApplicativo, true);
return readErroreApplicativo(TipoErroreApplicativo.XML, xmlBytes,prefixCodiceErroreApplicativoIntegrazione);
}catch(Exception e){
throw new ProtocolException(e.getMessage(), e);
}
}
// INSERT INTO SOAP FAULT
@Override
public void insertInSOAPFault(
EccezioneProtocolloBuilderParameters parameters,
OpenSPCoop2Message msg) throws ProtocolException {
ErroreApplicativoMessageUtils.addErroreApplicativoIntoSOAPFaultDetail(
this.toSoapElement(parameters), msg, this.log);
}
@Override
public void insertInSOAPFault(
EccezioneIntegrazioneBuilderParameters parameters,
OpenSPCoop2Message msg) throws ProtocolException {
ErroreApplicativoMessageUtils.addErroreApplicativoIntoSOAPFaultDetail(
this.toSoapElement(parameters), msg, this.log);
}
@Override
public void insertRoutingErrorInSOAPFault(IDSoggetto identitaRouter,String idFunzione,String msgErrore,OpenSPCoop2Message msg) throws ProtocolException{
ErroreApplicativoMessageUtils.insertRoutingErrorInSOAPFault(identitaRouter, idFunzione, msgErrore, msg, this.log, this.xmlUtils);
}
/** BUILDER UTILITIES */
protected SOAPElement _buildErroreApplicativo_SoapElement(CodeDetailsError codeDetailsErrorWrapper,
EccezioneProtocolloBuilderParameters eccezioneProtocollo,
EccezioneIntegrazioneBuilderParameters eccezioneIntegrazione)throws ProtocolException{
Element elementErroreApplicativo = this._buildErroreApplicativo_Element(codeDetailsErrorWrapper, eccezioneProtocollo, eccezioneIntegrazione);
try{
MessageType messageType = null;
if(eccezioneProtocollo!=null){
messageType = eccezioneProtocollo.getMessageType();
}
else{
messageType = eccezioneIntegrazione.getMessageType();
}
SOAPFactory sf = SoapUtils.getSoapFactory(this.errorFactory, messageType);
SOAPElement erroreApplicativoElementSOAP = sf.createElement(elementErroreApplicativo);
return erroreApplicativoElementSOAP;
} catch(Exception e) {
this.log.error("XMLBuilder.buildElement_Eccezione error: "+e.getMessage(),e);
throw new ProtocolException("buildErroreApplicativoElement failed: "+e.getMessage(),e);
}
}
protected Element _buildErroreApplicativo_Element(CodeDetailsError codeDetailsErrorWrapper,
EccezioneProtocolloBuilderParameters eccezioneProtocollo,
EccezioneIntegrazioneBuilderParameters eccezioneIntegrazione)throws ProtocolException{
try{
ConfigurationRFC7807 rfc7807 = null;
if(eccezioneIntegrazione!=null){
rfc7807 = eccezioneIntegrazione.getRfc7807();
}else{
rfc7807 = eccezioneProtocollo.getRfc7807();
}
if(rfc7807!=null) {
ProblemRFC7807 problemRFC7807 = this._buildErroreApplicativo_problemRFC7807(codeDetailsErrorWrapper, eccezioneProtocollo, eccezioneIntegrazione);
XmlSerializer xmlSerializer = new XmlSerializer();
return xmlSerializer.toNode(problemRFC7807);
}
else {
// il passaggio da XMLUtils forza anche la validazione dell'oggetto
ErroreApplicativo erroreApplicativo = this._buildErroreApplicativo_engine(false, codeDetailsErrorWrapper,
eccezioneProtocollo, eccezioneIntegrazione);
byte[]xmlErroreApplicativo = org.openspcoop2.core.eccezione.errore_applicativo.utils.XMLUtils.generateErroreApplicativo(erroreApplicativo);
Element elementErroreApplicativo = this.xmlUtils.newElement(xmlErroreApplicativo);
ErroreApplicativoMessageUtils.addPrefixToElement(elementErroreApplicativo,"op2ErrAppl");
return elementErroreApplicativo;
}
} catch(Exception e) {
this.log.error("XMLBuilder.buildElement_Eccezione error: "+e.getMessage(),e);
throw new ProtocolException("buildErroreApplicativoElement failed: "+e.getMessage(),e);
}
}
protected String _buildErroreApplicativo_String(TipoErroreApplicativo tipoErroreApplicativo, boolean omitXMLDeclaration,
CodeDetailsError codeDetailsErrorWrapper,
EccezioneProtocolloBuilderParameters eccezioneProtocollo,
EccezioneIntegrazioneBuilderParameters eccezioneIntegrazione)throws ProtocolException{
try{
ConfigurationRFC7807 rfc7807 = null;
if(eccezioneIntegrazione!=null){
rfc7807 = eccezioneIntegrazione.getRfc7807();
}else{
rfc7807 = eccezioneProtocollo.getRfc7807();
}
if(rfc7807!=null) {
ProblemRFC7807 problemRFC7807 = this._buildErroreApplicativo_problemRFC7807(codeDetailsErrorWrapper, eccezioneProtocollo, eccezioneIntegrazione);
if(TipoErroreApplicativo.JSON.equals(tipoErroreApplicativo)){
JsonSerializer jsonSerializer = new JsonSerializer();
return jsonSerializer.toString(problemRFC7807);
}
else {
XmlSerializer xmlSerializer = new XmlSerializer();
return xmlSerializer.toString(problemRFC7807, omitXMLDeclaration);
}
}
else {
if(TipoErroreApplicativo.JSON.equals(tipoErroreApplicativo)){
ErroreApplicativo erroreApplicativo = this._buildErroreApplicativo_engine(false, codeDetailsErrorWrapper,
eccezioneProtocollo, eccezioneIntegrazione);
return org.openspcoop2.core.eccezione.errore_applicativo.utils.XMLUtils.generateErroreApplicativoAsJson(erroreApplicativo);
}
else{
Element element = this._buildErroreApplicativo_Element(codeDetailsErrorWrapper, eccezioneProtocollo, eccezioneIntegrazione);
return this.xmlUtils.toString(element, omitXMLDeclaration);
}
}
}catch(Exception e){
throw new ProtocolException("toString failed: "+e.getMessage(),e);
}
}
protected byte[] _buildErroreApplicativo_ByteArray(TipoErroreApplicativo tipoErroreApplicativo, boolean omitXMLDeclaration,
CodeDetailsError codeDetailsErrorWrapper,
EccezioneProtocolloBuilderParameters eccezioneProtocollo,
EccezioneIntegrazioneBuilderParameters eccezioneIntegrazione)throws ProtocolException{
try{
ConfigurationRFC7807 rfc7807 = null;
if(eccezioneIntegrazione!=null){
rfc7807 = eccezioneIntegrazione.getRfc7807();
}else{
rfc7807 = eccezioneProtocollo.getRfc7807();
}
if(rfc7807!=null) {
ProblemRFC7807 problemRFC7807 = this._buildErroreApplicativo_problemRFC7807(codeDetailsErrorWrapper, eccezioneProtocollo, eccezioneIntegrazione);
if(TipoErroreApplicativo.JSON.equals(tipoErroreApplicativo)){
JsonSerializer jsonSerializer = new JsonSerializer();
return jsonSerializer.toByteArray(problemRFC7807);
}
else {
XmlSerializer xmlSerializer = new XmlSerializer();
return xmlSerializer.toByteArray(problemRFC7807, omitXMLDeclaration);
}
}
else {
if(TipoErroreApplicativo.JSON.equals(tipoErroreApplicativo)){
ErroreApplicativo erroreApplicativo = this._buildErroreApplicativo_engine(false, codeDetailsErrorWrapper,
eccezioneProtocollo, eccezioneIntegrazione);
return org.openspcoop2.core.eccezione.errore_applicativo.utils.XMLUtils.generateErroreApplicativoAsJson(erroreApplicativo).getBytes();
}
else{
Element element = this._buildErroreApplicativo_Element(codeDetailsErrorWrapper, eccezioneProtocollo, eccezioneIntegrazione);
return this.xmlUtils.toByteArray(element, omitXMLDeclaration);
}
}
}catch(Exception e){
throw new ProtocolException("toByteArray failed: "+e.getMessage(),e);
}
}
private ProblemRFC7807 _buildErroreApplicativo_problemRFC7807(CodeDetailsError codeDetailsErrorWrapper,
EccezioneProtocolloBuilderParameters eccezioneProtocollo,
EccezioneIntegrazioneBuilderParameters eccezioneIntegrazione)throws ProtocolException{
try{
ErroriProperties erroriProperties = ErroriProperties.getInstance(this.log);
ConfigurationRFC7807 rfc7807 = null;
int govwayCode;
String nomePorta;
String transactionId;
IntegrationFunctionError functionError;
boolean genericDetails = true;
if(eccezioneIntegrazione!=null){
rfc7807 = eccezioneIntegrazione.getRfc7807();
govwayCode = eccezioneIntegrazione.getReturnConfig().getGovwayReturnCode();
nomePorta = eccezioneIntegrazione.getNomePorta();
transactionId = eccezioneIntegrazione.getTransactionId();
functionError = eccezioneIntegrazione.getFunctionError();
genericDetails = eccezioneIntegrazione.getReturnConfig().isGenericDetails();
}else{
rfc7807 = eccezioneProtocollo.getRfc7807();
govwayCode = eccezioneProtocollo.getReturnConfig().getGovwayReturnCode();
nomePorta = eccezioneProtocollo.getNomePorta();
transactionId = eccezioneProtocollo.getTransactionId();
functionError = eccezioneProtocollo.getFunctionError();
genericDetails = eccezioneProtocollo.getReturnConfig().isGenericDetails();
}
if(!genericDetails && erroriProperties.isForceGenericDetails(functionError)) {
genericDetails = true;
}
if (Costanti.isTRANSACTION_FORCE_SPECIFIC_ERROR_DETAILS()) {
genericDetails = false;
}
// Problem builder
ProblemRFC7807Builder rfc7807ProblemBuilder = null;
if(erroriProperties.isTypeEnabled()) {
String webSite = erroriProperties.getWebSite(functionError);
if(webSite!=null && !"".equals(webSite)) {
rfc7807ProblemBuilder = new ProblemRFC7807Builder(webSite);
}
else if(rfc7807.isType()) {
rfc7807ProblemBuilder = new ProblemRFC7807Builder(rfc7807.getTypeFormat());
}
else {
rfc7807ProblemBuilder = new ProblemRFC7807Builder(false);
}
}
else {
rfc7807ProblemBuilder = new ProblemRFC7807Builder(false);
}
// Esamino errore
ErroreApplicativo erroreApplicativo = this._buildErroreApplicativo_engine(true, null,
eccezioneProtocollo, eccezioneIntegrazione);
if(erroreApplicativo.getException()!=null) {
codeDetailsErrorWrapper.setDetails(erroreApplicativo.getException().getDescription());
}
if(erroreApplicativo.getException()!=null &&
erroreApplicativo.getException().getCode()!=null &&
erroreApplicativo.getException().getCode().getBase()!=null) {
String prefixCodeStatus = null;
if(erroreApplicativo.getException().getType()!=null &&
org.openspcoop2.core.eccezione.errore_applicativo.constants.TipoEccezione.PROTOCOL.equals(erroreApplicativo.getException().getType())) {
prefixCodeStatus = org.openspcoop2.protocol.basic.Costanti.PROBLEM_RFC7807_GOVWAY_CODE_PREFIX_PROTOCOL;
}
else {
prefixCodeStatus = org.openspcoop2.protocol.basic.Costanti.PROBLEM_RFC7807_GOVWAY_CODE_PREFIX_INTEGRATION;
}
String code = erroreApplicativo.getException().getCode().getBase();
codeDetailsErrorWrapper.setPrefixCode(prefixCodeStatus);
codeDetailsErrorWrapper.setCode(code);
}
// Costruisco problem
ProblemRFC7807 problemRFC7807 = rfc7807ProblemBuilder.buildProblem(govwayCode);
// details
if(rfc7807.isDetails()) {
if(codeDetailsErrorWrapper.getDetails()!=null && !genericDetails) {
problemRFC7807.setDetail(codeDetailsErrorWrapper.getDetails());
}
else {
problemRFC7807.setDetail(erroriProperties.getGenericDetails(functionError));
}
}
// govway-type
if(rfc7807.isGovwayType()) {
String govwayType = erroriProperties.getErrorType(functionError);
// title
if(Costanti.isPROBLEM_RFC7807_ENRICH_TITLE_AS_GOVWAY_TYPE()) {
if(Costanti.isPROBLEM_RFC7807_ENRICH_TITLE_AS_GOVWAY_TYPE_CAMEL_CASE_DECODE()) {
problemRFC7807.setTitle(StringUtils.join(
StringUtils.splitByCharacterTypeCamelCase(govwayType),
' '));
}
else {
problemRFC7807.setTitle(govwayType);
}
if(Costanti.isPROBLEM_RFC7807_ENRICH_TITLE_AS_GOVWAY_TYPE_CUSTOM_CLAIM()) {
problemRFC7807.getCustom().put(org.openspcoop2.protocol.basic.Costanti.getPROBLEM_RFC7807_GOVWAY_TYPE(), govwayType);
}
}
else {
problemRFC7807.getCustom().put(org.openspcoop2.protocol.basic.Costanti.getPROBLEM_RFC7807_GOVWAY_TYPE(), govwayType);
}
}
// govway-status
if(Costanti.isTRANSACTION_ERROR_STATUS_ABILITATO() && rfc7807.isGovwayStatus()) {
if(codeDetailsErrorWrapper.getCode()!=null && codeDetailsErrorWrapper.getPrefixCode()!=null) {
problemRFC7807.getCustom().put(org.openspcoop2.protocol.basic.Costanti.getPROBLEM_RFC7807_GOVWAY_CODE(),
codeDetailsErrorWrapper.getPrefixCode()+codeDetailsErrorWrapper.getCode());
}
}
// instance
if(Costanti.isTRANSACTION_ERROR_INSTANCE_ID_ABILITATO() && rfc7807.isInstance()) {
problemRFC7807.setInstance(nomePorta);
}
// govway-transactionId
if(rfc7807.isGovwayTransactionId()) {
problemRFC7807.getCustom().put(org.openspcoop2.protocol.basic.Costanti.getPROBLEM_RFC7807_GOVWAY_TRANSACTION_ID(), transactionId);
}
return problemRFC7807;
}catch(Exception e){
throw new ProtocolException("toProblemRFC7807 failed: "+e.getMessage());
}
}
private ErroreApplicativo _buildErroreApplicativo_engine(boolean ignoreIntegrationFunctionErroreDirective, CodeDetailsError codeDetailsErrorWrapper,
EccezioneProtocolloBuilderParameters eccezioneProtocollo,
EccezioneIntegrazioneBuilderParameters eccezioneIntegrazione)throws ProtocolException{
try{
ErroriProperties erroriProperties = ErroriProperties.getInstance(this.log);
ErroreApplicativo erroreApplicativo = new ErroreApplicativo();
IDSoggetto idDominio = null;
String idModulo = null;
TipoPdD tipoPdD = null;
IDSoggetto fruitore = null;
IDServizio servizio = null;
String servizioApplicativo = null;
String codiceEccezione = null;
Integer codiceEccezioneOpenSPCoop = null;
Integer subCodiceEccezioneOpenSPCoop = null;
String descrizioneEccezione = null;
TipoEccezione tipoEccezione = null;
Date oraRegistrazione = null;
@SuppressWarnings("unused")
MessageType messageType = null;
IntegrationFunctionError functionError = null;
boolean genericDetails = true;
int govwayCode = 500;
if(eccezioneProtocollo!=null){
idDominio = eccezioneProtocollo.getDominioPorta();
idModulo = eccezioneProtocollo.getIdFunzione();
tipoPdD = eccezioneProtocollo.getTipoPorta();
fruitore = eccezioneProtocollo.getMittente();
servizio = eccezioneProtocollo.getServizio();
servizioApplicativo = eccezioneProtocollo.getServizioApplicativo();
codiceEccezione = this.traduttore.toString(eccezioneProtocollo.getEccezioneProtocollo().getCodiceEccezione(),
eccezioneProtocollo.getEccezioneProtocollo().getSubCodiceEccezione());
codiceEccezioneOpenSPCoop = eccezioneProtocollo.getEccezioneProtocollo().getCodiceEccezione().getCodice();
if(eccezioneProtocollo.getEccezioneProtocollo().getSubCodiceEccezione()!=null){
subCodiceEccezioneOpenSPCoop = eccezioneProtocollo.getEccezioneProtocollo().getSubCodiceEccezione().getSubCodice();
}
descrizioneEccezione = eccezioneProtocollo.getEccezioneProtocollo().getDescrizione(this.protocolFactory);
tipoEccezione = TipoEccezione.PROTOCOL;
oraRegistrazione = eccezioneProtocollo.getOraRegistrazione();
messageType = eccezioneProtocollo.getMessageType();
if(!ignoreIntegrationFunctionErroreDirective) {
functionError = eccezioneProtocollo.getFunctionError();
if(eccezioneProtocollo.getReturnConfig()!=null) {
genericDetails = eccezioneProtocollo.getReturnConfig().isGenericDetails();
govwayCode = eccezioneProtocollo.getReturnConfig().getGovwayReturnCode();
}
codeDetailsErrorWrapper.setPrefixCode(org.openspcoop2.protocol.basic.Costanti.PROBLEM_RFC7807_GOVWAY_CODE_PREFIX_PROTOCOL);
codeDetailsErrorWrapper.setCode(codiceEccezione);
codeDetailsErrorWrapper.setDetails(descrizioneEccezione);
}
}
else{
idDominio = eccezioneIntegrazione.getDominioPorta();
idModulo = eccezioneIntegrazione.getIdFunzione();
tipoPdD = eccezioneIntegrazione.getTipoPorta();
fruitore = eccezioneIntegrazione.getMittente();
servizio = eccezioneIntegrazione.getServizio();
servizioApplicativo = eccezioneIntegrazione.getServizioApplicativo();
codiceEccezione = this.traduttore.toCodiceErroreIntegrazioneAsString(eccezioneIntegrazione.getErroreIntegrazione(),
eccezioneIntegrazione.getProprieta().getFaultPrefixCode(),eccezioneIntegrazione.getProprieta().isFaultAsGenericCode());
codiceEccezioneOpenSPCoop = eccezioneIntegrazione.getErroreIntegrazione().getCodiceErrore().getCodice();
descrizioneEccezione = eccezioneIntegrazione.getProprieta().transformFaultMsg(eccezioneIntegrazione.getErroreIntegrazione(),this.protocolFactory);
tipoEccezione = TipoEccezione.INTEGRATION;
oraRegistrazione = eccezioneIntegrazione.getOraRegistrazione();
messageType = eccezioneIntegrazione.getMessageType();
if(!ignoreIntegrationFunctionErroreDirective) {
functionError = eccezioneIntegrazione.getFunctionError();
if(eccezioneIntegrazione.getReturnConfig()!=null) {
genericDetails = eccezioneIntegrazione.getReturnConfig().isGenericDetails();
govwayCode = eccezioneIntegrazione.getReturnConfig().getGovwayReturnCode();
}
codeDetailsErrorWrapper.setPrefixCode(org.openspcoop2.protocol.basic.Costanti.PROBLEM_RFC7807_GOVWAY_CODE_PREFIX_INTEGRATION);
codeDetailsErrorWrapper.setCode(codiceEccezione);
codeDetailsErrorWrapper.setDetails(descrizioneEccezione);
}
}
if(!ignoreIntegrationFunctionErroreDirective) {
if(!genericDetails && erroriProperties.isForceGenericDetails(functionError)) {
genericDetails = true;
}
if (Costanti.isTRANSACTION_FORCE_SPECIFIC_ERROR_DETAILS()) {
genericDetails = false;
}
}
org.openspcoop2.core.eccezione.errore_applicativo.constants.TipoPdD idFunzione = null;
if(TipoPdD.DELEGATA.equals(tipoPdD)){
idFunzione = org.openspcoop2.core.eccezione.errore_applicativo.constants.TipoPdD.OUTBOUND_PROXY;
}
else if(TipoPdD.APPLICATIVA.equals(tipoPdD)){
idFunzione = org.openspcoop2.core.eccezione.errore_applicativo.constants.TipoPdD.INBOUND_PROXY;
}
else if(TipoPdD.INTEGRATION_MANAGER.equals(tipoPdD)){
idFunzione = org.openspcoop2.core.eccezione.errore_applicativo.constants.TipoPdD.INTEGRATION_MANAGER;
}
else if(TipoPdD.ROUTER.equals(tipoPdD)){
idFunzione = org.openspcoop2.core.eccezione.errore_applicativo.constants.TipoPdD.ROUTER;
}
// dominio
Dominio dominio = new Dominio();
DominioSoggetto dominioSoggetto = new DominioSoggetto();
dominioSoggetto.setType(idDominio.getTipo());
dominioSoggetto.setBase(idDominio.getNome());
dominio.setOrganization(dominioSoggetto);
dominio.setId(idDominio.getCodicePorta());
dominio.setRole(idFunzione);
dominio.setModule(idModulo);
erroreApplicativo.setDomain(dominio);
// oraRegistrazione
if(oraRegistrazione==null){
oraRegistrazione = DateManager.getDate();
}
erroreApplicativo.setTimestamp(oraRegistrazione);
// dati-coopeazione
if(fruitore!=null || servizio!=null || servizioApplicativo!=null){
DatiCooperazione datiCooperazione = new DatiCooperazione();
if(fruitore!=null){
Soggetto fruitoreErroreApplicativo = new Soggetto();
SoggettoIdentificativo fruitoreIdentificativoErroreApplicativo = new SoggettoIdentificativo();
fruitoreIdentificativoErroreApplicativo.setType(fruitore.getTipo());
fruitoreIdentificativoErroreApplicativo.setBase(fruitore.getNome());
fruitoreErroreApplicativo.setId(fruitoreIdentificativoErroreApplicativo);
fruitoreErroreApplicativo.setDomainId(fruitore.getCodicePorta());
datiCooperazione.setSender(fruitoreErroreApplicativo);
}
if(servizio!=null && servizio.getSoggettoErogatore()!=null){
IDSoggetto erogatore = servizio.getSoggettoErogatore();
Soggetto erogatoreErroreApplicativo = new Soggetto();
SoggettoIdentificativo erogatoreIdentificativoErroreApplicativo = new SoggettoIdentificativo();
erogatoreIdentificativoErroreApplicativo.setType(erogatore.getTipo());
erogatoreIdentificativoErroreApplicativo.setBase(erogatore.getNome());
erogatoreErroreApplicativo.setId(erogatoreIdentificativoErroreApplicativo);
erogatoreErroreApplicativo.setDomainId(erogatore.getCodicePorta());
datiCooperazione.setProvider(erogatoreErroreApplicativo);
}
if(servizio!=null && servizio.getTipo()!=null && servizio.getNome()!=null && servizio.getVersione()!=null){
Servizio servizioErroreApplicativo = new Servizio();
servizioErroreApplicativo.setBase(servizio.getNome());
servizioErroreApplicativo.setType(servizio.getTipo());
servizioErroreApplicativo.setVersion(servizio.getVersione());
datiCooperazione.setService(servizioErroreApplicativo);
}
if(servizio!=null && servizio.getAzione()!=null){
datiCooperazione.setAction(servizio.getAzione());
}
datiCooperazione.setApplication(servizioApplicativo);
erroreApplicativo.setService(datiCooperazione);
}
// eccezioni
Eccezione eccezione = new Eccezione();
CodiceEccezione codice = new CodiceEccezione();
if(ignoreIntegrationFunctionErroreDirective || Costanti.isTRANSACTION_ERROR_STATUS_ABILITATO()) {
codice.setBase(codiceEccezione);
codice.setType(codiceEccezioneOpenSPCoop);
if(subCodiceEccezioneOpenSPCoop!=null)
codice.setSubtype(subCodiceEccezioneOpenSPCoop);
}
else {
String govwayType = erroriProperties.getErrorType(functionError);
codice.setBase(govwayType);
codice.setType(govwayCode);
}
eccezione.setCode(codice);
if(ignoreIntegrationFunctionErroreDirective || !genericDetails) {
eccezione.setDescription(descrizioneEccezione);
}
else {
eccezione.setDescription(erroriProperties.getGenericDetails(functionError));
}
eccezione.setType(tipoEccezione);
erroreApplicativo.setException(eccezione);
return erroreApplicativo;
} catch(Exception e) {
this.log.error("XMLBuilder.buildElement_Eccezione error: "+e.getMessage(),e);
throw new ProtocolException("buildErroreApplicativoElement failed: "+e.getMessage(),e);
}
}
// UTILS - BUILD OPENSPCOOP2 MESSAGE
private OpenSPCoop2Message _buildErroreApplicativo_OpenSPCoop2Message(EccezioneProtocolloBuilderParameters eccezioneProtocollo,
EccezioneIntegrazioneBuilderParameters eccezioneIntegrazione)throws ProtocolException{
MessageType messageType = null;
ConfigurationRFC7807 rfc7807= null;
boolean useProblemRFC7807 = false;
CodeDetailsError codeDetailsErrorWrapper = null;
OpenSPCoop2Message msg = null;
boolean addErroreProtocolloInMessaggio = false;
IntegrationFunctionError functionError = null;
IntegrationErrorReturnConfiguration returnConfig = null;
ErroriProperties erroriProperties = null;
try{
erroriProperties = ErroriProperties.getInstance(this.log);
Context context = null;
if(eccezioneIntegrazione!=null){
context = eccezioneIntegrazione.getContext();
functionError = eccezioneIntegrazione.getFunctionError();
returnConfig = eccezioneIntegrazione.getReturnConfig();
}
else {
context = eccezioneProtocollo.getContext();
functionError = eccezioneProtocollo.getFunctionError();
returnConfig = eccezioneProtocollo.getReturnConfig();
}
if(eccezioneProtocollo!=null) { // non aggiungamo anche gli errori di processamento altrimenti vengono catalogati come errore di protocollo se avvengono prima della generazione della busta errore
if(context!=null && context.containsKey(org.openspcoop2.core.constants.Costanti.ERRORE_VALIDAZIONE_PROTOCOLLO)) {
Object o = context.getObject(org.openspcoop2.core.constants.Costanti.ERRORE_VALIDAZIONE_PROTOCOLLO);
if(o!=null) {
if(o instanceof String) {
addErroreProtocolloInMessaggio = "true".equalsIgnoreCase((String)o);
}
else if(o instanceof Boolean) {
addErroreProtocolloInMessaggio = (Boolean) o;
}
}
}
}
// RFC7807
if(eccezioneIntegrazione!=null){
rfc7807 = eccezioneIntegrazione.getRfc7807();
}else{
rfc7807 = eccezioneProtocollo.getRfc7807();
}
useProblemRFC7807 = rfc7807!=null;
// MESSAGE TYPE
if(eccezioneIntegrazione!=null){
messageType = eccezioneIntegrazione.getMessageType();
}else{
messageType = eccezioneProtocollo.getMessageType();
}
boolean omitXMLDeclaration = true;
// 1) Il Messagge Type XML o JSON DEVE ESSERE CAPITO PRIMA
// 2) In questo momento deve arrivare la configurazione del RFC PROBLEM
// FIX: in caso di XML devo restituire un errore 'XML'
// PROPRIETA ERRORE APPLICATIVO
ProprietaErroreApplicativo proprieta = null;
if(eccezioneIntegrazione!=null){
proprieta = eccezioneIntegrazione.getProprieta();
}else{
proprieta = eccezioneProtocollo.getProprieta();
}
if(proprieta!=null &&
proprieta.isFaultAsXML()){
messageType = MessageType.XML;
returnConfig.setHttpReturnCode(returnConfig.getGovwayReturnCode());
}
switch (messageType) {
case XML:
codeDetailsErrorWrapper = new CodeDetailsError();
byte[] bytes = this._buildErroreApplicativo_ByteArray(TipoErroreApplicativo.XML, !omitXMLDeclaration, codeDetailsErrorWrapper, eccezioneProtocollo, eccezioneIntegrazione);
OpenSPCoop2MessageParseResult pr = this.errorFactory.createMessage(messageType, MessageRole.FAULT, HttpConstants.CONTENT_TYPE_XML, bytes);
msg = pr.getMessage_throwParseException();
if(useProblemRFC7807) {
msg.setContentType(HttpConstants.CONTENT_TYPE_XML_PROBLEM_DETAILS_RFC_7807);
}
else {
msg.setContentType(HttpConstants.CONTENT_TYPE_XML);
}
return msg;
case JSON:
codeDetailsErrorWrapper = new CodeDetailsError();
bytes = this._buildErroreApplicativo_ByteArray(TipoErroreApplicativo.JSON, !omitXMLDeclaration, codeDetailsErrorWrapper, eccezioneProtocollo, eccezioneIntegrazione);
pr = this.errorFactory.createMessage(messageType, MessageRole.FAULT, HttpConstants.CONTENT_TYPE_JSON, bytes);
msg = pr.getMessage_throwParseException();
if(useProblemRFC7807) {
msg.setContentType(HttpConstants.CONTENT_TYPE_JSON_PROBLEM_DETAILS_RFC_7807);
}
else {
msg.setContentType(HttpConstants.CONTENT_TYPE_JSON);
}
return msg;
case BINARY:
case MIME_MULTIPART:
// Viene usato per l'opzione None dove viene ritornato solamente il return code
msg = this.errorFactory.createEmptyMessage(messageType, MessageRole.FAULT);
return msg;
default:
// PERSONALIZZAZIONE MESSAGGI
String codiceEccezione = null;
String posizioneEccezione = null;
if(eccezioneProtocollo!=null){
// cambio il msg nell'eccezione, aggiungendo il soggetto che l'ha prodotta
// A meno di porta di dominio non disponibile
String msgPortaDiDominioNonDisponibile =
CostantiProtocollo.PDD_NON_DISPONIBILE.
replace(CostantiProtocollo.KEYWORDPDD_NON_DISPONIBILE,
eccezioneProtocollo.getSoggettoProduceEccezione().getTipo()+
eccezioneProtocollo.getSoggettoProduceEccezione().getNome());
String descrizioneErrore = eccezioneProtocollo.getEccezioneProtocollo().getDescrizione(this.protocolFactory);
if(descrizioneErrore!=null && descrizioneErrore.indexOf(msgPortaDiDominioNonDisponibile)==-1)
eccezioneProtocollo.getEccezioneProtocollo().
setDescrizione(eccezioneProtocollo.getSoggettoProduceEccezione().toString() +" ha rilevato le seguenti eccezioni:\n"+eccezioneProtocollo.getEccezioneProtocollo().getDescrizione(this.protocolFactory));
// Raccolgo codice e messaggio
codiceEccezione =
this.traduttore.toString(eccezioneProtocollo.getEccezioneProtocollo().getCodiceEccezione(),
eccezioneProtocollo.getEccezioneProtocollo().getSubCodiceEccezione());
posizioneEccezione = eccezioneProtocollo.getEccezioneProtocollo().getDescrizione(this.protocolFactory);
}
else{
codiceEccezione = this.traduttore.toCodiceErroreIntegrazioneAsString(eccezioneIntegrazione.getErroreIntegrazione(),
proprieta.getFaultPrefixCode(),proprieta.isFaultAsGenericCode());
posizioneEccezione = proprieta.transformFaultMsg(eccezioneIntegrazione.getErroreIntegrazione(),this.protocolFactory);
}
// ELEMENT RISPOSTA APPLICATIVA ERRORE
CodeDetailsError codeDetailsErrorWrapperNOP = new CodeDetailsError(); // uso quello del fault
SOAPElement rispostaApplicativaElement = this._buildErroreApplicativo_SoapElement(codeDetailsErrorWrapperNOP, eccezioneProtocollo, eccezioneIntegrazione);
msg = this.errorFactory.createEmptyMessage(messageType,MessageRole.FAULT);
OpenSPCoop2SoapMessage soapMessageError = msg.castAsSoap();
SOAPBody soapBody = soapMessageError.getSOAPBody();
SOAPFaultCode code = null;
// ECCEZIONE CODE
QName eccezioneName = null;
if(eccezioneIntegrazione!=null){
eccezioneName = this.getQNameEccezioneIntegrazione(proprieta!=null ? proprieta.getDefaultFaultCodeIntegrationNamespace() : null, codiceEccezione);
code = eccezioneIntegrazione.getSoapFaultCode();
}else{
eccezioneName = this.getQNameEccezioneProtocollo(proprieta!=null ? proprieta.getDefaultFaultCodeProtocolNamespace() : null, codiceEccezione);
code = eccezioneProtocollo.getSoapFaultCode();
}
// Genero FAULT O ERRORE XML
if(proprieta!=null && proprieta.isFaultAsXML()){
soapBody.appendChild(soapBody.getOwnerDocument().importNode(rispostaApplicativaElement,true));
//NOTA: in caso il servizio applicativo voglia un errore XML non deve essere aggiunto il Details di OpenSPCoop
// Altrimenti l'xml ritornato non e' piu' compatibile con quello definito da XSD
}
else{
soapBody.addFault();
SOAPFault fault = soapBody.getFault();
codeDetailsErrorWrapper = new CodeDetailsError();
// fault code
codeDetailsErrorWrapper.setPrefixCode(eccezioneName.getPrefix());
codeDetailsErrorWrapper.setCode(eccezioneName.getLocalPart());
if(Costanti.isTRANSACTION_ERROR_SOAP_USE_GOVWAY_STATUS_AS_FAULT_CODE()) {
soapMessageError.setFaultCode(fault, code, eccezioneName);
}
else {
String codiceEccezioneGW = Costanti.getTransactionSoapFaultCode(returnConfig.getGovwayReturnCode(),erroriProperties.getErrorType(functionError));
// aggiorno code con codici govway
if(returnConfig.getGovwayReturnCode()<=499) {
code = SOAPFaultCode.Sender;
}
else {
code = SOAPFaultCode.Receiver;
}
if(MessageType.SOAP_11.equals(messageType)) {
codiceEccezioneGW = (SOAPFaultCode.Sender.equals(code) ?
org.openspcoop2.message.constants.Costanti.SOAP11_FAULT_CODE_CLIENT : org.openspcoop2.message.constants.Costanti.SOAP11_FAULT_CODE_SERVER) +
org.openspcoop2.message.constants.Costanti.SOAP11_FAULT_CODE_SEPARATOR+codiceEccezioneGW;
}
QName eccezioneNameGovway = null;
if(MessageType.SOAP_11.equals(messageType)) {
eccezioneNameGovway = new QName(org.openspcoop2.message.constants.Costanti.SOAP_ENVELOPE_NAMESPACE, codiceEccezioneGW, fault.getPrefix());
}
else {
eccezioneNameGovway = this.getQNameEccezioneIntegrazione(proprieta!=null ? proprieta.getDefaultFaultCodeIntegrationNamespace() : null, codiceEccezioneGW);
}
msg.castAsSoap().setFaultCode(fault, code, eccezioneNameGovway);
}
// fault actor
if(proprieta!=null) {
fault.setFaultActor(proprieta.getFaultActor());
}
// fault string
if(proprieta!=null && proprieta.isInsertAsDetails()){
codeDetailsErrorWrapper.setDetails(posizioneEccezione);
boolean genericDetails = returnConfig.isGenericDetails();
if(!genericDetails && erroriProperties.isForceGenericDetails(functionError)) {
genericDetails = true;
}
if (Costanti.isTRANSACTION_FORCE_SPECIFIC_ERROR_DETAILS()) {
genericDetails = false;
}
if(codeDetailsErrorWrapper.getDetails()!=null && !genericDetails) {
SoapUtils.setFaultString(fault, codeDetailsErrorWrapper.getDetails());
}
else {
String errorMsg = erroriProperties.getGenericDetails(functionError);
SoapUtils.setFaultString(fault, errorMsg);
}
Detail d = fault.getDetail();
if(d==null){
d = fault.addDetail();
d = fault.getDetail();
}
d.appendChild(d.getOwnerDocument().importNode(rispostaApplicativaElement, true));
}else{
SoapUtils.setFaultString(fault, Utilities.toString(this.errorFactory, rispostaApplicativaElement, true));
}
// DettaglioEccezione
DettaglioEccezione dettaglioEccezione = null;
if(Costanti.isTRANSACTION_ERROR_SOAP_FAULT_ADD_FAULT_DETAILS_WITH_PROBLEM_RFC7807() || !useProblemRFC7807) {
if(eccezioneIntegrazione!=null){
dettaglioEccezione = eccezioneIntegrazione.getDettaglioEccezionePdD();
}else{
dettaglioEccezione = eccezioneProtocollo.getDettaglioEccezionePdD();
}
}
if(dettaglioEccezione!=null){
Detail d = fault.getDetail();
if(d==null){
d = fault.addDetail();
d = fault.getDetail();
}
byte[] dettaglioEccezioneBytes = org.openspcoop2.core.eccezione.details.utils.XMLUtils.generateDettaglioEccezione(dettaglioEccezione);
d.appendChild(d.getOwnerDocument().importNode(this.xmlUtils.newDocument(dettaglioEccezioneBytes).getDocumentElement(), true));
}
}
ParseException parseException = null;
if(eccezioneProtocollo!=null){
parseException = eccezioneProtocollo.getParseException();
}
else if(eccezioneIntegrazione!=null){
parseException = eccezioneIntegrazione.getParseException();
}
msg.setParseException(parseException);
if(parseException!=null && context!=null) {
if(MessageRole.REQUEST.equals(parseException.getMessageRole())){
context.addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO, true);
context.addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO_PARSE_EXCEPTION, parseException);
msg.addContextProperty(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO, true);
msg.addContextProperty(org.openspcoop2.core.constants.Costanti.CONTENUTO_RICHIESTA_NON_RICONOSCIUTO_PARSE_EXCEPTION, parseException);
}
else if(MessageRole.RESPONSE.equals(parseException.getMessageRole())){
context.addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO, true);
context.addObject(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION, parseException);
msg.addContextProperty(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO, true);
msg.addContextProperty(org.openspcoop2.core.constants.Costanti.CONTENUTO_RISPOSTA_NON_RICONOSCIUTO_PARSE_EXCEPTION, parseException);
}
}
return msg;
}
}catch(Exception e){
this.log.error("Errore durante la costruzione del messaggio di errore applicativo",e);
return this.errorFactory.createFaultMessage(messageType,useProblemRFC7807,"ErroreDiProcessamento");
}finally {
if(msg!=null) {
msg.addContextProperty(org.openspcoop2.message.constants.Costanti.ERRORE_GOVWAY, useProblemRFC7807 ?
org.openspcoop2.message.constants.Costanti.TIPO_RFC7807 : org.openspcoop2.message.constants.Costanti.TIPO_GOVWAY );
if(codeDetailsErrorWrapper!=null) {
if(codeDetailsErrorWrapper.getPrefixCode()!=null) {
String prefixInternalErrorCode = codeDetailsErrorWrapper.getPrefixCode();
if(prefixInternalErrorCode.endsWith(":")) {
prefixInternalErrorCode = prefixInternalErrorCode.substring(0, prefixInternalErrorCode.length()-1);
}
msg.addContextProperty(org.openspcoop2.message.constants.Costanti.ERRORE_GOVWAY_PREFIX_CODE, prefixInternalErrorCode);
}
if(codeDetailsErrorWrapper.getCode()!=null) {
msg.addContextProperty(org.openspcoop2.message.constants.Costanti.ERRORE_GOVWAY_CODE, codeDetailsErrorWrapper.getCode() );
if(Costanti.isTRANSACTION_ERROR_STATUS_ABILITATO()) {
String code = codeDetailsErrorWrapper.getCode();
if(codeDetailsErrorWrapper.getPrefixCode()!=null) {
if(codeDetailsErrorWrapper.getPrefixCode().endsWith(":")) {
code = codeDetailsErrorWrapper.getPrefixCode() + code;
}
else {
code = codeDetailsErrorWrapper.getPrefixCode() + ":" +code;
}
}
msg.forceTransportHeader(Costanti.getHTTP_HEADER_GOVWAY_ERROR_STATUS(), code);
}
}
if(codeDetailsErrorWrapper.getDetails()!=null) {
msg.addContextProperty(org.openspcoop2.message.constants.Costanti.ERRORE_GOVWAY_DETAILS, codeDetailsErrorWrapper.getDetails() );
}
}
if(addErroreProtocolloInMessaggio) {
msg.addContextProperty(org.openspcoop2.core.constants.Costanti.ERRORE_VALIDAZIONE_PROTOCOLLO, org.openspcoop2.core.constants.Costanti.ERRORE_TRUE);
}
try {
if(erroriProperties!=null) {
msg.forceTransportHeader(Costanti.getHTTP_HEADER_GOVWAY_ERROR_TYPE(), erroriProperties.getErrorType(functionError));
}
}catch(Exception e) {
this.log.error("Scrittura header http 'GovWayErrorType' non riuscita: "+e.getMessage(),e);
}
if(returnConfig.isRetry()) {
int seconds = returnConfig.getRetryAfterSeconds();
if(seconds<0) {
seconds=0;
}
if(returnConfig.getRetryRandomBackoffSeconds()>0) {
seconds = seconds + getRandom().nextInt(returnConfig.getRetryRandomBackoffSeconds());
}
msg.forceTransportHeader(HttpConstants.RETRY_AFTER, seconds+"");
}
msg.setForcedResponseCode(returnConfig.getHttpReturnCode()+"");
}
}
}
// UTILS - PARSING
private AbstractEccezioneBuilderParameter _parseErroreApplicativo(ErroreApplicativo erroreApplicativo,String prefixCodiceErroreApplicativoIntegrazione) throws ProtocolException{
try{
AbstractEccezioneBuilderParameter eccezione = null;
if( TipoEccezione.PROTOCOL.equals(erroreApplicativo.getException().getType())){
eccezione = new EccezioneProtocolloBuilderParameters();
CodiceErroreCooperazione codice = CodiceErroreCooperazione.toCodiceErroreCooperazione(erroreApplicativo.getException().getCode().getType().intValue());
String descrizione = erroreApplicativo.getException().getCode().getBase();
ErroreCooperazione erroreCooperazione = new ErroreCooperazione(descrizione, codice);
org.openspcoop2.protocol.sdk.Eccezione eccezioneProtocollo =
new org.openspcoop2.protocol.sdk.Eccezione(erroreCooperazione,true,erroreApplicativo.getDomain().getRole().getValue(),this.protocolFactory);
if(erroreApplicativo.getException().getCode().getSubtype()!=null){
SubCodiceErrore sub = new SubCodiceErrore();
sub.setSubCodice(erroreApplicativo.getException().getCode().getSubtype());
eccezioneProtocollo.setSubCodiceEccezione(sub);
}
((EccezioneProtocolloBuilderParameters)eccezione).setEccezioneProtocollo(eccezioneProtocollo);
}
else{
eccezione = new EccezioneIntegrazioneBuilderParameters();
CodiceErroreIntegrazione codice = CodiceErroreIntegrazione.toCodiceErroreIntegrazione(erroreApplicativo.getException().getCode().getType().intValue());
String descrizione = erroreApplicativo.getException().getCode().getBase();
ErroreIntegrazione erroreIntegrazione = new ErroreIntegrazione(descrizione, codice);
((EccezioneIntegrazioneBuilderParameters)eccezione).setErroreIntegrazione(erroreIntegrazione);
}
// dominio
eccezione.setDominioPorta(new IDSoggetto(erroreApplicativo.getDomain().getOrganization().getType(),
erroreApplicativo.getDomain().getOrganization().getBase(),
erroreApplicativo.getDomain().getId()));
eccezione.setIdFunzione(erroreApplicativo.getDomain().getModule());
if(org.openspcoop2.core.eccezione.errore_applicativo.constants.TipoPdD.OUTBOUND_PROXY.equals(erroreApplicativo.getDomain().getRole())){
eccezione.setTipoPorta(TipoPdD.DELEGATA);
}
else if(org.openspcoop2.core.eccezione.errore_applicativo.constants.TipoPdD.INBOUND_PROXY.equals(erroreApplicativo.getDomain().getRole())){
eccezione.setTipoPorta(TipoPdD.APPLICATIVA);
}
else if(org.openspcoop2.core.eccezione.errore_applicativo.constants.TipoPdD.INTEGRATION_MANAGER.equals(erroreApplicativo.getDomain().getRole())){
eccezione.setTipoPorta(TipoPdD.INTEGRATION_MANAGER);
}
else if(org.openspcoop2.core.eccezione.errore_applicativo.constants.TipoPdD.ROUTER.equals(erroreApplicativo.getDomain().getRole())){
eccezione.setTipoPorta(TipoPdD.ROUTER);
}
// oraRegistrazione
eccezione.setOraRegistrazione(erroreApplicativo.getTimestamp());
// dati cooperazione
if(erroreApplicativo.getService()!=null){
DatiCooperazione datiCooperazione = erroreApplicativo.getService();
if(datiCooperazione.getSender()!=null){
eccezione.setMittente(new IDSoggetto(datiCooperazione.getSender().getId().getType(),
datiCooperazione.getSender().getId().getBase(),
datiCooperazione.getSender().getDomainId()));
}
IDServizio idServizio = null;
IDSoggetto idSoggettoErogatore = null;
if(datiCooperazione.getProvider()!=null){
idSoggettoErogatore = new IDSoggetto(datiCooperazione.getProvider().getId().getType(),
datiCooperazione.getProvider().getId().getBase(),
datiCooperazione.getProvider().getDomainId());
}
if(datiCooperazione.getService()!=null){
idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(datiCooperazione.getService().getType(),
datiCooperazione.getService().getBase(),
idSoggettoErogatore,
datiCooperazione.getService().getVersion());
}
if(idServizio!=null){
idServizio.setAzione(datiCooperazione.getAction());
eccezione.setServizio(idServizio);
}
eccezione.setServizioApplicativo(datiCooperazione.getApplication());
}
return eccezione;
}catch(Exception e){
throw new ProtocolException(e.getMessage(), e);
}
}
}