ContenutiUtilities.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.pdd.logger.transazioni;

import org.openspcoop2.core.commons.dao.DAOFactory;
import org.openspcoop2.core.transazioni.DumpContenuto;
import org.openspcoop2.core.transazioni.DumpMessaggio;
import org.openspcoop2.core.transazioni.IdDumpMessaggio;
import org.openspcoop2.core.transazioni.Transazione;
import org.openspcoop2.core.transazioni.constants.TipoMessaggio;
import org.openspcoop2.core.transazioni.dao.IDumpMessaggioService;
import org.openspcoop2.monitor.engine.config.TransactionResource;
import org.openspcoop2.monitor.engine.config.TransactionServiceLibrary;
import org.openspcoop2.monitor.engine.transaction.TransactionContentUtils;

import java.util.List;

import org.slf4j.Logger;
import org.openspcoop2.generic_project.exception.MultipleResultException;
import org.openspcoop2.generic_project.exception.NotFoundException;
import org.openspcoop2.generic_project.exception.NotImplementedException;
import org.openspcoop2.generic_project.exception.ServiceException;
import org.openspcoop2.pdd.core.handlers.HandlerException;
import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico;
import org.openspcoop2.protocol.sdk.tracciamento.Traccia;
import org.openspcoop2.utils.date.DateManager;

