Validatore.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.engine.validator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.core.transazioni.utils.TempiElaborazione;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.message.OpenSPCoop2MessageFactory;
import org.openspcoop2.message.constants.MessageType;
import org.openspcoop2.message.constants.ServiceBinding;
import org.openspcoop2.protocol.engine.Configurazione;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.BustaRawContent;
import org.openspcoop2.protocol.sdk.Context;
import org.openspcoop2.protocol.sdk.Eccezione;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.SecurityInfo;
import org.openspcoop2.protocol.sdk.Servizio;
import org.openspcoop2.protocol.sdk.builder.ProprietaManifestAttachments;
import org.openspcoop2.protocol.sdk.config.IProtocolManager;
import org.openspcoop2.protocol.sdk.constants.ErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.ErroriCooperazione;
import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
import org.openspcoop2.protocol.sdk.constants.LivelloRilevanza;
import org.openspcoop2.protocol.sdk.constants.RuoloBusta;
import org.openspcoop2.protocol.sdk.state.IState;
import org.openspcoop2.protocol.sdk.state.RequestInfo;
import org.openspcoop2.protocol.sdk.validator.IValidatoreErrori;
import org.openspcoop2.protocol.sdk.validator.ProprietaValidazione;
import org.openspcoop2.protocol.sdk.validator.ProprietaValidazioneErrori;
import org.openspcoop2.security.message.MessageSecurityContext;
import org.openspcoop2.security.message.SubErrorCodeSecurity;
import org.openspcoop2.utils.LoggerWrapperFactory;
import org.openspcoop2.utils.digest.IDigestReader;
import org.slf4j.Logger;
/**
* Classe utilizzata per effettuare la validazione di una busta
*
* @author Poli Andrea (apoli@link.it)
* @author Tronci Fabio (tronci@link.it)
* @author Lorenzo Nardi (nardi@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class Validatore {
/* ******** F I E L D S P R I V A T I ******** */
/** Se IState e' un'istanza di StatefulMessage possiede una Connessione SQL in autoCommit mode su cui effettuare query
* Altrimenti, e' un'istanza di StatelessMessage e nn necessita di connessioni */
private IState state;
/** Messaggio. */
private OpenSPCoop2Message msg;
private Context context;
/** Proprieta di Validazione. */
private ProprietaValidazione proprietaValidazione;
/** Eventuale errore avvenuto durante il processo di validazione */
ErroreCooperazione errore;
IntegrationFunctionError errore_integrationFunctionError;
/** Errori di validazione riscontrati sulla busta */
private java.util.List<Eccezione> erroriValidazione = new ArrayList<>();
/** Errori di processamento riscontrati sulla busta */
private java.util.List<Eccezione> erroriProcessamento = new ArrayList<>();
private String erroreProcessamento_internalMessage;
/** Indicazione se la busta validata e' un messaggio errore */
private boolean isMessaggioErrore;
private boolean isMessaggioErroreIntestazione;
private boolean isMessaggioErroreProcessamento;
/** Indicazione se la busta validata e' una busta di servizio.
* Una busta e' una busta di servizio, se:
* - non possiede un servizio (non e' quindi una richiesta)
* - non possiede un riferimentoMsg (non e' quindi una risposta)
**/
private boolean isBustaDiServizio;
/** Oggetto Busta contenente i valori della busta ricevuta */
private Busta busta;
/** Soggetto Mittente della busta */
private IDSoggetto mittente;
/** Servizio richiesto nella busta */
private IDServizio servizio;
/** ValidazioneSintattica */
private ValidazioneSintattica validatoreSintattico;
public ValidazioneSintattica getValidatoreSintattico() {
return this.validatoreSintattico;
}
public void setValidatoreSintattico(ValidazioneSintattica validator) {
this.validatoreSintattico = validator;
}
/** ServizioCorrelato */
private String servizioCorrelato;
/** Tipo ServizioCorrelato */
private String tipoServizioCorrelato;
/** Versione ServizioCorrelato */
private Integer versioneServizioCorrelato;
/** informazioni Servizio */
private Servizio infoServizio = null;
/** Profilo di Gestione */
private String versioneProtocollo = null;
/** RuoloBusta */
private RuoloBusta ruoloBustaRicevuta = null;
/** SecurityInfo */
private SecurityInfo securityInfo = null;
/** Indicazione se leggere gli attributi qualificati */
private boolean readQualifiedAttribute;
/** Logger utilizzato per debug. */
private org.slf4j.Logger log = null;
private IProtocolFactory<?> protocolFactory;
private IProtocolManager protocolManager;
/** bustaErroreHeaderIntestazione: generata solo quando la busta arrivata non contiene gli elementi principali */
private Busta bustaErroreHeaderIntestazione = null;
public Busta getBustaErroreHeaderIntestazione() {
return this.bustaErroreHeaderIntestazione;
}
/**
* Costruttore
*
* @param aMsg Messaggio da validare.
* @param aValidazione tipo di validazione.
* @param state Oggetto che rappresenta lo stato di una busta
* @throws ProtocolException
*
*/
public Validatore(OpenSPCoop2Message aMsg,Context ctx,ProprietaValidazione aValidazione, IState state,boolean readQualifiedAttribute, IProtocolFactory<?> protocolFactory) throws ProtocolException {
this(aMsg,ctx,aValidazione,state,Configurazione.getLibraryLog(),readQualifiedAttribute, protocolFactory);
}
/**
* Costruttore
*
* @param aMsg Messaggio da validare.
* @param aValidazione tipo di validazione.
* @param state Oggetto che rappresenta lo stato di una busta
* @throws ProtocolException
*
*/
public Validatore(OpenSPCoop2Message aMsg,Context ctx,ProprietaValidazione aValidazione,IState state,Logger alog,boolean readQualifiedAttribute, IProtocolFactory<?> protocolFactory) throws ProtocolException {
this.msg = aMsg;
this.context = ctx;
if(aValidazione == null)
this.proprietaValidazione = new ProprietaValidazione();
else
this.proprietaValidazione = aValidazione;
this.state = state;
if(alog!=null){
this.log = alog;
}else{
this.log = LoggerWrapperFactory.getLogger(Validatore.class);
}
this.readQualifiedAttribute = readQualifiedAttribute;
this.protocolFactory = protocolFactory;
this.protocolManager = this.protocolFactory.createProtocolManager();
}
/**
* Costruttore
*
* @param aMsg Messaggio da validare.
* @throws ProtocolException
*
*/
public Validatore(OpenSPCoop2Message aMsg,Context ctx,IState state,Logger alog, IProtocolFactory<?> protocolFactory) throws ProtocolException {
this(aMsg,ctx,null,state,alog,false, protocolFactory);
}
public void updateState(IState state){
this.state = state;
}
/**
* Avvia il processo di lettura di una busta ricevuta.
* Viene effettuata una validazione sintattica
* Vengono effettuati i seguenti passi:
* <ul>
* <li> Controllo header
* </ul>
*
*
* @return true in caso di identificazione con successo, false altrimenti.
*
*/
public boolean validazioneSintattica() {
return validazioneSintattica(null, null);
}
/**
* Per la validazione puo' essere necessaria la busta qualora le informazioni di cooperazione non siano dentro al messaggio.
*
* @param busta
* @return true se la struttura del messaggio e' corretta
*/
public boolean validazioneSintattica(Busta busta, Boolean isRichiestaParam) {
boolean request = (isRichiestaParam==null) || (isRichiestaParam.booleanValue());
try{
/** (Controllo presenza Busta) */
this.validatoreSintattico = new ValidazioneSintattica(this.context, this.state,this.msg, busta, isRichiestaParam, this.log,this.readQualifiedAttribute, this.protocolFactory);
if (this.validatoreSintattico.valida() == false){
this.errore = this.validatoreSintattico.getErrore();
this.errore_integrationFunctionError = this.validatoreSintattico.getErrore_integrationFunctionError();
if(this.errore_integrationFunctionError==null) {
if(request){
this.errore_integrationFunctionError = IntegrationFunctionError.INVALID_INTEROPERABILITY_PROFILE_REQUEST;
}
else {
this.errore_integrationFunctionError = IntegrationFunctionError.INVALID_INTEROPERABILITY_PROFILE_RESPONSE;
}
}
this.bustaErroreHeaderIntestazione = this.validatoreSintattico.getBustaErroreHeaderIntestazione();
return false;
}
this.errore_integrationFunctionError = this.validatoreSintattico.getErrore_integrationFunctionError();
this.busta = this.validatoreSintattico.getBusta();
IValidatoreErrori validatoreErrori = this.protocolFactory.createValidatoreErrori(this.state);
ProprietaValidazioneErrori pValidazioneErrori = new ProprietaValidazioneErrori();
pValidazioneErrori.setIgnoraEccezioniNonGravi(this.protocolManager.isIgnoraEccezioniNonGravi());
this.isMessaggioErrore = validatoreErrori.isBustaErrore(this.busta,this.msg,pValidazioneErrori);
this.isMessaggioErroreIntestazione = validatoreErrori.isBustaErroreIntestazione(this.busta, this.msg,pValidazioneErrori);
this.isMessaggioErroreProcessamento = validatoreErrori.isBustaErroreProcessamento(this.busta, this.msg,pValidazioneErrori);
this.isBustaDiServizio = this.protocolFactory.createProtocolManager().isBustaServizio(this.busta);
if(this.isMessaggioErrore){
addListaEccezioni(this.validatoreSintattico.getErroriTrovatiSullaListaEccezioni(),this.erroriValidazione);
}
else{
addListaEccezioni(this.validatoreSintattico.getEccezioniValidazione(),this.erroriValidazione);
}
addListaEccezioni(this.validatoreSintattico.getEccezioniProcessamento(),this.erroriProcessamento);
this.erroreProcessamento_internalMessage = this.validatoreSintattico.getErroreProcessamento_internalMessage();
// Se comunque e' arrivata un busta di servizio, che non possiede nemmeno uno delle seguenti cose:
// - lista eccezioni
// - lista riscontri
// Allora non si tratta di una busta di servizio bensi' di una busta malformata
if((this.isBustaDiServizio) && (this.busta.sizeListaEccezioni()<=0) && (this.busta.sizeListaRiscontri()<=0)){
Eccezione ec = Eccezione.getEccezioneValidazione(ErroriCooperazione.SERVIZIO_SCONOSCIUTO.getErroreCooperazione(), this.protocolFactory);
this.erroriValidazione.add(ec);
this.isBustaDiServizio = false;
}
// Costruzione IDMittente e IDServizio
if(this.busta.getTipoMittente()!=null && this.busta.getMittente()!=null){
this.mittente = new IDSoggetto(this.busta.getTipoMittente(),this.busta.getMittente());
this.mittente.setCodicePorta(this.busta.getIdentificativoPortaMittente());
}
if(this.isBustaDiServizio==false) {
try {
this.servizio = IDServizioFactory.getInstance().getIDServizioFromValues(this.busta.getTipoServizio(),this.busta.getServizio(),
this.busta.getTipoDestinatario(),this.busta.getDestinatario(),
this.busta.getVersioneServizio());
}catch(Exception e) {
this.log.debug("Generazione IDServizio non possibile: "+ e.getMessage());
}
if(this.servizio!=null) {
this.servizio.setAzione(this.busta.getAzione());
if(this.servizio!=null && this.servizio.getSoggettoErogatore()!=null) {
this.servizio.getSoggettoErogatore().setCodicePorta(this.busta.getIdentificativoPortaDestinatario());
}
}
}
// Se la lettura precedente ha riscontrato anomalie, ho gia' finito
if( ( (this.erroriValidazione!=null) && (this.erroriValidazione.size()>0) )
||
( (this.erroriProcessamento!=null) && (this.erroriProcessamento.size()>0) )
)
return true; // riscontrati errori durante la validazione sintattica.
return true;
}catch(Exception e){
this.log.error("validazioneSintattica",e);
this.eccezioneProcessamentoValidazioneSintattica = e;
this.errore = ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreProcessamento("Errore di processamento: " +e.getMessage());
if(request){
this.errore_integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
}
else {
this.errore_integrationFunctionError = IntegrationFunctionError.INTERNAL_RESPONSE_ERROR;
}
return false;
}
}
private Exception eccezioneProcessamentoValidazioneSintattica = null;
public Exception getEccezioneProcessamentoValidazioneSintattica() {
return this.eccezioneProcessamentoValidazioneSintattica;
}
/**
* Avvia il processo di validazione.
* Vengono effettuati i seguenti passi:
* <ul>
* <li> Message-Security
* <li> Controllo eventuale SOAPFault di un messaggio Errore
* <li> Controllo eventuale di un manifest degli attachments
* <li> Controllo con schema xsd
* <li> Validazione Semantica
* </ul>
*
* @param messageSecurityContext MessageSecurityContext utilizzato per l'applicazione di un header di MessageSecurity
* @return true in caso di validazione effettuata (con o senza errori), false in caso di errori di processamento
*
*/
private boolean rilevatiErroriDuranteValidazioneSemantica = false;
public boolean isRilevatiErroriDuranteValidazioneSemantica() {
return this.rilevatiErroriDuranteValidazioneSemantica;
}
public boolean validazioneSemantica_beforeMessageSecurity(ServiceBinding serviceBinding, boolean rispostaConnectionReply,String profiloGestione, RequestInfo requestInfo) {
try{
this.rilevatiErroriDuranteValidazioneSemantica = true; // in fondo se arrivo corretto lo re-imposto a false
if(this.validatoreSintattico == null){
this.errore = ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreProcessamento("Errore di processamento: Analisi sintattica richiesta e validatoreSintattico non risulta inizializzato");
return false;
}
// Tipo Busta (Servizio,Richiesta,Risposta,Ricevuta)
if(this.ruoloBustaRicevuta==null)
this.ruoloBustaRicevuta = ValidazioneSemantica.getTipoBustaDaValidare(serviceBinding, this.busta, this.protocolFactory, rispostaConnectionReply,this.state,this.log);
//log.info("Validazione tipoBusta ["+tipoBusta+"]...");
// Riconoscimento Profilo di Gestione per servizio erogato.
try{
if(rispostaConnectionReply){
this.versioneProtocollo = profiloGestione;
}else{
if(this.busta!=null && this.busta.getMittente()!=null && this.busta.getTipoMittente()!=null){
this.versioneProtocollo = ValidazioneSemantica.riconoscimentoVersioneProtocolloServizioErogato(this.busta, this.protocolFactory.createTraduttore(), this.ruoloBustaRicevuta, this.state, requestInfo);
}
else{
// caso di protocollo che non richiedono l'autenticazione del soggetto
this.versioneProtocollo = profiloGestione;
}
}
}catch(Exception e){
// L'eventuale errore, e' dovuto al non riconoscimento nel registro dei servizi del soggetto mittente o destinatario.
// L'errore verra' riportato poi nel resto della validazione se il messaggio non era un messaggio Errore
// Se invece era gia' stato marcato come messaggio Errore, molto probabilmente uno dei motivi era quello!
this.log.error("Riconoscimento profilo di gestione non riuscito",e);
}
if(this.protocolFactory.createProtocolVersionManager(this.versioneProtocollo).isEccezioniLivelloInfoAbilitato()){
// Eventuali eccezioni trovate in buste errore, di livello INFO, non marcano il msg come BustaErrore, rieffettuo il test
if(this.isMessaggioErrore){
IValidatoreErrori validatoreErrori = this.protocolFactory.createValidatoreErrori(this.state);
ProprietaValidazioneErrori pValidazioneErrori = new ProprietaValidazioneErrori();
pValidazioneErrori.setIgnoraEccezioniNonGravi(this.protocolManager.isIgnoraEccezioniNonGravi());
pValidazioneErrori.setVersioneProtocollo(this.versioneProtocollo);
this.isMessaggioErrore = validatoreErrori.isBustaErrore(this.busta,this.msg,pValidazioneErrori);
this.isMessaggioErroreIntestazione = validatoreErrori.isBustaErroreIntestazione(this.busta, this.msg,pValidazioneErrori);
this.isMessaggioErroreProcessamento = validatoreErrori.isBustaErroreProcessamento(this.busta, this.msg,pValidazioneErrori);
}
}
// Se la lettura precedente (readBusta) ha riscontrato anomalie, ho gia' finito
boolean ignoraEccezioniLivelloNonGravi = this.protocolFactory.createProtocolVersionManager(this.versioneProtocollo).isIgnoraEccezioniLivelloNonGrave();
int sizeErroriValidazione = countErrori(ignoraEccezioniLivelloNonGravi, this.erroriValidazione);
int sizeErroriProcessamento = countErrori(ignoraEccezioniLivelloNonGravi, this.erroriProcessamento);
if( sizeErroriValidazione>0 || sizeErroriProcessamento>0 )
return true; // riscontrati errori durante la validazione sintattica.
}catch(Exception e){
this.log.error("validazioneSemantica (validazioneSemantica_beforeMessageSecurity)",e);
this.eccezioneProcessamentoValidazioneSemantica = e;
this.errore = ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreCooperazione();
return false;
}
this.rilevatiErroriDuranteValidazioneSemantica = false;
return true;
}
public boolean validazioneSemantica_messageSecurity_readSecurityInfo(MessageSecurityContext messageSecurityContext) {
try{
this.rilevatiErroriDuranteValidazioneSemantica = true; // in fondo se arrivo corretto lo re-imposto a false
/** Leggo contesto sicurezza prima di processare la parte MessageSecurity */
IDigestReader digestReader = null;
if(messageSecurityContext != null) {
digestReader = messageSecurityContext.getDigestReader(this.msg!=null ? this.msg.getFactory() : OpenSPCoop2MessageFactory.getDefaultMessageFactory());
}
if(messageSecurityContext!= null && digestReader!=null){
this.securityInfo = this.protocolFactory.createValidazioneSemantica(this.state).readSecurityInformation(digestReader,
this.msg);
}
}catch(Exception e){
this.log.error("validazioneSemantica (validazioneSemantica_messageSecurity_readSecurityInfo)",e);
this.eccezioneProcessamentoValidazioneSemantica = e;
this.errore = ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreCooperazione();
return false;
}
this.rilevatiErroriDuranteValidazioneSemantica = false;
return true;
}
public boolean validazioneSemantica_messageSecurity_process(MessageSecurityContext messageSecurityContext, StringBuilder errore, TempiElaborazione tempiElaborazione, boolean request) {
try{
this.rilevatiErroriDuranteValidazioneSemantica = true; // in fondo se arrivo corretto lo re-imposto a false
/** Applicazione Message-Security (eventualmente per decriptare il body applicativo: utile anche per il SoapFault del MessaggioErrore) */
if(messageSecurityContext!= null && messageSecurityContext.getIncomingProperties() != null && messageSecurityContext.getIncomingProperties().size() > 0){
boolean existsHeaderMessageSecurity = messageSecurityContext.existsSecurityHeader(this.msg, messageSecurityContext.getActor());
if(messageSecurityContext.processIncoming(this.msg,this.busta,this.context, tempiElaborazione) == false){
List<Eccezione> eccezioniSicurezza = new ArrayList<>();
if(messageSecurityContext.getListaSubCodiceErrore()!=null && messageSecurityContext.getListaSubCodiceErrore().size()>0){
List<SubErrorCodeSecurity> subCodiciErrore = messageSecurityContext.getListaSubCodiceErrore();
for (Iterator<?> iterator = subCodiciErrore.iterator(); iterator.hasNext();) {
SubErrorCodeSecurity subCodiceErrore = (SubErrorCodeSecurity) iterator.next();
Eccezione ecc = new Eccezione(ErroriCooperazione.MESSAGE_SECURITY.getErroreMessageSecurity(subCodiceErrore.getMsgErrore(), messageSecurityContext.getCodiceErrore()),true,null, this.protocolFactory);
ecc.setSubCodiceEccezione(subCodiceErrore);
eccezioniSicurezza.add(ecc);
}
}else{
Eccezione ecc = new Eccezione(ErroriCooperazione.MESSAGE_SECURITY.getErroreMessageSecurity(messageSecurityContext.getMsgErrore(),messageSecurityContext.getCodiceErrore()), true, null, this.protocolFactory);
eccezioniSicurezza.add(ecc);
}
if(request) {
this.errore_integrationFunctionError=IntegrationFunctionError.MESSAGE_SECURITY_REQUEST_FAILED;
}
else {
this.errore_integrationFunctionError=IntegrationFunctionError.MESSAGE_SECURITY_RESPONSE_FAILED;
}
if(this.isMessaggioErrore){
// NOTA: il message security header puo' non essere presente se l'altra porta di dominio, ha generato un messaggio Busta Errore.
// La porta di dominio riesce ad aggiungere l'header di sicurezza solo se riesce ad identificare la PortaApplicativa/Delegata,
// altrimenti genera un msg di Busta Errore chiaramente senza header di sicurezza.
if(existsHeaderMessageSecurity){
for (Iterator<?> iterator = eccezioniSicurezza.iterator(); iterator.hasNext();) {
Eccezione ecc = (Eccezione) iterator.next();
this.erroriValidazione.add(ecc);
if(errore.length()>0){
errore.append("\n");
}
errore.append(ecc.getDescrizione(this.protocolFactory));
}
return true; // riscontrati errori durante la validazione Message Security
}
else{
StringBuilder bf = new StringBuilder();
for (Iterator<?> iterator = eccezioniSicurezza.iterator(); iterator.hasNext();) {
Eccezione ecc = (Eccezione) iterator.next();
if(bf.length()>0){
bf.append(" ; ");
}
bf.append(ecc.toString(this.protocolFactory));
}
this.log.debug("MessageSecurityHeader not exists: "+bf.toString());
}
}else{
for (Iterator<?> iterator = eccezioniSicurezza.iterator(); iterator.hasNext();) {
Eccezione ecc = (Eccezione) iterator.next();
this.erroriValidazione.add(ecc);
if(errore.length()>0){
errore.append("\n");
}
errore.append(ecc.getDescrizione(this.protocolFactory));
}
return true; // riscontrati errori durante la validazione Message Security
}
}
}
}catch(Exception e){
if(errore.length()>0){
errore.append("\n");
}
errore.append(e.getMessage());
this.log.error("validazioneSemantica (validazioneSemantica_messageSecurity_process)",e);
this.eccezioneProcessamentoValidazioneSemantica = e;
this.errore = ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreCooperazione();
return false;
}
this.rilevatiErroriDuranteValidazioneSemantica = false;
return true;
}
public boolean validazioneSemantica_afterMessageSecurity(ProprietaManifestAttachments proprietaManifestAttachments,boolean validazioneIdentificativiCompleta, RequestInfo requestInfo) {
try{
this.rilevatiErroriDuranteValidazioneSemantica = true; // in fondo se arrivo corretto lo re-imposto a false
/** Se ho ricevuto un messaggio Busta Errore, devo controllare il SOAPFault ricevuto
* Deve essere fatta dopo Message-Security per il Body (attachments manifest)
*/
if(this.isMessaggioErrore){
this.validatoreSintattico.validazioneFault(this.msg);
addListaEccezioni(this.validatoreSintattico.getErroriTrovatiSullaListaEccezioni(),this.erroriValidazione);
addListaEccezioni(this.validatoreSintattico.getEccezioniProcessamento(),this.erroriProcessamento);
if( ( (this.erroriValidazione!=null) && (this.erroriValidazione.size()>0) )
||
( (this.erroriProcessamento!=null) && (this.erroriProcessamento.size()>0) )
)
return true; // riscontrati errori durante la validazione
}
// Controllo se il messaggio ha attachments
boolean hasAttachments = false;
if(ServiceBinding.SOAP.equals(this.msg.getServiceBinding())){
hasAttachments = this.msg.castAsSoap().hasAttachments();
}
else if(MessageType.MIME_MULTIPART.equals(this.msg.getMessageType())){
hasAttachments = true;
}
/** Se ho ricevuto un messaggio con Attachments devo controllare il manifest
* Deve essere fatta dopo Message-Security per il Body (attachments manifest)
*/
// Questa validazione non deve essere effettuata per messaggi Busta Errore
if(this.isMessaggioErrore==false){
if(this.proprietaValidazione.isValidazioneManifestAttachments()){
if(hasAttachments){
this.validatoreSintattico.validazioneManifestAttachments(this.msg,proprietaManifestAttachments);
addListaEccezioni(this.validatoreSintattico.getEccezioniValidazione(),this.erroriValidazione);
addListaEccezioni(this.validatoreSintattico.getEccezioniProcessamento(),this.erroriProcessamento);
if( ( (this.erroriValidazione!=null) && (this.erroriValidazione.size()>0) )
||
( (this.erroriProcessamento!=null) && (this.erroriProcessamento.size()>0) )
)
return true; // riscontrati errori durante la validazione
}
}
}
/** Validazione semantica */
// Questa validazione non deve essere effettuata per messaggi Busta Errore
if(this.isMessaggioErrore==false){
ValidazioneSemantica registryValidator = new ValidazioneSemantica(this.busta,this.context,this.state,validazioneIdentificativiCompleta,this.log, this.protocolFactory);
registryValidator.valida(this.msg,this.proprietaValidazione,this.ruoloBustaRicevuta,this.versioneProtocollo, requestInfo);
addListaEccezioni(registryValidator.getEccezioniValidazione(),this.erroriValidazione);
addListaEccezioni(registryValidator.getEccezioniProcessamento(),this.erroriProcessamento);
this.servizioCorrelato = registryValidator.getServizioCorrelato();
this.tipoServizioCorrelato = registryValidator.getTipoServizioCorrelato();
this.versioneServizioCorrelato = registryValidator.getVersioneServizioCorrelato();
this.infoServizio = registryValidator.getInfoServizio();
this.errore_integrationFunctionError = registryValidator.getErrore_integrationFunctionError();
if( ( (this.erroriValidazione!=null) && (this.erroriValidazione.size()>0) )
||
( (this.erroriProcessamento!=null) && (this.erroriProcessamento.size()>0) )
)
return true; // riscontrati errori durante la validazione sul registro.
}
/** Validazione con SCHEMA (Opzionale): deve essere fatta dopo Message-Security per il Body (attachments manifest)*/
// Questa validazione deve essere effettuata anche per messaggi Busta Errore
if( this.proprietaValidazione.isValidazioneConSchema() ){
ValidazioneConSchema schemaValidator = new ValidazioneConSchema(this.msg,
this.isMessaggioErroreProcessamento, this.isMessaggioErroreIntestazione,
this.proprietaValidazione.isValidazioneManifestAttachments(), this.log, this.protocolFactory,
this.state);
schemaValidator.valida(hasAttachments);
addListaEccezioni(schemaValidator.getEccezioniValidazione(),this.erroriValidazione);
addListaEccezioni(schemaValidator.getEccezioniProcessamento(),this.erroriProcessamento);
if( ( (this.erroriValidazione!=null) && (this.erroriValidazione.size()>0) )
||
( (this.erroriProcessamento!=null) && (this.erroriProcessamento.size()>0) )
)
return true; // riscontrati errori durante la validazione
}
}catch(Exception e){
this.log.error("validazioneSemantica (validazioneSemantica_afterMessageSecurity)",e);
this.eccezioneProcessamentoValidazioneSemantica = e;
this.errore = ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreCooperazione();
return false;
}
this.rilevatiErroriDuranteValidazioneSemantica = false;
return true;
}
private Exception eccezioneProcessamentoValidazioneSemantica = null;
public Exception getEccezioneProcessamentoValidazioneSemantica() {
return this.eccezioneProcessamentoValidazioneSemantica;
}
/**
* In caso di avvenuto errore durante il processo di validazione,
* questo metodo ritorna l'errore.
*
* @return errore (se avvenuto).
*
*/
public ErroreCooperazione getErrore(){
return this.errore;
}
public IntegrationFunctionError getErrore_integrationFunctionError() {
return this.errore_integrationFunctionError;
}
/**
* Indicazione se la validazione della busta ha riscontrato eccezioni
*
* @return true in caso la validazione abbia riscontrato eccezioni.
*
*/
public boolean validazioneConEccezioni(){
if( ( (this.erroriValidazione!=null) && (this.erroriValidazione.size()>0) )
||
( (this.erroriProcessamento!=null) && (this.erroriProcessamento.size()>0) )
)
return true;
else
return false;
}
/**
* Ritorna un List contenente eventuali eccezioni di validazione riscontrate nella busta.
*
* @return Eccezioni riscontrate nella busta.
*
*/
public java.util.List<Eccezione> getEccezioniValidazione(){
if(this.erroriValidazione!=null)
return this.erroriValidazione;
else
return new java.util.ArrayList<Eccezione>();
}
/**
* Ritorna un List contenente eventuali eccezioni di processamento riscontrate nella busta.
*
* @return Eccezioni riscontrate nella busta.
*
*/
public java.util.List<Eccezione> getEccezioniProcessamento(){
if(this.erroriProcessamento!=null)
return this.erroriProcessamento;
else
return new java.util.ArrayList<Eccezione>();
}
public String getErroreProcessamento_internalMessage() {
return this.erroreProcessamento_internalMessage;
}
/**
* Indicazione se la busta processata e' un messaggio Errore.
*
* @return true se la busta e' un messaggio errore.
*
*/
public boolean isErroreProtocollo(){
return this.isMessaggioErrore;
}
public boolean isMessaggioErroreIntestazione() {
return this.isMessaggioErroreIntestazione;
}
public boolean isMessaggioErroreProcessamento() {
return this.isMessaggioErroreProcessamento;
}
/**
* Indicazione se la busta processata e' una busta di servizio
*
* @return true se la busta e' una busta di servizio
*
*/
public boolean isBustaDiServizio(){
return this.isBustaDiServizio;
}
/**
* Oggetto Busta contenente i valori della busta ricevuta.
*
* @return busta.
*
*/
public Busta getBusta(){
return this.busta;
}
/**
* Soggetto Mittente.
*
* @return soggetto Mittente.
*
*/
public IDSoggetto getSoggettoMittente(){
return this.mittente;
}
public void setMittente(IDSoggetto mittente) {
this.mittente = mittente;
}
/**
* Identificativo del servizio presente nella busta.
*
* @return identificativo del servizio richiesto.
*
*/
public IDServizio getIDServizio(){
return this.servizio;
}
/**
* Eventuale servizio correlato associato al servizio presente nella busta.
*
* @return Eventuale servizio correlato associato al servizio presente nella busta.
*
*/
public String getServizioCorrelato() {
return this.servizioCorrelato;
}
/**
* Eventuale tipo di servizio correlato associato al servizio presente nella busta.
*
* @return Eventuale tipo di servizio correlato associato al servizio presente nella busta.
*
*/
public String getTipoServizioCorrelato() {
return this.tipoServizioCorrelato;
}
public Integer getVersioneServizioCorrelato() {
return this.versioneServizioCorrelato;
}
public Servizio getInfoServizio() {
return this.infoServizio;
}
public String getProfiloGestione() {
return this.versioneProtocollo;
}
public void setProfiloGestione(String profiloGestione) {
this.versioneProtocollo = profiloGestione;
}
public RuoloBusta getRuoloBustaRicevuta(ServiceBinding serviceBinding, boolean rispostaConnectionReply) throws ProtocolException {
if(this.ruoloBustaRicevuta==null)
this.ruoloBustaRicevuta= ValidazioneSemantica.getTipoBustaDaValidare(serviceBinding, this.busta, this.protocolFactory, rispostaConnectionReply,this.state,this.log);
return this.ruoloBustaRicevuta;
}
public void setProprietaValidazione(ProprietaValidazione proprietaValidazione) {
this.proprietaValidazione = proprietaValidazione;
}
public BustaRawContent<?> getHeaderProtocollo() {
return this.validatoreSintattico.getProtocolHeader();
}
public BustaRawContent<?> getHeaderProtocollo_senzaControlli() throws ProtocolException{
this.validatoreSintattico = new ValidazioneSintattica(this.context, this.state,this.msg,this.log, this.protocolFactory);
return this.validatoreSintattico.getHeaderProtocollo_senzaControlli();
}
private void addListaEccezioni(List<Eccezione> from,List<Eccezione> to){
if(from!=null){
to.addAll(from);
}
}
public SecurityInfo getSecurityInfo() {
return this.securityInfo;
}
private int countErrori(boolean ignoraEccezioniNonGravi,List<Eccezione> list){
int size = 0;
if(list!=null){
for (Eccezione eccezione : list) {
if(eccezione.getRilevanza()!=null && ignoraEccezioniNonGravi){
if(LivelloRilevanza.isEccezioneLivelloGrave(eccezione.getRilevanza())){
size++;
}
}
else{
size++;
}
}
}
return size;
}
public void updateMsg(OpenSPCoop2Message msg) throws ProtocolException {
String msgClassName = msg.getClass().getName()+ "";
boolean update = !msgClassName.equals(this.msg.getClass().getName());
if(update){
this.msg = msg;
if(this.validatoreSintattico!=null){
this.validatoreSintattico.updateMsg(msg);
}
}
}
}