GeneralHelper.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.web.ctrlstat.servlet;

import java.awt.Font;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringEscapeUtils;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.protocol.engine.utils.NamingUtils;
import org.openspcoop2.protocol.utils.ProtocolUtils;
import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
import org.openspcoop2.web.ctrlstat.core.ControlStationLogger;
import org.openspcoop2.web.ctrlstat.costanti.CostantiControlStation;
import org.openspcoop2.web.ctrlstat.servlet.about.AboutCostanti;
import org.openspcoop2.web.ctrlstat.servlet.login.LoginCostanti;
import org.openspcoop2.web.ctrlstat.servlet.pdd.PddCore;
import org.openspcoop2.web.ctrlstat.servlet.soggetti.SoggettiCore;
import org.openspcoop2.web.ctrlstat.servlet.utenti.UtentiCostanti;
import org.openspcoop2.web.lib.mvc.Costanti;
import org.openspcoop2.web.lib.mvc.DataElement;
import org.openspcoop2.web.lib.mvc.DataElementType;
import org.openspcoop2.web.lib.mvc.GeneralData;
import org.openspcoop2.web.lib.mvc.GeneralLink;
import org.openspcoop2.web.lib.mvc.PageData;
import org.openspcoop2.web.lib.mvc.Parameter;
import org.openspcoop2.web.lib.mvc.ServletUtils;
import org.openspcoop2.web.lib.users.dao.InterfaceType;
import org.openspcoop2.web.lib.users.dao.User;
import org.slf4j.Logger;


// Questa classe, volendo, potrebbe essere usata anche dalla Porta di Dominio e
// dal registro servizi, dato che serve per settare pezzi di codice comuni a
// piu' applicazioni
/**
 * generalHelper
 * 
 * @author Andrea Poli (apoli@link.it)
 * @author Stefano Corallo (corallo@link.it)
 * @author Sandra Giangrandi (sandra@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 * 
 */
public class GeneralHelper {

	protected HttpSession session;
	protected ControlStationCore core;
	protected PddCore pddCore;
	protected SoggettiCore soggettiCore;
	protected Logger log;

	public GeneralHelper(HttpSession session) {
		this.session = session;
		try {
			this.core = new ControlStationCore();
			this.pddCore = new PddCore(this.core);
			this.soggettiCore = new SoggettiCore(this.core);
		} catch (Exception e) {
			this.log = ControlStationLogger.getPddConsoleCoreLogger();
			this.log.error("Exception: " + e.getMessage(), e);
		}
		this.log = ControlStationLogger.getPddConsoleCoreLogger();
	}





	public GeneralData initGeneralData(HttpServletRequest request){
		String baseUrl = request.getRequestURI();
		return this.initGeneralData_engine(request, baseUrl);
	}
	public GeneralData initGeneralData(HttpServletRequest request,String servletName){
		String baseUrl = request.getContextPath();
		if(servletName.startsWith("/")){
			baseUrl = baseUrl + servletName;
		}else{
			baseUrl = baseUrl + "/" + servletName;
		}
		return this.initGeneralData_engine(request, baseUrl);
	}

