BustaBuilder.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 Link.it srl (https://link.it).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3, as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- package org.openspcoop2.protocol.basic.builder;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Iterator;
- import javax.xml.namespace.QName;
- import javax.xml.soap.SOAPFault;
- import org.openspcoop2.core.constants.TipoPdD;
- import org.openspcoop2.core.id.IDServizio;
- import org.openspcoop2.core.id.IDSoggetto;
- import org.openspcoop2.core.registry.driver.IDServizioFactory;
- import org.openspcoop2.message.OpenSPCoop2Message;
- import org.openspcoop2.message.OpenSPCoop2SoapMessage;
- import org.openspcoop2.message.config.ServiceBindingConfiguration;
- import org.openspcoop2.message.constants.ServiceBinding;
- import org.openspcoop2.message.soap.SOAPFaultCode;
- import org.openspcoop2.protocol.basic.BasicStateComponentFactory;
- import org.openspcoop2.protocol.basic.Costanti;
- import org.openspcoop2.protocol.sdk.Busta;
- import org.openspcoop2.protocol.sdk.Context;
- import org.openspcoop2.protocol.sdk.Eccezione;
- import org.openspcoop2.protocol.sdk.EccezioneProtocolloBuilderParameters;
- import org.openspcoop2.protocol.sdk.IProtocolFactory;
- import org.openspcoop2.protocol.sdk.ProtocolException;
- import org.openspcoop2.protocol.sdk.ProtocolMessage;
- import org.openspcoop2.protocol.sdk.Riscontro;
- import org.openspcoop2.protocol.sdk.Trasmissione;
- import org.openspcoop2.protocol.sdk.builder.IErroreApplicativoBuilder;
- import org.openspcoop2.protocol.sdk.builder.ProprietaManifestAttachments;
- import org.openspcoop2.protocol.sdk.config.ITraduttore;
- import org.openspcoop2.protocol.sdk.constants.ErroriCooperazione;
- import org.openspcoop2.protocol.sdk.constants.FaseImbustamento;
- import org.openspcoop2.protocol.sdk.constants.FaseSbustamento;
- 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.RuoloMessaggio;
- import org.openspcoop2.protocol.sdk.constants.TipoOraRegistrazione;
- import org.openspcoop2.protocol.sdk.state.IState;
- import org.openspcoop2.utils.date.DateManager;
- import org.openspcoop2.utils.date.DateUtils;
- import org.openspcoop2.utils.id.UniqueIdentifierManager;
- /**
- * BustaBuilder
- *
- * @author Poli Andrea (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class BustaBuilder<BustaRawType> extends BasicStateComponentFactory implements org.openspcoop2.protocol.sdk.builder.IBustaBuilder<BustaRawType> {
-
- protected ITraduttore traduttore;
- protected IErroreApplicativoBuilder erroreApplicativoBuilder = null;
-
- public BustaBuilder(IProtocolFactory<?> factory, IState state) throws ProtocolException{
- super(factory,state);
- this.traduttore = this.protocolFactory.createTraduttore();
- this.erroreApplicativoBuilder = this.protocolFactory.createErroreApplicativoBuilder();
- }
- private static final String dateformatPattern = "yyyyMMddHHmmssSSS"; // utile per il filtro duplicati
-
- @Override
- public String newID(IDSoggetto idSoggetto, String idTransazione, RuoloMessaggio ruoloMessaggio) throws ProtocolException {
- return newID(idSoggetto, idTransazione, ruoloMessaggio, true);
- }
- public String newID(IDSoggetto idSoggetto, String idTransazione, RuoloMessaggio ruoloMessaggio, boolean generateIDasUUID) throws ProtocolException {
-
- if(generateIDasUUID){
-
- try{
- return UniqueIdentifierManager.newUniqueIdentifier().getAsString();
- }catch(Exception e){
- throw new ProtocolException(e.getMessage());
- }
-
- }
- else{
-
- String id = idTransazione;
-
- // try {
- // XMLGregorianCalendar cal = DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar());
- // id = id + "_T_" + cal.getSecond() + cal.getMillisecond();
- // } catch (DatatypeConfigurationException e) {
- // throw new ProtocolException(e);
- // }
-
- Date now = DateManager.getDate();
-
- // NOTA: La data nell'identificativo e' utile quando l'id viene usato in un filtro duplicati
- // Per avere un insieme di identificativi in ordine raggruppate per date. (aiuta l'indice sulla base dati)
- // Essendo questa una classe di base si preferisce aggiungere la data.
- // Se non la si vuole nel protocollo trasparente reimplementare questo metodo nel protocollo trasparente eliminando la data
- // Anche il metodo extractDate dovra' a quel punto essere reimplementato ritornando null
-
- SimpleDateFormat dateFormat = DateUtils.getDefaultDateTimeFormatter(dateformatPattern);
-
- if(RuoloMessaggio.RICHIESTA.equals(ruoloMessaggio))
- // return id+ "-request";
- return dateFormat.format(now)+"-"+id;
- else
- return dateFormat.format(now)+"-"+id + "-response";
-
- }
- }
- @Override
- public Date extractDateFromID(String id) throws ProtocolException {
- return this.extractDateFromID(id, true);
- }
- public Date extractDateFromID(String id, boolean generateIDasUUID) throws ProtocolException {
- if(id==null){
- throw new ProtocolException("ID non fornito");
- }
- if(generateIDasUUID == false){
- if(id.contains("-")==false){
- throw new ProtocolException("ID fornito ["+id+"] non e' corretto (missing '-')");
- }
- String [] split = id.split("-");
-
- SimpleDateFormat dateFormat = DateUtils.getDefaultDateTimeFormatter(dateformatPattern);
-
- try{
- return dateFormat.parse(split[0].trim());
- }catch(Exception e){
- throw new ProtocolException("ID fornito ["+id+"] non e' corretto: "+e.getMessage());
- }
- }
- else{
- return null;
- }
- }
-
-
- @Override
- public ProtocolMessage imbustamento(OpenSPCoop2Message msg, Context context,
- Busta busta, Busta bustaRichiesta,
- RuoloMessaggio ruoloMessaggio,
- ProprietaManifestAttachments proprietaManifestAttachments,
- FaseImbustamento faseImbustamento)
- throws ProtocolException {
-
- if(FaseImbustamento.DOPO_SICUREZZA_MESSAGGIO.equals(faseImbustamento)) {
- ProtocolMessage protocolMessage = new ProtocolMessage();
- protocolMessage.setPhaseUnsupported(true);
- return protocolMessage;
- }
-
- if(busta.getProfiloDiCollaborazione() != null) {
- switch (busta.getProfiloDiCollaborazione()) {
- case ONEWAY:
- busta.setProfiloDiCollaborazione(ProfiloDiCollaborazione.ONEWAY, ProfiloDiCollaborazione.ONEWAY.getEngineValue());
- break;
- case SINCRONO:
- busta.setProfiloDiCollaborazione(ProfiloDiCollaborazione.SINCRONO, ProfiloDiCollaborazione.SINCRONO.getEngineValue());
- break;
- case ASINCRONO_ASIMMETRICO:
- busta.setProfiloDiCollaborazione(ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO, ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.getEngineValue());
- break;
- case ASINCRONO_SIMMETRICO:
- busta.setProfiloDiCollaborazione(ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO, ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.getEngineValue());
- break;
- case UNKNOWN:
- break;
- }
- }
-
- if(busta.getTipoOraRegistrazione() != null) {
- switch (busta.getTipoOraRegistrazione()) {
- case LOCALE:
- busta.setTipoOraRegistrazione(TipoOraRegistrazione.LOCALE,Costanti.TIPO_TEMPO_LOCALE);
- break;
- case SINCRONIZZATO:
- busta.setTipoOraRegistrazione(TipoOraRegistrazione.SINCRONIZZATO,Costanti.TIPO_TEMPO_SINCRONIZZATO);
- break;
- case UNKNOWN:
- break;
- }
- }
-
- if(busta.getInoltro() != null) {
- switch (busta.getInoltro()) {
- case CON_DUPLICATI:
- busta.setInoltro(Inoltro.CON_DUPLICATI, Costanti.PROFILO_TRASMISSIONE_CON_DUPLICATI);
- break;
- case SENZA_DUPLICATI:
- busta.setInoltro(Inoltro.SENZA_DUPLICATI, Costanti.PROFILO_TRASMISSIONE_SENZA_DUPLICATI);
- break;
- case UNKNOWN:
- break;
- }
- }
-
- Iterator<Riscontro> riscontri = busta.getListaRiscontri().iterator();
- while(riscontri.hasNext()){
- Riscontro riscontro = riscontri.next();
- if(riscontro.getTipoOraRegistrazione() == null)
- continue;
- if(riscontro.getTipoOraRegistrazione().equals(TipoOraRegistrazione.LOCALE))
- riscontro.setTipoOraRegistrazioneValue(Costanti.TIPO_TEMPO_LOCALE);
- if(riscontro.getTipoOraRegistrazione().equals(TipoOraRegistrazione.SINCRONIZZATO))
- riscontro.setTipoOraRegistrazioneValue(Costanti.TIPO_TEMPO_SINCRONIZZATO);
- }
-
- Iterator<Trasmissione> trasmissioni = busta.getListaTrasmissioni().iterator();
- while(trasmissioni.hasNext()){
- Trasmissione trasmissione = trasmissioni.next();
- if(trasmissione.getTempo() == null) continue;
-
- if(trasmissione.getTempo().equals(TipoOraRegistrazione.LOCALE))
- trasmissione.setTempoValue(Costanti.TIPO_TEMPO_LOCALE);
- else
- trasmissione.setTempoValue(Costanti.TIPO_TEMPO_SINCRONIZZATO);
-
- }
-
- ProtocolMessage protocolMessage = new ProtocolMessage();
- protocolMessage.setMessage(msg);
- return protocolMessage;
- }
-
- @Override
- public ProtocolMessage addTrasmissione(OpenSPCoop2Message message,
- Trasmissione trasmissione,
- FaseImbustamento faseImbustamento) throws ProtocolException {
- ProtocolMessage protocolMessage = new ProtocolMessage();
- protocolMessage.setMessage(message);
- return protocolMessage;
- }
- @Override
- public ProtocolMessage sbustamento(OpenSPCoop2Message msg, Context context,
- Busta busta,
- RuoloMessaggio ruoloMessaggio, ProprietaManifestAttachments proprietaManifestAttachments,
- FaseSbustamento faseSbustamento, ServiceBinding integrationServiceBinding, ServiceBindingConfiguration serviceBindingConfiguration) throws ProtocolException {
-
- ProtocolMessage protocolMessage = new ProtocolMessage();
- protocolMessage.setMessage(msg);
- return protocolMessage;
-
- }
-
-
- protected void enrichFault(OpenSPCoop2Message msg, Busta busta, boolean ignoraEccezioniNonGravi,
- boolean modifyFault, boolean generateErroreApplicativoIntoDetail) throws ProtocolException{
- SOAPFault f = null;
- OpenSPCoop2SoapMessage soapMessage = null;
- try{
- if(!modifyFault && !generateErroreApplicativoIntoDetail) {
- return;
- }
-
- if(ServiceBinding.SOAP.equals(msg.getServiceBinding())){
- soapMessage = msg.castAsSoap();
- if(soapMessage.hasSOAPFault()) {
- if(soapMessage.getSOAPBody()!=null){
- f = soapMessage.getSOAPBody().getFault();
- }
- }
- }
-
- if(soapMessage==null || f==null){
- return;
- }
-
-
- // Eccezione
- // NOTA: il parametro 'ignoraEccezioniNonGravi' serve solo a filtrare.
- // il controllo che esista almeno una eccezione non grave e' fatto dove viene chiamato il metodo.
- Eccezione ecc = null;
- if(busta.sizeListaEccezioni()==1){
- ecc = busta.getEccezione(0);
- }
- else{
- ecc = Eccezione.getEccezioneProcessamento(ErroriCooperazione.ERRORE_GENERICO_PROTOCOLLO_NON_CORRETTO.getErroreCooperazione(), this.protocolFactory);
- StringBuilder bfDescrizione = new StringBuilder();
- for(int k=0; k<busta.sizeListaEccezioni();k++){
- Eccezione eccLista = busta.getEccezione(k);
- if(eccLista.getRilevanza()==null || LivelloRilevanza.isEccezioneLivelloGrave(eccLista.getRilevanza())){
- if(eccLista.getDescrizione(this.protocolFactory)!=null)
- bfDescrizione.append("["+this.traduttore.toString(eccLista.getCodiceEccezione(),eccLista.getSubCodiceEccezione())+"] "+eccLista.getDescrizione(this.protocolFactory)+"\n");
- }
- }
- if(bfDescrizione.length()>0)
- ecc.setDescrizione(bfDescrizione.toString());
- }
- if(ecc==null) {
- // non ci sono segnalazioni di errore
- return ;
- }
-
- EccezioneProtocolloBuilderParameters params = new EccezioneProtocolloBuilderParameters();
- params.setEccezioneProtocollo(ecc);
-
- if(modifyFault) {
- // Set Fault Code
- String codiceEccezione =
- this.traduttore.toString(ecc.getCodiceEccezione(),
- ecc.getSubCodiceEccezione());
- QName eccezioneName = this.erroreApplicativoBuilder.getQNameEccezioneProtocollo(null, codiceEccezione);
- SOAPFaultCode code = params.getSoapFaultCode();
- soapMessage.setFaultCode(f, code, eccezioneName);
-
- // Set fault String
- soapMessage.setFaultString(f, ecc.getDescrizione(this.protocolFactory));
-
- // Set fault Actor
- f.setFaultActor(org.openspcoop2.utils.Costanti.OPENSPCOOP2);
- }
-
- if(generateErroreApplicativoIntoDetail) {
-
- // Soggetto Produce Eccezione == Dominio
- IDSoggetto soggettoProduceEccezione = new IDSoggetto(busta.getTipoMittente(),busta.getMittente(),busta.getIdentificativoPortaMittente());
- params.setSoggettoProduceEccezione(soggettoProduceEccezione);
- params.setDominioPorta(soggettoProduceEccezione);
-
- // Mittente (può essere non definito in protocollo che supportano l'invocazione anonima)
- if(busta.getTipoDestinatario()!=null && busta.getDestinatario()!=null){
- IDSoggetto idSoggettoMittente = new IDSoggetto(busta.getTipoDestinatario(), busta.getDestinatario());
- String idPortaMittente = busta.getIdentificativoPortaDestinatario();
- if(idPortaMittente==null){
- idPortaMittente = this.traduttore.getIdentificativoPortaDefault(idSoggettoMittente);
- }
- idSoggettoMittente.setCodicePorta(idPortaMittente);
- params.setMittente(idSoggettoMittente);
- }
-
- // Servizio
- IDServizio idServizio =
- IDServizioFactory.getInstance().getIDServizioFromValues(busta.getTipoServizio(), busta.getServizio(),
- soggettoProduceEccezione, busta.getVersioneServizio());
- idServizio.setAzione(busta.getAzione());
- params.setServizio(idServizio);
-
- // MessageType
- params.setMessageType(msg.getMessageType());
-
- // IDFunzione
- params.setIdFunzione("PortaApplicativa");
-
- // ServizioApplicativo
- params.setServizioApplicativo(busta.getServizioApplicativoErogatore());
-
- // TipoPdD
- params.setTipoPorta(TipoPdD.APPLICATIVA);
-
- // genero errore applicativo
- this.erroreApplicativoBuilder.insertInSOAPFault(params, msg);
- }
-
- }catch(Exception e){
- throw new ProtocolException(e.getMessage(),e);
- }
- }
-
- }