SPCoopValidazioneSemantica.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.protocol.spcoop.validator;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.protocol.basic.BasicStateComponentFactory;
import org.openspcoop2.protocol.registry.RegistroServiziManager;
import org.openspcoop2.protocol.registry.RegistroServiziReader;
import org.openspcoop2.protocol.registry.RisultatoValidazione;
import org.openspcoop2.protocol.sdk.Busta;
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.Riscontro;
import org.openspcoop2.protocol.sdk.SecurityInfo;
import org.openspcoop2.protocol.sdk.Servizio;
import org.openspcoop2.protocol.sdk.Trasmissione;
import org.openspcoop2.protocol.sdk.config.ITraduttore;
import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.ContestoCodificaEccezione;
import org.openspcoop2.protocol.sdk.constants.Inoltro;
import org.openspcoop2.protocol.sdk.constants.LivelloRilevanza;
import org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione;
import org.openspcoop2.protocol.sdk.constants.RuoloBusta;
import org.openspcoop2.protocol.sdk.constants.TipoOraRegistrazione;
import org.openspcoop2.protocol.sdk.state.IState;
import org.openspcoop2.protocol.sdk.state.RequestInfo;
import org.openspcoop2.protocol.sdk.validator.IValidazioneSemantica;
import org.openspcoop2.protocol.sdk.validator.ProprietaValidazione;
import org.openspcoop2.protocol.sdk.validator.ValidazioneSemanticaResult;
import org.openspcoop2.protocol.spcoop.constants.SPCoopCostanti;
import org.openspcoop2.protocol.spcoop.constants.SPCoopCostantiPosizioneEccezione;
import org.openspcoop2.utils.digest.IDigestReader;
/**
* Classe che implementa, in base al protocollo SPCoop, l'interfaccia {@link org.openspcoop2.protocol.sdk.validator.IValidazioneSemantica}
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class SPCoopValidazioneSemantica extends BasicStateComponentFactory implements IValidazioneSemantica {
/** Errori di validazione riscontrati sulla busta */
private java.util.List<Eccezione> erroriValidazione;
/** Errori di processamento riscontrati sulla busta */
private java.util.List<Eccezione> erroriProcessamento;
/** Busta */
private Busta busta;
/** Validazione IDEGov completa */
private boolean validazioneIDEGovCompleta = false;
/** ServizioCorrelato */
private String servizioCorrelato;
/** Tipo ServizioCorrelato */
private String tipoServizioCorrelato;
/** Versione ServizioCorrelato */
private Integer versioneServizioCorrelato = 1; // in spcoop รจ fissa
/** Azione Correlata */
private String azioneCorrelata;
/** Reader Registro */
private RegistroServiziManager registroServiziReader;
/** informazioni Servizio */
private Servizio infoServizio = null;
@SuppressWarnings("unused")
private Context context;
/**
* Costruttore.
*
* @param protocolFactory ProtocolFactory
* @throws ProtocolException
*
*/
public SPCoopValidazioneSemantica(IProtocolFactory<?> protocolFactory,IState state) throws ProtocolException{
super(protocolFactory,state);
}
@Override
public void setContext(Context context) {
this.context = context;
}
/**
* Metodo che effettua la validazione dei soggetti di una busta, controllando la loro registrazione nel registro dei servizi.
*
* Mano mano che sono incontrati errori di validazione, viene creato un oggetto
* {@link Eccezione}, e viene inserito nel List <var>errors</var>.
*
* @param tipoValidazione tipo di Validazione
*
*/
public void valida(ProprietaValidazione tipoValidazione, RuoloBusta tipoBusta, String profiloGestione){
try{
RequestInfo requestInfo = null;
if(this.context!=null && this.context.containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
requestInfo = (RequestInfo) this.context.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
}
this.erroriValidazione = new java.util.ArrayList<Eccezione>();
this.erroriProcessamento = new java.util.ArrayList<Eccezione>();
//log.info("Validazione semantica...");
/* Accesso al registro */
if( RegistroServiziReader.isInitialize()==false || this.registroServiziReader==null){
this.log.error("Registro dei Servizi non inizializzato.");
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.PROCESSAMENTO);
ecc.setCodiceEccezione(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione("Registro dei Servizi non disponibile");
this.erroriProcessamento.add(ecc);
return;
}
//log.info("Validazione mittente...");
// Mittente: check registrazione nel Registro dei Servizi
IDSoggetto soggMitt = new IDSoggetto(this.busta.getTipoMittente(),this.busta.getMittente());
String dominioMittente = null;
boolean mittenteSconosciuto = false;
try{
dominioMittente = this.registroServiziReader.getDominio(soggMitt,null,this.protocolFactory, requestInfo); //null=allRegistri
if(dominioMittente==null)
throw new Exception("Dominio non definito");
else
this.busta.setIdentificativoPortaMittente(dominioMittente);
}catch(DriverRegistroServiziNotFound es){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.MITTENTE_SCONOSCIUTO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE.toString());
this.log.debug("Identificazione mittente fallita:"+es.getMessage());
this.erroriValidazione.add(ecc);
mittenteSconosciuto = true;
}catch(Exception es){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.PROCESSAMENTO);
ecc.setCodiceEccezione(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione("Identificazione mittente non riuscita: errore di processamento");
this.log.error("Identificazione mittente non riuscita",es);
this.erroriProcessamento.add(ecc);
mittenteSconosciuto = true;
}
//log.info("Validazione destinatario...");
// Destinatario: check registrazione nel Registro dei Servizi
IDSoggetto soggDest = new IDSoggetto(this.busta.getTipoDestinatario(),this.busta.getDestinatario());
String dominioDestinatario = null;
boolean destinatarioSconosciuto = false;
try{
dominioDestinatario = this.registroServiziReader.getDominio(soggDest,null,this.protocolFactory, requestInfo); // null=allRegistri
if(dominioDestinatario==null)
throw new Exception("Dominio non definito");
else
this.busta.setIdentificativoPortaDestinatario(dominioDestinatario);
}catch(DriverRegistroServiziNotFound es){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.DESTINATARIO_SCONOSCIUTO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE.toString());
this.log.debug("Identificazione destinatario fallita: "+es.getMessage());
this.erroriValidazione.add(ecc);
destinatarioSconosciuto = true;
}catch(Exception es){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.PROCESSAMENTO);
ecc.setCodiceEccezione(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione("Identificazione destinatario non riuscita: errore di processamento");
this.log.error("Identificazione destinatario non riuscita",es);
this.erroriProcessamento.add(ecc);
destinatarioSconosciuto = true;
}
// Riconoscimento servizio-azione: viene effettuato per Richiesta/Risposta/Ricevuta
// Per risposte e ricevute, viene controllato che esista servizio e azione associate al mittente della busta
// per richieste, viene controllato che esista servizio e azione associate al destinatario della busta
RisultatoValidazione risultatoValidazioneServizio = null;
if( RuoloBusta.BUSTA_DI_SERVIZIO.equals(tipoBusta.toString()) == false ){
//log.info("Validazione servizio azione...");
risultatoValidazioneServizio = riconoscimentoServizioAzione(tipoBusta,mittenteSconosciuto,destinatarioSconosciuto);
}
// Controllo correlazione alla richiesta per buste contenenti Risposte o ricevute
//System.out.println("TIPO BUSTA ["+tipoBusta+"]");
// LOGICA SPOSTATA NELL'ENGINE VALIDATOR
// if( RuoloBusta.BUSTA_DI_SERVIZIO.equals(tipoBusta.toString()) == false &&
// RuoloBusta.RICHIESTA.equals(tipoBusta.toString()) == false){
// //log.info("Validazione correlazione...");
// validazioneCorrelazione(tipoBusta);
// }
// boolean indicazione se il servizio e' stato riconosciuto in base a mittente, destinatario servizio e azione
boolean servizioBustaValido = false;
if( (RuoloBusta.BUSTA_DI_SERVIZIO.equals(tipoBusta.toString()) == false ) &&
(destinatarioSconosciuto==false) &&
(mittenteSconosciuto==false) ){
//this.log.info("Indicazione servizio...");
if(risultatoValidazioneServizio!=null && risultatoValidazioneServizio.getServizioRegistrato()){
if( (this.busta.getAzione()==null) && (risultatoValidazioneServizio.getAccessoSenzaAzione()) ){
servizioBustaValido = true;
}else if(this.busta.getAzione()!=null){
if(risultatoValidazioneServizio.getAzioni()!=null){
for(int j=0; j<risultatoValidazioneServizio.sizeAzioni();j++){
if(this.busta.getAzione().equals(risultatoValidazioneServizio.getAzioni()[j])){
servizioBustaValido = true;
break;
}
}
}
}
}
//this.log.info("Raccolta info servizio...");
if(servizioBustaValido){
IDSoggetto idSoggettoFruitore = new IDSoggetto();
IDSoggetto idSoggettoErogatore = new IDSoggetto();
this.impostaFruitoreErogatoreRealiServizio(idSoggettoFruitore,idSoggettoErogatore,tipoBusta);
IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(this.busta.getTipoServizio(),this.busta.getServizio(),
idSoggettoErogatore,
this.busta.getVersioneServizio());
idServizio.setAzione(this.busta.getAzione());
try{
this.infoServizio = this.registroServiziReader.getInfoServizio(idSoggettoFruitore,idServizio,null,false, true, requestInfo);//null=allRegistri
}catch(DriverRegistroServiziNotFound dnot){}
if(this.infoServizio==null){
try{
this.infoServizio = this.registroServiziReader.getInfoServizioCorrelato(soggMitt, idServizio, null, true, requestInfo);//null=allRegistri
}catch(DriverRegistroServiziNotFound dnot){}
}
if(this.infoServizio==null){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione("Raccolta informazioni servizio: servizio sconosciuto");
this.erroriValidazione.add(ecc);
servizioBustaValido = false;
}
}
//this.log.info("Raccolta info servizio effettuata");
}
// Riconoscimento profilo di collaborazione: viene controllato che sia usato il profilo di collaborazione registrato
// Per risposte e ricevute, viene controllato che esista servizio e azione associate al mittente della busta (fruitore e' destinatario)
// per richieste, viene controllato che esista servizio e azione associate al destinatario della busta (fruitore e' destinatario)
if( (servizioBustaValido) && (tipoValidazione.isValidazioneProfiloCollaborazione()) && (RuoloBusta.RICHIESTA.equals(tipoBusta.toString())) ){
riconoscimentoProfiloCollaborazione(tipoBusta);
}
// Identificativo Messaggio: viene controllato che l'identificativo porta sia quello del mittente della busta
//log.info("Validazione ID...");
if(mittenteSconosciuto==false){
if( validazioneID_engine(this.busta.getID(),this.busta.getMittente(),dominioMittente) == false ){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ID_MESSAGGIO_NON_VALIDO_POSIZIONE.toString());
this.erroriValidazione.add(ecc);
}
}
// Riferimento Messaggio: viene controllato che l'identificativo porta sia quello del mittente della busta
// viene inoltro controllato che il riferimento messaggio sia quello aspettato per il profilo gestito
if(this.busta.getRiferimentoMessaggio()!=null){
//log.info("Validazione RifMsg... ["+tipoBusta+"] ["+this.busta.getRiferimentoMessaggio()+"]");
boolean validazioneIDRiferimentoMessaggio = true;
if(ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(this.busta.getProfiloDiCollaborazione()) &&
RuoloBusta.RISPOSTA.equals(tipoBusta.toString())){
// per il profilo asincrono asimmetrico devo usare come dominio/nome per il rifMsg il mittente, invece che il destinatario
if(mittenteSconosciuto==false){
validazioneIDRiferimentoMessaggio = validazioneID_engine(this.busta.getRiferimentoMessaggio(),this.busta.getMittente(),dominioMittente);
}
}else{
if(destinatarioSconosciuto==false){
validazioneIDRiferimentoMessaggio = validazioneID_engine(this.busta.getRiferimentoMessaggio(),this.busta.getDestinatario(),dominioDestinatario);
}
}
if(validazioneIDRiferimentoMessaggio == false ){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.RIFERIMENTO_MESSAGGIO_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_RIFERIMENTO_MESSAGGIO_NON_VALIDO_POSIZIONE.toString());
this.erroriValidazione.add(ecc);
}else{
//log.info("Validazione RifMsg specifico...");
// LOGICA SPOSTATA NELL'ENGINE VALIDATOR
//validazioneRiferimentoMessaggio(tipoBusta);
}
}
// Controllo Collaborazione (validazioneID e Riconoscimento)
// Controllo che non deve essere effettuato se ho ricevuto un Fault
// LOGICA DI RICONOSCIMENTO COLLABORAZIONE SPOSTATA NELL'ENGINE VALIDATOR.
// Qua viene controllato solo la struttura dell'id
if( RuoloBusta.BUSTA_DI_SERVIZIO.equals(tipoBusta.toString()) == false ){
//log.info("Validazione Collaborazione...");
validazioneCollaborazione(tipoBusta,dominioMittente,dominioDestinatario);
}
// Validazione Sequenza: se presente, ci deve essere anche una collaborazione valida (se si arriva qua, e' garantito)
// ed un profiloTrasmissione con 'inoltro= ALPIUUNAVOLTA' e 'conferma=TRUE'
//log.info("Validazione Sequenza...");
if( (SPCoopCostanti.PROFILO_CNIPA_LINEE_GUIDA_11_BUSTA_EGOV_11.equals(profiloGestione)==false) && (this.busta.getSequenza() != -1) ){
if( (this.busta.getCollaborazione() == null) ||
(this.busta.getInoltro() == null) ){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_NON_VALIDA);
ecc.setRilevanza(LivelloRilevanza.ERROR);
if( (this.busta.getCollaborazione() == null) && (this.busta.getInoltro() == null))
ecc.setDescrizione("Sequenza non gestibile, elementi Collaborazione e ProfiloTrasmissione non presenti");
else if( this.busta.getCollaborazione() == null ){
ecc.setDescrizione("Sequenza non gestibile, elemento Collaborazione non presente");
}else{
ecc.setDescrizione("Sequenza non gestibile, elemento ProfiloTrasmissione non presente");
}
this.erroriValidazione.add(ecc);
}else{
if( (Inoltro.SENZA_DUPLICATI.equals(this.busta.getInoltro())==false)||
(this.busta.isConfermaRicezione()==false) ){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_NON_GESTIBILE);
ecc.setRilevanza(LivelloRilevanza.ERROR);
if((Inoltro.SENZA_DUPLICATI.equals(this.busta.getInoltro())==false) && (this.busta.isConfermaRicezione()==false)){
ecc.setDescrizione("Sequenza non gestibile, attributi dell'elemento ProfiloTrasmissione non validi con la sequenza");
}else if(this.busta.isConfermaRicezione()==false){
ecc.setDescrizione("Sequenza non gestibile, attributo confermaRicezione dell'elemento ProfiloTrasmissione non valido con la sequenza");
}else{
ecc.setDescrizione("Sequenza non gestibile, attributo inoltro dell'elemento ProfiloTrasmissione non valido con la sequenza");
}
this.erroriValidazione.add(ecc);
}
}
}
// Riscontri (ID)
//log.info("Validazione Riscontri...");
for(int i=0; i<this.busta.sizeListaRiscontri();i++){
Riscontro r = this.busta.getRiscontro(i);
if(validazioneID_engine(r.getID()) == false){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_IDENTIFICATIVO_MESSAGGIO_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_IDENTIFICATORE.toString());
this.erroriValidazione.add(ecc);
}
}
// Trasmissione (Origine e Destinazione)
//log.info("Validazione Trasmissione...");
for(int i=0; i<this.busta.sizeListaTrasmissioni();i++){
Trasmissione t = this.busta.getTrasmissione(i);
IDSoggetto soggOrig = new IDSoggetto(t.getTipoOrigine(),t.getOrigine());
String dominioOrig = null;
try{
dominioOrig = this.registroServiziReader.getDominio(soggOrig,null,this.protocolFactory, requestInfo); // null=allRegistri
if(dominioOrig==null)
throw new Exception("Dominio non definito");
else
t.setIdentificativoPortaOrigine(dominioOrig);
}catch(DriverRegistroServiziNotFound es){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_ORIGINE_NON_VALIDA);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE_IDENTIFICATIVO_PARTE.toString());
this.log.debug("Identificazione origine trasmissione fallita:"+es.getMessage());
this.erroriValidazione.add(ecc);
}catch(Exception es){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.PROCESSAMENTO);
ecc.setCodiceEccezione(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione("Identificazione origine della trasmissione non riuscita: errore di processamento");
this.log.error("Identificazione origine trasmissione non riuscita",es);
this.erroriProcessamento.add(ecc);
}
IDSoggetto soggDestTr = new IDSoggetto(t.getTipoDestinazione(),t.getDestinazione());
String dominioDestinatarioTr = null;
try{
dominioDestinatarioTr = this.registroServiziReader.getDominio(soggDestTr,null,this.protocolFactory, requestInfo); // null=allRegistri
if(dominioDestinatarioTr==null)
throw new Exception("Dominio non definito");
else
t.setIdentificativoPortaDestinazione(dominioDestinatarioTr);
}catch(DriverRegistroServiziNotFound es){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_DESTINAZIONE_NON_VALIDA);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE_IDENTIFICATIVO_PARTE.toString());
this.log.debug("Identificazione destinazione trasmissione fallita:"+es.getMessage());
this.erroriValidazione.add(ecc);
}catch(Exception es){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.PROCESSAMENTO);
ecc.setCodiceEccezione(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione("Identificazione destinazione della trasmissione non riuscita: errore di processamento");
this.log.error("Identificazione destinazione trasmissione non riuscita",es);
this.erroriProcessamento.add(ecc);
}
}
// Validazione LineeGuida1.1
if(SPCoopCostanti.PROFILO_CNIPA_LINEE_GUIDA_11_BUSTA_EGOV_11.equals(profiloGestione)){
// log.info("Validazione LineeGuida1.1...");
this.validazioneLineeGuida11();
}
} catch(Exception e) {
this.log.error("ValidazioneSemantica: riscontrato errore durante la validazione",e);
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.PROCESSAMENTO);
ecc.setCodiceEccezione(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione("Errore di processamento durante la validazione semantica.");
this.erroriProcessamento.add(ecc);
}
}
private void validazioneCollaborazione(RuoloBusta tipoBusta,String dominioMittente,String dominioDestinatario) throws ProtocolException{
// La collaborazione deve appartenere o al mittente, o al destinatario della busta.
if(this.busta.getCollaborazione()!=null){
if( (validazioneID_engine(this.busta.getCollaborazione(),this.busta.getMittente(),dominioMittente) == false) &&
(validazioneID_engine(this.busta.getCollaborazione(),this.busta.getDestinatario(),dominioDestinatario) == false) ){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.COLLABORAZIONE_SCONOSCIUTA);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_COLLABORAZIONE_SCONOSCIUTA_POSIZIONE.toString());
this.erroriValidazione.add(ecc);
return;
}
}
}
private void impostaFruitoreErogatoreRealiServizio(IDSoggetto fruitore,IDSoggetto erogatore,RuoloBusta tipoBusta){
if( (RuoloBusta.RICHIESTA.equals(tipoBusta.toString())) ||
((RuoloBusta.RISPOSTA.equals(tipoBusta.toString())) && (ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(this.busta.getProfiloDiCollaborazione()))) ||
((RuoloBusta.RISPOSTA.equals(tipoBusta.toString())) && (ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(this.busta.getProfiloDiCollaborazione()))) ){
if(erogatore!=null){
erogatore.setTipo(this.busta.getTipoDestinatario());
erogatore.setNome(this.busta.getDestinatario());
}
if(fruitore!=null){
fruitore.setTipo(this.busta.getTipoMittente());
fruitore.setNome(this.busta.getMittente());
}
}else if((RuoloBusta.RISPOSTA.equals(tipoBusta.toString())) || (RuoloBusta.RICEVUTA_RICHIESTA.equals(tipoBusta.toString())) || (RuoloBusta.RICEVUTA_RISPOSTA.equals(tipoBusta.toString()))){
if(erogatore!=null){
erogatore.setTipo(this.busta.getTipoMittente());
erogatore.setNome(this.busta.getMittente());
}
if(fruitore!=null){
fruitore.setTipo(this.busta.getTipoDestinatario());
fruitore.setNome(this.busta.getDestinatario());
}
}
}
/**
* Metodo che si occupa di validare l'elemento 'Servizio' e 'Azione', controllando
* che siano riconosciuti all'interno del registro dei servizi di riferimento (es. registro UDDI)
*
* @param tipoBusta tipo di Busta da validare
*
*/
private RisultatoValidazione riconoscimentoServizioAzione(RuoloBusta tipoBusta,boolean mittenteSconosciuto,boolean destinatarioSconosciuto) throws ProtocolException,DriverRegistroServiziException{
if(mittenteSconosciuto)
return null;
if(destinatarioSconosciuto)
return null;
IDSoggetto idSoggettoErogatore = new IDSoggetto();
IDSoggetto idSoggettoFruitore = null;
// Per richiesta asincrono simmetrico serve anche il fruitore per la localizzazione del servizio correlato
if( (ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(this.busta.getProfiloDiCollaborazione())) &&
(RuoloBusta.RICHIESTA.equals(tipoBusta.toString())) ){
idSoggettoFruitore = new IDSoggetto();
}else if( (ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(this.busta.getProfiloDiCollaborazione())) ){
idSoggettoFruitore = new IDSoggetto();
}
this.impostaFruitoreErogatoreRealiServizio(idSoggettoFruitore,idSoggettoErogatore,tipoBusta);
// 1) Validazione Servizio
RisultatoValidazione validazione = null;
if(this.busta.getServizio()!=null && this.busta.getTipoServizio()!=null){
IDServizio idService = IDServizioFactory.getInstance().getIDServizioFromValues(this.busta.getTipoServizio(),this.busta.getServizio(),
idSoggettoErogatore,
this.busta.getVersioneServizio());
idService.setAzione(this.busta.getAzione());
try{
validazione = this.registroServiziReader.validaServizio(idSoggettoFruitore,idService,null); //null=allRegistri
}catch(Exception e){
this.log.error("Errore durante l'accesso al registro per la validazione del servizio e dell'azione",e);
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.PROCESSAMENTO);
ecc.setCodiceEccezione(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione("Riconoscimento Servizio/Azione: errore di processamento");
this.erroriProcessamento.add(ecc);
return null;
}
if(validazione.getServizioRegistrato()==false){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.SERVIZIO_SCONOSCIUTO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SERVIZIO_SCONOSCIUTO_POSIZIONE.toString());
this.erroriValidazione.add(ecc);
return validazione;
}
this.servizioCorrelato = validazione.getServizioCorrelato();
this.tipoServizioCorrelato = validazione.getTipoServizioCorrelato();
this.versioneServizioCorrelato = validazione.getVersioneServizioCorrelato();
this.azioneCorrelata = validazione.getAzioneCorrelata();
}
// 2) Validazione Azione (solo se c'e' un servizio)
if(this.busta.getServizio()!=null && this.busta.getTipoServizio()!=null){
if(validazione==null) {
this.log.error("Errore durante l'accesso al registro per la validazione del servizio e dell'azione: validazione is null");
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.PROCESSAMENTO);
ecc.setCodiceEccezione(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione("Riconoscimento Azione: errore di processamento");
this.erroriProcessamento.add(ecc);
return null;
}
//log.info("Validazione Azione...");
if(this.busta.getAzione() == null){
// Controllo che sia valida una invocazione senza azione
if(validazione.getAccessoSenzaAzione() == false){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.INVOCAZIONE_SENZA_AZIONE_NON_PERMESSA);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_AZIONE_SCONOSCIUTA_POSIZIONE.toString());
this.erroriValidazione.add(ecc);
return validazione;
}
}else{
String[]azioni = validazione.getAzioni();
boolean azioneTrovata = false;
if(azioni!=null){
for(int i=0;i<azioni.length;i++){
if(this.busta.getAzione().equals(azioni[i])){
azioneTrovata=true;
break;
}
}
}
if(azioneTrovata==false){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.AZIONE_SCONOSCIUTA);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_AZIONE_SCONOSCIUTA_POSIZIONE.toString());
this.erroriValidazione.add(ecc);
return validazione;
}
}
}
// 3) Validazione elementi ServizioCorrelato e TipoServizioCorrelato
if(ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(this.busta.getProfiloDiCollaborazione())
&& RuoloBusta.RICHIESTA.equals(tipoBusta.toString())){
/* Con la certificazione CNIPA, questi attributi non sono piu' obbligatori */
/*if( (this.busta.getServizioCorrelato()==null) || (this.busta.getTipoServizioCorrelato()==null) ||
(this.busta.getTipoServizioCorrelato().equals(validazione.getTipoServizioCorrelato())== false) ||
(this.busta.getServizioCorrelato().equals(validazione.getServizioCorrelato())== false) ){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(Costanti.CONTESTO_CODIFICA_ECCEZIONE_VALIDAZIONE);
ecc.setCodiceEccezione(Costanti.ECCEZIONE_SERVIZIO_SCONOSCIUTO);
ecc.setRilevanza(Costanti.GRAVE);
ecc.setDescrizione("Servizio Correlato non valido (o non presente) nella richiesta asincrona simmetrica");
this.erroriValidazione.add(ecc);
return;
}*/
// NEW ALGORITM:
if(
(this.busta.getServizioCorrelato()!=null) &&
validazione!=null &&
(this.busta.getServizioCorrelato().equals(validazione.getServizioCorrelato())== false)
){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.SERVIZIO_CORRELATO_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE_SERVIZIO_CORRELATO+" diverso da quello atteso (richiesta asincrona simmetrica)");
this.erroriValidazione.add(ecc);
return validazione;
}
if(
(this.busta.getTipoServizioCorrelato()!=null) &&
validazione!=null &&
(this.busta.getTipoServizioCorrelato().equals(validazione.getTipoServizioCorrelato())== false)
){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_SERVIZIO_CORRELATO_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE_TIPO_SERVIZIO_CORRELATO+" diverso da quello atteso (richiesta asincrona simmetrica)");
this.erroriValidazione.add(ecc);
return validazione;
}
}
if(ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(this.busta.getProfiloDiCollaborazione())
&& RuoloBusta.RICEVUTA_RICHIESTA.equals(tipoBusta.toString()) ){
/* Con la certificazione CNIPA, questi attributi non sono piu' obbligatori */
/*
if( (this.busta.getServizioCorrelato()==null) || (this.busta.getTipoServizioCorrelato()==null) ||
(this.busta.getTipoServizioCorrelato().equals(validazione.getTipoServizioCorrelato())== false) ||
(this.busta.getServizioCorrelato().equals(validazione.getServizioCorrelato())== false) ){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(Costanti.CONTESTO_CODIFICA_ECCEZIONE_VALIDAZIONE);
ecc.setCodiceEccezione(Costanti.ECCEZIONE_SERVIZIO_SCONOSCIUTO);
ecc.setRilevanza(Costanti.GRAVE);
ecc.setDescrizione("Servizio Correlato non valido (o non presente) nella ricevuta della richiesta asincrona asimmetrica");
this.erroriValidazione.add(ecc);
return;
}*/
// NEW ALGORITM:
if(
(this.busta.getServizioCorrelato()!=null) &&
validazione!=null &&
(this.busta.getServizioCorrelato().equals(validazione.getServizioCorrelato())== false)
){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.SERVIZIO_CORRELATO_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE_SERVIZIO_CORRELATO+" diverso da quello atteso (ricevuta della richiesta asincrona simmetrica)");
this.erroriValidazione.add(ecc);
return validazione;
}
if(
(this.busta.getTipoServizioCorrelato()!=null) &&
validazione!=null &&
(this.busta.getTipoServizioCorrelato().equals(validazione.getTipoServizioCorrelato())== false)
){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_SERVIZIO_CORRELATO_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE_TIPO_SERVIZIO_CORRELATO+" diverso da quello atteso (ricevuta della richiesta asincrona simmetrica)");
this.erroriValidazione.add(ecc);
return validazione;
}
}
return validazione;
}
/**
* Metodo che si occupa di validare l'elemento 'Servizio' e 'Azione', controllando
* che siano riconosciuti all'interno del registro dei servizi di riferimento (es. registro UDDI)
*
* @param tipoBusta tipo di Busta da validare
*
*/
private void riconoscimentoProfiloCollaborazione(RuoloBusta tipoBusta){
// Viene effettuato solo per la richiesta.
try{
if(this.infoServizio.getProfiloDiCollaborazione().equals(this.busta.getProfiloDiCollaborazione())==false){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.PROFILO_COLLABORAZIONE_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE+" diverso da quanto specificato nel registro");
this.erroriValidazione.add(ecc);
}
}catch(Exception e){
this.log.error("Errore durante l'accesso al registro per la validazione del profilo di collaborazione",e);
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.PROCESSAMENTO);
ecc.setCodiceEccezione(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione("Riconoscimento Profilo di Collaborazione: errore di processamento");
this.erroriProcessamento.add(ecc);
}
}
/**
* Metodo che si occupa di validare l'identificativo <var>id</var> secondo la specifica eGov.
*
* @param id identificativo eGov da validare
* @return il valore boolean true se l'identificativo fornito e' conforme alla specifica eGov. Altrimenti false.
*
*/
public boolean validazioneID_engine(String id){
return validazioneID_engine(id,null,null);
}
/**
* Metodo che si occupa di validare l'identificativo <var>id</var> secondo la specifica eGov.
* L'identificativo e' formato da :
* codAmministrazione_codPortaDominio_num.progressivo_data_ora
* <p>
* Il codice Amministrazione e' preso da <var>codAmm</var>.
* Il codice Amministrazione deve contenere l'identificativo parte del mittente, quando deve essere validato
* un identificativo del messaggio od una collaborazione di una richiesta
* (oneWay, richiestaSincrona , richiesta/ricevutaRisposta AsincronaSimmetrica ,
* richiesta/richiestaStato AsincronaAsimmetrica), poiche' e' lui che lo ha spedito
* e che ha quindi creato l'identificatore.
* Deve contenere invece il codice del destinatario, quando deve essere validato un RiferimentoMessaggio, od una
* collaborazione di una risposta (Sincrona , ricevutaRichiesta/Risposta AsincronaSimmetrica ,
* ricevutaRichiesta/ricevutaRichiestaStato AsincronaAsimmetrica),
* poiche' la creazione dell'identificatore venne fatta dal destinatario quando creo' la richiesta.
* <p>
* Il codice amministrativo <var>codAmm</var>, sara' utilizzato anche per ottenere dal
* registro dei servizi di openspcoop la validazione del codice della Porta di Dominio presente nell'identificativo.
*
*
* @param id identificativo eGov da validare
* @param codAmm Identificativo Parte mittente o destinatario di una busta.
* @param codDominio Identificativo del dominio del codice di amministrazione
* @return il valore boolean true se l'identificativo fornito e' conforme alla specifica eGov. Altrimenti false.
*
*/
public boolean validazioneID_engine(String id, String codAmm, String codDominio){
try{
// Ottengo parti dell'identificatore
String [] split = id.split("_");
if(split == null)
return false;
if(split.length != 5)
return false;
if(codAmm!=null && this.validazioneIDEGovCompleta){
// Check codice amministrazione
if(!split[0].equals(codAmm))
return false;
byte [] checkID = split[0].getBytes();
for(int j=0;j<checkID.length;j++){
if( !Character.isLetterOrDigit((char)checkID[j]))
return false;
}
}
if(codDominio!=null && this.validazioneIDEGovCompleta){
// Check codice porta di dominio
if(!split[1].equalsIgnoreCase(codDominio))
return false;
byte [] checkPDD = split[1].getBytes();
for(int j=0;j<checkPDD.length;j++){
if( !Character.isLetterOrDigit((char)checkPDD[j]))
return false;
}
}
// Check num progressivo
if(split[2].length() != 7)
return false;
try{
Integer test = Integer.valueOf(split[2]);
if(test.intValue()<0) {
// ignore
}
} catch(Exception e){
return false;
}
// Check data yyyy-MM-dd
String [] date = split[3].split("-");
if(date == null)
return false;
if(date.length != 3)
return false;
if(date[0].length() != 4)
return false;
try{
Integer test = Integer.valueOf(date[0]);
if(test.intValue()>2100)
return false;
} catch(Exception e){
return false;
}
if(date[1].length() != 2)
return false;
if(date[2].length() != 2)
return false;
try{
Integer mese = Integer.valueOf(date[1]);
if(mese.intValue()>12 || mese.intValue() < 0)
return false;
Integer giorno = Integer.valueOf(date[2]);
if(giorno.intValue() < 0)
return false;
if(giorno.intValue()>29 && mese.intValue() == 2)
return false;
else if(giorno.intValue()>30 &&
( (mese.intValue() == 4) ||
(mese.intValue() == 6) ||
(mese.intValue() == 9) ||
(mese.intValue() == 11) ) )
return false;
else if(giorno.intValue()>31)
return false;
} catch(Exception e){
return false;
}
// Check ora hh:mm
String [] ora = split[4].split(":");
if(ora == null)
return false;
if(ora.length != 2)
return false;
if(ora[0].length() != 2)
return false;
try{
Integer test = Integer.valueOf(ora[0]);
if(test.intValue() > 23 || test.intValue() < 0)
return false;
} catch(Exception e){
return false;
}
if(ora[1].length() != 2)
return false;
try{
Integer test = Integer.valueOf(ora[1]);
if(test.intValue() > 59 || test.intValue() < 0)
return false;
} catch(Exception e){
return false;
}
return true;
}catch(Exception error){
return false;
}
}
private void validazioneLineeGuida11() throws ProtocolException{
ITraduttore traduttore = this.protocolFactory.createTraduttore();
String valoreEngine = traduttore.toRegistryOrganizationType(SPCoopCostanti.SERVIZIO_SPC);
// mittente
if(valoreEngine.equals(this.busta.getTipoMittente())==false){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_MITTENTE_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_TIPO.toString());
this.erroriValidazione.add(ecc);
}
// destinatario
if(valoreEngine.equals(this.busta.getTipoDestinatario())==false){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_DESTINATARIO_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_TIPO.toString());
this.erroriValidazione.add(ecc);
}
// Servizio e' obbligatorio in questo profilo (queste sono eccezioni GRAVI!)
if(this.busta.getTipoServizio()==null){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_SERVIZIO_NON_PRESENTE);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SERVIZIO_SCONOSCIUTO_POSIZIONE_TIPO.toString());
this.erroriValidazione.add(ecc);
}
if(this.busta.getServizio()==null){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.SERVIZIO_NON_PRESENTE);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SERVIZIO_SCONOSCIUTO_POSIZIONE.toString());
this.erroriValidazione.add(ecc);
}
// servizio
if(valoreEngine.equals(this.busta.getTipoServizio())==false){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_SERVIZIO_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SERVIZIO_SCONOSCIUTO_POSIZIONE_TIPO.toString());
this.erroriValidazione.add(ecc);
}
// Azione e' obbligatoria (queste sono eccezioni GRAVI!)
if(this.busta.getAzione()==null){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.AZIONE_NON_PRESENTE);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_AZIONE_SCONOSCIUTA_POSIZIONE.toString());
this.erroriValidazione.add(ecc);
}
// Profilo di Collaborazione
if(this.busta.getProfiloDiCollaborazione()==null){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.PROFILO_COLLABORAZIONE_NON_PRESENTE);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE.toString());
this.erroriValidazione.add(ecc);
}
// Collaborazione (valida solo per profili asincroni)
if( ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(this.busta.getProfiloDiCollaborazione())
||
ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(this.busta.getProfiloDiCollaborazione()) ){
if(this.busta.getCollaborazione()==null){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.COLLABORAZIONE_NON_VALIDA);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_COLLABORAZIONE_SCONOSCIUTA_POSIZIONE.toString());
this.erroriValidazione.add(ecc);
}
}
// OraRegistrazione
if(TipoOraRegistrazione.SINCRONIZZATO.equals(this.busta.getTipoOraRegistrazione())==false){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_ORA_REGISTRAZIONE_NON_VALIDA);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ORA_REGISTRAZIONE_NON_VALIDA_POSIZIONE_TEMPO.toString());
this.erroriValidazione.add(ecc);
}
// Profilo di Trasmissione (queste sono eccezioni GRAVI!)
if(this.busta.isConfermaRicezione()==true){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.PROFILO_TRASMISSIONE_CONFERMA_RICEZIONE_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_TRASMISSIONE_NON_VALIDO_POSIZIONE_CONFERMA_RICEZIONE.toString());
this.erroriValidazione.add(ecc);
}
if(Inoltro.CON_DUPLICATI.equals(this.busta.getInoltro())){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.PROFILO_TRASMISSIONE_FILTRO_DUPLICATI_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_TRASMISSIONE_NON_VALIDO_POSIZIONE_INOLTRO.toString());
this.erroriValidazione.add(ecc);
}
for(int i=0; i<this.busta.sizeListaTrasmissioni(); i++){
Trasmissione tr = this.busta.getTrasmissione(i);
if(valoreEngine.equals(tr.getTipoOrigine())==false){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_TIPO_ORIGINE_NON_VALIDA);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE_IDENTIFICATIVO_PARTE_TIPO.toString());
this.erroriValidazione.add(ecc);
}
if(valoreEngine.equals(tr.getTipoDestinazione())==false){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_TIPO_DESTINAZIONE_NON_VALIDA);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE_IDENTIFICATIVO_PARTE_TIPO.toString());
this.erroriValidazione.add(ecc);
}
if(TipoOraRegistrazione.SINCRONIZZATO.equals(tr.getTempo())==false){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_TIPO_ORA_REGISTRAZIONE_NON_VALIDA);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORA_REGISTRAZIONE_TEMPO.toString());
this.erroriValidazione.add(ecc);
}
}
// Lista riscontri
for(int i=0; i<this.busta.sizeListaRiscontri(); i++){
Riscontro r = this.busta.getRiscontro(i);
if(TipoOraRegistrazione.SINCRONIZZATO.equals(r.getTipoOraRegistrazione())==false){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_TIPO_ORA_REGISTRAZIONE_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.ERROR);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_ORA_REGISTRAZIONE_TEMPO.toString());
this.erroriValidazione.add(ecc);
}
}
// Segnalo errori di tipo INFO SOLO SE non ci sono stati gia errori di tipo GRAVE
if(this.erroriValidazione.size()==0){
// Indirizzo telematico mittente
if(this.busta.getIndirizzoMittente()!=null){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.INDIRIZZO_MITTENTE_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.INFO);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_IND_TELEMATICO.toString());
this.erroriValidazione.add(ecc);
}
// Indirizzo telematico destinatario
if(this.busta.getIndirizzoDestinatario()!=null){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.INDIRIZZO_DESTINATARIO_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.INFO);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_IND_TELEMATICO.toString());
this.erroriValidazione.add(ecc);
}
// Profilo di Collaborazione
if(this.busta.getTipoServizioCorrelato()!=null){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_SERVIZIO_CORRELATO_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.INFO);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE_TIPO_SERVIZIO_CORRELATO.toString());
this.erroriValidazione.add(ecc);
}
if(this.busta.getServizioCorrelato()!=null){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.SERVIZIO_CORRELATO_NON_VALIDO);
ecc.setRilevanza(LivelloRilevanza.INFO);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE_SERVIZIO_CORRELATO.toString());
this.erroriValidazione.add(ecc);
}
// Collaborazione valida solo per gli asincroni
if( (ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(this.busta.getProfiloDiCollaborazione())==false)
&&
(ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(this.busta.getProfiloDiCollaborazione())==false) ){
if(this.busta.getCollaborazione()!=null){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.COLLABORAZIONE_NON_VALIDA);
ecc.setRilevanza(LivelloRilevanza.INFO);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_COLLABORAZIONE_SCONOSCIUTA_POSIZIONE.toString());
this.erroriValidazione.add(ecc);
}
}
// Sequenza
if(this.busta.getSequenza()!=-1){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_NON_SUPPORTATA);
ecc.setRilevanza(LivelloRilevanza.INFO);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_TRASPARENZA_TEMPORALE_NON_SUPPORTATA_POSIZIONE.toString());
this.erroriValidazione.add(ecc);
}
// Lista trasmissioni
/* L'hanno riammessa.
if(this.busta.sizeListaTrasmissioni()>0){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(Costanti.CONTESTO_CODIFICA_ECCEZIONE_VALIDAZIONE);
ecc.setCodiceEccezione(Costanti.ECCEZIONE_FORMATO_INTESTAZIONE_NON_CORRETTO);
ecc.setRilevanza(LivelloRilevanza.INFO);
ecc.setDescrizione(Costanti.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE);
this.erroriValidazione.add(ecc);
}*/
for(int i=0; i<this.busta.sizeListaTrasmissioni(); i++){
Trasmissione tr = this.busta.getTrasmissione(i);
if(tr.getIndirizzoOrigine()!=null){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_INDIRIZZO_ORIGINE_NON_VALIDA);
ecc.setRilevanza(LivelloRilevanza.INFO);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE_IDENTIFICATIVO_PARTE_IND_TELEMATICO.toString());
this.erroriValidazione.add(ecc);
}
if(tr.getIndirizzoDestinazione()!=null){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_INDIRIZZO_DESTINAZIONE_NON_VALIDA);
ecc.setRilevanza(LivelloRilevanza.INFO);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE_IDENTIFICATIVO_PARTE_IND_TELEMATICO.toString());
this.erroriValidazione.add(ecc);
}
}
// Lista riscontri
if(this.busta.sizeListaRiscontri()>0){
Eccezione ecc = new Eccezione();
ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
ecc.setCodiceEccezione(CodiceErroreCooperazione.LISTA_RISCONTRI_NON_VALIDA);
ecc.setRilevanza(LivelloRilevanza.INFO);
ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE.toString());
this.erroriValidazione.add(ecc);
}
}
}
public String getAzioneCorrelata() {
return this.azioneCorrelata;
}
public void setAzioneCorrelata(String azioneCorrelata) {
this.azioneCorrelata = azioneCorrelata;
}
@Override
public IProtocolFactory<?> getProtocolFactory() {
return this.protocolFactory;
}
@Override
public boolean validazioneID(String id, IDSoggetto dominio, ProprietaValidazione proprietaValidazione) {
this.validazioneIDEGovCompleta = proprietaValidazione.isValidazioneIDCompleta();
if(dominio!=null){
return this.validazioneID_engine(id, dominio.getNome(), dominio.getCodicePorta());
}else{
return this.validazioneID_engine(id, null, null);
}
}
@Override
public ValidazioneSemanticaResult valida(OpenSPCoop2Message msg, Busta busta,
ProprietaValidazione proprietaValidazione, RuoloBusta tipoBusta)
throws ProtocolException {
this.busta = busta;
this.registroServiziReader = RegistroServiziManager.getInstance(this.state);
this.validazioneIDEGovCompleta = proprietaValidazione.isValidazioneIDCompleta();
this.valida(proprietaValidazione, tipoBusta, proprietaValidazione.getVersioneProtocollo());
ValidazioneSemanticaResult result = new ValidazioneSemanticaResult(this.erroriValidazione, this.erroriProcessamento,
this.servizioCorrelato, this.tipoServizioCorrelato, this.versioneServizioCorrelato, this.infoServizio);
return result;
}
@Override
public SecurityInfo readSecurityInformation(IDigestReader digestReader, OpenSPCoop2Message msg) throws ProtocolException{
return null;
}
}