/**     
 * ContenutiUtilities
 *
 * @author Poli Andrea (poli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class ContenutiUtilities {

	private Logger logger;
	
	public ContenutiUtilities(Logger log){
		this.logger = log;
	}
	
	public void insertContenuti(Transazione transactionDTO,
			Traccia tracciaRichiesta, Traccia tracciaRisposta,
			List<MsgDiagnostico> msgDiagnostici,
			IDumpMessaggioService dumpMessageService,
			List<TransactionResource> risorse,
			TransactionServiceLibrary transactionServiceLibrary,
			DAOFactory daoFactory) throws HandlerException{

		try {

			boolean updateRichiestaIngresso = false;
			boolean updateRichiestaUscita = false;
			boolean updateRispostaIngresso = false;
			boolean updateRispostaUscita = false;
			
			DumpMessaggio dumpMessaggioRichiestaIngresso = null;
			DumpMessaggio dumpMessaggioRichiestaUscita = null;
			DumpMessaggio dumpMessaggioRispostaIngresso = null;
			DumpMessaggio dumpMessaggioRispostaUscita = null;
			
			IdDumpMessaggio idDumpMessaggioRichiestaIngresso = new IdDumpMessaggio();
			idDumpMessaggioRichiestaIngresso.setIdTransazione(transactionDTO.getIdTransazione());
			idDumpMessaggioRichiestaIngresso.setTipoMessaggio(TipoMessaggio.RICHIESTA_INGRESSO);
			
			IdDumpMessaggio idDumpMessaggioRichiestaUscita = new IdDumpMessaggio();
			idDumpMessaggioRichiestaUscita.setIdTransazione(transactionDTO.getIdTransazione());
			idDumpMessaggioRichiestaUscita.setTipoMessaggio(TipoMessaggio.RICHIESTA_USCITA);
			
			IdDumpMessaggio idDumpMessaggioRispostaIngresso = new IdDumpMessaggio();
			idDumpMessaggioRispostaIngresso.setIdTransazione(transactionDTO.getIdTransazione());
			idDumpMessaggioRispostaIngresso.setTipoMessaggio(TipoMessaggio.RISPOSTA_INGRESSO);
			
			IdDumpMessaggio idDumpMessaggioRispostaUscita = new IdDumpMessaggio();
			idDumpMessaggioRispostaUscita.setIdTransazione(transactionDTO.getIdTransazione());
			idDumpMessaggioRispostaUscita.setTipoMessaggio(TipoMessaggio.RISPOSTA_USCITA);
			
			

			// ----------------------- Inserimento contenuti -------------------------
			if(risorse!=null && !risorse.isEmpty()){
				
				
				for (TransactionResource risorsaCalcolata : risorse) {
					
					if(org.openspcoop2.core.transazioni.constants.TipoMessaggio.RICHIESTA_INGRESSO.equals(risorsaCalcolata.getTipoMessaggio())){
						
						if(dumpMessaggioRichiestaIngresso==null) {
							dumpMessaggioRichiestaIngresso = getSafe(dumpMessageService, idDumpMessaggioRichiestaIngresso);
						}
						
						if(dumpMessaggioRichiestaIngresso==null){
							dumpMessaggioRichiestaIngresso = new DumpMessaggio();
							dumpMessaggioRichiestaIngresso.setIdTransazione(transactionDTO.getIdTransazione());
							dumpMessaggioRichiestaIngresso.setTipoMessaggio(TipoMessaggio.RICHIESTA_INGRESSO);
							dumpMessaggioRichiestaIngresso.setDumpTimestamp(DateManager.getDate());
						}
						DumpContenuto contenuto = 
								TransactionContentUtils.createDumpContenuto(risorsaCalcolata.getNome(), 
										risorsaCalcolata.getValore(), 
										DateManager.getDate());
						dumpMessaggioRichiestaIngresso.addContenuto(contenuto);
						updateRichiestaIngresso = true;
					}
					
					else if(org.openspcoop2.core.transazioni.constants.TipoMessaggio.RICHIESTA_USCITA.equals(risorsaCalcolata.getTipoMessaggio())){
						
						if(dumpMessaggioRichiestaUscita==null) {
							dumpMessaggioRichiestaUscita = getSafe(dumpMessageService, idDumpMessaggioRichiestaUscita);
						}
						
						if(dumpMessaggioRichiestaUscita==null){
							dumpMessaggioRichiestaUscita = new DumpMessaggio();
							dumpMessaggioRichiestaUscita.setIdTransazione(transactionDTO.getIdTransazione());
							dumpMessaggioRichiestaUscita.setTipoMessaggio(TipoMessaggio.RICHIESTA_USCITA);
							dumpMessaggioRichiestaUscita.setDumpTimestamp(DateManager.getDate());
						}
						DumpContenuto contenuto = 
								TransactionContentUtils.createDumpContenuto(risorsaCalcolata.getNome(), 
										risorsaCalcolata.getValore(), 
										DateManager.getDate());
						dumpMessaggioRichiestaUscita.addContenuto(contenuto);
						updateRichiestaUscita = true;
					}
					
					else if(org.openspcoop2.core.transazioni.constants.TipoMessaggio.RISPOSTA_INGRESSO.equals(risorsaCalcolata.getTipoMessaggio())){
						
						if(dumpMessaggioRispostaIngresso==null) {
							dumpMessaggioRispostaIngresso = getSafe(dumpMessageService, idDumpMessaggioRispostaIngresso);
						}
						
						if(dumpMessaggioRispostaIngresso==null){
							dumpMessaggioRispostaIngresso = new DumpMessaggio();
							dumpMessaggioRispostaIngresso.setIdTransazione(transactionDTO.getIdTransazione());
							dumpMessaggioRispostaIngresso.setTipoMessaggio(TipoMessaggio.RISPOSTA_INGRESSO);
							dumpMessaggioRispostaIngresso.setDumpTimestamp(DateManager.getDate());
						}
						DumpContenuto contenuto = 
								TransactionContentUtils.createDumpContenuto(risorsaCalcolata.getNome(), 
										risorsaCalcolata.getValore(), 
										DateManager.getDate());
						dumpMessaggioRispostaIngresso.addContenuto(contenuto);
						updateRispostaIngresso = true;
					}
					
					else if(org.openspcoop2.core.transazioni.constants.TipoMessaggio.RISPOSTA_USCITA.equals(risorsaCalcolata.getTipoMessaggio())){
						
						if(dumpMessaggioRispostaUscita==null) {
							dumpMessaggioRispostaUscita = getSafe(dumpMessageService, idDumpMessaggioRispostaUscita);
						}
						
						if(dumpMessaggioRispostaUscita==null){
							dumpMessaggioRispostaUscita = new DumpMessaggio();
							dumpMessaggioRispostaUscita.setIdTransazione(transactionDTO.getIdTransazione());
							dumpMessaggioRispostaUscita.setTipoMessaggio(TipoMessaggio.RISPOSTA_USCITA);
							dumpMessaggioRispostaUscita.setDumpTimestamp(DateManager.getDate());
						}
						DumpContenuto contenuto = 
								TransactionContentUtils.createDumpContenuto(risorsaCalcolata.getNome(), 
										risorsaCalcolata.getValore(), 
										DateManager.getDate());
						dumpMessaggioRispostaUscita.addContenuto(contenuto);
						updateRispostaUscita = true;
					}
				}
			}
			
			
			
			// ----------------------- SDK -------------------------
				
			if(dumpMessaggioRichiestaIngresso==null && transactionServiceLibrary!=null){
				dumpMessaggioRichiestaIngresso = new DumpMessaggio();
				dumpMessaggioRichiestaIngresso.setIdTransazione(transactionDTO.getIdTransazione());
				dumpMessaggioRichiestaIngresso.setTipoMessaggio(TipoMessaggio.RICHIESTA_INGRESSO);
				dumpMessaggioRichiestaIngresso.setDumpTimestamp(DateManager.getDate());
			}
			
			if(dumpMessaggioRichiestaUscita==null && transactionServiceLibrary!=null){
				dumpMessaggioRichiestaUscita = new DumpMessaggio();
				dumpMessaggioRichiestaUscita.setIdTransazione(transactionDTO.getIdTransazione());
				dumpMessaggioRichiestaUscita.setTipoMessaggio(TipoMessaggio.RICHIESTA_USCITA);
				dumpMessaggioRichiestaUscita.setDumpTimestamp(DateManager.getDate());
			}
			
			if(dumpMessaggioRispostaIngresso==null && transactionServiceLibrary!=null){
				dumpMessaggioRispostaIngresso = new DumpMessaggio();
				dumpMessaggioRispostaIngresso.setIdTransazione(transactionDTO.getIdTransazione());
				dumpMessaggioRispostaIngresso.setTipoMessaggio(TipoMessaggio.RISPOSTA_INGRESSO);
				dumpMessaggioRispostaIngresso.setDumpTimestamp(DateManager.getDate());
			}
			
			if(dumpMessaggioRispostaUscita==null && transactionServiceLibrary!=null){
				dumpMessaggioRispostaUscita = new DumpMessaggio();
				dumpMessaggioRispostaUscita.setIdTransazione(transactionDTO.getIdTransazione());
				dumpMessaggioRispostaUscita.setTipoMessaggio(TipoMessaggio.RISPOSTA_USCITA);
				dumpMessaggioRispostaUscita.setDumpTimestamp(DateManager.getDate());
			}
			
			boolean messaggioModificatoSDK = false;
			if(transactionServiceLibrary!=null){
				messaggioModificatoSDK = transactionServiceLibrary.processResourcesBeforeSaveOnDatabase(transactionDTO,
						tracciaRichiesta, tracciaRisposta,
						msgDiagnostici,
						dumpMessaggioRichiestaIngresso, dumpMessaggioRichiestaUscita,
						dumpMessaggioRispostaIngresso, dumpMessaggioRispostaUscita, 
						transactionDTO.getStato(),
						this.logger,daoFactory);
			}
			
			
			
			
			// ----------------------- UPDATE -------------------------

			if(updateRichiestaIngresso || messaggioModificatoSDK){
				dumpMessageService.updateOrCreate(idDumpMessaggioRichiestaIngresso, dumpMessaggioRichiestaIngresso);
			}
			if(updateRichiestaUscita || messaggioModificatoSDK){
				dumpMessageService.updateOrCreate(idDumpMessaggioRichiestaUscita, dumpMessaggioRichiestaUscita);
			}
			
			if(updateRispostaIngresso || messaggioModificatoSDK){
				dumpMessageService.updateOrCreate(idDumpMessaggioRispostaIngresso, dumpMessaggioRispostaIngresso);
			}
			if(updateRispostaUscita || messaggioModificatoSDK){
				dumpMessageService.updateOrCreate(idDumpMessaggioRispostaUscita, dumpMessaggioRispostaUscita);
			}
			
		} catch (Exception e) {
			throw new HandlerException("Errore durante la scrittura della transazione sul database: " + e.getLocalizedMessage(), e);
		} 
	}
	
	private DumpMessaggio getSafe(IDumpMessaggioService dumpMessageService, IdDumpMessaggio id) throws ServiceException, MultipleResultException, NotImplementedException {
		try{
			return dumpMessageService.get(id);
		}catch(NotFoundException notFound){
			// ignore
			return null;
		}
	}
	
}