SDIValidatoreServizioRiceviFile.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.sdi.validator;
import it.gov.fatturapa.sdi.ws.trasmissione.v1_0.types.constants.ErroreInvioType;
import it.gov.fatturapa.sdi.ws.trasmissione.v1_0.types.utils.ProjectInfo;
import java.util.List;
import javax.xml.soap.SOAPElement;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.message.soap.SoapUtils;
import org.openspcoop2.protocol.sdi.constants.SDICostanti;
import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioRiceviFile;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
/**
* SDIValidatoreServizioRiceviFile
*
* @author Andrea Poli (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class SDIValidatoreServizioRiceviFile {
private SDIValidazioneSintattica sdiValidazioneSintattica;
@SuppressWarnings("unused")
private SDIValidazioneSemantica sdiValidazioneSemantica;
@SuppressWarnings("unused")
private OpenSPCoop2Message msg;
private boolean isRichiesta;
private SOAPElement sdiMessage;
private String namespace;
private Busta busta;
public SDIValidatoreServizioRiceviFile(SDIValidazioneSintattica sdiValidazioneSintattica,
OpenSPCoop2Message msg,boolean isRichiesta,
SOAPElement sdiMessage,Busta busta){
this.sdiValidazioneSintattica = sdiValidazioneSintattica;
this.msg = msg;
this.isRichiesta = isRichiesta;
this.sdiMessage = sdiMessage;
this.namespace = ProjectInfo.getInstance().getProjectNamespace();
this.busta = busta;
}
public SDIValidatoreServizioRiceviFile(SDIValidazioneSemantica sdiValidazioneSemantica,
OpenSPCoop2Message msg,boolean isRichiesta,
SOAPElement sdiMessage,Busta busta){
this.sdiValidazioneSemantica = sdiValidazioneSemantica;
this.msg = msg;
this.isRichiesta = isRichiesta;
this.sdiMessage = sdiMessage;
this.namespace = ProjectInfo.getInstance().getProjectNamespace();
this.busta = busta;
}
private boolean checkServiceNamespace() throws Exception{
if(this.namespace.equals(this.sdiMessage.getNamespaceURI())==false){
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
"Namespace ["+this.sdiMessage.getNamespaceURI()+"] differente da quello atteso ["+this.namespace+"]"));
return false;
}
return true;
}
/* ***** validaRiceviFile ***** */
public void validaRiceviFile() throws Exception{
if(checkServiceNamespace()==false){
return;
}
if(this.sdiValidazioneSintattica!=null){
if(this.isRichiesta){
throw new Exception("NotImplemented"); // l'engine non dovrebbe richiedere questo caso.
}
else{
this._validazioneSintattica_RiceviFile_risposta();
}
}
else{
if(this.isRichiesta){
throw new Exception("NotImplemented"); // l'engine non dovrebbe richiedere questo caso.
}
else{
// non vi sono contenuti xml da validare
}
}
}
private void _validazioneSintattica_RiceviFile_risposta() throws Exception{
if(SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ROOT_ELEMENT.equals(this.sdiMessage.getLocalName())==false){
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
"LocalName ["+this.sdiMessage.getLocalName()+"] differente da quello atteso ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ROOT_ELEMENT+"]"));
return;
}
List<SOAPElement> elementChilds = SoapUtils.getNotEmptyChildSOAPElement(this.sdiMessage);
if(elementChilds==null || elementChilds.size()<=0){
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
"RootElement [{"+this.namespace+"}"+this.sdiMessage.getLocalName()+"] non contiene elementi"));
return;
}
String identificativoSdI = null;
String data = null;
StringBuilder erroreSB = new StringBuilder();
for (int i = 0; i < elementChilds.size(); i++) {
SOAPElement child = elementChilds.get(i);
if(SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_IDENTIFICATIVO_SDI.equals(child.getLocalName())){
if(identificativoSdI!=null){
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_PRESENTE_PIU_VOLTE));
return;
}
if(child.getTextContent()==null){
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALORIZZATO));
return;
}
identificativoSdI = child.getTextContent();
}
else if(SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_DATA_ORA_RICEZIONE.equals(child.getLocalName())){
if(data!=null){
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_DATA_ORA_RICEZIONE+"] presente piu' volte"));
return;
}
if(child.getTextContent()==null){
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_DATA_ORA_RICEZIONE+"] non valorizzato"));
return;
}
data = child.getTextContent();
}
else if(SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_ERRORE.equals(child.getLocalName())){
if(erroreSB!=null && erroreSB.length()>0){
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_ERRORE+"] presente piu' volte"));
return;
}
if(child.getTextContent()==null){
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_ERRORE+"] non valorizzato"));
return;
}
String errore = child.getTextContent();
if(errore!=null) {
erroreSB.append(errore);
}
}
else{
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
"Element ["+child.getLocalName()+"] sconosciuto"));
return;
}
if(child.getNamespaceURI()!=null){
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
"Element ["+child.getLocalName()+"] appartiene al namespace ("+child.getNamespaceURI()+"). Era atteso un elemento senza namespace"));
return;
}
}
// identificativoSDI
if(identificativoSdI==null){
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_PRESENTE));
return;
}
// data
if(data==null){
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_DATA_ORA_RICEZIONE+"] non presente"));
return;
}
// errore
String errore = (erroreSB.length()>0) ? erroreSB.toString() : null;
if(errore!=null){
try{
if(!ErroreInvioType.EI01.name().equals(errore) &&
!ErroreInvioType.EI02.name().equals(errore) &&
!ErroreInvioType.EI03.name().equals(errore) ){
throw new Exception("Valore ["+errore+"] differente dai valori attesi: ["+ErroreInvioType.EI01.name()+","+ErroreInvioType.EI02.name()+","+ErroreInvioType.EI03.name()+"]");
}
}catch(Exception e){
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_ERRORE+"] non valido: "+e.getMessage(),e));
return;
}
String motivo = null;
if(ErroreInvioType.EI01.name().equals(errore)){
motivo = "EI01 - FILE VUOTO";
}
else if(ErroreInvioType.EI02.name().equals(errore)){
motivo = "EI02 - SERVIZIO NON DISPONIBILE";
}
else if(ErroreInvioType.EI03.name().equals(errore)){
motivo = "EI03 - UTENTE NON ABILITATO";
}
this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_ERRORE+"] indica uno stato del SdI in errore: "+motivo));
}
// setto i valori sdi nella busta
this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI, identificativoSdI);
this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_DATA_ORA_RICEZIONE, data);
if(errore!=null){
this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_ERRORE, errore);
}
}
}