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;
}
}