	private GeneralData initGeneralData_engine(HttpServletRequest request, String baseUrl) {
		String userLogin = ServletUtils.getUserLoginFromSession(this.session);
		String css = this.core.getConsoleCSS();

		// per avere diversi 'profili' utente per i vari tab leggo l'utente dalla sessione del tab
		User u = ServletUtils.getUserFromSession(request, this.session);

		boolean displayUtente = false;
		boolean displayLogin = true;
		boolean displayLogout = true;
		if ((baseUrl.indexOf("/"+LoginCostanti.SERVLET_NAME_LOGIN) != -1 && u == null) || (baseUrl.indexOf("/"+LoginCostanti.SERVLET_NAME_LOGOUT) != -1)
				|| (baseUrl.indexOf("/"+LoginCostanti.SERVLET_NAME_LOGIN_MESSAGE_PAGE) != -1)
				|| (baseUrl.indexOf("/"+UtentiCostanti.SERVLET_NAME_UTENTE_PASSWORD_CHANGE) != -1 && u == null)) {
			displayLogin = false;
			displayLogout = false;
		}
		if (u != null){
			displayLogin = false;
			displayUtente = true;
		}

		GeneralData gd = new GeneralData(CostantiControlStation.LABEL_LINKIT_WEB);
		gd.setProduct(this.core.getConsoleNomeSintesi());
		gd.setLanguage(this.core.getConsoleLanguage());
		gd.setTitle(StringEscapeUtils.escapeHtml(this.core.getConsoleNomeEsteso(request, this.session)));
		gd.setLogoHeaderImage(this.core.getLogoHeaderImage());
		gd.setLogoHeaderLink(this.core.getLogoHeaderLink());
		gd.setLogoHeaderTitolo(this.core.getLogoHeaderTitolo()); 
		gd.setVisualizzaLinkHome(this.core.isVisualizzaLinkHomeHeader());
		gd.setUrl(baseUrl);
		gd.setCss(css);
		if (displayLogin || displayLogout) {
			List<GeneralLink> link = new ArrayList<GeneralLink>();
			if (displayLogin) {
				// in questo ramo non si dovrebbe mai passare, l'authorizationfilter blocca le chiamate quando l'utente nn e' loggato
				GeneralLink gl1 = new GeneralLink();
				gl1.setLabel(LoginCostanti.LABEL_LOGIN);
				gl1.setUrl(LoginCostanti.SERVLET_NAME_LOGIN);
				link.add(gl1);
			}else{
				// Ordine dei link da visualizzare nel menu'

				// 1. Utente collegato
				if (displayUtente){
					GeneralLink glUtente = new GeneralLink();
					glUtente.setLabel(userLogin);
					glUtente.setUrl("");
					link.add(glUtente);
				}

				// 2. modalita' standard/avanzata
				GeneralLink glUtente = new GeneralLink();
				InterfaceType tipoInterfaccia = u.getInterfaceType();
				if(!tipoInterfaccia.equals(InterfaceType.COMPLETA)){
					if(tipoInterfaccia.equals(InterfaceType.STANDARD)){
						glUtente.setLabel(LoginCostanti.LABEL_MENU_UTENTE_MODALITA_AVANZATA);
						glUtente.setIcon(LoginCostanti.ICONA_MENU_UTENTE_UNCHECKED);
						glUtente.setUrl(UtentiCostanti.SERVLET_NAME_UTENTE_CHANGE,
								new Parameter(UtentiCostanti.PARAMETRO_UTENTE_TIPO_GUI, InterfaceType.AVANZATA.toString()),
								new Parameter(Costanti.DATA_ELEMENT_EDIT_MODE_NAME,Costanti.DATA_ELEMENT_EDIT_MODE_VALUE_EDIT_END),
								new Parameter(UtentiCostanti.PARAMETRO_UTENTE_CHANGE_GUI,Costanti.CHECK_BOX_ENABLED)
//								,
//								new Parameter(Costanti.PARAMETER_PREV_TAB_KEY, request.ge)
								);
	
					} else {
						glUtente.setLabel(LoginCostanti.LABEL_MENU_UTENTE_MODALITA_AVANZATA);
						glUtente.setIcon(LoginCostanti.ICONA_MENU_UTENTE_CHECKED);
						glUtente.setUrl(UtentiCostanti.SERVLET_NAME_UTENTE_CHANGE,
								new Parameter(UtentiCostanti.PARAMETRO_UTENTE_TIPO_GUI, InterfaceType.STANDARD.toString()),
								new Parameter(Costanti.DATA_ELEMENT_EDIT_MODE_NAME,Costanti.DATA_ELEMENT_EDIT_MODE_VALUE_EDIT_END),
								new Parameter(UtentiCostanti.PARAMETRO_UTENTE_CHANGE_GUI,Costanti.CHECK_BOX_ENABLED));
					}
					link.add(glUtente);
				}

				// 3. informazioni/about
				GeneralLink glO = new GeneralLink();
				glO.setLabel(LoginCostanti.LABEL_MENU_UTENTE_INFORMAZIONI);
				glO.setUrl(AboutCostanti.SERVLET_NAME_ABOUT);
				link.add(glO);

				// 4. profilo utente
				if (displayUtente){
					GeneralLink glProfiloUtente = new GeneralLink();
					glProfiloUtente.setLabel(LoginCostanti.LABEL_MENU_UTENTE_PROFILO_UTENTE);
					glProfiloUtente.setUrl(UtentiCostanti.SERVLET_NAME_UTENTE_CHANGE);
					link.add(glProfiloUtente);
				}
			}

			// 5. logoutsetModalitaLinks
			if (displayLogout && this.core.isMostraButtonLogout()) {
				GeneralLink gl2 = new GeneralLink();
				gl2.setLabel(LoginCostanti.LABEL_MENU_UTENTE_LOGOUT);

				// se ho definito una url custom viene controllato nella procedura di logout
				gl2.setUrl(LoginCostanti.SERVLET_NAME_LOGOUT);
				link.add(gl2);
			}

			gd.setHeaderLinks(link);

			if(u != null) { // se ho fatto refresh della pagina dopo che e' scaduta la sessione l'utente e' null
				if(!u.hasOnlyPermessiUtenti())  
					gd.setModalitaLinks(this.caricaMenuProtocolliUtente(request, u));
				
				if(!u.hasOnlyPermessiUtenti())  // si e' deciso di farlo vedere sempre, sarĂ  senza tendina: && this.core.isMultitenant())  
					gd.setSoggettiLinks(this.caricaMenuSoggetti(request, u));
			}
		}

		return gd;
	}

