SearchFormUtilities.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.core.monitor.rs.server.api.impl.utils;

import org.joda.time.DateTime;
import org.openspcoop2.core.monitor.rs.server.config.ServerProperties;
import org.openspcoop2.core.monitor.rs.server.config.SoggettiConfig;
import org.openspcoop2.core.monitor.rs.server.model.FiltroRicercaRuoloTransazioneEnum;
import org.openspcoop2.core.monitor.rs.server.model.FormatoReportEnum;
import org.openspcoop2.core.transazioni.constants.PddRuolo;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.utils.service.beans.ProfiloEnum;
import org.openspcoop2.utils.service.beans.TransazioneRuoloEnum;
import org.openspcoop2.utils.service.context.IContext;
import org.openspcoop2.utils.service.fault.jaxrs.FaultCode;
import org.openspcoop2.web.lib.users.dao.InterfaceType;
import org.openspcoop2.web.lib.users.dao.PermessiUtente;
import org.openspcoop2.web.lib.users.dao.User;
import org.openspcoop2.web.monitor.core.bean.BaseSearchForm;
import org.openspcoop2.web.monitor.core.constants.ModalitaRicercaTransazioni;
import org.openspcoop2.web.monitor.core.constants.TipologiaRicerca;
import org.openspcoop2.web.monitor.eventi.bean.EventiSearchForm;
import org.openspcoop2.web.monitor.statistiche.bean.ConfigurazioniGeneraliSearchForm;
import org.openspcoop2.web.monitor.statistiche.constants.CostantiExporter;
import org.openspcoop2.web.monitor.transazioni.bean.TransazioniSearchForm;

/**
 * BaseSearchForm
 * 
 * @author $Author$
 * @version $Rev$, $Date$
 * 
 */
public class SearchFormUtilities {

	private ServerProperties serverProperties;
	private ProtocolFactoryManager protocolFactoryManager;
	
	public SearchFormUtilities() throws Exception {
		this.serverProperties = ServerProperties.getInstance();
		this.protocolFactoryManager = ProtocolFactoryManager.getInstance();
	}
	
	public User getUtente(IContext context) {
		User user = new User();
		user.setInterfaceType(InterfaceType.STANDARD);
		user.setLogin(context.getAuthentication().getName());
		PermessiUtente permessi = new PermessiUtente();
		permessi.setDiagnostica(true);
		permessi.setReportistica(true);
		user.setPermessi(permessi);
		user.setPermitAllServizi(true);
		user.setPermitAllSoggetti(true);
		//user.setProtocolliSupportati(protocolFactoryManager.getProtocolNamesAsList());
		return user;
	}
	
	private void initBaseInfo(BaseSearchForm searchForm, IContext context, ProfiloEnum profilo, String soggetto, FiltroRicercaRuoloTransazioneEnum ruolo) throws Exception {
		this.initBaseInfo(searchForm, context, profilo, soggetto);
		if(ruolo!=null) {
			switch (ruolo) {
			case FRUIZIONE:
				searchForm.setTipologiaRicerca(TipologiaRicerca.uscita);
				break;
			case EROGAZIONE:
				searchForm.setTipologiaRicerca(TipologiaRicerca.ingresso);	
				break;
			case QUALSIASI:
				searchForm.setTipologiaRicerca(TipologiaRicerca.all);	
				break;
			}
		}
	}
	
	private void initBaseInfo(BaseSearchForm searchForm, IContext context, ProfiloEnum profilo, String soggetto) throws Exception {
		searchForm.setUser(this.getUtente(context));
		String protocollo = Converter.toProtocollo(profilo);
		searchForm.setProtocollo(protocollo);
		String tipoSoggettoLocale = this.protocolFactoryManager.getDefaultOrganizationTypes().get(protocollo);
		String nomeSoggettoLocale = soggetto;
		if(nomeSoggettoLocale==null) {
			if(this.serverProperties.useSoggettoDefault()) {
				nomeSoggettoLocale = this.serverProperties.getSoggettoDefaultIfEnabled(protocollo);
			}
		}
		if(nomeSoggettoLocale!=null) {
			if(!SoggettiConfig.existsIdentificativoPorta(tipoSoggettoLocale, nomeSoggettoLocale)) {
				throw FaultCode.RICHIESTA_NON_VALIDA.toException("Il soggetto '"+nomeSoggettoLocale+"' indicato non esiste");
			}
			searchForm.setTipoNomeSoggettoLocale(tipoSoggettoLocale+"/"+nomeSoggettoLocale);
			searchForm.setSoggettoPddMonitor(tipoSoggettoLocale+"/"+nomeSoggettoLocale);
		}
		else {
			searchForm.setCheckSoggettoPddMonitor(false);
		}
		searchForm.saveProtocollo();
	}
	
