ValidazioneSintattica.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 javax.xml.soap.SOAPHeader;
import org.openspcoop2.core.constants.TipoPdD;
import org.openspcoop2.message.OpenSPCoop2Message;
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.builder.ProprietaManifestAttachments;
import org.openspcoop2.protocol.sdk.config.IProtocolManager;
import org.openspcoop2.protocol.sdk.constants.ErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
import org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione;
import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
import org.openspcoop2.protocol.sdk.state.IState;
import org.openspcoop2.protocol.sdk.validator.ProprietaValidazioneErrori;
import org.openspcoop2.protocol.sdk.validator.ValidazioneSintatticaResult;
import org.openspcoop2.utils.LoggerWrapperFactory;
import org.slf4j.Logger;
/**
* Classe utilizzata per la validazione sintattica di una busta.
*
*
* @author Poli Andrea (apoli@link.it)
* @author Lorenzo Nardi (nardi@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class ValidazioneSintattica {
/** Messaggio. */
protected OpenSPCoop2Message msg;
/** HeaderSOAP */
protected SOAPHeader headerSOAP = null;
/** Header */
protected BustaRawContent<?> headerProtocollo;
public BustaRawContent<?> getProtocolHeader(){
return this.headerProtocollo;
}
public void setHeaderSOAP(SOAPHeader headerSOAP) {
this.headerSOAP = headerSOAP;
}
/** Errori di validazione riscontrati sulla busta */
protected java.util.List<Eccezione> erroriValidazione;
/** Errori di processamento riscontrati sulla busta */
protected java.util.List<Eccezione> erroriProcessamento;
private String erroreProcessamento_internalMessage;
/** Errors riscontrati sulla lista eccezioni */
protected java.util.List<Eccezione> errorsTrovatiSullaListaEccezioni;
/** Busta */
protected Busta busta;
protected Boolean isRichiesta;
/** Eventuale errore avvenuto durante il processo di validazione */
protected ErroreCooperazione errore;
protected IntegrationFunctionError errore_integrationFunctionError;
/** Indicazione se leggere gli attributi qualificati */
protected boolean readQualifiedAttribute;
/** Logger utilizzato per debug. */
protected org.slf4j.Logger log = null;
protected boolean segnalazioneElementoPresentePiuVolte = false;
private IProtocolFactory<?> protocolFactory;
private IProtocolManager protocolManager;
/** Indicazione se la busta risulta scaduta */
protected boolean messaggioScaduto = false;
/** bustaErroreHeaderIntestazione: generata solo quando la busta arrivata non contiene gli elementi principali */
protected Busta bustaErroreHeaderIntestazione = null;
public Busta getBustaErroreHeaderIntestazione() {
return this.bustaErroreHeaderIntestazione;
}
/** Stato */
private IState state;
/** Context */
private Context context;
/**
* Costruttore
*
* @param aMsg Messaggio da validare.
* @throws ProtocolException
*
*/
public ValidazioneSintattica(Context context, IState state,OpenSPCoop2Message aMsg,boolean readQualifiedAttribute, IProtocolFactory<?> protocolFactory) throws ProtocolException {
this(context,state,aMsg,Configurazione.getLibraryLog(),readQualifiedAttribute, protocolFactory);
}
public ValidazioneSintattica(Context context, IState state,OpenSPCoop2Message aMsg, IProtocolFactory<?> protocolFactory) throws ProtocolException {
this(context,state,aMsg,Configurazione.getLibraryLog(),false, protocolFactory);
}
public ValidazioneSintattica(Context context, IState state,OpenSPCoop2Message aMsg,Logger alog, IProtocolFactory<?> protocolFactory) throws ProtocolException {
this(context, state,aMsg,alog,false, protocolFactory);
}
/**
* Costruttore
*
* @param aMsg Messaggio da validare.
* @throws ProtocolException
*
*/
public ValidazioneSintattica(Context context, IState state,OpenSPCoop2Message aMsg, Busta busta, Boolean isRichiesta, Logger alog, boolean readQualifiedAttribute, IProtocolFactory<?> protocolFactory) throws ProtocolException {
this(context, state,aMsg, alog, readQualifiedAttribute, protocolFactory);
this.busta = busta;
this.isRichiesta = isRichiesta;
}
public ValidazioneSintattica(Context context, IState state,OpenSPCoop2Message aMsg,Logger alog,boolean readQualifiedAttribute, IProtocolFactory<?> protocolFactory) throws ProtocolException {
this.state = state;
this.context = context;
this.msg = aMsg;
if(alog!=null){
this.log = alog;
}else{
this.log = LoggerWrapperFactory.getLogger(ValidazioneSintattica.class.getName());
}
this.readQualifiedAttribute = readQualifiedAttribute;
this.protocolFactory = protocolFactory;
this.protocolManager = this.protocolFactory.createProtocolManager();
}
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.headerProtocollo!=null){
org.openspcoop2.protocol.sdk.validator.IValidazioneSintattica<?> validazioneSintattica = this.protocolFactory.createValidazioneSintattica(this.state);
this.headerProtocollo = validazioneSintattica.getBustaRawContent_senzaControlli(this.msg);
}
}
}
public IProtocolFactory<?> getProtocolFactory(){
return this.protocolFactory;
}
/**
* Oggetto Busta contenente i valori della busta ricevuta.
*
* @return busta.
*
*/
public Busta getBusta(){
return this.busta;
}
/**
* Ritorna un List contenente eventuali eccezioni di validazione riscontrate nella busta.
*
* @return Eccezioni riscontrate nella busta.
*
*/
public java.util.List<Eccezione> getEccezioniValidazione(){
return this.erroriValidazione;
}
/**
* Ritorna un List contenente eventuali eccezioni di processamento riscontrate nella busta.
*
* @return Eccezioni riscontrate nella busta.
*
*/
public java.util.List<Eccezione> getEccezioniProcessamento(){
return this.erroriProcessamento;
}
public String getErroreProcessamento_internalMessage() {
return this.erroreProcessamento_internalMessage;
}
/**
* Ritorna un List contenente eventuali eccezioni riscontrate nella busta durante il processo di validazione.
*
* @return Eccezioni riscontrate nella busta.
*
*/
public java.util.List<Eccezione> getErroriTrovatiSullaListaEccezioni(){
return this.errorsTrovatiSullaListaEccezioni;
}
/**
* In caso di avvenuto errore durante il processo di validazione,
* questo metodo ritorna il motivo dell'errore.
*
* @return motivo dell'errore (se avvenuto).
*
*/
public ErroreCooperazione getErrore(){
return this.errore;
}
public IntegrationFunctionError getErrore_integrationFunctionError() {
return this.errore_integrationFunctionError;
}
/**
* Metodo che effettua una validazione sintattica di una busta.
* Il metodo, oltre ad effettuare la validazione della busta, si occupa anche di leggerne il contenuto e
* di impostarlo all'interno dell'oggetto <var>busta</var>.
* Mano mano che sono incontrati errori di validazione, viene creato un oggetto
* {@link Eccezione}, e viene inserito nel List <var>errors</var>.
*
* @return return true in caso di validazione sintattica riuscita (con o senza anomalie), false in caso di errori di processamento.
*
*/
public boolean valida(){
// Recupero l'oggetto Busta
ValidazioneSintatticaResult<?> result = null;
org.openspcoop2.protocol.sdk.validator.IValidazioneSintattica<?> validazioneSintattica = null;
boolean protocolException = false;
try {
validazioneSintattica = this.protocolFactory.createValidazioneSintattica(this.state);
validazioneSintattica.setContext(this.context);
ProprietaValidazioneErrori pValidazioneErrori = new ProprietaValidazioneErrori();
pValidazioneErrori.setIgnoraEccezioniNonGravi(this.protocolManager.isIgnoraEccezioniNonGravi());
if(this.isRichiesta==null || this.isRichiesta){
result = validazioneSintattica.validaRichiesta(this.msg, this.busta, pValidazioneErrori);
}
else{
result = validazioneSintattica.validaRisposta(this.msg, this.busta, pValidazioneErrori);
}
} catch (ProtocolException e) {
protocolException = true;
}
if(result != null){
if(result.getBusta() != null)
this.busta = result.getBusta();
if(result.getBustaErrore()!= null)
this.bustaErroreHeaderIntestazione = result.getBustaErrore();
this.errore = result.getErrore();
this.errore_integrationFunctionError = result.getErrore_integrationFunctionError();
this.erroriProcessamento = result.getErroriProcessamento();
if(this.erroriProcessamento == null)
this.erroriProcessamento = new java.util.ArrayList<Eccezione>();
this.erroreProcessamento_internalMessage = result.getErroreProcessamento_internalMessage();
this.erroriValidazione = result.getErroriValidazione();
if(this.erroriValidazione == null)
this.erroriValidazione = new java.util.ArrayList<Eccezione>();
this.errorsTrovatiSullaListaEccezioni = result.getErrorsTrovatiSullaListaEccezioni();
if(this.errorsTrovatiSullaListaEccezioni == null)
this.errorsTrovatiSullaListaEccezioni = new java.util.ArrayList<Eccezione>();
if(result.getBustaRawContent() != null)
this.headerProtocollo = result.getBustaRawContent();
return result.isValido();
}
else {
if(protocolException) {
if(this.isRichiesta==null || this.isRichiesta){
this.errore_integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
}
else {
this.errore_integrationFunctionError = IntegrationFunctionError.INTERNAL_RESPONSE_ERROR;
}
}
}
return false;
}
/**
* Controlla che esista una busta nell'header
*
* @return true se esiste un protocollo, false altrimenti
*/
public boolean verifyProtocolPresence(TipoPdD tipoPdD, ProfiloDiCollaborazione profilo, RuoloMessaggio ruoloMessaggio) throws Exception{
return this.protocolFactory.createValidazioneSintattica(this.state).verifyProtocolPresence(tipoPdD, profilo, ruoloMessaggio, this.msg);
}
/**
* Metodo che si occupa di validare il Fault presente in un Messaggio Errore.
*
* @param msg Messaggio contenente il Fault.
* @throws ProtocolException
*
*/
public void validazioneFault(OpenSPCoop2Message msg) throws ProtocolException{
ValidazioneSintatticaResult<?> result = this.protocolFactory.createValidazioneSintattica(this.state).validazioneFault(msg);
if(result != null){
if(result.getBusta() != null)
this.busta = result.getBusta();
if(result.getBustaErrore()!= null)
this.bustaErroreHeaderIntestazione = result.getBustaErrore();
this.errore = result.getErrore();
this.erroriProcessamento = result.getErroriProcessamento();
if(this.erroriProcessamento == null)
this.erroriProcessamento = new java.util.ArrayList<Eccezione>();
this.erroreProcessamento_internalMessage = result.getErroreProcessamento_internalMessage();
this.erroriValidazione = result.getErroriValidazione();
if(this.erroriValidazione == null)
this.erroriValidazione = new java.util.ArrayList<Eccezione>();
this.errorsTrovatiSullaListaEccezioni = result.getErrorsTrovatiSullaListaEccezioni();
if(this.errorsTrovatiSullaListaEccezioni == null)
this.errorsTrovatiSullaListaEccezioni = new java.util.ArrayList<Eccezione>();
if(result.getBustaRawContent() != null)
this.headerProtocollo = result.getBustaRawContent();
}
}
/**
* Metodo che si occupa di validare il Manifest di un SoapBody.
*
* @param msg SOAPMessage contenente il Manifest.
* @throws ProtocolException
*
*/
public void validazioneManifestAttachments(OpenSPCoop2Message msg,ProprietaManifestAttachments proprietaManifestAttachments) throws ProtocolException{
ValidazioneSintatticaResult<?> result = this.protocolFactory.createValidazioneSintattica(this.state).validazioneManifestAttachments(msg, proprietaManifestAttachments);
if(result != null){
if(result.getBusta() != null)
this.busta = result.getBusta();
if(result.getBustaErrore()!= null)
this.bustaErroreHeaderIntestazione = result.getBustaErrore();
this.errore = result.getErrore();
this.erroriProcessamento = result.getErroriProcessamento();
if(this.erroriProcessamento == null)
this.erroriProcessamento = new java.util.ArrayList<Eccezione>();
this.erroreProcessamento_internalMessage = result.getErroreProcessamento_internalMessage();
this.erroriValidazione = result.getErroriValidazione();
if(this.erroriValidazione == null)
this.erroriValidazione = new java.util.ArrayList<Eccezione>();
this.errorsTrovatiSullaListaEccezioni = result.getErrorsTrovatiSullaListaEccezioni();
if(this.errorsTrovatiSullaListaEccezioni == null)
this.errorsTrovatiSullaListaEccezioni = new java.util.ArrayList<Eccezione>();
if(result.getBustaRawContent() != null)
this.headerProtocollo = result.getBustaRawContent();
}
}
public BustaRawContent<?> getHeaderProtocollo_senzaControlli() throws ProtocolException{
return this.protocolFactory.createValidazioneSintattica(this.state).getBustaRawContent_senzaControlli(this.msg);
}
}