	public PageData initPageData() {
		return  initPageData(null);		
	}

	public PageData initPageData(String breadcrumb) {
		PageData pd = new PageData();
		if(breadcrumb != null) {
			List<GeneralLink> titlelist = new ArrayList<>();
			GeneralLink tl1 = new GeneralLink();
			tl1.setLabel(breadcrumb);
			titlelist.add(tl1);
			pd.setTitleList(titlelist);
		}
		List<DataElement> dati = new ArrayList<>();
		// titolo sezione login 
		DataElement titoloSezione = new DataElement();
		titoloSezione.setLabel(LoginCostanti.LABEL_LOGIN);
		titoloSezione.setType(DataElementType.TITLE);
		titoloSezione.setName("");

		DataElement login = new DataElement();
		login.setLabel(LoginCostanti.LABEL_USERNAME);
		login.setType(DataElementType.TEXT_EDIT);
		login.setName(UtentiCostanti.PARAMETRO_UTENTE_LOGIN);
		login.setStyleClass(Costanti.INPUT_CSS_CLASS);
		DataElement pwd = new DataElement();
		pwd.setLabel(UtentiCostanti.LABEL_PASSWORD);
		pwd.setType(DataElementType.CRYPT);
		pwd.setName(UtentiCostanti.PARAMETRO_UTENTE_PW);
		pwd.setStyleClass(Costanti.INPUT_CSS_CLASS);

		dati.add(titoloSezione);
		dati.add(login);
		dati.add(pwd);
		pd.setDati(dati);
		return pd;
	}



	public int getSize() {
		return 50;
	}