	public HttpRequestWrapper getHttpRequestWrapper(IContext context, ProfiloEnum profilo, String soggetto, FiltroRicercaRuoloTransazioneEnum ruolo, 
			FormatoReportEnum formato, boolean formatoStat,
			TipoReport tipo) throws Exception {
		HttpRequestWrapper request = new HttpRequestWrapper(context.getServletRequest());
		request.overrideParameter(CostantiExporter.TIPO_DISTRIBUZIONE, tipo.getValue());
		String protocollo = Converter.toProtocollo(profilo);
		request.overrideParameter(CostantiExporter.PROTOCOLLO,protocollo);
		String tipoSoggettoLocale = this.protocolFactoryManager.getDefaultOrganizationTypes().get(protocollo);
		String nomeSoggettoLocale = soggetto;
		if(nomeSoggettoLocale==null) {
			if(this.serverProperties.useSoggettoDefault()) {
				nomeSoggettoLocale = this.serverProperties.getSoggettoDefaultIfEnabled(protocollo);
			}
		}
		if(nomeSoggettoLocale!=null) {
			if(!SoggettiConfig.existsIdentificativoPorta(tipoSoggettoLocale, nomeSoggettoLocale)) {
				throw FaultCode.RICHIESTA_NON_VALIDA.toException("Il soggetto '"+nomeSoggettoLocale+"' indicato non esiste");
			}
			request.overrideParameter(CostantiExporter.SOGGETTO_LOCALE,tipoSoggettoLocale+"/"+nomeSoggettoLocale);
		}
		if(ruolo!=null) {
			switch (ruolo) {
			case FRUIZIONE:
				request.overrideParameter(CostantiExporter.TIPOLOGIA,CostantiExporter.TIPOLOGIA_FRUIZIONE);
				break;
			case EROGAZIONE:
				request.overrideParameter(CostantiExporter.TIPOLOGIA,CostantiExporter.TIPOLOGIA_EROGAZIONE);
				break;
			case QUALSIASI:
				request.overrideParameter(CostantiExporter.TIPOLOGIA,CostantiExporter.TIPOLOGIA_EROGAZIONE_FRUIZIONE);
				break;
			}
		}
		String nomeParametroTipoFormato = null;
		if(formatoStat) {
			nomeParametroTipoFormato = CostantiExporter.TIPO_FORMATO;
		}
		else {
			nomeParametroTipoFormato = CostantiExporter.TIPO_FORMATO_CONFIGURAZIONE;
		}
		switch (formato) {
		case CSV:
			request.overrideParameter(nomeParametroTipoFormato, CostantiExporter.TIPO_FORMATO_CSV);
			break;
		case PDF:
			request.overrideParameter(nomeParametroTipoFormato, CostantiExporter.TIPO_FORMATO_PDF);
			break;
		case XLS:
			request.overrideParameter(nomeParametroTipoFormato, CostantiExporter.TIPO_FORMATO_XLS);
			break;
		case XML:
			request.overrideParameter(nomeParametroTipoFormato, CostantiExporter.TIPO_FORMATO_XML);
			break;
		case JSON:
			request.overrideParameter(nomeParametroTipoFormato, CostantiExporter.TIPO_FORMATO_JSON);
			break;
		default:
			break;
		}
		return request;
	}
	public HttpRequestWrapper getHttpRequestWrapper(IContext context, ProfiloEnum profilo, String soggetto, TransazioneRuoloEnum ruolo, 
			FormatoReportEnum formato, boolean formatoStat, 
			TipoReport tipo) throws Exception {
		FiltroRicercaRuoloTransazioneEnum ruoloNull = null;
		HttpRequestWrapper wrapper = getHttpRequestWrapper(context, profilo, soggetto, ruoloNull, formato, formatoStat, tipo);
		if(ruolo!=null) {
			switch (ruolo) {
			case FRUIZIONE:
				wrapper.overrideParameter(CostantiExporter.TIPOLOGIA,CostantiExporter.TIPOLOGIA_FRUIZIONE);
				break;
			case EROGAZIONE:
				wrapper.overrideParameter(CostantiExporter.TIPOLOGIA,CostantiExporter.TIPOLOGIA_EROGAZIONE);
				break;
			}
		}
		return wrapper;
	}
	
	public TransazioniSearchForm getAndamentoTemporaleSearchForm(IContext context, ProfiloEnum profilo, String soggetto, FiltroRicercaRuoloTransazioneEnum ruolo,
			DateTime dataInizio, DateTime dataFine) throws Exception {
		TransazioniSearchForm searchForm = new TransazioniSearchForm();
		initBaseInfo(searchForm, context, profilo, soggetto, ruolo);
		searchForm.setModalitaRicercaStorico(ModalitaRicercaTransazioni.ANDAMENTO_TEMPORALE.getValue());
		if (dataInizio != null && dataFine != null) {
			searchForm.setDataInizio(dataInizio.toDate());
			searchForm.setDataFine(dataFine.toDate());
		}
		return searchForm;
	}
	
	public TransazioniSearchForm getIdMessaggioSearchForm(IContext context, ProfiloEnum profilo, String soggetto) throws Exception {
		TransazioniSearchForm searchForm = new TransazioniSearchForm();
		initBaseInfo(searchForm, context, profilo, soggetto, null);
		searchForm.setModalitaRicercaStorico(ModalitaRicercaTransazioni.ID_MESSAGGIO.getValue());
		
		return searchForm;
	}
	
	public TransazioniSearchForm getIdApplicativoBaseSearchForm(IContext context, ProfiloEnum profilo, String soggetto) throws Exception {
		TransazioniSearchForm searchForm = new TransazioniSearchForm();
		initBaseInfo(searchForm, context, profilo, soggetto, null);
		searchForm.setModalitaRicercaStorico(ModalitaRicercaTransazioni.ID_APPLICATIVO_BASE.getValue());
		
		return searchForm;
	}
	
	
	public EventiSearchForm getEventiSearchForm(IContext context, DateTime dataInizio, DateTime dataFine) throws Exception {
		EventiSearchForm searchForm = new EventiSearchForm();
		searchForm.setDataInizio(dataInizio.toDate());
		searchForm.setDataFine(dataFine.toDate());
		return searchForm;
	}
	
	public TransazioniSearchForm getIdApplicativoSearchForm(IContext context, ProfiloEnum profilo, String soggetto, FiltroRicercaRuoloTransazioneEnum ruolo,
			DateTime dataInizio, DateTime dataFine) throws Exception {
		TransazioniSearchForm searchForm = new TransazioniSearchForm();
		initBaseInfo(searchForm, context, profilo, soggetto, ruolo);
		searchForm.setModalitaRicercaStorico(ModalitaRicercaTransazioni.ID_APPLICATIVO_AVANZATA.getValue());
		if (dataInizio != null && dataFine != null) {
			searchForm.setDataInizio(dataInizio.toDate());
			searchForm.setDataFine(dataFine.toDate());
		}
		return searchForm;
	}
	
	public ConfigurazioniGeneraliSearchForm getConfigurazioniGeneraliSearchForm(IContext context, ProfiloEnum profilo, String soggetto, TransazioneRuoloEnum ruolo) throws Exception {
		ConfigurazioniGeneraliSearchForm searchForm = new ConfigurazioniGeneraliSearchForm();
		initBaseInfo(searchForm, context, profilo, soggetto);
		if(ruolo!=null) {
			switch (ruolo) {
			case FRUIZIONE:
				searchForm.setTipologiaTransazioni(PddRuolo.DELEGATA);
				break;
			case EROGAZIONE:
				searchForm.setTipologiaTransazioni(PddRuolo.APPLICATIVA);
				break;
			}
		}
		return searchForm;
	}
}