	public List<GeneralLink> caricaMenuProtocolliUtente(HttpServletRequest request, User u){
		List<GeneralLink> link = new ArrayList<>();

		// 1. controllo se ho piu' di un protocollo disponibile per l'utente
		try {
			List<String> protocolliDispondibili = this.core.getProtocolli(request, this.session,true);

			if(protocolliDispondibili != null && !protocolliDispondibili.isEmpty()) {
				// prelevo l'eventuale protocollo selezionato
				String protocolloSelezionato = u.getProtocolloSelezionatoPddConsole();
				if(protocolliDispondibili.size()==1) {
					protocolloSelezionato = protocolliDispondibili.get(0); // forzo
				}
				
				GeneralLink glModalitaCorrente = new GeneralLink();
 				String labelSelezionato = protocolloSelezionato == null ? UtentiCostanti.LABEL_PARAMETRO_MODALITA_ALL : ConsoleHelper._getLabelProtocollo(protocolloSelezionato);
				String labelSelezionatoCompleta = MessageFormat.format(LoginCostanti.LABEL_MENU_MODALITA_CORRENTE_WITH_PARAM, labelSelezionato);
				glModalitaCorrente.setLabel(labelSelezionatoCompleta); 
				glModalitaCorrente.setUrl("");
				glModalitaCorrente.setLabelWidth(this.core.getFontWidth(labelSelezionatoCompleta,  Font.BOLD, 16)); 
				link.add(glModalitaCorrente);

				if(protocolliDispondibili.size()>1) {
					// popolo la tendina con i protocolli disponibili
					for (String protocolloDisponibile : ProtocolUtils.orderProtocolli(protocolliDispondibili)) {
						GeneralLink glProt = new GeneralLink();
						
						String labelProt = ConsoleHelper._getLabelProtocollo(protocolloDisponibile);
						glProt.setLabel(labelProt);
						if(protocolloSelezionato != null && protocolloSelezionato.equals(protocolloDisponibile)) {
							glProt.setUrl("");
						} else {
							glProt.setUrl(UtentiCostanti.SERVLET_NAME_UTENTE_CHANGE,
								new Parameter(UtentiCostanti.PARAMETRO_UTENTE_TIPO_MODALITA, protocolloDisponibile),
								new Parameter(Costanti.DATA_ELEMENT_EDIT_MODE_NAME,Costanti.DATA_ELEMENT_EDIT_MODE_VALUE_EDIT_END),
								new Parameter(UtentiCostanti.PARAMETRO_UTENTE_CHANGE_MODALITA,Costanti.CHECK_BOX_ENABLED)
								);
						}

						glProt.setLabelWidth(this.core.getFontWidth(glProt.getLabel(), 14)); 
						link.add(glProt);
					}
				
					// seleziona tutti 
					GeneralLink glAll = new GeneralLink();
					glAll.setLabel(UtentiCostanti.LABEL_PARAMETRO_MODALITA_ALL);
					if((protocolloSelezionato == null)) {
						glAll.setUrl("");
					} else {
						glAll.setUrl(UtentiCostanti.SERVLET_NAME_UTENTE_CHANGE,
							new Parameter(UtentiCostanti.PARAMETRO_UTENTE_TIPO_MODALITA, UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL),
							new Parameter(Costanti.DATA_ELEMENT_EDIT_MODE_NAME,Costanti.DATA_ELEMENT_EDIT_MODE_VALUE_EDIT_END),
							new Parameter(UtentiCostanti.PARAMETRO_UTENTE_CHANGE_MODALITA,Costanti.CHECK_BOX_ENABLED)
							);
					}
					glAll.setLabelWidth(this.core.getFontWidth(UtentiCostanti.LABEL_PARAMETRO_MODALITA_ALL, 14));
					link.add(glAll);
				}
				
			}
		} catch (Exception e) {
			ControlStationLogger.getPddConsoleCoreLogger().error(e.getMessage(),e);
		}

		return link;
	}

	public List<GeneralLink> caricaMenuSoggetti(HttpServletRequest request, User u){
		List<GeneralLink> link = new ArrayList<>();

		try {
			// prelevo l'eventuale protocollo selezionato
			List<String> protocolliDispondibili = this.core.getProtocolli(request, this.session,true);
			String protocolloSelezionato = u.getProtocolloSelezionatoPddConsole();
			if(protocolliDispondibili.size()==1) {
				protocolloSelezionato = protocolliDispondibili.get(0); // forzo
			}
			
			// prelevo il soggetto selezionato
			String soggettoOperativoSelezionato = u.getSoggettoSelezionatoPddConsole();
			
			List<IDSoggetto> idSoggettiOperativi = this.soggettiCore.getIdSoggettiOperativi(protocolloSelezionato);
			// Si e' deciso che i soggetti associati valgono solo per govwayMonitor
			
			// visualizzo il menu' soggetti solo se e' stato selezionato un protocollo 
			if(protocolloSelezionato!=null && !"".equals(protocolloSelezionato) &&
					idSoggettiOperativi != null && !idSoggettiOperativi.isEmpty()) {
				
				if(soggettoOperativoSelezionato==null && idSoggettiOperativi.size()==1) {
					IDSoggetto idSoggetto = idSoggettiOperativi.get(0);
					soggettoOperativoSelezionato = idSoggetto.toString(); // forzo
				}
				
				GeneralLink glSoggettoCorrente = new GeneralLink();
				IDSoggetto idSoggettoOperativo = null;
				if(soggettoOperativoSelezionato!=null) {
					idSoggettoOperativo = this.soggettiCore.convertSoggettoSelezionatoToID(soggettoOperativoSelezionato);
				}
 				String labelSelezionato = soggettoOperativoSelezionato == null ? UtentiCostanti.LABEL_PARAMETRO_MODALITA_ALL : ConsoleHelper._getLabelNomeSoggetto(idSoggettoOperativo);
				String labelSelezionatoCompleta = MessageFormat.format(LoginCostanti.LABEL_MENU_SOGGETTO_CORRENTE_WITH_PARAM, labelSelezionato);
				glSoggettoCorrente.setLabel(labelSelezionatoCompleta); 
				
				if(labelSelezionatoCompleta.length() > this.core.getLunghezzaMassimaLabelSoggettiOperativiMenuUtente()) {
					glSoggettoCorrente.setLabel(ConsoleHelper.normalizeLabel(labelSelezionatoCompleta, this.core.getLunghezzaMassimaLabelSoggettiOperativiMenuUtente()));
				}
				
				glSoggettoCorrente.setUrl("");
				glSoggettoCorrente.setLabelWidth(this.core.getFontWidth(glSoggettoCorrente.getLabel(),  Font.BOLD, 16)); 
				link.add(glSoggettoCorrente);
				
				Integer numeroMassimoSoggettiSelectListSoggettiOperatiti = this.core.getNumeroMassimoSoggettiSelectListSoggettiOperatiti();
				
				if(idSoggettiOperativi.size()>1) {
					List<String> listaLabel = new ArrayList<>();
					Map<String, IDSoggetto> mapLabelIds = new HashMap<>();
					for (IDSoggetto idSoggetto : idSoggettiOperativi) {
						String labelSoggetto = ConsoleHelper._getLabelNomeSoggetto(idSoggetto);
						if(!listaLabel.contains(labelSoggetto)) {
							listaLabel.add(labelSoggetto);
							mapLabelIds.put(labelSoggetto, idSoggetto);
						}
					}
					
					// Per ordinare in maniera case insensistive
					Collections.sort(listaLabel, new Comparator<String>() {
						 @Override
						public int compare(String o1, String o2) {
					           return o1.toLowerCase().compareTo(o2.toLowerCase());
					        }
						});
					
					for (String label : listaLabel) {
						GeneralLink glSoggetto = new GeneralLink();
						
						glSoggetto.setLabel(label);
						if(soggettoOperativoSelezionato != null && mapLabelIds.get(label).toString().equals(idSoggettoOperativo.toString())) {
							glSoggetto.setUrl("");
						} else {
							glSoggetto.setUrl(UtentiCostanti.SERVLET_NAME_UTENTE_CHANGE,
									new Parameter(UtentiCostanti.PARAMETRO_UTENTE_ID_SOGGETTO, NamingUtils.getSoggettoFromLabel(protocolloSelezionato, label).toString()),
									new Parameter(Costanti.DATA_ELEMENT_EDIT_MODE_NAME,Costanti.DATA_ELEMENT_EDIT_MODE_VALUE_EDIT_END),
									new Parameter(UtentiCostanti.PARAMETRO_UTENTE_CHANGE_SOGGETTO,Costanti.CHECK_BOX_ENABLED)
									);
						}
						
						if(label.length() > this.core.getLunghezzaMassimaLabelSoggettiOperativiMenuUtente()) {
							glSoggetto.setLabel(ConsoleHelper.normalizeLabel(label, this.core.getLunghezzaMassimaLabelSoggettiOperativiMenuUtente()));
							glSoggetto.setTooltip(label); 
						}
						
						glSoggetto.setLabelWidth(this.core.getFontWidth(glSoggetto.getLabel(), 14)); 
						link.add(glSoggetto);
					}
				
				
					// seleziona tutti 
					GeneralLink glAll = new GeneralLink();
					glAll.setLabel(UtentiCostanti.LABEL_PARAMETRO_MODALITA_ALL);
					if((soggettoOperativoSelezionato == null)) {
						glAll.setUrl("");
					} else {
						glAll.setUrl(UtentiCostanti.SERVLET_NAME_UTENTE_CHANGE,
								new Parameter(UtentiCostanti.PARAMETRO_UTENTE_ID_SOGGETTO, UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL),
								new Parameter(Costanti.DATA_ELEMENT_EDIT_MODE_NAME,Costanti.DATA_ELEMENT_EDIT_MODE_VALUE_EDIT_END),
								new Parameter(UtentiCostanti.PARAMETRO_UTENTE_CHANGE_SOGGETTO,Costanti.CHECK_BOX_ENABLED)
								);
					}
					glAll.setLabelWidth(this.core.getFontWidth(UtentiCostanti.LABEL_PARAMETRO_MODALITA_ALL, 14));
					link.add(glAll);
				}
				
				if( idSoggettiOperativi.size() > numeroMassimoSoggettiSelectListSoggettiOperatiti ) {	
					// Abilita l visualizzazione autocomplete
					glSoggettoCorrente.setUrl("abilitaAutocomplete");
				}
			}
		} catch (Exception e) {
			ControlStationLogger.getPddConsoleCoreLogger().error(e.getMessage(),e);
		}

		return link;
	}

	public ControlStationCore getCore() {
		return this.core;
	}
}